summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Hanreich <s.hanreich@proxmox.com>2023-11-20 17:28:32 +0100
committerThomas Lamprecht <t.lamprecht@proxmox.com>2023-11-20 17:40:36 +0100
commit359416aa52e6ed137a8662a9d3f6fa4a50a5e7ec (patch)
tree22d40e668c1df48fde91d0074348d64bb0112f24
parent39062bc53a95ef5a0e45171e61aa5df3e52ca898 (diff)
api: refactor URL structure for Ipam
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>
-rw-r--r--src/PVE/API2/Network/SDN.pm6
-rw-r--r--src/PVE/API2/Network/SDN/Ipams.pm83
-rw-r--r--src/PVE/API2/Network/SDN/Ips.pm (renamed from src/PVE/API2/Network/SDN/Ipam.pm)97
-rw-r--r--src/PVE/API2/Network/SDN/Makefile2
-rw-r--r--src/PVE/API2/Network/SDN/Vnets.pm6
5 files changed, 100 insertions, 94 deletions
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;
@@ -37,11 +36,6 @@ __PACKAGE__->register_method ({
});
__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
index 722baa4..6989b9b 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' ]],
@@ -126,10 +49,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' ]],
@@ -161,10 +84,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) = @_;