* [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox