[pve-devel] [PATCH v4] Add support for custom storage plugins
Dmitry Petuhov
mityapetuhov at gmail.com
Mon Aug 29 08:56:44 CEST 2016
Here's plugin itself https://github.com/mityarzn/pve-storage-custom-mpnetapp
And its dependency script https://github.com/mityarzn/multipath-scan
29.08.2016 06:30, Alexandre DERUMIER пишет:
> Dmitry,
>
> Can you send a link to your netapp plugin ?
>
> I'll like to see how you define api version and other things for new custom plugins integration
>
> ----- Mail original -----
> De: "Dmitry Petuhov" <mityapetuhov at gmail.com>
> À: "pve-devel" <pve-devel at pve.proxmox.com>
> Envoyé: Vendredi 26 Août 2016 15:06:33
> Objet: [pve-devel] [PATCH v4] Add support for custom storage plugins
>
> PVE team cannot support specialized vendor-specific storage
> plugins because of lack of hardware. But we can allow users to
> add own plugins for their storages without need to rewrite any
> PVE code and thus ease PVE updates to them.
>
> Idea of this patch is to add folder /usr/share/perl5/PVE/Storage/Custom
> where user can place his plugins and PVE will automatically load
> them on start or warn if it could not and continue. Maybe we could
> even load all plugins (except PVE::Storage::Plugin itself) this way,
> because current storage plugins are not really plugins, if they
> need to be explicitly loaded in PVE code :-).
>
> Custom plugins MUST have api() method returning version for which
> it was designed. If API changes from PVE side, module is just not
> being registered and warnig message is printed do log, so user have
> to update module. Until module update, corresponding storage will
> just disappear from PVE, so it shall not impose any data damage
> because of API change.
>
> This approach works (with some limitations) if plugin works in
> generic PVE way: full control of volumes lifecycle. And will not
> currently work for custom plugins like iSCSI, which needs to select
> pre-existing volumes. Maybe someone will add more flexible way to
> pve-manager to select input elements for storage plugins to target
> this.
>
> Currently tested with my NetApp plugin.
>
> Signed-off-by: Dmitry Petuhov <mityapetuhov at gmail.com>
> ---
> New in v4: added eval on module registration. And to import, just to be
> on completely safe side.
>
> New in v3:
> - Moved constant APIVER definion after other use statements.
> - Added check for api() method and PVE::Storage::Plugin inheritabce.
> - Added warning message on api version mismatch.
> - Moved custom plugins loading after standard plugins.
>
> PVE/Storage.pm | 32 ++++++++++++++++++++++++++++++--
> 1 file changed, 30 insertions(+), 2 deletions(-)
>
> diff --git a/PVE/Storage.pm b/PVE/Storage.pm
> index 25ff545..adaa380 100755
> --- a/PVE/Storage.pm
> +++ b/PVE/Storage.pm
> @@ -12,7 +12,7 @@ use File::Path;
> use Cwd 'abs_path';
> use Socket;
>
> -use PVE::Tools qw(run_command file_read_firstline $IPV6RE);
> +use PVE::Tools qw(run_command file_read_firstline dir_glob_foreach $IPV6RE);
> use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file);
> use PVE::Exception qw(raise_param_exc);
> use PVE::JSONSchema;
> @@ -33,7 +33,10 @@ use PVE::Storage::ZFSPoolPlugin;
> use PVE::Storage::ZFSPlugin;
> use PVE::Storage::DRBDPlugin;
>
> -# load and initialize all plugins
> +# Storage API version. Icrement it on changes in storage API interface.
> +use constant APIVER => 1;
> +
> +# load standard plugins
> PVE::Storage::DirPlugin->register();
> PVE::Storage::LVMPlugin->register();
> PVE::Storage::LvmThinPlugin->register();
> @@ -46,6 +49,34 @@ PVE::Storage::GlusterfsPlugin->register();
> PVE::Storage::ZFSPoolPlugin->register();
> PVE::Storage::ZFSPlugin->register();
> PVE::Storage::DRBDPlugin->register();
> +
> +# load third-party plugins
> +if ( -d '/usr/share/perl5/PVE/Storage/Custom' ) {
> + dir_glob_foreach('/usr/share/perl5/PVE/Storage/Custom', '.*\.pm$', sub {
> + my ($file) = @_;
> + my $modname = 'PVE::Storage::Custom::' . $file;
> + $modname =~ s!\.pm$!!;
> + $file = 'PVE/Storage/Custom/' . $file;
> +
> + eval {
> + require $file;
> + };
> + if ($@) {
> + warn $@;
> + # Check storage API version and that file is really storage plugin.
> + } elsif ($modname->isa('PVE::Storage::Plugin') && $modname->can('api') && $modname->api() == APIVER) {
> + eval {
> + import $file;
> + $modname->register();
> + };
> + warn $@ if $@;
> + } else {
> + warn "Error loading storage plugin \"$modname\" because of API version mismatch. Please, update it.\n"
> + }
> + });
> +}
> +
> +# initialize all plugins
> PVE::Storage::Plugin->init();
>
> my $UDEVADM = '/sbin/udevadm';
More information about the pve-devel
mailing list