SPAM: [PATCH pve-network 14/16] ipam: nautobot: hacky ip range support
Lou Lecrivain
lou.lecrivain at wdz.de
Wed Nov 27 17:18:01 CET 2024
since nautobot lacks support for IP ranges,
this feature could be dropped / marked unsupported
Signed-off-by: lou lecrivain <lou.lecrivain at wdz.de>
---
src/PVE/Network/SDN/Ipams/NautobotPlugin.pm | 26 ++++++++++++++++-----
1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/src/PVE/Network/SDN/Ipams/NautobotPlugin.pm b/src/PVE/Network/SDN/Ipams/NautobotPlugin.pm
index bf9d34a..95e749c 100644
--- a/src/PVE/Network/SDN/Ipams/NautobotPlugin.pm
+++ b/src/PVE/Network/SDN/Ipams/NautobotPlugin.pm
@@ -104,15 +104,22 @@ sub add_range_next_freeip {
my $headers = default_headers($plugin_config);
my $cidr = $subnet->{cidr};
- my $range_offset = NetAddr::IP->new($range->{'start-address'}) - NetAddr::IP->new($cidr);
+ my $minimal_size = NetAddr::IP->new($range->{'start-address'}) - NetAddr::IP->new($cidr);
my $internalid = PVE::Network::SDN::Ipams::NetboxPlugin::get_prefix_id($url, $cidr, $headers);
- my $params = { offset => $range_offset };
eval {
- my $result = PVE::Network::SDN::api_request("POST", "$url/ipam/prefixes/$internalid/available-ips/", $headers, $params);
- my ($ip, undef) = split(/\//, @{$result}[0]->{address});
- print "found free ip $ip in range $range->{'start-address'}-$range->{'end-address'}\n" if $ip;
- return $ip
+ my $result = PVE::Network::SDN::api_request("GET", "$url/ipam/prefixes/$internalid/available-ips/?limit=$minimal_size", $headers);
+ # v important for NetAddr::IP comparison!
+ my @ips = map((split(/\//,$_->{address}))[0], @{$result});
+ # get 1st result
+ my $ip = (get_ips_within_range($range->{'start-address'}, $range->{'end-address'}, @ips))[0];
+
+ if ($ip) {
+ print "found free ip $ip in range $range->{'start-address'}-$range->{'end-address'}\n"
+ } else { die "prefix out of space in range"; }
+
+ $class->add_ip($plugin_config, undef, $subnet, $ip, $data->{hostname}, $data->{mac}, undef, 0, 0);
+ return $ip;
};
if ($@) {
@@ -199,6 +206,13 @@ sub on_update_hook {
}
# helpers
+sub get_ips_within_range {
+ my ($start_address, $end_address, @list) = @_;
+ $start_address = NetAddr::IP->new($start_address);
+ $end_address = NetAddr::IP->new($end_address);
+ return grep($start_address <= NetAddr::IP->new($_) <= $end_address, @list);
+}
+
sub get_namespace_id {
my ($url, $namespace, $headers) = @_;
--
2.39.5
More information about the pve-devel
mailing list