* [pve-devel] [PATCH] POC v3: add/del/update ip from vnet-subnet-ipam
@ 2020-10-05 15:11 Alexandre Derumier
0 siblings, 0 replies; only message in thread
From: Alexandre Derumier @ 2020-10-05 15:11 UTC (permalink / raw)
To: pve-devel
This is a POC to call ip to retreive ip address from ipam.
(it's really just a poc && buggy , it need to be improve for vnet changes, pending config apply/revert,...)
Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
---
src/PVE/LXC/Config.pm | 107 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 106 insertions(+), 1 deletion(-)
diff --git a/src/PVE/LXC/Config.pm b/src/PVE/LXC/Config.pm
index 49f599b..10ae3d1 100644
--- a/src/PVE/LXC/Config.pm
+++ b/src/PVE/LXC/Config.pm
@@ -11,6 +11,14 @@ use PVE::INotify;
use PVE::JSONSchema qw(get_standard_option);
use PVE::Tools;
+my $have_sdn;
+eval {
+ require PVE::Network::SDN::Vnets;
+ require PVE::Network::SDN::Subnets;
+ $have_sdn = 1;
+};
+
+
use base qw(PVE::AbstractConfig);
my $nodename = PVE::INotify::nodename();
@@ -1151,7 +1159,6 @@ sub parse_lxc_network {
my $dc = PVE::Cluster::cfs_read_file('datacenter.cfg');
$res->{hwaddr} = PVE::Tools::random_ether_addr($dc->{mac_prefix});
}
-
return $res;
}
@@ -1231,6 +1238,8 @@ sub vmconfig_hotplug_pending {
$cgroup->change_cpu_shares(undef, $confdesc->{cpuunits}->{default});
} elsif ($opt =~ m/^net(\d)$/) {
my $netid = $1;
+ my $net = $class->parse_lxc_network($conf->{$opt});
+ delete_net_ip($conf->{hostname}, $net);
PVE::Network::veth_delete("veth${vmid}i$netid");
} else {
die "skip\n"; # skip non-hotpluggable opts
@@ -1257,6 +1266,7 @@ sub vmconfig_hotplug_pending {
} elsif ($opt =~ m/^net(\d+)$/) {
my $netid = $1;
my $net = $class->parse_lxc_network($value);
+ update_net_ip($conf->{hostname}, $net, undef, "vm:$vmid net:$netid");
$value = $class->print_lxc_network($net);
PVE::LXC::update_net($vmid, $conf, $opt, $net, $netid, $rootdir);
} elsif ($opt eq 'memory' || $opt eq 'swap') {
@@ -1333,6 +1343,8 @@ sub vmconfig_apply_pending {
} elsif ($opt =~ m/^net(\d+)$/) {
my $netid = $1;
my $net = $class->parse_lxc_network($conf->{pending}->{$opt});
+ my $oldnet = $class->parse_lxc_network($conf->{$opt});
+ update_net_ip($conf->{hostname}, $net, $oldnet, "vm:$vmid net:$netid");
$conf->{pending}->{$opt} = $class->print_lxc_network($net);
}
};
@@ -1596,4 +1608,97 @@ sub get_backup_volumes {
return $return_volumes;
}
+sub update_net_ip {
+ my ($hostname, $net, $oldnet, $description) = @_;
+
+ return if !$have_sdn;
+
+ my $oldbridge = $oldnet->{bridge};
+ my $bridge = $net->{bridge};
+
+ my $subnets = PVE::Network::SDN::Vnets::get_subnets($bridge);
+
+ return if !keys %{$subnets};
+
+ #delete old ip
+ if ($oldnet->{ip} && $oldnet->{ip} ne 'dhcp' && $oldnet->{ip} ne 'manual') {
+ my $deletebridge = $oldbridge ne $bridge ? $oldbridge : $bridge;
+ eval {
+ PVE::Network::SDN::Vnets::del_cidr($deletebridge, $oldnet->{ip}, $hostname, $description) if !$net->{ip} || $net->{ip} ne $oldnet->{ip};
+ #writeconfig ?
+ };
+ warn $@ if $@;
+ }
+
+ eval {
+ if (!$net->{ip}) {
+ $net->{ip} = PVE::Network::SDN::Vnets::get_next_free_cidr($bridge, $hostname, $description);
+ #writeconfig ?
+ } elsif ($net->{ip} ne 'dhcp' && $net->{ip} ne 'manual') {
+ PVE::Network::SDN::Vnets::add_cidr($bridge, $net->{ip}, $hostname, $description) if $net->{ip} ne $oldnet->{ip};
+ #writeconfig ?
+ }
+ };
+ if ($@) {
+ #empty ip if error
+ $net->{ip} = '';
+ die $@;
+ }
+
+ #delete old ip6
+ if ($oldnet->{ip6} && $oldnet->{ip6} ne 'dhcp' && $oldnet->{ip6} ne 'manual' && $net->{ip6} ne 'auto') {
+ my $deletebridge = $oldbridge ne $bridge ? $oldbridge : $bridge;
+ eval {
+ PVE::Network::SDN::Vnets::del_cidr($deletebridge, $oldnet->{ip6}, $hostname) if !$net->{ip6} || $net->{ip6} ne $oldnet->{ip6};
+ #writeconfig ?
+ };
+ warn $@ if $@;
+ }
+
+ eval {
+ if (!$net->{ip6}) {
+
+ $net->{ip6} = PVE::Network::SDN::Vnets::get_next_free_cidr($bridge, $hostname, $description, 6);
+ #writeconfig ?
+ } elsif ($net->{ip6} ne 'dhcp' && $net->{ip6} ne 'manual' && $net->{ip6} ne 'auto') {
+ PVE::Network::SDN::Vnets::add_cidr($bridge, $net->{ip6}, $hostname, $description) if $net->{ip6} ne $oldnet->{ip6};
+ #writeconfig ?
+ }
+ };
+ if ($@) {
+ #empty ip if error
+ $net->{ip6} = '';
+ die $@;
+ }
+
+ if ($net->{ip}) {
+ my ($ip, $mask) = split(/\//, $net->{ip});
+ my ($subnetidv4, $subnetv4) = PVE::Network::SDN::Subnets::find_ip_subnet($ip, $mask, $subnets);
+ $net->{gw} = $subnetv4->{gateway} if $subnetv4->{gateway};
+ }
+
+ if ($net->{ip6}) {
+ my ($ip6, $mask6) = split(/\//, $net->{ip6});
+ my ($subnetidv6, $subnetv6) = PVE::Network::SDN::Subnets::find_ip_subnet($ip6, $mask6, $subnets);
+ $net->{gw6} = $subnetv6->{gateway} if $subnetv6->{gateway};
+ }
+
+}
+
+sub delete_net_ip {
+ my ($hostname, $net) = @_;
+
+ return if !$have_sdn;
+
+ my $bridge = $net->{bridge};
+ my $subnets = PVE::Network::SDN::Vnets::get_subnets($bridge);
+ return if !keys %{$subnets};
+
+ if ($net->{ip6} && ($net->{ip6} eq 'auto' || $net->{ip6} eq 'manual' || $net->{ip6} eq 'dhcp')) {
+ PVE::Network::SDN::Vnets::del_cidr($hostname, $bridge, $net->{ip6});
+ } elsif ($net->{ip} && $net->{ip} ne 'dhcp' && $net->{ip} ne 'manual') {
+ PVE::Network::SDN::Vnets::del_cidr($hostname, $bridge, $net->{ip});
+ }
+}
+
1;
--
2.20.1
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2020-10-05 15:11 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-05 15:11 [pve-devel] [PATCH] POC v3: add/del/update ip from vnet-subnet-ipam Alexandre Derumier
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal