2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2026-09-04 20:17:55 +00:00

fix(dhcp): normalize all Kea option flags

Render the boolean fields in global and subnet option-data through the same policy already used for client classes, for both DHCPv4 and DHCPv6.
This commit is contained in:
Vinícius Ferrão
2026-08-26 19:31:52 -03:00
parent 4d0c96a78c
commit f41d5e6cd1
+38 -10
View File
@@ -89,7 +89,8 @@ sub render_dhcp4_config {
$dhcp4{'hooks-libraries'} = $intent->{'hooks-libraries'} if $intent->{'hooks-libraries'};
$dhcp4{'option-def'} = $intent->{'option-def'} if $intent->{'option-def'};
$dhcp4{'client-classes'} = [ map { $self->_render_client_class($_) } @{ $intent->{'client-classes'} } ] if $intent->{'client-classes'};
$dhcp4{'option-data'} = $intent->{'option-data'} if $intent->{'option-data'};
$dhcp4{'option-data'} = _render_option_data( $intent->{'option-data'} )
if $intent->{'option-data'};
$dhcp4{'dhcp-ddns'} = $intent->{'dhcp-ddns'} if $intent->{'dhcp-ddns'};
foreach my $field (qw/ddns-send-updates ddns-override-no-update ddns-override-client-update ddns-qualifying-suffix ddns-update-on-renew/) {
$dhcp4{$field} = $intent->{$field} if exists $intent->{$field};
@@ -119,7 +120,8 @@ sub render_dhcp6_config {
$dhcp6{'control-socket'} = $intent->{'control-socket'} if $intent->{'control-socket'};
$dhcp6{'hooks-libraries'} = $intent->{'hooks-libraries'} if $intent->{'hooks-libraries'};
$dhcp6{'option-data'} = $intent->{'option-data'} if $intent->{'option-data'};
$dhcp6{'option-data'} = _render_option_data( $intent->{'option-data'} )
if $intent->{'option-data'};
$dhcp6{'dhcp-ddns'} = $intent->{'dhcp-ddns'} if $intent->{'dhcp-ddns'};
foreach my $field (qw/ddns-send-updates ddns-override-no-update ddns-override-client-update ddns-qualifying-suffix ddns-update-on-renew/) {
$dhcp6{$field} = $intent->{$field} if exists $intent->{$field};
@@ -696,11 +698,11 @@ sub live_upsert_reservations {
my $delete = $self->_live_delete_reservation($reservation, service => $service, ignore_not_found => 1);
return $delete if $delete->{error};
my %stored = %$reservation;
my ($stored) = @{ _render_entry_option_data( [$reservation] ) };
my $result = $self->control_agent_command(
'reservation-add',
{
reservation => \%stored,
reservation => $stored,
'operation-target' => 'memory',
},
service => $service,
@@ -767,7 +769,9 @@ sub _render_subnet4 {
$rendered{interface} = $subnet->{interface} if defined $subnet->{interface};
$rendered{'next-server'} = _first_defined( $subnet->{'next-server'}, $subnet->{next_server} );
$rendered{'boot-file-name'} = _first_defined( $subnet->{'boot-file-name'}, $subnet->{boot_file_name} );
$rendered{'option-data'} = _first_defined( $subnet->{'option-data'}, $subnet->{option_data} );
$rendered{'option-data'} = _render_option_data(
_first_defined( $subnet->{'option-data'}, $subnet->{option_data} )
);
my $additional_classes = _first_defined(
$subnet->{additional_client_classes},
$subnet->{'evaluate-additional-classes'},
@@ -776,13 +780,14 @@ sub _render_subnet4 {
$subnet->{require_client_classes},
);
$rendered{ $self->_additional_class_list_field() } = $additional_classes if defined $additional_classes;
$rendered{reservations} = $subnet->{reservations} if $subnet->{reservations};
$rendered{reservations} = _render_entry_option_data( $subnet->{reservations} )
if $subnet->{reservations};
delete $rendered{'next-server'} unless defined $rendered{'next-server'};
delete $rendered{'boot-file-name'} unless defined $rendered{'boot-file-name'};
delete $rendered{'option-data'} unless defined $rendered{'option-data'};
if ( $subnet->{pools} ) {
$rendered{pools} = $subnet->{pools};
$rendered{pools} = _render_entry_option_data( $subnet->{pools} );
} elsif ( $subnet->{dynamicrange} ) {
$rendered{pools} = [ xCAT::DHCP::Range->kea_pools( $subnet->{dynamicrange} ) ];
} else {
@@ -838,6 +843,26 @@ sub _render_option_data {
return \@rendered;
}
sub _render_entry_option_data {
my ($entries) = @_;
return $entries unless ref($entries) eq 'ARRAY';
my @rendered;
foreach my $entry (@$entries) {
if ( ref($entry) ne 'HASH' ) {
push @rendered, $entry;
next;
}
my %copy = %$entry;
$copy{'option-data'} = _render_option_data( $copy{'option-data'} )
if $copy{'option-data'};
push @rendered, \%copy;
}
return \@rendered;
}
sub _render_subnet6 {
my ( $self, $subnet ) = @_;
@@ -847,12 +872,15 @@ sub _render_subnet6 {
);
$rendered{interface} = $subnet->{interface} if defined $subnet->{interface};
$rendered{'option-data'} = _first_defined( $subnet->{'option-data'}, $subnet->{option_data} );
$rendered{reservations} = $subnet->{reservations} if $subnet->{reservations};
$rendered{'option-data'} = _render_option_data(
_first_defined( $subnet->{'option-data'}, $subnet->{option_data} )
);
$rendered{reservations} = _render_entry_option_data( $subnet->{reservations} )
if $subnet->{reservations};
delete $rendered{'option-data'} unless defined $rendered{'option-data'};
if ( $subnet->{pools} ) {
$rendered{pools} = $subnet->{pools};
$rendered{pools} = _render_entry_option_data( $subnet->{pools} );
} elsif ( $subnet->{dynamicrange} ) {
$rendered{pools} = [ xCAT::DHCP::Range->kea_pools( $subnet->{dynamicrange} ) ];
} else {