]>
git.proxmox.com Git - pve-network.git/blob - src/PVE/API2/Network/SDN/Ipam.pm
e71ca7da151d72a332e9fc98c2d697857658c986
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');
117 PVE
::Network
::SDN
::Dhcp
::remove_mapping
($vnet, $mac);
120 PVE
::Network
::SDN
::Vnets
::del_ips_from_mac
($vnet, $mac);
124 PVE
::Network
::SDN
::Vnets
::add_dhcp_mapping
($vnet, $mac) if $error;
125 die "$error\n" if $error;
131 __PACKAGE__-
>register_method ({
132 name
=> 'dhcpcreate',
133 path
=> '{zone}/{vnet}/{mac}',
135 description
=> 'Create DHCP Mapping',
138 check
=> ['perm', '/sdn/zones/{zone}/{vnet}', [ 'SDN.Allocate' ]],
141 additionalProperties
=> 0,
143 zone
=> get_standard_option
('pve-sdn-zone-id'),
144 vnet
=> get_standard_option
('pve-sdn-vnet-id'),
145 mac
=> get_standard_option
('mac-addr'),
149 description
=> 'The IP address to associate with the given MAC address',
153 returns
=> { type
=> 'null' },
157 my $vnet = extract_param
($param, 'vnet');
158 my $mac = extract_param
($param, 'mac');
159 my $ip = extract_param
($param, 'ip');
161 PVE
::Network
::SDN
::Vnets
::add_ip
($vnet, $ip, '', $mac, undef);
162 PVE
::Network
::SDN
::Vnets
::add_dhcp_mapping
($vnet, $mac);
167 __PACKAGE__-
>register_method ({
168 name
=> 'dhcpupdate',
169 path
=> '{zone}/{vnet}/{mac}',
171 description
=> 'Update DHCP Mapping',
174 check
=> ['perm', '/sdn/zones/{zone}/{vnet}', [ 'SDN.Allocate' ]],
177 additionalProperties
=> 0,
179 zone
=> get_standard_option
('pve-sdn-zone-id'),
180 vnet
=> get_standard_option
('pve-sdn-vnet-id'),
181 vmid
=> get_standard_option
('pve-vmid', {
184 mac
=> get_standard_option
('mac-addr'),
188 description
=> 'The IP address to associate with the given MAC address',
192 returns
=> { type
=> 'null' },
196 my $vnet = extract_param
($param, 'vnet');
197 my $mac = extract_param
($param, 'mac');
198 my $vmid = extract_param
($param, 'vmid');
199 my $ip = extract_param
($param, 'ip');
201 PVE
::Network
::SDN
::Dhcp
::remove_mapping
($vnet, $mac);
202 my ($old_ip4, $old_ip6) = PVE
::Network
::SDN
::Vnets
::del_ips_from_mac
($vnet, $mac, '');
205 PVE
::Network
::SDN
::Vnets
::add_ip
($vnet, $ip, '', $mac, $vmid);
210 PVE
::Network
::SDN
::Vnets
::add_ip
($vnet, $old_ip4, '', $mac, $vmid) if $old_ip4;
211 PVE
::Network
::SDN
::Vnets
::add_ip
($vnet, $old_ip6, '', $mac, $vmid) if $old_ip6;
214 PVE
::Network
::SDN
::Vnets
::add_dhcp_mapping
($vnet, $mac);
216 die "$error\n" if $error;