diff --git a/src/PVE/Network/SDN/Ipams/NetboxPlugin.pm b/src/PVE/Network/SDN/Ipams/NetboxPlugin.pm index 2fa975f..af9be25 100644 --- a/src/PVE/Network/SDN/Ipams/NetboxPlugin.pm +++ b/src/PVE/Network/SDN/Ipams/NetboxPlugin.pm @@ -40,6 +40,33 @@ sub netbox_api_request { ); } +sub add_dhcp_range { + my ($config, $dhcp_range, $noerr) = @_; + + my $result = eval { + netbox_api_request($config, "POST", "/ipam/ip-ranges/", { + start_address => $dhcp_range->{'start-address'}, + end_address => $dhcp_range->{'end-address'}, + }); + }; + if ($@) { + return if $noerr; + die "could not create ip range $dhcp_range->{'start-address'}:$dhcp_range->{'end-address'}: $@"; + } + + return $result->{id}; +} + +sub del_dhcp_range { + my ($config, $id, $noerr) = @_; + + eval { + netbox_api_request($config, "DELETE", "/ipam/ip-ranges/$id/"); + }; + + die "could not create dhcp range: $@" if $@ && !$noerr; +} + # Plugin implementation sub add_subnet { @@ -62,6 +89,11 @@ sub add_subnet { return if $noerr; die "error adding subnet to ipam: $@"; } + + my $dhcp_ranges = PVE::Network::SDN::Subnets::get_dhcp_ranges($subnet); + for my $dhcp_range (@$dhcp_ranges) { + add_dhcp_range($plugin_config, $dhcp_range, $noerr); + } } sub del_subnet { @@ -88,6 +120,19 @@ sub del_subnet { die "could not delete gateway ip from subnet $subnetid"; } + my $dhcp_ranges = PVE::Network::SDN::Subnets::get_dhcp_ranges($subnet); + for my $dhcp_range (@$dhcp_ranges) { + my $internalid = get_iprange_id($plugin_config, $dhcp_range, $noerr); + + # definedness check, because ID could be 0 + if (!defined($internalid)) { + warn "could not find id for ip range $dhcp_range->{'start-address'}:$dhcp_range->{'end-address'}"; + next; + } + + del_dhcp_range($plugin_config, $internalid, $noerr); + } + eval { netbox_api_request($plugin_config, "DELETE", "/ipam/prefixes/$internalid/"); };