@for (control of ['prefix', 'excludedPrefix']; track control) { @if ( formGroup.get('prefixes')?.get(control)?.invalid && (formGroup.get('prefixes').get(control).dirty || formGroup.get('prefixes').get(control).touched) && formGroup.get('prefixes').get(control).hasError('ipv6Prefix') ) { {{ formGroup.get('prefixes').get(control).errors.ipv6Prefix }} } } @for ( err of [ 'ipv6PrefixDelegatedLength', 'ipv6ExcludedPrefix', 'ipv6ExcludedPrefixDelegatedLength', 'ipv6PrefixOverlaps', ]; track err ) { @if (formGroup.get('prefixes').invalid && formGroup.get('prefixes').hasError(err)) { {{ formGroup.get('prefixes').errors[err] }} } }

The location where the edited subnet information is saved depends on the loaded Kea hooks. If libdhcp_cb_cmds is loaded, Stork updates the Config Backend database. If libdhcp_subnet_cmds is loaded, Stork updates subnet data in the Kea JSON configuration file.

If both libdhcp_subnet_cmds and libdhcp_cb_cmds hooks are loaded, Stork updates the subnet configuration in the Config Backend database, and leaves the JSON configuration unchanged. It conforms to the Kea behavior that prioritizes configuration specified in the Config Backend over the configuration sourced from the JSON file.

If some daemons have the libdhcp_cb_cmds hook loaded, they are connected to the same Config Backend database, and share the same server tag, then they cannot be configured individually. In this case, they are grouped into a single position in the server selection list. Such a group is labeled with the server tag and the number of daemons in the group. The configuration changes are applied to all daemons in the group.

@if ( formGroup.get('selectedDaemonGroups').invalid && (formGroup.get('selectedDaemonGroups').dirty || formGroup.get('selectedDaemonGroups').touched) ) { At least one server must be selected. }
Unlock setting DHCP options for individual servers.
@for (optionSet of formGroup.get('options.data')?.controls; track optionSet; let i = $index) { @if (i === 0 || formGroup.get('options.unlocked')?.value) {
@if (formGroup.get('options.unlocked')?.value) {
@if (formGroup.get('options.data')?.length > 1) { {{ daemonGroupLabels[i] }} }
}
} }