]>
git.proxmox.com Git - pve-network.git/blob - src/PVE/API2/Network/SDN/Ipam.pm
722baa46a96f786c081cad211b3070916c60fc59
1 package PVE
::API2
::Network
::SDN
::Ipam
;
6 use PVE
::Tools
qw(extract_param);
7 use PVE
::Cluster
qw(cfs_read_file cfs_write_file);
10 use PVE
::Network
::SDN
::Dhcp
;
11 use PVE
::Network
::SDN
::Vnets
;
12 use PVE
::Network
::SDN
::Ipams
::Plugin
;
14 use PVE
::JSONSchema
qw(get_standard_option);
15 use PVE
::RPCEnvironment
;
19 use base
qw(PVE::RESTHandler);
21 __PACKAGE__-
>register_method ({
25 description
=> 'List PVE IPAM Entries',
28 description
=> "Only list entries where you have 'SDN.Audit' or 'SDN.Allocate' permissions on '/sdn/zones/<zone>/<vnet>'",
32 additionalProperties
=> 0,
40 my $rpcenv = PVE
::RPCEnvironment
::get
();
41 my $authuser = $rpcenv->get_user();
42 my $privs = [ 'SDN.Audit', 'SDN.Allocate' ];
44 my $ipam_plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup('pve');
45 my $ipam_db = $ipam_plugin->read_db();
49 for my $zone_id (keys %{$ipam_db->{zones
}}) {
50 my $zone_config = PVE
::Network
::SDN
::Zones
::get_zone
($zone_id, 1);
51 next if !$zone_config || $zone_config->{ipam
} ne 'pve' || !$zone_config->{dhcp
};
53 my $zone = $ipam_db->{zones
}->{$zone_id};
55 my $vnets = PVE
::Network
::SDN
::Zones
::get_vnets
($zone_id, 1);
57 for my $subnet_cidr (keys %{$zone->{subnets
}}) {
58 my $subnet = $zone->{subnets
}->{$subnet_cidr};
59 my $ip = new NetAddr
::IP
($subnet_cidr) or die 'Found invalid CIDR in IPAM';
62 for my $vnet_id (keys %$vnets) {
64 my ($zone, $subnetid, $subnet_cfg, $ip) = PVE
::Network
::SDN
::Vnets
::get_subnet_from_vnet_ip
(
69 $vnet = $subnet_cfg->{vnet
};
75 next if !$vnet || !$rpcenv->check_any($authuser, "/sdn/zones/$zone_id/$vnet", $privs, 1);
77 for my $ip (keys %{$subnet->{ips
}}) {
78 my $entry = $subnet->{ips
}->{$ip};
79 $entry->{zone
} = $zone_id;
80 $entry->{subnet
} = $subnet_cidr;
82 $entry->{vnet
} = $vnet;
84 push @$result, $entry;
93 __PACKAGE__-
>register_method ({
95 path
=> '{zone}/{vnet}/{mac}',
97 description
=> 'Delete DHCP Mappings in a VNet for a MAC address',
100 check
=> ['perm', '/sdn/zones/{zone}/{vnet}', [ 'SDN.Allocate' ]],
103 additionalProperties
=> 0,
105 zone
=> get_standard_option
('pve-sdn-zone-id'),
106 vnet
=> get_standard_option
('pve-sdn-vnet-id'),
107 mac
=> get_standard_option
('mac-addr'),
110 returns
=> { type
=> 'null' },
114 my $vnet = extract_param
($param, 'vnet');
115 my $mac = extract_param
($param, 'mac');
118 PVE
::Network
::SDN
::Vnets
::del_ips_from_mac
($vnet, $mac);
122 die "$error\n" if $error;
128 __PACKAGE__-
>register_method ({
129 name
=> 'dhcpcreate',
130 path
=> '{zone}/{vnet}/{mac}',
132 description
=> 'Create DHCP Mapping',
135 check
=> ['perm', '/sdn/zones/{zone}/{vnet}', [ 'SDN.Allocate' ]],
138 additionalProperties
=> 0,
140 zone
=> get_standard_option
('pve-sdn-zone-id'),
141 vnet
=> get_standard_option
('pve-sdn-vnet-id'),
142 mac
=> get_standard_option
('mac-addr'),
146 description
=> 'The IP address to associate with the given MAC address',
150 returns
=> { type
=> 'null' },
154 my $vnet = extract_param
($param, 'vnet');
155 my $mac = extract_param
($param, 'mac');
156 my $ip = extract_param
($param, 'ip');
158 PVE
::Network
::SDN
::Vnets
::add_ip
($vnet, $ip, '', $mac, undef);
163 __PACKAGE__-
>register_method ({
164 name
=> 'dhcpupdate',
165 path
=> '{zone}/{vnet}/{mac}',
167 description
=> 'Update DHCP Mapping',
170 check
=> ['perm', '/sdn/zones/{zone}/{vnet}', [ 'SDN.Allocate' ]],
173 additionalProperties
=> 0,
175 zone
=> get_standard_option
('pve-sdn-zone-id'),
176 vnet
=> get_standard_option
('pve-sdn-vnet-id'),
177 vmid
=> get_standard_option
('pve-vmid', {
180 mac
=> get_standard_option
('mac-addr'),
184 description
=> 'The IP address to associate with the given MAC address',
188 returns
=> { type
=> 'null' },
192 my $vnet = extract_param
($param, 'vnet');
193 my $mac = extract_param
($param, 'mac');
194 my $vmid = extract_param
($param, 'vmid');
195 my $ip = extract_param
($param, 'ip');
197 my ($old_ip4, $old_ip6) = PVE
::Network
::SDN
::Vnets
::del_ips_from_mac
($vnet, $mac, '');
200 PVE
::Network
::SDN
::Vnets
::add_ip
($vnet, $ip, '', $mac, $vmid);
205 PVE
::Network
::SDN
::Vnets
::add_ip
($vnet, $old_ip4, '', $mac, $vmid) if $old_ip4;
206 PVE
::Network
::SDN
::Vnets
::add_ip
($vnet, $old_ip6, '', $mac, $vmid) if $old_ip6;
209 die "$error\n" if $error;