Bug 2165283

Summary: [rust] removing route rules treats empty string filter as wildcard
Product: Red Hat Enterprise Linux 9 Reporter: Mingyu Shi <mshi>
Component: nmstateAssignee: Gris Ge <fge>
Status: CLOSED ERRATA QA Contact: Mingyu Shi <mshi>
Severity: medium Docs Contact:
Priority: medium    
Version: 9.2CC: ferferna, jiji, jishi, network-qe, till
Target Milestone: rcKeywords: Triaged
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: nmstate-2.2.6-1.el9 Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2023-05-09 07:32:13 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description Mingyu Shi 2023-01-29 03:44:38 UTC
Description of problem:
Nmstate rust removing route rules treats empty string filter as wildcard.
Refer to the original RFE https://bugzilla.redhat.com/show_bug.cgi?id=1822140 , nmstate should treat *MISSING* property as wildcard, but in this case, nmstate rust treats, for example, `ip-from: ''` as wildcard too.

```
  - ip-to: 100::/64
    ip-from: ''
    state: absent
```
should remove
```
  - ip-to: 100::/64
    priority: 1000
    route-table: 50
```
and keep
```
  - ip-from: 100::/64
    ip-to: 100::/64
    priority: 20000
    route-table: 50
```

Version-Release number of selected component (if applicable):
nmstate-2.2.5-1.el9.x86_64
nispor-1.2.9-1.el9.x86_64
NetworkManager-1.41.90-1.el9.x86_64

How reproducible:
100%

Steps to Reproduce:
cat << EOF > rules.yaml
interfaces:
  - name: veth0
    type: veth
    state: up
    veth:
      peer: veth0_p
    ipv6:
      address:
      - ip: 100::1
        prefix-length: 64
      enabled: true
    ipv4:
      address:
      - ip: 192.0.2.251
        prefix-length: 24
      enabled: true
  - name: veth1
    type: veth
    state: up
    veth:
      peer: veth1_p
    ipv6:
      address:
      - ip: 1::1
        prefix-length: 64
      enabled: true
    ipv4:
      address:
      - ip: 198.51.100.251
        prefix-length: 24
      enabled: true
route-rules:
  config:
  - ip-to: 192.0.2.0/24
    priority: 1000
    route-table: 50
  - ip-from: 192.0.2.1/24
    priority: 1001
    route-table: 50
  - ip-to: 198.51.100.99/24
    priority: 1002
    route-table: 51
  - ip-from: 198.51.100.255/24
    priority: 1003
    route-table: 51
  - ip-to: 100::/64
    priority: 1000
    route-table: 50
  - ip-from: 100::/64
    priority: 1001
    route-table: 50
  - ip-to: 1::/64
    priority: 1002
    route-table: 51
  - ip-from: 1::/64
    priority: 1003
    route-table: 51
  - ip-to: 192.0.2.0/24
    ip-from: 192.0.2.1/24
    priority: 20000
    route-table: 50
  - ip-to: 100::/64
    priority: 20000
    route-table: 50
    ip-from: 100::/64
routes:
  config:
  - destination: 0.0.0.0/0
    metric: 150
    next-hop-address: 192.0.2.1
    next-hop-interface: veth0
    table-id: 50
  - destination: ::/0
    metric: 100
    next-hop-address: 100::254
    next-hop-interface: veth0
    table-id: 50
  - destination: 0.0.0.0/0
    metric: 151
    next-hop-address: 198.51.100.1
    next-hop-interface: veth1
    table-id: 51
  - destination: ::/0
    metric: 1
    next-hop-address: 1::254
    next-hop-interface: veth1
    table-id: 51
EOF

cat << EOF > rules_absent.yaml
route-rules:
  config:
  - priority: 1001
    state: absent
  - route-table: 51
    state: absent
  - ip-to: 192.0.2.0/24
    state: absent
  - ip-to: 100::/64
    ip-from: ''
    state: absent
EOF

nmstatectl apply rules.yaml
nmstatectl apply rules_absent.yaml

# check the result
nmstatectl show
ip rule
ip -6 rule

Actual results:
All route rules were removed.

Expected results:
route-rules:
  config:
  - ip-from: 100::/64
    ip-to: 100::/64
    priority: 20000
    route-table: 50

[11:23:00@dell-per740-34 libnmstate]0# ip rule
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default
[11:23:07@dell-per740-34 libnmstate]0# ip -6 rule
0:      from all lookup local
20000:  from 100::/64 to 100::/64 lookup 50 proto static
32766:  from all lookup main

Additional info:

Comment 1 Gris Ge 2023-02-02 04:22:50 UTC
Patch sent to upstream: https://github.com/nmstate/nmstate/pull/2216


When user desiring absent route or route rule with empty string, it
should means this absent route only matches current route/route_rule
with this property been set to None.

For example on route rule:

```yml
- ip-to: 2001:db8:b::/64
  ip-from: ''
  state: absent
```

Should match

```yml
- ip-to: 2001:db8:b::/64
  priority: 1000
  route-table: 50
```

Should not match
```
- ip-from: 2001:db8:b::/64
  ip-to: 2001:db8:b::/64
  priority: 20000
  route-table: 50
```

This change applied to `ip-from` and `ip-to` in route rule.
This change applied to `next-hop-address` in route.

The empty string in route destination is invalid IP address string, user
should set it to null/None or use proper IP address.

Comment 4 Mingyu Shi 2023-02-25 15:31:35 UTC
Verified with nmstate-2.2.7-1.el9

Comment 6 errata-xmlrpc 2023-05-09 07:32:13 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory (nmstate bug fix and enhancement update), and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://access.redhat.com/errata/RHBA-2023:2190