Page MenuHomeVyOS Platform

Op command 'show interfaces' does not display VRRP VIP
Closed, DuplicatePublicBUG

Description

When VRRP configured with rfc3768-compatibility option, VyOS does not display VIP

vyos@vyos:~$ show interfaces 
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             192.168.255.170/24                u/u  
eth1             172.20.110.1/24                   u/u  
eth2             -                                 u/u  
eth3             -                                 u/u  
lo               127.0.0.1/8                       u/u  
                 ::1/128

VyOS configuration:

set high-availability vrrp group test interface 'eth1'
set high-availability vrrp group test rfc3768-compatibility
set high-availability vrrp group test virtual-address '172.20.110.111/24'
set high-availability vrrp group test virtual-address '172.20.110.15/24'
set high-availability vrrp group test vrid '1'

VRRP with option rfc3768-compatibility creates macvlan interface with name {ifaceName}v{vrid}

vyos@vyos:~$ sudo ip addr show 
...
6: eth1v1@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:00:5e:00:01:01 brd ff:ff:ff:ff:ff:ff
    inet 172.20.110.111/24 scope global eth1v1
       valid_lft forever preferred_lft forever
    inet 172.20.110.15/24 scope global secondary eth1v1
       valid_lft forever preferred_lft forever

Details

Difficulty level
Normal (likely a few hours)
Version
1.3-beta-202102250443
Why the issue appeared?
Will be filled on close
Is it a breaking change?
Unspecified (possibly destroys the router)

Event Timeline

Unknown Object (User) created this task.Feb 26 2021, 11:02 AM

But only vrrp works

vyos@r-roll01:~$ show interfaces  vrrp 
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth1v1           172.20.110.111/24                 u/u  
                 172.20.110.15/24
Unknown Object (User) added a comment.Feb 28 2021, 8:02 PM

Yes, agree it works by show interfaces vrrp, but behavior in 1.2.x also displayed VIP by command show interfaces
I think this is a bug and need to fix it.

It used different scripts in 1.3 and 1.4.
show interfaces => run: ${vyos_op_scripts_dir}/show_interfaces.py --action=show-brief
show interfaces vrrp => run: ${vyatta_bindir}/vyatta-show-interfaces.pl --vrrp --action=show-brief

Not sure that it was rewritten correctly

Also, we can see vif but not vrrp

root@r-roll01:/home/vyos# ${vyos_op_scripts_dir}/show_interfaces.py --vif --action=show-brief
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth1.1000        -                                 u/u
root@r-roll01:/home/vyos# ${vyos_op_scripts_dir}/show_interfaces.py --vrrp --action=show-brief
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
root@r-roll01:/home/vyos#

VRRP return always [] <= nodata
https://github.com/vyos/vyos-1x/blob/f892294239101aecc21a45629eb1d10bd89fba0b/src/op_mode/show_interfaces.py#L68
Maybe don't have permissions to kill PID https://github.com/vyos/vyos-1x/blob/f892294239101aecc21a45629eb1d10bd89fba0b/python/vyos/ifconfig/vrrp.py#L95

VRRP.active_interfaces() return

vyos@r-roll01:~$ show int
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/vyos/ifconfig/vrrp.py", line 95, in collect
    os.kill(int(pid), cls._signal[what])
PermissionError: [Errno 1] Operation not permitted

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/libexec/vyos/op_mode/show_interfaces.py", line 314, in <module>
    args.vrrp
  File "/usr/libexec/vyos/op_mode/show_interfaces.py", line 48, in handled_function
    function(*args, **kwargs)
  File "/usr/libexec/vyos/op_mode/show_interfaces.py", line 223, in run_show_intf_brief
    for interface in filtered_interfaces(ifnames, iftypes, vif, vrrp):
  File "/usr/libexec/vyos/op_mode/show_interfaces.py", line 69, in filtered_interfaces
    vrrp_interfaces = VRRP.active_interfaces()
  File "/usr/lib/python3/dist-packages/vyos/ifconfig/vrrp.py", line 75, in active_interfaces
    data = cls.collect('json')
  File "/usr/lib/python3/dist-packages/vyos/ifconfig/vrrp.py", line 104, in collect
    raise VRRPError(f'VRRP {name} is not available')
vyos.ifconfig.vrrp.VRRPError: VRRP data is not available
vyos@r-roll01:~$

As a workaround, we can replace https://github.com/vyos/vyos-1x/blob/f892294239101aecc21a45629eb1d10bd89fba0b/python/vyos/ifconfig/vrrp.py#L95 to

