]> git.proxmox.com Git - pve-container.git/commitdiff
nic hotplug : add|del ips in ipam
authorAlexandre Derumier <aderumier@odiso.com>
Fri, 17 Nov 2023 11:40:05 +0000 (12:40 +0100)
committerWolfgang Bumiller <w.bumiller@proxmox.com>
Tue, 21 Nov 2023 08:25:58 +0000 (09:25 +0100)
Co-Authored-by: Stefan Hanreich <s.hanreich@proxmox.com>
Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
src/PVE/LXC.pm
src/PVE/LXC/Config.pm

index 8f53b53044dce7601bf4c7bf77a1129ef6af4915..b6df6d62cf58875e461faa5a153b116ca64bdf08 100644 (file)
@@ -961,6 +961,12 @@ sub update_net {
            safe_string_ne($oldnet->{name}, $newnet->{name})) {
 
            PVE::Network::veth_delete($veth);
+
+           if ($have_sdn) {
+               eval { PVE::Network::SDN::Vnets::del_ips_from_mac($oldnet->{bridge}, $oldnet->{hwaddr}, $conf->{hostname}) };
+               warn $@ if $@;
+           }
+
            delete $conf->{$opt};
            PVE::LXC::Config->write_config($vmid, $conf);
 
@@ -974,14 +980,23 @@ sub update_net {
            ) {
 
                if ($oldnet->{bridge}) {
+
                    PVE::Network::tap_unplug($veth);
                    foreach (qw(bridge tag firewall)) {
                        delete $oldnet->{$_};
                    }
                    $conf->{$opt} = PVE::LXC::Config->print_lxc_network($oldnet);
                    PVE::LXC::Config->write_config($vmid, $conf);
+
+                   if ($have_sdn) {
+                       eval { PVE::Network::SDN::Vnets::del_ips_from_mac($oldnet->{bridge}, $oldnet->{hwaddr}, $conf->{hostname}) };
+                       warn $@ if $@;
+                   }
                }
 
+               if ($have_sdn) {
+                   PVE::Network::SDN::Vnets::add_next_free_cidr($newnet->{bridge}, $conf->{hostname}, $newnet->{hwaddr}, $vmid, undef, 1);
+               }
                PVE::LXC::net_tap_plug($veth, $newnet);
 
                # This includes the rate:
@@ -1012,6 +1027,8 @@ sub hotplug_net {
     my $eth = $newnet->{name};
 
     if ($have_sdn) {
+       PVE::Network::SDN::Vnets::add_next_free_cidr($newnet->{bridge}, $conf->{hostname}, $newnet->{hwaddr}, $vmid, undef, 1);
+       PVE::Network::SDN::Vnets::add_dhcp_mapping($newnet->{bridge}, $newnet->{hwaddr});
        PVE::Network::SDN::Zones::veth_create($veth, $vethpeer, $newnet->{bridge}, $newnet->{hwaddr});
     } else {
        PVE::Network::veth_create($veth, $vethpeer, $newnet->{bridge}, $newnet->{hwaddr});
index 56e1f1047c3521b0958a64e3adfb95e59a288c3a..c884313b5213aa18e0a6d0a40cd0e4e896dd3fca 100644 (file)
@@ -22,6 +22,12 @@ use constant {
     FITHAW   => 0xc0045878,
 };
 
+my $have_sdn;
+eval {
+    require PVE::Network::SDN::Vnets;
+    $have_sdn = 1;
+};
+
 my $nodename = PVE::INotify::nodename();
 my $lock_handles =  {};
 my $lockdir = "/run/lock/lxc";
@@ -1383,6 +1389,12 @@ sub vmconfig_hotplug_pending {
            } elsif ($opt =~ m/^net(\d)$/) {
                my $netid = $1;
                PVE::Network::veth_delete("veth${vmid}i$netid");
+               if ($have_sdn) {
+                   my $net = PVE::LXC::Config->parse_lxc_network($conf->{$opt});
+                   print "delete ips from $opt\n";
+                   eval { PVE::Network::SDN::Vnets::del_ips_from_mac($net->{bridge}, $net->{hwaddr}, $conf->{hostname}) };
+                   warn $@ if $@;
+               }
            } else {
                die "skip\n"; # skip non-hotpluggable opts
            }