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

Jasmin J. jasmin at anw.at
Sat Dec 10 20:11:36 CET 2016


Hi!

 > Is there anything else I need activate to get it displayed in the Add dialog?
I just found this in the README of the plugin:
   PVE currently doesn't offers interface to add custom plugins via GUI,
   so storage needs to be configured manually.

OK, so no GUI for now :(

Is there a possibility / concept to dynamically rewrite parts of the GUI which
may be reused here ?

BR,
    Jasmin

**************************************************************************

On 12/10/2016 07:04 PM, Jasmin J. wrote:
> Hi!
>
> I started today playing with storage plugins.
>
> I installed this plugin on my machine to see how it works, but I couldn't see
> it in the Add dialog on the WEB interface.
>
> I restarted only "pveproxy", which should enough, I guess.
>
> I even tried to execute it directly from Storage.pm, without luck.
>
> Is there anything else I need activate to get it displayed in the Add dialog?
>
> BR,
>    Jasmin
>
> ******************************************************************************
>
> On 08/29/2016 08:56 AM, Dmitry Petuhov wrote:
>> 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';
>>
>> _______________________________________________
>> pve-devel mailing list
>> pve-devel at pve.proxmox.com
>> http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>>
> _______________________________________________
> 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