]> git.proxmox.com Git - pve-network.git/commitdiff
ipam: improve update / delete behavior
authorStefan Hanreich <s.hanreich@proxmox.com>
Wed, 22 Nov 2023 12:29:50 +0000 (13:29 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 22 Nov 2023 13:14:29 +0000 (14:14 +0100)
Currently when updating or deleting a mapping in the IPAM we would
delete all existing entries in the IPAM with that mac address. Now we
only delete the specific entry we are updating / deleting.

Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com>
src/PVE/API2/Network/SDN/Ips.pm
src/PVE/Network/SDN/Subnets.pm

index 6989b9b8823d60fcba879b39cf75529830da5c36..0003b2aa2d82938954016cf09a425ee92753de2f 100644 (file)
@@ -28,6 +28,11 @@ __PACKAGE__->register_method ({
            zone => get_standard_option('pve-sdn-zone-id'),
            vnet => get_standard_option('pve-sdn-vnet-id'),
            mac => get_standard_option('mac-addr'),
+           ip => {
+               type => 'string',
+               format => 'ip',
+               description => 'The IP address to delete',
+           },
        },
     },
     returns => { type => 'null' },
@@ -36,13 +41,12 @@ __PACKAGE__->register_method ({
 
        my $vnet = extract_param($param, 'vnet');
        my $mac = extract_param($param, 'mac');
+       my $ip = extract_param($param, 'ip');
 
        eval {
-           PVE::Network::SDN::Vnets::del_ips_from_mac($vnet, $mac);
+           PVE::Network::SDN::Vnets::del_ip($vnet, $ip, '', $mac);
        };
-       my $error = $@;
-
-       die "$error\n" if $error;
+       die "$@\n" if $@;
 
        return undef;
     },
@@ -117,7 +121,10 @@ __PACKAGE__->register_method ({
        my $vmid = extract_param($param, 'vmid');
        my $ip = extract_param($param, 'ip');
 
-       my ($old_ip4, $old_ip6) = PVE::Network::SDN::Vnets::del_ips_from_mac($vnet, $mac, '');
+       my ($old_ip4, $old_ip6) = PVE::Network::SDN::Vnets::get_ips_from_mac($vnet, $mac);
+       my $old_ip = (Net::IP::ip_get_version($ip) == 4) ? $old_ip4 : $old_ip6;
+
+       PVE::Network::SDN::Vnets::del_ip($vnet, $old_ip, '', $mac);
 
        eval {
            PVE::Network::SDN::Vnets::add_ip($vnet, $ip, '', $mac, $vmid);
@@ -125,8 +132,7 @@ __PACKAGE__->register_method ({
        my $error = $@;
 
        if ($error) {
-           PVE::Network::SDN::Vnets::add_ip($vnet, $old_ip4, '', $mac, $vmid) if $old_ip4;
-           PVE::Network::SDN::Vnets::add_ip($vnet, $old_ip6, '', $mac, $vmid) if $old_ip6;
+           PVE::Network::SDN::Vnets::add_ip($vnet, $old_ip, '', $mac, $vmid);
        }
 
        die "$error\n" if $error;
index b1885c5a0d8ddb0b7eb61ddf0b84f7a7e84f9e24..3b08dcd50c70e6d37b050e2a939cd0b173700a5d 100644 (file)
@@ -305,6 +305,9 @@ sub add_ip {
            $plugin->add_ip($plugin_config, $subnetid, $subnet, $ip, $hostname, $mac, $vmid, $is_gateway);
        };
        die $@ if $@;
+
+       eval { PVE::Network::SDN::Ipams::add_cache_mac_ip($mac, $ip) if $mac; };
+       warn $@ if $@;
     }
 
     eval {