2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2026-08-03 16:06:59 +00:00

fix(dhcp): preserve Kea reservations on makedhcp -n

(cherry picked from commit 781d5e4163)
This commit is contained in:
Vinícius Ferrão
2026-07-31 15:18:43 -03:00
committed by github-actions[bot]
parent 9f45309138
commit 1817ef78c9
2 changed files with 54 additions and 0 deletions
+36
View File
@@ -630,6 +630,42 @@ sub query_reservations {
return \@found;
}
sub preserve_reservations {
my ( $self, $config, $intent ) = @_;
my $target_subnets = $intent->{subnets} || [];
return $intent unless @$target_subnets;
my $target_config = $config->{Dhcp6}
? { Dhcp6 => { subnet6 => $target_subnets } }
: { Dhcp4 => { subnet4 => $target_subnets } };
foreach my $source_subnet ( _subnets_for_config($config) ) {
foreach my $reservation ( @{ $source_subnet->{reservations} || [] } ) {
my $ip = $reservation->{'ip-address'};
$ip = $reservation->{'ip-addresses'}[0]
if !$ip && ref( $reservation->{'ip-addresses'} ) eq 'ARRAY';
my $target_subnet;
if ($ip) {
my $subnet_id = $self->subnet_id_for_ip( $target_config, $ip );
$target_subnet = _find_subnet_by_id( $target_config, $subnet_id ) if defined($subnet_id);
}
if ( !$target_subnet && $source_subnet->{subnet} ) {
($target_subnet) = grep {
( $_->{subnet} || '' ) eq $source_subnet->{subnet}
} @$target_subnets;
}
next unless $target_subnet;
$target_subnet->{reservations} ||= [];
push @{ $target_subnet->{reservations} }, { %$reservation };
}
}
return $intent;
}
sub subnet_id_for_ip {
my ( $self, $config, $ip ) = @_;
+18
View File
@@ -2380,6 +2380,24 @@ sub kea_process_request
}
if ($opt->{n}) {
my $loaded4 = $backend->load_dhcp4_config();
if ($loaded4->{error}) {
$callback->({ error => [ $loaded4->{error} ], errorcode => [1] });
flock($dhcplockfd, LOCK_UN);
return;
}
$backend->preserve_reservations($loaded4, $intent4);
if ($using_dhcp6) {
my $loaded6 = $backend->load_dhcp6_config();
if ($loaded6->{error}) {
$callback->({ error => [ $loaded6->{error} ], errorcode => [1] });
flock($dhcplockfd, LOCK_UN);
return;
}
$backend->preserve_reservations($loaded6, $intent6);
}
my $result = $backend->write_dhcp4_config($intent4, backup_existing => 1);
if ($result->{error}) {
$callback->({ error => [ $result->{error} ], errorcode => [1] });