from vyos.util import cmd
cmd(f'sudo kill -s {cls._signal[what]} {pid}')

And get JSON values

vyos@r-roll01:~$ sudo cat /tmp/keepalived.json 
[ { "data": { "iname": "test", "dont_track_primary": 0, "skip_check_adv_addr": 0, "strict_mode": 0, "vmac_ifname": "eth1v1", "track_ifp": [ ], "track_script": [ ], "ifp_ifname": "eth1v1", "master_priority": 100, "last_transition": 1615454936.7267461, "garp_delay": 5, "garp_refresh": 0, "garp_rep": 5, "garp_refresh_rep": 1, "garp_lower_prio_delay": 5, "garp_lower_prio_rep": 5, "lower_prio_no_advert": 0, "higher_prio_send_advert": 0, "vrid": 1, "base_priority": 100, "effective_priority": 100, "vipset": true, "vips": [ "172.20.110.111", "172.20.110.15" ], "evips": [ ], "promote_secondaries": false, "vroutes": [ ], "vrules": [ ], "adver_int": 1, "master_adver_int": 1, "accept": 1, "nopreempt": false, "preempt_delay": 0, "state": 2, "wantstate": 2, "version": 2, "smtp_alert": false, "auth_type": 0 }, "stats": { "advert_rcvd": 983, "advert_sent": 10535, "become_master": 1, "release_master": 0, "packet_len_err": 0, "advert_interval_err": 0, "ip_ttl_err": 0, "invalid_type_rcvd": 0, "addr_list_err": 0, "invalid_authtype": 0, "authtype_mismatch": 0, "auth_failure": 0, "pri_zero_rcvd": 2, "pri_zero_sent": 0 } } ]

Or more readable:

{
   "data":{
      "iname":"test",
      "dont_track_primary":0,
      "skip_check_adv_addr":0,
      "strict_mode":0,
      "vmac_ifname":"eth1v1",
      "track_ifp":[
         
      ],
      "track_script":[
         
      ],
      "ifp_ifname":"eth1v1",
      "master_priority":100,
      "last_transition":1615454936.7267461,
      "garp_delay":5,
      "garp_refresh":0,
      "garp_rep":5,
      "garp_refresh_rep":1,
      "garp_lower_prio_delay":5,
      "garp_lower_prio_rep":5,
      "lower_prio_no_advert":0,
      "higher_prio_send_advert":0,
      "vrid":1,
      "base_priority":100,
      "effective_priority":100,
      "vipset":true,
      "vips":[
         "172.20.110.111",
         "172.20.110.15"
      ],
      "evips":[
         
      ],
      "promote_secondaries":false,
      "vroutes":[
         
      ],
      "vrules":[
         
      ],
      "adver_int":1,
      "master_adver_int":1,
      "accept":1,
      "nopreempt":false,
      "preempt_delay":0,
      "state":2,
      "wantstate":2,
      "version":2,
      "smtp_alert":false,
      "auth_type":0
   },
   "stats":{
      "advert_rcvd":983,
      "advert_sent":10535,
      "become_master":1,
      "release_master":0,
      "packet_len_err":0,
      "advert_interval_err":0,
      "ip_ttl_err":0,
      "invalid_type_rcvd":0,
      "addr_list_err":0,
      "invalid_authtype":0,
      "authtype_mismatch":0,
      "auth_failure":0,
      "pri_zero_rcvd":2,
      "pri_zero_sent":0
   }
}

But need to fix other errors

vyos@r-roll01:~$ show int
Traceback (most recent call last):
  File "/usr/libexec/vyos/op_mode/show_interfaces.py", line 314, in <module>
    args.vrrp
  File "/usr/libexec/vyos/op_mode/show_interfaces.py", line 48, in handled_function
    function(*args, **kwargs)
  File "/usr/libexec/vyos/op_mode/show_interfaces.py", line 223, in run_show_intf_brief
    for interface in filtered_interfaces(ifnames, iftypes, vif, vrrp):
  File "/usr/libexec/vyos/op_mode/show_interfaces.py", line 69, in filtered_interfaces
    vrrp_interfaces = VRRP.active_interfaces()
  File "/usr/lib/python3/dist-packages/vyos/ifconfig/vrrp.py", line 80, in active_interfaces
    return [group['data']['ifp_ifname'] for group in json.loads(data)]
  File "/usr/lib/python3/dist-packages/vyos/ifconfig/vrrp.py", line 80, in <listcomp>
    return [group['data']['ifp_ifname'] for group in json.loads(data)]
TypeError: string indices must be integers
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
vyos@r-roll01:~$