diff --git a/ncm-network/src/main/pan/components/network/types/network/backend/initscripts.pan b/ncm-network/src/main/pan/components/network/types/network/backend/initscripts.pan index 84fe8b8798..2565ea8b63 100644 --- a/ncm-network/src/main/pan/components/network/types/network/backend/initscripts.pan +++ b/ncm-network/src/main/pan/components/network/types/network/backend/initscripts.pan @@ -13,6 +13,10 @@ function network_valid_route = { error("Use either prefix or netmask as route"); }; + if (exists(SELF['gateway']) && exists(SELF['type'])) { + error("The route gateway will be ignored when type is defined"); + }; + if (exists(SELF['prefix'])) { network_valid_prefix(SELF); }; diff --git a/ncm-network/src/main/pan/components/network/types/network/backend/nmstate.pan b/ncm-network/src/main/pan/components/network/types/network/backend/nmstate.pan index 3ad962a2f9..91e48ab8fa 100644 --- a/ncm-network/src/main/pan/components/network/types/network/backend/nmstate.pan +++ b/ncm-network/src/main/pan/components/network/types/network/backend/nmstate.pan @@ -38,6 +38,10 @@ function network_valid_route = { if (exists(SELF['prefix']) && exists(SELF['netmask'])) error("Use either prefix or netmask as route"); }; + if (exists(SELF['gateway']) && exists(SELF['type'])) { + error("The route gateway will be ignored when type is defined"); + }; + if (exists(SELF['prefix'])) { network_valid_prefix(SELF); }; diff --git a/ncm-network/src/main/pan/components/network/types/network/route.pan b/ncm-network/src/main/pan/components/network/types/network/route.pan index 58ce6f85b7..63aa7766d8 100644 --- a/ncm-network/src/main/pan/components/network/types/network/route.pan +++ b/ncm-network/src/main/pan/components/network/types/network/route.pan @@ -40,4 +40,6 @@ type network_route = { "onlink" ? boolean @{route add command options to use (cannot be combined with other options)} "command" ? string with !match(SELF, '[;]') + @{route types} # only subset, i.e. the nmstate allowed route types + "type" ? choice('blackhole', 'unreachable', 'prohibit') } with network_valid_route(SELF); diff --git a/ncm-network/src/main/perl/network.pm b/ncm-network/src/main/perl/network.pm index 7f936210be..11540512b3 100755 --- a/ncm-network/src/main/perl/network.pm +++ b/ncm-network/src/main/perl/network.pm @@ -1236,12 +1236,22 @@ sub make_ifcfg_ip_route # in absence of netmask, NetAddr::IP uses 32 or 128 $ip = NetAddr::IP->new($route->{address}, $route->{netmask}); } + # Generate it - $route->{command} = "$ip"; - $route->{command} .= " via $route->{gateway}" if $route->{gateway}; - $route->{command} .= " dev $device"; - $route->{command} .= " onlink" if $route->{onlink}; - $route->{command} .= " table $route->{table}" if $route->{table}; + my @commands; + push(@commands, $route->{type}) if $route->{type}; + push(@commands, $ip); + + if (!$route->{type}) { + # This is part of the next-hop config + push(@commands, "via", $route->{gateway}) if $route->{gateway}; + push(@commands, "dev", $device); + }; + + push(@commands, "onlink") if $route->{onlink}; + push(@commands, "table", $route->{table}) if $route->{table}; + + $route->{command} = join(" ", @commands); } push(@text, $route->{command}); } diff --git a/ncm-network/src/main/perl/nmstate.pm b/ncm-network/src/main/perl/nmstate.pm index 9d23713c3f..d3cd87f3a3 100644 --- a/ncm-network/src/main/perl/nmstate.pm +++ b/ncm-network/src/main/perl/nmstate.pm @@ -190,9 +190,16 @@ sub make_nm_ip_route $rt{destination} = $route->{address}."/32"; } } + $rt{'table-id'} = "$routing_table_hash->{$route->{table}}" if $route->{table}; - $rt{'next-hop-interface'} = $device; - $rt{'next-hop-address'} = $route->{gateway} if $route->{gateway}; + + if ($route->{type}) { + $rt{'route-type'} = $route->{type}; + } else { + $rt{'next-hop-interface'} = $device; + $rt{'next-hop-address'} = $route->{gateway} if $route->{gateway}; + } + push (@rt_entry, \%rt); } diff --git a/ncm-network/src/test/perl/nmstate_route_rule.t b/ncm-network/src/test/perl/nmstate_route_rule.t index ee73ee9749..ed74700ba3 100755 --- a/ncm-network/src/test/perl/nmstate_route_rule.t +++ b/ncm-network/src/test/perl/nmstate_route_rule.t @@ -54,6 +54,8 @@ routes: - destination: 0.0.0.0/0 next-hop-address: 4.3.2.254 next-hop-interface: eth0 + - destination: 1.2.3.9/32 + route-type: blackhole EOF is($cmp->Configure($cfg), 1, "Component runs correctly with a test profile"); diff --git a/ncm-network/src/test/perl/route_rule.t b/ncm-network/src/test/perl/route_rule.t index c3c53fb0ba..606857d349 100644 --- a/ncm-network/src/test/perl/route_rule.t +++ b/ncm-network/src/test/perl/route_rule.t @@ -112,6 +112,7 @@ Readonly my $ETH0_ROUTE => < <