Skip to content

Commit

Permalink
ncm-network: nmstate - remove config route entry not in config instea…
Browse files Browse the repository at this point in the history
…d of merging.

nmstatectl apply does not replace running config instead merges current state config
with desired state. This is not useful when settings have been removed such as policy routing.

'state: absent' will remove config routes entry that matches the interface as next hop
and therefore will only apply the routes configured in host profile profile.
  • Loading branch information
Abdul Karim authored and Abdul Karim committed Jan 4, 2024
1 parent 14a5f7d commit ab04411
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 4 deletions.
18 changes: 14 additions & 4 deletions ncm-network/src/main/perl/nmstate.pm
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,16 @@ sub make_nm_ip_route
return \@rt_entry;
}

# create an absent route entry.
# if you prepend the routes with the 'absent', then nmstate will clear the existing matches and apply the routes
# This will allow nmstate to clear all routes for the interface and only apply routes defined in config.
# useful when routes are changed later on in profile once host is built.
# return arrayref
sub make_nm_route_absent {
my ($self, $device) = @_;
return { 'state' => 'absent', 'next-hop-interface' => $device };
}

# group all eth bound to a bond together in a hashref for to be used as
# - port in nmstate config file
sub get_bonded_eth
Expand Down Expand Up @@ -377,13 +387,13 @@ sub generate_nmstate_config
# next-hop-interface:
# and so on.
my $routes = [];
push @$routes, ($self->make_nm_route_absent($name));
push @$routes, \%default_rt if scalar %default_rt;
if (defined($iface->{route})) {
$self->verbose("policy route found, nmstate will manage it");
my $route = $iface->{route};
$routes = $self->make_nm_ip_route($name, $route, $routing_table);
push @$routes, \%default_rt if scalar %default_rt;
} elsif (scalar %default_rt){
push @$routes, \%default_rt if scalar %default_rt;
my $policyroutes = $self->make_nm_ip_route($name, $route, $routing_table);
push @$routes, @{$policyroutes};
}

my $policy_rule = [];
Expand Down
4 changes: 4 additions & 0 deletions ncm-network/src/test/perl/nmstate_simple.t
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ interfaces:
name: eth0
profile-name: eth0
type: bond
routes:
config:
- next-hop-interface: eth0
state: absent
EOF

Readonly my $NOTTOREMOVE => <<EOF;
Expand Down

0 comments on commit ab04411

Please sign in to comment.