mirror of
https://git.proxmox.com/git/qemu-server
synced 2025-10-04 17:01:46 +00:00
vmnic add|remove : add|del ip in ipam
Co-Authored-by: Stefan Lendl <s.lendl@proxmox.com> Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com> Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
This commit is contained in:
parent
2c651d846f
commit
c944fef885
@ -64,6 +64,7 @@ use PVE::QemuServer::USB;
|
|||||||
my $have_sdn;
|
my $have_sdn;
|
||||||
eval {
|
eval {
|
||||||
require PVE::Network::SDN::Zones;
|
require PVE::Network::SDN::Zones;
|
||||||
|
require PVE::Network::SDN::Vnets;
|
||||||
$have_sdn = 1;
|
$have_sdn = 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -5028,6 +5029,10 @@ sub vmconfig_hotplug_pending {
|
|||||||
} elsif ($opt =~ m/^net(\d+)$/) {
|
} elsif ($opt =~ m/^net(\d+)$/) {
|
||||||
die "skip\n" if !$hotplug_features->{network};
|
die "skip\n" if !$hotplug_features->{network};
|
||||||
vm_deviceunplug($vmid, $conf, $opt);
|
vm_deviceunplug($vmid, $conf, $opt);
|
||||||
|
if($have_sdn) {
|
||||||
|
my $net = PVE::QemuServer::parse_net($conf->{$opt});
|
||||||
|
PVE::Network::SDN::Vnets::del_ips_from_mac($net->{bridge}, $net->{macaddr}, $conf->{name});
|
||||||
|
}
|
||||||
} elsif (is_valid_drivename($opt)) {
|
} elsif (is_valid_drivename($opt)) {
|
||||||
die "skip\n" if !$hotplug_features->{disk} || $opt =~ m/(ide|sata)(\d+)/;
|
die "skip\n" if !$hotplug_features->{disk} || $opt =~ m/(ide|sata)(\d+)/;
|
||||||
vm_deviceunplug($vmid, $conf, $opt);
|
vm_deviceunplug($vmid, $conf, $opt);
|
||||||
@ -5233,6 +5238,12 @@ sub vmconfig_apply_pending {
|
|||||||
die "internal error";
|
die "internal error";
|
||||||
} elsif (defined($conf->{$opt}) && is_valid_drivename($opt)) {
|
} elsif (defined($conf->{$opt}) && is_valid_drivename($opt)) {
|
||||||
vmconfig_delete_or_detach_drive($vmid, $storecfg, $conf, $opt, $force);
|
vmconfig_delete_or_detach_drive($vmid, $storecfg, $conf, $opt, $force);
|
||||||
|
} elsif (defined($conf->{$opt}) && $opt =~ m/^net\d+$/) {
|
||||||
|
if($have_sdn) {
|
||||||
|
my $net = PVE::QemuServer::parse_net($conf->{$opt});
|
||||||
|
eval { PVE::Network::SDN::Vnets::del_ips_from_mac($net->{bridge}, $net->{macaddr}, $conf->{name}) };
|
||||||
|
warn if $@;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (my $err = $@) {
|
if (my $err = $@) {
|
||||||
@ -5252,6 +5263,20 @@ sub vmconfig_apply_pending {
|
|||||||
eval {
|
eval {
|
||||||
if (defined($conf->{$opt}) && is_valid_drivename($opt)) {
|
if (defined($conf->{$opt}) && is_valid_drivename($opt)) {
|
||||||
vmconfig_register_unused_drive($storecfg, $vmid, $conf, parse_drive($opt, $conf->{$opt}))
|
vmconfig_register_unused_drive($storecfg, $vmid, $conf, parse_drive($opt, $conf->{$opt}))
|
||||||
|
} elsif (defined($conf->{pending}->{$opt}) && $opt =~ m/^net\d+$/) {
|
||||||
|
if($have_sdn) {
|
||||||
|
my $new_net = PVE::QemuServer::parse_net($conf->{pending}->{$opt});
|
||||||
|
if ($conf->{$opt}){
|
||||||
|
my $old_net = PVE::QemuServer::parse_net($conf->{$opt});
|
||||||
|
|
||||||
|
if ($old_net->{bridge} ne $new_net->{bridge} ||
|
||||||
|
$old_net->{macaddr} ne $new_net->{macaddr}) {
|
||||||
|
PVE::Network::SDN::Vnets::del_ips_from_mac($old_net->{bridge}, $old_net->{macaddr}, $conf->{name});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#fixme: reuse ip if mac change && same bridge
|
||||||
|
PVE::Network::SDN::Vnets::add_next_free_cidr($new_net->{bridge}, $conf->{name}, $new_net->{macaddr}, $vmid, undef, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (my $err = $@) {
|
if (my $err = $@) {
|
||||||
@ -5295,6 +5320,11 @@ sub vmconfig_update_net {
|
|||||||
# for non online change, we try to hot-unplug
|
# for non online change, we try to hot-unplug
|
||||||
die "skip\n" if !$hotplug;
|
die "skip\n" if !$hotplug;
|
||||||
vm_deviceunplug($vmid, $conf, $opt);
|
vm_deviceunplug($vmid, $conf, $opt);
|
||||||
|
|
||||||
|
if($have_sdn) {
|
||||||
|
PVE::Network::SDN::Vnets::del_ips_from_mac($oldnet->{bridge}, $oldnet->{macaddr}, $conf->{name});
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
die "internal error" if $opt !~ m/net(\d+)/;
|
die "internal error" if $opt !~ m/net(\d+)/;
|
||||||
@ -5306,6 +5336,13 @@ sub vmconfig_update_net {
|
|||||||
safe_num_ne($oldnet->{firewall}, $newnet->{firewall})) {
|
safe_num_ne($oldnet->{firewall}, $newnet->{firewall})) {
|
||||||
PVE::Network::tap_unplug($iface);
|
PVE::Network::tap_unplug($iface);
|
||||||
|
|
||||||
|
if (safe_string_ne($oldnet->{bridge}, $newnet->{bridge})) {
|
||||||
|
if ($have_sdn) {
|
||||||
|
PVE::Network::SDN::Vnets::del_ips_from_mac($oldnet->{bridge}, $oldnet->{macaddr}, $conf->{name});
|
||||||
|
PVE::Network::SDN::Vnets::add_next_free_cidr($newnet->{bridge}, $conf->{name}, $newnet->{macaddr}, $vmid, undef, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ($have_sdn) {
|
if ($have_sdn) {
|
||||||
PVE::Network::SDN::Zones::tap_plug($iface, $newnet->{bridge}, $newnet->{tag}, $newnet->{firewall}, $newnet->{trunks}, $newnet->{rate});
|
PVE::Network::SDN::Zones::tap_plug($iface, $newnet->{bridge}, $newnet->{tag}, $newnet->{firewall}, $newnet->{trunks}, $newnet->{rate});
|
||||||
} else {
|
} else {
|
||||||
@ -5326,6 +5363,9 @@ sub vmconfig_update_net {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($hotplug) {
|
if ($hotplug) {
|
||||||
|
if ($have_sdn) {
|
||||||
|
PVE::Network::SDN::Vnets::add_next_free_cidr($newnet->{bridge}, $conf->{name}, $newnet->{macaddr}, $vmid, undef, 1);
|
||||||
|
}
|
||||||
vm_deviceplug($storecfg, $conf, $vmid, $opt, $newnet, $arch, $machine_type);
|
vm_deviceplug($storecfg, $conf, $vmid, $opt, $newnet, $arch, $machine_type);
|
||||||
} else {
|
} else {
|
||||||
die "skip\n";
|
die "skip\n";
|
||||||
|
Loading…
Reference in New Issue
Block a user