[pve-devel] [PATCH v4] Add support for custom storage plugins

Alexandre DERUMIER aderumier at odiso.com
Mon Aug 29 05:30:01 CEST 2016


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'; 
-- 
2.1.4 

_______________________________________________ 
pve-devel mailing list 
pve-devel at pve.proxmox.com 
http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel 




More information about the pve-devel mailing list