* [pve-devel] [PATCH pve-network] ipam: add custom plugins support
@ 2021-04-29 22:55 Alexandre Derumier
2021-05-05 10:06 ` Thomas Lamprecht
0 siblings, 1 reply; 3+ messages in thread
From: Alexandre Derumier @ 2021-04-29 22:55 UTC (permalink / raw)
To: pve-devel
Same than for storage
Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
---
PVE/Network/SDN/Ipams.pm | 48 ++++++++++++++++++++-
test/debug/MyCustomIpamPlugin.pm | 72 ++++++++++++++++++++++++++++++++
2 files changed, 118 insertions(+), 2 deletions(-)
create mode 100644 test/debug/MyCustomIpamPlugin.pm
diff --git a/PVE/Network/SDN/Ipams.pm b/PVE/Network/SDN/Ipams.pm
index e8a4b0b..3d7f328 100644
--- a/PVE/Network/SDN/Ipams.pm
+++ b/PVE/Network/SDN/Ipams.pm
@@ -5,7 +5,7 @@ use warnings;
use JSON;
-use PVE::Tools qw(extract_param dir_glob_regex run_command);
+use PVE::Tools qw(extract_param dir_glob_regex run_command dir_glob_foreach);
use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file);
use PVE::Network;
@@ -14,11 +14,55 @@ use PVE::Network::SDN::Ipams::NetboxPlugin;
use PVE::Network::SDN::Ipams::PhpIpamPlugin;
use PVE::Network::SDN::Ipams::Plugin;
+# Storage API version. Increment it on changes in storage API interface.
+use constant APIVER => 1;
+# Age is the number of versions we're backward compatible with.
+# This is like having 'current=APIVER' and age='APIAGE' in libtool,
+# see https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html
+use constant APIAGE => 1;
+
PVE::Network::SDN::Ipams::PVEPlugin->register();
PVE::Network::SDN::Ipams::NetboxPlugin->register();
PVE::Network::SDN::Ipams::PhpIpamPlugin->register();
-PVE::Network::SDN::Ipams::Plugin->init();
+# load third-party plugins
+if ( -d '/usr/share/perl5/PVE/Network/SDN/Ipams/Custom' ) {
+ dir_glob_foreach('/usr/share/perl5/PVE/Network/SDN/Ipams/Custom', '.*\.pm$', sub {
+ my ($file) = @_;
+ my $modname = 'PVE::Network::SDN::Ipams::Custom::' . $file;
+ $modname =~ s!\.pm$!!;
+ $file = 'PVE/Network/SDN/Ipams/Custom/' . $file;
+
+ eval {
+ require $file;
+
+ # Check perl interface:
+ die "not derived from PVE::Network::SDN::Ipams::Plugin\n"
+ if !$modname->isa('PVE::Network::SDN::Ipams::Plugin');
+ die "does not provide an api() method\n"
+ if !$modname->can('api');
+ # Check storage API version and that file is really ipam plugin.
+ my $version = $modname->api();
+ die "implements an API version newer than current ($version > " . APIVER . ")\n"
+ if $version > APIVER;
+ my $min_version = (APIVER - APIAGE);
+ die "API version too old, please update the plugin ($version < $min_version)\n"
+ if $version < $min_version;
+ import $file;
+ $modname->register();
+
+ # If we got this far and the API version is not the same, make some
+ # noise:
+ warn "Plugin \"$modname\" is implementing an older ipam API, an upgrade is recommended\n"
+ if $version != APIVER;
+ };
+ if ($@) {
+ warn "Error loading storage plugin \"$modname\": $@";
+ }
+ });
+}
+
+PVE::Network::SDN::Ipams::Plugin->init();
sub sdn_ipams_config {
my ($cfg, $id, $noerr) = @_;
diff --git a/test/debug/MyCustomIpamPlugin.pm b/test/debug/MyCustomIpamPlugin.pm
new file mode 100644
index 0000000..e923478
--- /dev/null
+++ b/test/debug/MyCustomIpamPlugin.pm
@@ -0,0 +1,72 @@
+package PVE::Network::SDN::Ipams::Custom::MyCustomIpamPlugin;
+
+use strict;
+use warnings;
+use PVE::INotify;
+use PVE::Cluster;
+use PVE::Tools;
+
+use base('PVE::Network::SDN::Ipams::Plugin');
+
+sub type {
+ return 'mycustomipam';
+}
+
+sub api {
+ return 1;
+}
+
+sub options {
+
+ return {
+ url => { optional => 0},
+ token => { optional => 0 },
+ section => { optional => 0 },
+ };
+}
+
+# Plugin implementation
+
+sub add_subnet {
+ my ($class, $plugin_config, $subnetid, $subnet, $noerr) = @_;
+
+}
+
+sub del_subnet {
+ my ($class, $plugin_config, $subnetid, $subnet, $noerr) = @_;
+
+}
+
+sub add_ip {
+ my ($class, $plugin_config, $subnetid, $subnet, $ip, $hostname, $mac, $description, $is_gateway, $noerr) = @_;
+
+}
+
+sub update_ip {
+ my ($class, $plugin_config, $subnetid, $subnet, $ip, $hostname, $mac, $description, $is_gateway, $noerr) = @_;
+
+}
+
+sub add_next_freeip {
+ my ($class, $plugin_config, $subnetid, $subnet, $hostname, $mac, $description, $noerr) = @_;
+
+}
+
+sub del_ip {
+ my ($class, $plugin_config, $subnetid, $subnet, $ip, $noerr) = @_;
+
+}
+
+sub verify_api {
+ my ($class, $plugin_config) = @_;
+
+}
+
+sub on_update_hook {
+ my ($class, $plugin_config) = @_;
+
+}
+
+1;
+
+
--
2.20.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [pve-devel] [PATCH pve-network] ipam: add custom plugins support
2021-04-29 22:55 [pve-devel] [PATCH pve-network] ipam: add custom plugins support Alexandre Derumier
@ 2021-05-05 10:06 ` Thomas Lamprecht
2021-05-08 8:33 ` aderumier
0 siblings, 1 reply; 3+ messages in thread
From: Thomas Lamprecht @ 2021-05-05 10:06 UTC (permalink / raw)
To: Proxmox VE development discussion, Alexandre Derumier
On 30.04.21 00:55, Alexandre Derumier wrote:
> Same than for storage
>
FYI, from a quick look this seems OK, but I'll wait at least until we
have VM and CT support ready before applying this.
> Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
> ---
> PVE/Network/SDN/Ipams.pm | 48 ++++++++++++++++++++-
> test/debug/MyCustomIpamPlugin.pm | 72 ++++++++++++++++++++++++++++++++
> 2 files changed, 118 insertions(+), 2 deletions(-)
> create mode 100644 test/debug/MyCustomIpamPlugin.pm
>
> diff --git a/PVE/Network/SDN/Ipams.pm b/PVE/Network/SDN/Ipams.pm
> index e8a4b0b..3d7f328 100644
> --- a/PVE/Network/SDN/Ipams.pm
> +++ b/PVE/Network/SDN/Ipams.pm
> @@ -5,7 +5,7 @@ use warnings;
>
> use JSON;
>
> -use PVE::Tools qw(extract_param dir_glob_regex run_command);
> +use PVE::Tools qw(extract_param dir_glob_regex run_command dir_glob_foreach);
> use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file);
> use PVE::Network;
>
> @@ -14,11 +14,55 @@ use PVE::Network::SDN::Ipams::NetboxPlugin;
> use PVE::Network::SDN::Ipams::PhpIpamPlugin;
> use PVE::Network::SDN::Ipams::Plugin;
>
> +# Storage API version. Increment it on changes in storage API interface.
> +use constant APIVER => 1;
> +# Age is the number of versions we're backward compatible with.
> +# This is like having 'current=APIVER' and age='APIAGE' in libtool,
> +# see https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html
> +use constant APIAGE => 1;
> +
> PVE::Network::SDN::Ipams::PVEPlugin->register();
> PVE::Network::SDN::Ipams::NetboxPlugin->register();
> PVE::Network::SDN::Ipams::PhpIpamPlugin->register();
> -PVE::Network::SDN::Ipams::Plugin->init();
>
> +# load third-party plugins
> +if ( -d '/usr/share/perl5/PVE/Network/SDN/Ipams/Custom' ) {
> + dir_glob_foreach('/usr/share/perl5/PVE/Network/SDN/Ipams/Custom', '.*\.pm$', sub {
> + my ($file) = @_;
> + my $modname = 'PVE::Network::SDN::Ipams::Custom::' . $file;
> + $modname =~ s!\.pm$!!;
> + $file = 'PVE/Network/SDN/Ipams/Custom/' . $file;
> +
> + eval {
> + require $file;
> +
> + # Check perl interface:
> + die "not derived from PVE::Network::SDN::Ipams::Plugin\n"
> + if !$modname->isa('PVE::Network::SDN::Ipams::Plugin');
> + die "does not provide an api() method\n"
> + if !$modname->can('api');
> + # Check storage API version and that file is really ipam plugin.
> + my $version = $modname->api();
> + die "implements an API version newer than current ($version > " . APIVER . ")\n"
> + if $version > APIVER;
> + my $min_version = (APIVER - APIAGE);
> + die "API version too old, please update the plugin ($version < $min_version)\n"
> + if $version < $min_version;
> + import $file;
> + $modname->register();
> +
> + # If we got this far and the API version is not the same, make some
> + # noise:
> + warn "Plugin \"$modname\" is implementing an older ipam API, an upgrade is recommended\n"
> + if $version != APIVER;
> + };
> + if ($@) {
> + warn "Error loading storage plugin \"$modname\": $@";
> + }
> + });
> +}
> +
> +PVE::Network::SDN::Ipams::Plugin->init();
>
> sub sdn_ipams_config {
> my ($cfg, $id, $noerr) = @_;
> diff --git a/test/debug/MyCustomIpamPlugin.pm b/test/debug/MyCustomIpamPlugin.pm
> new file mode 100644
> index 0000000..e923478
> --- /dev/null
> +++ b/test/debug/MyCustomIpamPlugin.pm
> @@ -0,0 +1,72 @@
> +package PVE::Network::SDN::Ipams::Custom::MyCustomIpamPlugin;
> +
> +use strict;
> +use warnings;
> +use PVE::INotify;
> +use PVE::Cluster;
> +use PVE::Tools;
> +
> +use base('PVE::Network::SDN::Ipams::Plugin');
> +
> +sub type {
> + return 'mycustomipam';
> +}
> +
> +sub api {
> + return 1;
> +}
> +
> +sub options {
> +
> + return {
> + url => { optional => 0},
> + token => { optional => 0 },
> + section => { optional => 0 },
> + };
> +}
> +
> +# Plugin implementation
> +
> +sub add_subnet {
> + my ($class, $plugin_config, $subnetid, $subnet, $noerr) = @_;
> +
> +}
> +
> +sub del_subnet {
> + my ($class, $plugin_config, $subnetid, $subnet, $noerr) = @_;
> +
> +}
> +
> +sub add_ip {
> + my ($class, $plugin_config, $subnetid, $subnet, $ip, $hostname, $mac, $description, $is_gateway, $noerr) = @_;
> +
> +}
> +
> +sub update_ip {
> + my ($class, $plugin_config, $subnetid, $subnet, $ip, $hostname, $mac, $description, $is_gateway, $noerr) = @_;
> +
> +}
> +
> +sub add_next_freeip {
> + my ($class, $plugin_config, $subnetid, $subnet, $hostname, $mac, $description, $noerr) = @_;
> +
> +}
> +
> +sub del_ip {
> + my ($class, $plugin_config, $subnetid, $subnet, $ip, $noerr) = @_;
> +
> +}
> +
> +sub verify_api {
> + my ($class, $plugin_config) = @_;
> +
> +}
> +
> +sub on_update_hook {
> + my ($class, $plugin_config) = @_;
> +
> +}
> +
> +1;
> +
> +
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [pve-devel] [PATCH pve-network] ipam: add custom plugins support
2021-05-05 10:06 ` Thomas Lamprecht
@ 2021-05-08 8:33 ` aderumier
0 siblings, 0 replies; 3+ messages in thread
From: aderumier @ 2021-05-08 8:33 UTC (permalink / raw)
To: Thomas Lamprecht, Proxmox VE development discussion
Le mercredi 05 mai 2021 à 12:06 +0200, Thomas Lamprecht a écrit :
> FYI, from a quick look this seems OK, but I'll wait at least until we
> have VM and CT support ready before applying this.
ok no problem.
It was a request of a user forum, but it can't use it without VM && CT
support anyway.
I think we can work on CT support first, I'll rework my patches for
review.
and if it's ok, we can then work on VM support.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2021-05-08 8:33 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-29 22:55 [pve-devel] [PATCH pve-network] ipam: add custom plugins support Alexandre Derumier
2021-05-05 10:06 ` Thomas Lamprecht
2021-05-08 8:33 ` aderumier
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal