public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Stefan Hanreich <s.hanreich@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH pve-network 1/2] api: refactor URL structure for Ipam
Date: Mon, 20 Nov 2023 17:28:32 +0100	[thread overview]
Message-ID: <20231120162833.431139-2-s.hanreich@proxmox.com> (raw)
In-Reply-To: <20231120162833.431139-1-s.hanreich@proxmox.com>

The initial URL structure was less than optimal due to Ipam as well as
Ipams being endpoints in the API, which are too similar and might be
confusing to users.

Move the listing of PVE IPAM to /ipams/pve/status
Move the create / update / delete endpoints to /vnets/{vnetid}/ips

Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com>
---
 src/PVE/API2/Network/SDN.pm                  |  6 --
 src/PVE/API2/Network/SDN/Ipams.pm            | 83 +++++++++++++++++
 src/PVE/API2/Network/SDN/{Ipam.pm => Ips.pm} | 97 ++------------------
 src/PVE/API2/Network/SDN/Makefile            |  2 +-
 src/PVE/API2/Network/SDN/Vnets.pm            |  6 ++
 5 files changed, 100 insertions(+), 94 deletions(-)
 rename src/PVE/API2/Network/SDN/{Ipam.pm => Ips.pm} (58%)

diff --git a/src/PVE/API2/Network/SDN.pm b/src/PVE/API2/Network/SDN.pm
index 551afcf..d216e48 100644
--- a/src/PVE/API2/Network/SDN.pm
+++ b/src/PVE/API2/Network/SDN.pm
@@ -15,7 +15,6 @@ use PVE::Network::SDN;
 use PVE::API2::Network::SDN::Controllers;
 use PVE::API2::Network::SDN::Vnets;
 use PVE::API2::Network::SDN::Zones;
-use PVE::API2::Network::SDN::Ipam;
 use PVE::API2::Network::SDN::Ipams;
 use PVE::API2::Network::SDN::Dns;
 
@@ -36,11 +35,6 @@ __PACKAGE__->register_method ({
     path => 'controllers',
 });
 
-__PACKAGE__->register_method ({
-    subclass => "PVE::API2::Network::SDN::Ipam",
-    path => 'ipam',
-});
-
 __PACKAGE__->register_method ({
     subclass => "PVE::API2::Network::SDN::Ipams",
     path => 'ipams',
diff --git a/src/PVE/API2/Network/SDN/Ipams.pm b/src/PVE/API2/Network/SDN/Ipams.pm
index 6410e8e..d6e0bc8 100644
--- a/src/PVE/API2/Network/SDN/Ipams.pm
+++ b/src/PVE/API2/Network/SDN/Ipams.pm
@@ -12,6 +12,9 @@ use PVE::Network::SDN::Ipams::Plugin;
 use PVE::Network::SDN::Ipams::PVEPlugin;
 use PVE::Network::SDN::Ipams::PhpIpamPlugin;
 use PVE::Network::SDN::Ipams::NetboxPlugin;
+use PVE::Network::SDN::Dhcp;
+use PVE::Network::SDN::Vnets;
+use PVE::Network::SDN::Zones;
 
 use Storable qw(dclone);
 use PVE::JSONSchema qw(get_standard_option);
@@ -245,4 +248,84 @@ __PACKAGE__->register_method ({
 	return undef;
     }});
 
+__PACKAGE__->register_method ({
+    name => 'ipamindex',
+    path => '{ipam}/status',
+    method => 'GET',
+    description => 'List PVE IPAM Entries',
+    protected => 1,
+    permissions => {
+	description => "Only list entries where you have 'SDN.Audit' or 'SDN.Allocate' permissions on '/sdn/zones/<zone>/<vnet>'",
+	user => 'all',
+    },
+    parameters => {
+	additionalProperties => 0,
+	properties => {
+	    ipam => get_standard_option('pve-sdn-ipam-id', {
+                completion => \&PVE::Network::SDN::Ipams::complete_sdn_ipams,
+            }),
+	},
+    },
+    returns => {
+	type => 'array',
+    },
+    code => sub {
+	my ($param) = @_;
+
+	my $id = extract_param($param, 'ipam');
+	die "Currently only PVE IPAM is supported!" if $id ne 'pve';
+
+	my $rpcenv = PVE::RPCEnvironment::get();
+	my $authuser = $rpcenv->get_user();
+	my $privs = [ 'SDN.Audit', 'SDN.Allocate' ];
+
+	my $ipam_plugin = PVE::Network::SDN::Ipams::Plugin->lookup('pve');
+	my $ipam_db = $ipam_plugin->read_db();
+
+	my $result = [];
+
+	for my $zone_id (keys %{$ipam_db->{zones}}) {
+	    my $zone_config = PVE::Network::SDN::Zones::get_zone($zone_id, 1);
+            next if !$zone_config || $zone_config->{ipam} ne 'pve' || !$zone_config->{dhcp};
+
+	    my $zone = $ipam_db->{zones}->{$zone_id};
+
+	    my $vnets = PVE::Network::SDN::Zones::get_vnets($zone_id, 1);
+
+	    for my $subnet_cidr (keys %{$zone->{subnets}}) {
+		my $subnet = $zone->{subnets}->{$subnet_cidr};
+		my $ip = new NetAddr::IP($subnet_cidr) or die 'Found invalid CIDR in IPAM';
+
+		my $vnet = undef;
+		for my $vnet_id (keys %$vnets) {
+		    eval {
+			my ($zone, $subnetid, $subnet_cfg, $ip) = PVE::Network::SDN::Vnets::get_subnet_from_vnet_ip(
+			    $vnet_id,
+			    $ip->addr,
+			);
+
+			$vnet = $subnet_cfg->{vnet};
+		    };
+
+		    last if $vnet;
+		}
+
+		next if !$vnet || !$rpcenv->check_any($authuser, "/sdn/zones/$zone_id/$vnet", $privs, 1);
+
+		for my $ip (keys %{$subnet->{ips}}) {
+		    my $entry = $subnet->{ips}->{$ip};
+		    $entry->{zone} = $zone_id;
+		    $entry->{subnet} = $subnet_cidr;
+		    $entry->{ip} = $ip;
+		    $entry->{vnet} = $vnet;
+
+		    push @$result, $entry;
+		}
+	    }
+	}
+
+	return $result;
+    },
+});
+
 1;
diff --git a/src/PVE/API2/Network/SDN/Ipam.pm b/src/PVE/API2/Network/SDN/Ips.pm
similarity index 58%
rename from src/PVE/API2/Network/SDN/Ipam.pm
rename to src/PVE/API2/Network/SDN/Ips.pm
index e71ca7d..31dec04 100644
--- a/src/PVE/API2/Network/SDN/Ipam.pm
+++ b/src/PVE/API2/Network/SDN/Ips.pm
@@ -1,100 +1,23 @@
-package PVE::API2::Network::SDN::Ipam;
+package PVE::API2::Network::SDN::Ips;
 
 use strict;
 use warnings;
 
 use PVE::Tools qw(extract_param);
-use PVE::Cluster qw(cfs_read_file cfs_write_file);
 
-use PVE::Network::SDN;
-use PVE::Network::SDN::Dhcp;
 use PVE::Network::SDN::Vnets;
-use PVE::Network::SDN::Ipams::Plugin;
+use PVE::Network::SDN::Dhcp;
 
 use PVE::JSONSchema qw(get_standard_option);
-use PVE::RPCEnvironment;
-
 use PVE::RESTHandler;
 
 use base qw(PVE::RESTHandler);
 
 __PACKAGE__->register_method ({
-    name => 'ipamindex',
+    name => 'ipdelete',
     path => '',
-    method => 'GET',
-    description => 'List PVE IPAM Entries',
-    protected => 1,
-    permissions => {
-	description => "Only list entries where you have 'SDN.Audit' or 'SDN.Allocate' permissions on '/sdn/zones/<zone>/<vnet>'",
-	user => 'all',
-    },
-    parameters => {
-	additionalProperties => 0,
-    },
-    returns => {
-	type => 'array',
-    },
-    code => sub {
-	my ($param) = @_;
-
-	my $rpcenv = PVE::RPCEnvironment::get();
-	my $authuser = $rpcenv->get_user();
-	my $privs = [ 'SDN.Audit', 'SDN.Allocate' ];
-
-	my $ipam_plugin = PVE::Network::SDN::Ipams::Plugin->lookup('pve');
-	my $ipam_db = $ipam_plugin->read_db();
-
-	my $result = [];
-
-	for my $zone_id (keys %{$ipam_db->{zones}}) {
-	    my $zone_config = PVE::Network::SDN::Zones::get_zone($zone_id, 1);
-            next if !$zone_config || $zone_config->{ipam} ne 'pve' || !$zone_config->{dhcp};
-
-	    my $zone = $ipam_db->{zones}->{$zone_id};
-
-	    my $vnets = PVE::Network::SDN::Zones::get_vnets($zone_id, 1);
-
-	    for my $subnet_cidr (keys %{$zone->{subnets}}) {
-		my $subnet = $zone->{subnets}->{$subnet_cidr};
-		my $ip = new NetAddr::IP($subnet_cidr) or die 'Found invalid CIDR in IPAM';
-
-		my $vnet = undef;
-		for my $vnet_id (keys %$vnets) {
-		    eval {
-			my ($zone, $subnetid, $subnet_cfg, $ip) = PVE::Network::SDN::Vnets::get_subnet_from_vnet_ip(
-			    $vnet_id,
-			    $ip->addr,
-			);
-
-			$vnet = $subnet_cfg->{vnet};
-		    };
-
-		    last if $vnet;
-		}
-
-		next if !$vnet || !$rpcenv->check_any($authuser, "/sdn/zones/$zone_id/$vnet", $privs, 1);
-
-		for my $ip (keys %{$subnet->{ips}}) {
-		    my $entry = $subnet->{ips}->{$ip};
-		    $entry->{zone} = $zone_id;
-		    $entry->{subnet} = $subnet_cidr;
-		    $entry->{ip} = $ip;
-		    $entry->{vnet} = $vnet;
-
-		    push @$result, $entry;
-		}
-	    }
-	}
-
-	return $result;
-    },
-});
-
-__PACKAGE__->register_method ({
-    name => 'dhcpdelete',
-    path => '{zone}/{vnet}/{mac}',
     method => 'DELETE',
-    description => 'Delete DHCP Mappings in a VNet for a MAC address',
+    description => 'Delete IP Mappings in a VNet',
     protected => 1,
     permissions => {
 	check => ['perm', '/sdn/zones/{zone}/{vnet}', [ 'SDN.Allocate' ]],
@@ -129,10 +52,10 @@ __PACKAGE__->register_method ({
 });
 
 __PACKAGE__->register_method ({
-    name => 'dhcpcreate',
-    path => '{zone}/{vnet}/{mac}',
+    name => 'ipcreate',
+    path => '',
     method => 'POST',
-    description => 'Create DHCP Mapping',
+    description => 'Create IP Mapping in a VNet',
     protected => 1,
     permissions => {
 	check => ['perm', '/sdn/zones/{zone}/{vnet}', [ 'SDN.Allocate' ]],
@@ -165,10 +88,10 @@ __PACKAGE__->register_method ({
     },
 });
 __PACKAGE__->register_method ({
-    name => 'dhcpupdate',
-    path => '{zone}/{vnet}/{mac}',
+    name => 'ipupdate',
+    path => '',
     method => 'PUT',
-    description => 'Update DHCP Mapping',
+    description => 'Update IP Mapping in a VNet',
     protected => 1,
     permissions => {
 	check => ['perm', '/sdn/zones/{zone}/{vnet}', [ 'SDN.Allocate' ]],
diff --git a/src/PVE/API2/Network/SDN/Makefile b/src/PVE/API2/Network/SDN/Makefile
index 2480c09..abd1bfa 100644
--- a/src/PVE/API2/Network/SDN/Makefile
+++ b/src/PVE/API2/Network/SDN/Makefile
@@ -1,4 +1,4 @@
-SOURCES=Vnets.pm Zones.pm Controllers.pm Subnets.pm Ipams.pm Ipam.pm Dns.pm
+SOURCES=Vnets.pm Zones.pm Controllers.pm Subnets.pm Ipams.pm Dns.pm Ips.pm
 
 
 PERL5DIR=${DESTDIR}/usr/share/perl5
diff --git a/src/PVE/API2/Network/SDN/Vnets.pm b/src/PVE/API2/Network/SDN/Vnets.pm
index 864dc4a..a32df8c 100644
--- a/src/PVE/API2/Network/SDN/Vnets.pm
+++ b/src/PVE/API2/Network/SDN/Vnets.pm
@@ -13,6 +13,7 @@ use PVE::Network::SDN::Vnets;
 use PVE::Network::SDN::VnetPlugin;
 use PVE::Network::SDN::Subnets;
 use PVE::API2::Network::SDN::Subnets;
+use PVE::API2::Network::SDN::Ips;
 
 use Storable qw(dclone);
 use PVE::JSONSchema qw(get_standard_option);
@@ -28,6 +29,11 @@ __PACKAGE__->register_method ({
     path => '{vnet}/subnets',
 });
 
+__PACKAGE__->register_method ({
+    subclass => "PVE::API2::Network::SDN::Ips",
+    path => '{vnet}/ips',
+});
+
 my $api_sdn_vnets_config = sub {
     my ($cfg, $id) = @_;
 
-- 
2.39.2




  reply	other threads:[~2023-11-20 16:28 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-20 16:28 [pve-devel] [PATCH network/manager 0/2] Refactor IPAM API methods Stefan Hanreich
2023-11-20 16:28 ` Stefan Hanreich [this message]
2023-11-20 16:43   ` [pve-devel] applied: [PATCH pve-network 1/2] api: refactor URL structure for Ipam Thomas Lamprecht
2023-11-20 16:28 ` [pve-devel] [PATCH pve-manager 2/2] sdn: Update IPAM API endpoints Stefan Hanreich
2023-11-21 21:14   ` [pve-devel] applied: " Thomas Lamprecht

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231120162833.431139-2-s.hanreich@proxmox.com \
    --to=s.hanreich@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal