--- PVE/Network/SDN/Vnets.pm | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
diff --git a/PVE/Network/SDN/Vnets.pm b/PVE/Network/SDN/Vnets.pm index 0de3fd5..07bc9ff 100644 --- a/PVE/Network/SDN/Vnets.pm +++ b/PVE/Network/SDN/Vnets.pm @@ -4,7 +4,9 @@ use strict; use warnings; use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file); +use PVE::Exception qw(raise_param_exc raise_perm_exc raise); use Net::IP; +use Net::Subnet qw(subnet_matcher); use PVE::Network::SDN::Subnets; use PVE::Network::SDN::Ipams; @@ -86,4 +88,35 @@ sub get_next_free_ip { return $subnet; } +sub add_ip { + my ($vnetid, $cidr, $name) = @_; + + my $vnets_cfg = PVE::Network::SDN::Vnets::config(); + my $subnets_cfg = PVE::Network::SDN::Subnets::config(); + my $vnet = $vnets_cfg->{ids}->{$vnetid}; + my @subnets = PVE::Tools::split_list($vnet->{subnets}) if $vnet->{subnets}; + my $subnet = undef; + my $subnetid = undef; + my ($ip, $mask) = split(/\//, $cidr); + + foreach my $s (@subnets) { + my $subnet_matcher = subnet_matcher($s); + next if !$subnet_matcher->($ip); + $subnetid = $s =~ s/\//-/r; + $subnet = $subnets_cfg->{ids}->{$subnetid}; + last; + } + raise_param_exc({'ip' => "can't find any subnet attached to vnet $vnetid for ip $ip"}) if !$subnet; + return if !$subnet->{ipam}; + + eval { + my $ipamid = $subnet->{ipam}; + my $ipam_cfg = PVE::Network::SDN::Ipams::config(); + my $plugin_config = $ipam_cfg->{ids}->{$ipamid}; + my $plugin = PVE::Network::SDN::Ipams::Plugin->lookup($plugin_config->{type}); + $plugin->add_ip($plugin_config, $subnetid, $ip); + }; + raise_param_exc({'ip' => $@}) if $@; +} + 1; -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel