diff --git a/.gitignore b/.gitignore index a50f1fce..541bfd57 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ /sysdep/autoconf.h.in~ /cscope.* *.tar.gz +__pycache__ diff --git a/flock/ospf-base/dump-0001-startup.yaml b/flock/ospf-base/dump-0001-rib-startup.yaml similarity index 100% rename from flock/ospf-base/dump-0001-startup.yaml rename to flock/ospf-base/dump-0001-rib-startup.yaml diff --git a/flock/ospf-base/dump-0002-fib-startup.yaml b/flock/ospf-base/dump-0002-fib-startup.yaml new file mode 100644 index 00000000..a7579e0b --- /dev/null +++ b/flock/ospf-base/dump-0002-fib-startup.yaml @@ -0,0 +1,1102 @@ +m1: + '4': + - dev: ve31 + dst: 192.0.2.48/28 + flags: [] + gateway: 192.0.2.1 + metric: 32 + protocol: bird + - dev: ve31 + dst: 192.0.2.64/28 + flags: [] + gateway: 192.0.2.1 + metric: 32 + protocol: bird + - dev: ve31 + dst: 192.0.2.80/28 + flags: [] + gateway: 192.0.2.1 + metric: 32 + protocol: bird + - dev: ve31 + dst: 192.0.2.96/28 + flags: [] + gateway: 192.0.2.1 + metric: 32 + protocol: bird + - dev: ve12 + dst: 192.0.2.16/28 + flags: [] + metric: 32 + protocol: bird + scope: link + - dev: ve31 + dst: 192.0.2.0/28 + flags: [] + metric: 32 + protocol: bird + scope: link + - dev: ve12 + dst: 192.0.2.16/28 + flags: [] + prefsrc: 192.0.2.17 + protocol: kernel + scope: link + - dev: ve31 + dst: 192.0.2.0/28 + flags: [] + prefsrc: 192.0.2.2 + protocol: kernel + scope: link + - dst: 192.0.2.32/28 + flags: [] + metric: 32 + nexthops: + - dev: ve12 + flags: [] + gateway: 192.0.2.18 + weight: 1 + - dev: ve31 + flags: [] + gateway: 192.0.2.1 + weight: 1 + protocol: bird + '6': + - dev: ve31 + dst: 2001:db8:0:3::/64 + flags: [] + gateway: fe80::ac55:22ff:fe32:3610 + metric: 32 + pref: medium + protocol: bird + - dev: ve31 + dst: 2001:db8:0:4::/64 + flags: [] + gateway: fe80::ac55:22ff:fe32:3610 + metric: 32 + pref: medium + protocol: bird + - dev: ve31 + dst: 2001:db8:0:5::/64 + flags: [] + gateway: fe80::ac55:22ff:fe32:3610 + metric: 32 + pref: medium + protocol: bird + - dev: ve31 + dst: 2001:db8:0:6::/64 + flags: [] + gateway: fe80::ac55:22ff:fe32:3610 + metric: 32 + pref: medium + protocol: bird + - dev: ve12 + dst: 2001:db8:0:1::/64 + flags: [] + metric: 32 + pref: medium + protocol: bird + - dev: ve12 + dst: 2001:db8:0:1::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve12 + dst: fe80::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve31 + dst: 2001:db8::/64 + flags: [] + metric: 32 + pref: medium + protocol: bird + - dev: ve31 + dst: 2001:db8::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve31 + dst: fe80::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dst: 2001:db8:0:2::/64 + flags: [] + metric: 32 + nexthops: + - dev: ve12 + flags: [] + gateway: fe80::5c38:8eff:fe25:1d68 + weight: 1 + - dev: ve31 + flags: [] + gateway: fe80::ac55:22ff:fe32:3610 + weight: 1 + pref: medium + protocol: bird + M: [] +m2: + '4': + - dev: ve23 + dst: 192.0.2.48/28 + flags: [] + gateway: 192.0.2.34 + metric: 32 + protocol: bird + - dev: ve23 + dst: 192.0.2.64/28 + flags: [] + gateway: 192.0.2.34 + metric: 32 + protocol: bird + - dev: ve23 + dst: 192.0.2.80/28 + flags: [] + gateway: 192.0.2.34 + metric: 32 + protocol: bird + - dev: ve23 + dst: 192.0.2.96/28 + flags: [] + gateway: 192.0.2.34 + metric: 32 + protocol: bird + - dev: ve12 + dst: 192.0.2.16/28 + flags: [] + metric: 32 + protocol: bird + scope: link + - dev: ve23 + dst: 192.0.2.32/28 + flags: [] + metric: 32 + protocol: bird + scope: link + - dev: ve12 + dst: 192.0.2.16/28 + flags: [] + prefsrc: 192.0.2.18 + protocol: kernel + scope: link + - dev: ve23 + dst: 192.0.2.32/28 + flags: [] + prefsrc: 192.0.2.33 + protocol: kernel + scope: link + - dst: 192.0.2.0/28 + flags: [] + metric: 32 + nexthops: + - dev: ve12 + flags: [] + gateway: 192.0.2.17 + weight: 1 + - dev: ve23 + flags: [] + gateway: 192.0.2.34 + weight: 1 + protocol: bird + '6': + - dev: ve23 + dst: 2001:db8:0:3::/64 + flags: [] + gateway: fe80::7cda:1aff:feae:9831 + metric: 32 + pref: medium + protocol: bird + - dev: ve23 + dst: 2001:db8:0:4::/64 + flags: [] + gateway: fe80::7cda:1aff:feae:9831 + metric: 32 + pref: medium + protocol: bird + - dev: ve23 + dst: 2001:db8:0:5::/64 + flags: [] + gateway: fe80::7cda:1aff:feae:9831 + metric: 32 + pref: medium + protocol: bird + - dev: ve23 + dst: 2001:db8:0:6::/64 + flags: [] + gateway: fe80::7cda:1aff:feae:9831 + metric: 32 + pref: medium + protocol: bird + - dev: ve12 + dst: 2001:db8:0:1::/64 + flags: [] + metric: 32 + pref: medium + protocol: bird + - dev: ve12 + dst: 2001:db8:0:1::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve12 + dst: fe80::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve23 + dst: 2001:db8:0:2::/64 + flags: [] + metric: 32 + pref: medium + protocol: bird + - dev: ve23 + dst: 2001:db8:0:2::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve23 + dst: fe80::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dst: 2001:db8::/64 + flags: [] + metric: 32 + nexthops: + - dev: ve12 + flags: [] + gateway: fe80::4cfd:f0ff:fe23:167 + weight: 1 + - dev: ve23 + flags: [] + gateway: fe80::7cda:1aff:feae:9831 + weight: 1 + pref: medium + protocol: bird + M: [] +m3: + '4': + - dev: multi + dst: 192.0.2.48/28 + flags: [] + gateway: 192.0.2.99 + metric: 32 + protocol: bird + - dev: multi + dst: 192.0.2.80/28 + flags: [] + gateway: 192.0.2.100 + metric: 32 + protocol: bird + - dev: multi + dst: 192.0.2.96/28 + flags: [] + metric: 32 + protocol: bird + scope: link + - dev: ve23 + dst: 192.0.2.32/28 + flags: [] + metric: 32 + protocol: bird + scope: link + - dev: ve31 + dst: 192.0.2.0/28 + flags: [] + metric: 32 + protocol: bird + scope: link + - dev: multi + dst: 192.0.2.96/28 + flags: [] + prefsrc: 192.0.2.97 + protocol: kernel + scope: link + - dev: ve23 + dst: 192.0.2.32/28 + flags: [] + prefsrc: 192.0.2.34 + protocol: kernel + scope: link + - dev: ve31 + dst: 192.0.2.0/28 + flags: [] + prefsrc: 192.0.2.1 + protocol: kernel + scope: link + - dst: 192.0.2.16/28 + flags: [] + metric: 32 + nexthops: + - dev: ve23 + flags: [] + gateway: 192.0.2.33 + weight: 1 + - dev: ve31 + flags: [] + gateway: 192.0.2.2 + weight: 1 + protocol: bird + - dst: 192.0.2.64/28 + flags: [] + metric: 32 + nexthops: + - dev: multi + flags: [] + gateway: 192.0.2.100 + weight: 1 + - dev: multi + flags: [] + gateway: 192.0.2.99 + weight: 1 + protocol: bird + '6': + - dev: multi + dst: 2001:db8:0:3::/64 + flags: [] + gateway: fe80::5c5b:1eff:fe50:3793 + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8:0:5::/64 + flags: [] + gateway: fe80::9ce1:eaff:fe4b:b4f9 + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8:0:6::/64 + flags: [] + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8:0:6::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: multi + dst: fe80::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve23 + dst: 2001:db8:0:2::/64 + flags: [] + metric: 32 + pref: medium + protocol: bird + - dev: ve23 + dst: 2001:db8:0:2::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve23 + dst: fe80::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve31 + dst: 2001:db8::/64 + flags: [] + metric: 32 + pref: medium + protocol: bird + - dev: ve31 + dst: 2001:db8::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve31 + dst: fe80::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dst: 2001:db8:0:1::/64 + flags: [] + metric: 32 + nexthops: + - dev: ve23 + flags: [] + gateway: fe80::8c41:8bff:fe8f:9446 + weight: 1 + - dev: ve31 + flags: [] + gateway: fe80::5c82:ccff:fe47:46df + weight: 1 + pref: medium + protocol: bird + - dst: 2001:db8:0:4::/64 + flags: [] + metric: 32 + nexthops: + - dev: multi + flags: [] + gateway: fe80::5c5b:1eff:fe50:3793 + weight: 1 + - dev: multi + flags: [] + gateway: fe80::9ce1:eaff:fe4b:b4f9 + weight: 1 + pref: medium + protocol: bird + M: [] +m4: + '4': + - dev: multi + dst: 192.0.2.0/28 + flags: [] + gateway: 192.0.2.97 + metric: 32 + protocol: bird + - dev: multi + dst: 192.0.2.16/28 + flags: [] + gateway: 192.0.2.97 + metric: 32 + protocol: bird + - dev: multi + dst: 192.0.2.32/28 + flags: [] + gateway: 192.0.2.97 + metric: 32 + protocol: bird + - dev: multi + dst: 192.0.2.48/28 + flags: [] + gateway: 192.0.2.99 + metric: 32 + protocol: bird + - dev: multi + dst: 192.0.2.80/28 + flags: [] + gateway: 192.0.2.100 + metric: 32 + protocol: bird + - dev: multi + dst: 192.0.2.96/28 + flags: [] + metric: 32 + protocol: bird + scope: link + - dev: multi + dst: 192.0.2.96/28 + flags: [] + prefsrc: 192.0.2.98 + protocol: kernel + scope: link + - dst: 192.0.2.64/28 + flags: [] + metric: 32 + nexthops: + - dev: multi + flags: [] + gateway: 192.0.2.100 + weight: 1 + - dev: multi + flags: [] + gateway: 192.0.2.99 + weight: 1 + protocol: bird + '6': + - dev: multi + dst: 2001:db8:0:1::/64 + flags: [] + gateway: fe80::dc8f:6bff:fe0f:6ad9 + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8:0:2::/64 + flags: [] + gateway: fe80::dc8f:6bff:fe0f:6ad9 + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8:0:3::/64 + flags: [] + gateway: fe80::5c5b:1eff:fe50:3793 + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8:0:5::/64 + flags: [] + gateway: fe80::9ce1:eaff:fe4b:b4f9 + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8::/64 + flags: [] + gateway: fe80::dc8f:6bff:fe0f:6ad9 + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8:0:6::/64 + flags: [] + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8:0:6::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: multi + dst: fe80::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dst: 2001:db8:0:4::/64 + flags: [] + metric: 32 + nexthops: + - dev: multi + flags: [] + gateway: fe80::5c5b:1eff:fe50:3793 + weight: 1 + - dev: multi + flags: [] + gateway: fe80::9ce1:eaff:fe4b:b4f9 + weight: 1 + pref: medium + protocol: bird + M: [] +m5: + '4': + - dev: multi + dst: 192.0.2.0/28 + flags: [] + gateway: 192.0.2.97 + metric: 32 + protocol: bird + - dev: multi + dst: 192.0.2.16/28 + flags: [] + gateway: 192.0.2.97 + metric: 32 + protocol: bird + - dev: multi + dst: 192.0.2.32/28 + flags: [] + gateway: 192.0.2.97 + metric: 32 + protocol: bird + - dev: multi + dst: 192.0.2.80/28 + flags: [] + gateway: 192.0.2.100 + metric: 32 + protocol: bird + - dev: ve57 + dst: 192.0.2.64/28 + flags: [] + gateway: 192.0.2.50 + metric: 32 + protocol: bird + - dev: multi + dst: 192.0.2.96/28 + flags: [] + metric: 32 + protocol: bird + scope: link + - dev: ve57 + dst: 192.0.2.48/28 + flags: [] + metric: 32 + protocol: bird + scope: link + - dev: multi + dst: 192.0.2.96/28 + flags: [] + prefsrc: 192.0.2.99 + protocol: kernel + scope: link + - dev: ve57 + dst: 192.0.2.48/28 + flags: [] + prefsrc: 192.0.2.49 + protocol: kernel + scope: link + '6': + - dev: multi + dst: 2001:db8:0:1::/64 + flags: [] + gateway: fe80::dc8f:6bff:fe0f:6ad9 + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8:0:2::/64 + flags: [] + gateway: fe80::dc8f:6bff:fe0f:6ad9 + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8:0:5::/64 + flags: [] + gateway: fe80::9ce1:eaff:fe4b:b4f9 + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8::/64 + flags: [] + gateway: fe80::dc8f:6bff:fe0f:6ad9 + metric: 32 + pref: medium + protocol: bird + - dev: ve57 + dst: 2001:db8:0:4::/64 + flags: [] + gateway: fe80::9c97:afff:fe62:f695 + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8:0:6::/64 + flags: [] + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8:0:6::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: multi + dst: fe80::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve57 + dst: 2001:db8:0:3::/64 + flags: [] + metric: 32 + pref: medium + protocol: bird + - dev: ve57 + dst: 2001:db8:0:3::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve57 + dst: fe80::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + M: [] +m6: + '4': + - dev: multi + dst: 192.0.2.0/28 + flags: [] + gateway: 192.0.2.97 + metric: 32 + protocol: bird + - dev: multi + dst: 192.0.2.16/28 + flags: [] + gateway: 192.0.2.97 + metric: 32 + protocol: bird + - dev: multi + dst: 192.0.2.32/28 + flags: [] + gateway: 192.0.2.97 + metric: 32 + protocol: bird + - dev: multi + dst: 192.0.2.48/28 + flags: [] + gateway: 192.0.2.99 + metric: 32 + protocol: bird + - dev: ve86 + dst: 192.0.2.64/28 + flags: [] + gateway: 192.0.2.81 + metric: 32 + protocol: bird + - dev: multi + dst: 192.0.2.96/28 + flags: [] + metric: 32 + protocol: bird + scope: link + - dev: ve86 + dst: 192.0.2.80/28 + flags: [] + metric: 32 + protocol: bird + scope: link + - dev: multi + dst: 192.0.2.96/28 + flags: [] + prefsrc: 192.0.2.100 + protocol: kernel + scope: link + - dev: ve86 + dst: 192.0.2.80/28 + flags: [] + prefsrc: 192.0.2.82 + protocol: kernel + scope: link + '6': + - dev: multi + dst: 2001:db8:0:1::/64 + flags: [] + gateway: fe80::dc8f:6bff:fe0f:6ad9 + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8:0:2::/64 + flags: [] + gateway: fe80::dc8f:6bff:fe0f:6ad9 + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8:0:3::/64 + flags: [] + gateway: fe80::5c5b:1eff:fe50:3793 + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8::/64 + flags: [] + gateway: fe80::dc8f:6bff:fe0f:6ad9 + metric: 32 + pref: medium + protocol: bird + - dev: ve86 + dst: 2001:db8:0:4::/64 + flags: [] + gateway: fe80::6cc9:f2ff:feb9:754f + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8:0:6::/64 + flags: [] + metric: 32 + pref: medium + protocol: bird + - dev: multi + dst: 2001:db8:0:6::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: multi + dst: fe80::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve86 + dst: 2001:db8:0:5::/64 + flags: [] + metric: 32 + pref: medium + protocol: bird + - dev: ve86 + dst: 2001:db8:0:5::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve86 + dst: fe80::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + M: [] +m7: + '4': + - dev: ve57 + dst: 192.0.2.0/28 + flags: [] + gateway: 192.0.2.49 + metric: 32 + protocol: bird + - dev: ve57 + dst: 192.0.2.16/28 + flags: [] + gateway: 192.0.2.49 + metric: 32 + protocol: bird + - dev: ve57 + dst: 192.0.2.32/28 + flags: [] + gateway: 192.0.2.49 + metric: 32 + protocol: bird + - dev: ve57 + dst: 192.0.2.96/28 + flags: [] + gateway: 192.0.2.49 + metric: 32 + protocol: bird + - dev: ve78 + dst: 192.0.2.80/28 + flags: [] + gateway: 192.0.2.66 + metric: 32 + protocol: bird + - dev: ve57 + dst: 192.0.2.48/28 + flags: [] + metric: 32 + protocol: bird + scope: link + - dev: ve78 + dst: 192.0.2.64/28 + flags: [] + metric: 32 + protocol: bird + scope: link + - dev: ve57 + dst: 192.0.2.48/28 + flags: [] + prefsrc: 192.0.2.50 + protocol: kernel + scope: link + - dev: ve78 + dst: 192.0.2.64/28 + flags: [] + prefsrc: 192.0.2.65 + protocol: kernel + scope: link + '6': + - dev: ve57 + dst: 2001:db8:0:1::/64 + flags: [] + gateway: fe80::2c33:44ff:fe0f:454b + metric: 32 + pref: medium + protocol: bird + - dev: ve57 + dst: 2001:db8:0:2::/64 + flags: [] + gateway: fe80::2c33:44ff:fe0f:454b + metric: 32 + pref: medium + protocol: bird + - dev: ve57 + dst: 2001:db8:0:6::/64 + flags: [] + gateway: fe80::2c33:44ff:fe0f:454b + metric: 32 + pref: medium + protocol: bird + - dev: ve57 + dst: 2001:db8::/64 + flags: [] + gateway: fe80::2c33:44ff:fe0f:454b + metric: 32 + pref: medium + protocol: bird + - dev: ve78 + dst: 2001:db8:0:5::/64 + flags: [] + gateway: fe80::8c67:1aff:fe6f:1193 + metric: 32 + pref: medium + protocol: bird + - dev: ve57 + dst: 2001:db8:0:3::/64 + flags: [] + metric: 32 + pref: medium + protocol: bird + - dev: ve57 + dst: 2001:db8:0:3::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve57 + dst: fe80::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve78 + dst: 2001:db8:0:4::/64 + flags: [] + metric: 32 + pref: medium + protocol: bird + - dev: ve78 + dst: 2001:db8:0:4::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve78 + dst: fe80::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + M: [] +m8: + '4': + - dev: ve78 + dst: 192.0.2.48/28 + flags: [] + gateway: 192.0.2.65 + metric: 32 + protocol: bird + - dev: ve86 + dst: 192.0.2.0/28 + flags: [] + gateway: 192.0.2.82 + metric: 32 + protocol: bird + - dev: ve86 + dst: 192.0.2.16/28 + flags: [] + gateway: 192.0.2.82 + metric: 32 + protocol: bird + - dev: ve86 + dst: 192.0.2.32/28 + flags: [] + gateway: 192.0.2.82 + metric: 32 + protocol: bird + - dev: ve86 + dst: 192.0.2.96/28 + flags: [] + gateway: 192.0.2.82 + metric: 32 + protocol: bird + - dev: ve78 + dst: 192.0.2.64/28 + flags: [] + metric: 32 + protocol: bird + scope: link + - dev: ve86 + dst: 192.0.2.80/28 + flags: [] + metric: 32 + protocol: bird + scope: link + - dev: ve78 + dst: 192.0.2.64/28 + flags: [] + prefsrc: 192.0.2.66 + protocol: kernel + scope: link + - dev: ve86 + dst: 192.0.2.80/28 + flags: [] + prefsrc: 192.0.2.81 + protocol: kernel + scope: link + '6': + - dev: ve78 + dst: 2001:db8:0:3::/64 + flags: [] + gateway: fe80::ac21:71ff:fea9:abe + metric: 32 + pref: medium + protocol: bird + - dev: ve86 + dst: 2001:db8:0:1::/64 + flags: [] + gateway: fe80::5cf4:d5ff:fe79:c89 + metric: 32 + pref: medium + protocol: bird + - dev: ve86 + dst: 2001:db8:0:2::/64 + flags: [] + gateway: fe80::5cf4:d5ff:fe79:c89 + metric: 32 + pref: medium + protocol: bird + - dev: ve86 + dst: 2001:db8:0:6::/64 + flags: [] + gateway: fe80::5cf4:d5ff:fe79:c89 + metric: 32 + pref: medium + protocol: bird + - dev: ve86 + dst: 2001:db8::/64 + flags: [] + gateway: fe80::5cf4:d5ff:fe79:c89 + metric: 32 + pref: medium + protocol: bird + - dev: ve78 + dst: 2001:db8:0:4::/64 + flags: [] + metric: 32 + pref: medium + protocol: bird + - dev: ve78 + dst: 2001:db8:0:4::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve78 + dst: fe80::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve86 + dst: 2001:db8:0:5::/64 + flags: [] + metric: 32 + pref: medium + protocol: bird + - dev: ve86 + dst: 2001:db8:0:5::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + - dev: ve86 + dst: fe80::/64 + flags: [] + metric: 256 + pref: medium + protocol: kernel + M: [] diff --git a/flock/ospf-base/test.py b/flock/ospf-base/test.py index fbae5e8d..4e1b680d 100644 --- a/flock/ospf-base/test.py +++ b/flock/ospf-base/test.py @@ -1,7 +1,7 @@ #!/usr/bin/python3 import asyncio -from python.BIRD.Test import Test, BIRDInstance, DumpRIB +from python.BIRD.Test import Test, BIRDInstance, DumpRIB, DumpLinuxKRT from python.BIRD.LogChecker import LogExpectedStub class ThisTest(Test): @@ -32,4 +32,7 @@ class ThisTest(Test): async def test(self): # Startup check - await DumpRIB(self, 30, "startup")() + await asyncio.gather(*[ + DumpRIB(self, 30, "rib-startup")(), + DumpLinuxKRT(self, 30, "fib-startup")(), + ]) diff --git a/python/BIRD/Test.py b/python/BIRD/Test.py index 9c3a4dd6..de4d549c 100644 --- a/python/BIRD/Test.py +++ b/python/BIRD/Test.py @@ -1,6 +1,7 @@ import asyncio import ipaddress import jinja2 +import json import os import pathlib import sys @@ -17,6 +18,7 @@ from flock.Hypervisor import Hypervisor from flock.Machine import Machine from .CLI import CLI, Transport from .LogChecker import LogChecker, LogExpectedFuture +from .Aux import dict_gather, dict_expand # TODO: move this to some aux file class Differs(Exception): @@ -32,6 +34,56 @@ class Differs(Exception): else: return False +class ComparableDict(dict): + def __lt__(self, other): + if type(other) is dict: + return self < ComparableDict(other) + elif type(other) is ComparableDict: + sk = sorted(list(self.keys())) + ok = sorted(list(other.keys())) + + if sk == ok: + for k in sk: + if self[k] < other[k]: + return True + if self[k] > other[k]: + return False + + return False + else: + return sk < ok + else: + raise TypeError("Inequality impossible between ComparableDict and non-dict") + + def __gt__(self, other): + if type(other) is dict: + return ComparableDict(other) < self + else: + return other < self + + def __le__(self, other): + if self == other: + return True + else: + return self < other + + def __ge__(self, other): + if self == other: + return True + else: + return self > other + +def sort_arrays(a): + if type(a) is str: + return a + if type(a) is int: + return a + + try: + return { k: sort_arrays(v) for k,v in a.items() } + except AttributeError: + return sorted([sort_arrays(v) for v in a ], key=lambda v: ComparableDict(v) if type(v) is dict else v) + def deep_eq(a, b, deep=False): if a == b: return True @@ -224,6 +276,7 @@ class BIRDInstance(CLI): class DumpCheck: def __init__(self, test, timeout, name, check_timeout=None, check_id=None, check_retry_timeout=0.5): + self.test = test self.timeout = timeout self.check_timeout = timeout if check_timeout is None else check_timeout self.check_retry_timeout = check_retry_timeout @@ -298,15 +351,15 @@ class DumpCheck: return False class DumpOnMachines(DumpCheck): - def __init__(self, test, *args, machines=None, **kwargs): - super().__init__(test, *args, **kwargs) + def __init__(self, *args, machines=None, **kwargs): + super().__init__(*args, **kwargs) # Collect machines to dump if machines is None: - self.machines = test.machine_index.values() + self.machines = self.test.machine_index.values() else: self.machines = [ - m if isinstance(m, CLI) else test.machine_index[m] + m if isinstance(m, CLI) else self.test.machine_index[m] for m in machines ] @@ -337,7 +390,27 @@ class DumpRIB(DumpOnMachines): del r[k] return d +class DumpLinuxKRT(DumpOnMachines): + def __init__(self, *args, cmdargs=None, **kwargs): + super().__init__(*args, **kwargs) + if cmdargs is None: + self.cmdargs = [] + else: + self.cmdargs = cmdargs + async def obtain_on_machine(self, mach): + raw = await dict_gather({ + fam: + self.test.hypervisor.control_socket.send_cmd( + "run_in", mach.mach.name, "ip", "-j", f"-{fam}", "route", "show", *self.cmdargs) + for fam in ("4", "6", "M") + }) + + for k,v in raw.items(): + if v["ret"] != 0 or len(v["err"]) != 0: + raise Exception(f"Failed to gather krt dump for {k}: ret={v['ret']}, {v['err']}") + + return { k: sort_arrays(json.loads(v["out"])) for k,v in raw.items() } class Test: ipv6_prefix = ipaddress.ip_network("2001:db8::/32") @@ -470,6 +543,36 @@ class Test: await self.cleanup() + async def krt_dump(self, timeout, name, *args, full=True, machines=None, check_timeout=10, check_retry_timeout=0.5): + # Collect machines to dump + if machines is None: + machines = self.machine_index.values() + else: + machines = [ + m if isinstance(m, CLI) else self.machine_index[m] + for m in machines + ] + + raw = await dict_gather({ + (mach.mach.name, fam): + mach.mach.hypervisor.control_socket.send_cmd( + "run_in", mach.mach.name, "ip", "-j", f"-{fam}", "route", "show", *args) + for mach in machines + for fam in ("4", "6", "M") + }) + + for k,v in raw.items(): + if v["ret"] != 0 or len(v["err"]) != 0: + raise Exception(f"Failed to gather krt dump for {k}: ret={v['ret']}, {v['err']}") + + dump = dict_expand({ k: json.loads(v["out"]) for k,v in raw.items()}) + print(dump) + + name = "krt.yaml" + with open(name, "w") as y: + yaml.dump(dump, y) + + if __name__ == "__main__": name = sys.argv[1] mode = Test.CHECK