summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/PVE/Network/SDN/Ipams/NetboxPlugin.pm32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/PVE/Network/SDN/Ipams/NetboxPlugin.pm b/src/PVE/Network/SDN/Ipams/NetboxPlugin.pm
index 56a1787..f0b70fd 100644
--- a/src/PVE/Network/SDN/Ipams/NetboxPlugin.pm
+++ b/src/PVE/Network/SDN/Ipams/NetboxPlugin.pm
@@ -71,7 +71,22 @@ sub del_subnet {
my $internalid = get_prefix_id($plugin_config, $cidr, $noerr);
- return; #fixme: check that prefix is empty exluding gateway, before delete
+ # definedness check, because ID could be 0
+ if (!defined($internalid)) {
+ warn "could not find id for ip prefix $cidr";
+ return;
+ }
+
+ if (!is_prefix_empty($plugin_config, $cidr, $noerr)) {
+ return if $noerr;
+ die "not deleting prefix $cidr because it still contains entries";
+ }
+
+ # last IP is assumed to be the gateway, delete it
+ if (!$class->del_ip($plugin_config, $subnetid, $subnet, $subnet->{gateway}, $noerr)) {
+ return if $noerr;
+ die "could not delete gateway ip from subnet $subnetid";
+ }
eval {
netbox_api_request($plugin_config, "DELETE", "/ipam/prefixes/$internalid/");
@@ -217,6 +232,8 @@ sub del_ip {
if ($@) {
die "error delete ip $ip : $@" if !$noerr;
}
+
+ return 1;
}
sub get_ips_from_mac {
@@ -324,6 +341,19 @@ sub is_ip_gateway {
return $is_gateway;
}
+sub is_prefix_empty {
+ my ($config, $cidr, $noerr) = @_;
+
+ my $result = eval { netbox_api_request($config, "GET", "/ipam/ip-addresses/?parent=$cidr") };
+ if ($@) {
+ return if $noerr;
+ die "could not query children for prefix $cidr: $@";
+ }
+
+ # checking against 1, because we do not count the gateway
+ return scalar(@{$result->{results}}) <= 1;
+}
+
1;