diff --git a/flock/bgp-secondary/bird_src.conf b/flock/bgp-secondary/bird_src.conf index bf6f5d75..1f7b1a08 100644 --- a/flock/bgp-secondary/bird_src.conf +++ b/flock/bgp-secondary/bird_src.conf @@ -61,6 +61,11 @@ protocol static p170 { disabled; } +protocol static STARTUP { + ipv6; + route 2001:db8:cc00::/40 unreachable; +} + # We need to CHECK this: # - adding worst to best # - adding best to worst @@ -68,6 +73,8 @@ protocol static p170 { # - reconf function CHECK() -> bool { + if net = 2001:db8:cc00::/40 then return true; + bgp_path.prepend(preference); case epoch { 1: case preference { diff --git a/flock/bgp-secondary/dump-0001-startup.yaml b/flock/bgp-secondary/dump-0001-startup.yaml new file mode 100644 index 00000000..eedcd3af --- /dev/null +++ b/flock/bgp-secondary/dump-0001-startup.yaml @@ -0,0 +1,26 @@ +tables: + master4: + networks: {} + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (200)' + dest: unreachable + proto: STARTUP + when: true +version: v3.0-alpha2-660-g62145d08-x +--- +tables: + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (100) [AS1i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true +version: v3.0-alpha2-660-g62145d08-x diff --git a/flock/bgp-secondary/dump-0002-enable-p170.yaml b/flock/bgp-secondary/dump-0002-enable-p170.yaml new file mode 100644 index 00000000..bdfa2b6e --- /dev/null +++ b/flock/bgp-secondary/dump-0002-enable-p170.yaml @@ -0,0 +1,80 @@ +tables: + master4: + networks: {} + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (200)' + dest: unreachable + proto: STARTUP + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (170)' + dest: unreachable + proto: p170 + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (170)' + dest: unreachable + proto: p170 + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (170)' + dest: unreachable + proto: p170 + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (170)' + dest: unreachable + proto: p170 + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (170)' + dest: unreachable + proto: p170 + when: true + 2001:db8:eee6::/48: + routes: + - args: '* (170)' + dest: unreachable + proto: p170 + when: true +version: v3.0-alpha2-660-g62145d08-x +--- +tables: + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (100) [AS1i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (100) [AS170i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (100) [AS170i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true +version: v3.0-alpha2-660-g62145d08-x diff --git a/flock/bgp-secondary/dump-0003-enable-p180.yaml b/flock/bgp-secondary/dump-0003-enable-p180.yaml new file mode 100644 index 00000000..21957c26 --- /dev/null +++ b/flock/bgp-secondary/dump-0003-enable-p180.yaml @@ -0,0 +1,113 @@ +tables: + master4: + networks: {} + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (200)' + dest: unreachable + proto: STARTUP + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (180)' + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (180)' + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (180)' + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (180)' + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (180)' + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee6::/48: + routes: + - args: '* (180)' + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true +version: v3.0-alpha2-660-g62145d08-x +--- +tables: + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (100) [AS1i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (100) [AS180i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (100) [AS170i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (100) [AS170i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true +version: v3.0-alpha2-660-g62145d08-x diff --git a/flock/bgp-secondary/dump-0004-enable-p190.yaml b/flock/bgp-secondary/dump-0004-enable-p190.yaml new file mode 100644 index 00000000..1b359dc3 --- /dev/null +++ b/flock/bgp-secondary/dump-0004-enable-p190.yaml @@ -0,0 +1,146 @@ +tables: + master4: + networks: {} + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (200)' + dest: unreachable + proto: STARTUP + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (190)' + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (190)' + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (190)' + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (190)' + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (190)' + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee6::/48: + routes: + - args: '* (190)' + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true +version: v3.0-alpha2-660-g62145d08-x +--- +tables: + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (100) [AS1i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (100) [AS190i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (100) [AS180i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (100) [AS190i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (100) [AS170i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true +version: v3.0-alpha2-660-g62145d08-x diff --git a/flock/bgp-secondary/dump-0005-enable-p200.yaml b/flock/bgp-secondary/dump-0005-enable-p200.yaml new file mode 100644 index 00000000..94870c54 --- /dev/null +++ b/flock/bgp-secondary/dump-0005-enable-p200.yaml @@ -0,0 +1,179 @@ +tables: + master4: + networks: {} + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (200)' + dest: unreachable + proto: STARTUP + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee6::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true +version: v3.0-alpha2-660-g62145d08-x +--- +tables: + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (100) [AS1i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (100) [AS190i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (100) [AS190i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (100) [AS170i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true +version: v3.0-alpha2-660-g62145d08-x diff --git a/flock/bgp-secondary/dump-0006-disable-p170.yaml b/flock/bgp-secondary/dump-0006-disable-p170.yaml new file mode 100644 index 00000000..db783ce4 --- /dev/null +++ b/flock/bgp-secondary/dump-0006-disable-p170.yaml @@ -0,0 +1,146 @@ +tables: + master4: + networks: {} + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (200)' + dest: unreachable + proto: STARTUP + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + 2001:db8:eee6::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true +version: v3.0-alpha2-660-g62145d08-x +--- +tables: + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (100) [AS1i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (100) [AS190i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (100) [AS190i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true +version: v3.0-alpha2-660-g62145d08-x diff --git a/flock/bgp-secondary/dump-0007-disable-p180.yaml b/flock/bgp-secondary/dump-0007-disable-p180.yaml new file mode 100644 index 00000000..3ed7b2b9 --- /dev/null +++ b/flock/bgp-secondary/dump-0007-disable-p180.yaml @@ -0,0 +1,122 @@ +tables: + master4: + networks: {} + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (200)' + dest: unreachable + proto: STARTUP + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + 2001:db8:eee6::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true +version: v3.0-alpha2-660-g62145d08-x +--- +tables: + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (100) [AS1i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (100) [AS190i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (100) [AS190i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true +version: v3.0-alpha2-660-g62145d08-x diff --git a/flock/bgp-secondary/dump-0008-disable-p190.yaml b/flock/bgp-secondary/dump-0008-disable-p190.yaml new file mode 100644 index 00000000..49eace6a --- /dev/null +++ b/flock/bgp-secondary/dump-0008-disable-p190.yaml @@ -0,0 +1,80 @@ +tables: + master4: + networks: {} + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (200)' + dest: unreachable + proto: STARTUP + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + 2001:db8:eee6::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true +version: v3.0-alpha2-660-g62145d08-x +--- +tables: + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (100) [AS1i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true +version: v3.0-alpha2-660-g62145d08-x diff --git a/flock/bgp-secondary/dump-0009-disable-p200.yaml b/flock/bgp-secondary/dump-0009-disable-p200.yaml new file mode 100644 index 00000000..eedcd3af --- /dev/null +++ b/flock/bgp-secondary/dump-0009-disable-p200.yaml @@ -0,0 +1,26 @@ +tables: + master4: + networks: {} + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (200)' + dest: unreachable + proto: STARTUP + when: true +version: v3.0-alpha2-660-g62145d08-x +--- +tables: + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (100) [AS1i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true +version: v3.0-alpha2-660-g62145d08-x diff --git a/flock/bgp-secondary/dump-0010-enable-p200.yaml b/flock/bgp-secondary/dump-0010-enable-p200.yaml new file mode 100644 index 00000000..49eace6a --- /dev/null +++ b/flock/bgp-secondary/dump-0010-enable-p200.yaml @@ -0,0 +1,80 @@ +tables: + master4: + networks: {} + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (200)' + dest: unreachable + proto: STARTUP + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + 2001:db8:eee6::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true +version: v3.0-alpha2-660-g62145d08-x +--- +tables: + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (100) [AS1i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true +version: v3.0-alpha2-660-g62145d08-x diff --git a/flock/bgp-secondary/dump-0011-enable-p190.yaml b/flock/bgp-secondary/dump-0011-enable-p190.yaml new file mode 100644 index 00000000..3ed7b2b9 --- /dev/null +++ b/flock/bgp-secondary/dump-0011-enable-p190.yaml @@ -0,0 +1,122 @@ +tables: + master4: + networks: {} + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (200)' + dest: unreachable + proto: STARTUP + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + 2001:db8:eee6::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true +version: v3.0-alpha2-660-g62145d08-x +--- +tables: + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (100) [AS1i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (100) [AS190i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (100) [AS190i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true +version: v3.0-alpha2-660-g62145d08-x diff --git a/flock/bgp-secondary/dump-0012-enable-p180.yaml b/flock/bgp-secondary/dump-0012-enable-p180.yaml new file mode 100644 index 00000000..db783ce4 --- /dev/null +++ b/flock/bgp-secondary/dump-0012-enable-p180.yaml @@ -0,0 +1,146 @@ +tables: + master4: + networks: {} + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (200)' + dest: unreachable + proto: STARTUP + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + 2001:db8:eee6::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true +version: v3.0-alpha2-660-g62145d08-x +--- +tables: + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (100) [AS1i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (100) [AS190i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (100) [AS190i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true +version: v3.0-alpha2-660-g62145d08-x diff --git a/flock/bgp-secondary/dump-0013-enable-p170.yaml b/flock/bgp-secondary/dump-0013-enable-p170.yaml new file mode 100644 index 00000000..94870c54 --- /dev/null +++ b/flock/bgp-secondary/dump-0013-enable-p170.yaml @@ -0,0 +1,179 @@ +tables: + master4: + networks: {} + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (200)' + dest: unreachable + proto: STARTUP + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee6::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true +version: v3.0-alpha2-660-g62145d08-x +--- +tables: + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (100) [AS1i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (100) [AS190i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (100) [AS190i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (100) [AS170i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true +version: v3.0-alpha2-660-g62145d08-x diff --git a/flock/bgp-secondary/dump-0014-add-all.yaml b/flock/bgp-secondary/dump-0014-add-all.yaml new file mode 100644 index 00000000..94870c54 --- /dev/null +++ b/flock/bgp-secondary/dump-0014-add-all.yaml @@ -0,0 +1,179 @@ +tables: + master4: + networks: {} + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (200)' + dest: unreachable + proto: STARTUP + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true + 2001:db8:eee6::/48: + routes: + - args: '* (200)' + dest: unreachable + proto: p200 + when: true + - args: (190) + dest: unreachable + proto: p190 + when: true + - args: (180) + dest: unreachable + proto: p180 + when: true + - args: (170) + dest: unreachable + proto: p170 + when: true +version: v3.0-alpha2-660-g62145d08-x +--- +tables: + master6: + networks: + 2001:db8:cc00::/40: + routes: + - args: '* (100) [AS1i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee1::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee2::/48: + routes: + - args: '* (100) [AS190i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee3::/48: + routes: + - args: '* (100) [AS200i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee4::/48: + routes: + - args: '* (100) [AS190i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true + 2001:db8:eee5::/48: + routes: + - args: '* (100) [AS170i]' + dest: unicast + nexthop: + - iface: L + nexthop: 2001:db8::1 + proto: LINK + when: true +version: v3.0-alpha2-660-g62145d08-x diff --git a/flock/bgp-secondary/test.py b/flock/bgp-secondary/test.py index 571bd848..54534fc3 100644 --- a/flock/bgp-secondary/test.py +++ b/flock/bgp-secondary/test.py @@ -17,11 +17,34 @@ class ThisTest(Test): # Start machines and links await self.start() - # Partial test - await self.route_dump(5) + # Startup check + await self.route_dump(10, "startup") - for p in ("p170", "p180", "p190", "p200"): + wtb = ("p170", "p180", "p190", "p200") + btw = reversed(wtb) + + # Enable worst to best + for p in wtb: await self.src.enable(p) - await self.route_dump(1) + await self.route_dump(1, f"enable-{p}") + + # Disable worst to best + for p in wtb: + await self.src.disable(p) + await self.route_dump(1, f"disable-{p}") + + # Enable best to worst + for p in btw: + await self.src.enable(p) + await self.route_dump(1, f"enable-{p}") + + # Disable worst to best + for p in btw: + await self.src.disable(p) + await self.route_dump(1, f"disable-{p}") + + # Re-enable all at once + await asyncio.gather(*[ self.src.enable(p) for p in wtb ]) + await self.route_dump(5, f"add-all") await self.cleanup() diff --git a/python/BIRD/ShowRoute.py b/python/BIRD/ShowRoute.py index 7ff2420b..2e1c4705 100644 --- a/python/BIRD/ShowRoute.py +++ b/python/BIRD/ShowRoute.py @@ -21,25 +21,20 @@ class CLIParser: return self.enter(groups) - print("subparser inited", self, self.result) def parse(self, line: str): - print(f"in {self} parsing line {line}") assert(self.cur == None) if line is not None: for k,v in self.subparsers.items(): - print(f"trying to match {k} for {v}") if m := k.match(line): self.cur = (c := v(groups=m.groups(), parent=self)) while c.cur is not None: c = c.cur return c elif self.parent is None: - print("overall exit", self, self.result) return self try: - print(f"exiting {self} with result {self.result}") self.exit() self.parent.cur = None return self.parent.parse(line) @@ -67,7 +62,6 @@ class ShowRouteParser(CLIParser): def __init__(self): super().__init__() self.result["tables"] = {} - print("parser init", self, self.result) @subparser(ShowRouteParser) class NothingParser(CLIParser): @@ -119,7 +113,7 @@ class RouteParser(CLIParser): class NextHopParser(CLIParser): entryRegex = re.compile("\\s+via ([0-9a-f:.]+) on (.*)") def enter(self, groups): - self.result = { + self.result = { k: v for k,v in zip(("nexthop", "iface"), groups) } @@ -128,11 +122,9 @@ class NextHopParser(CLIParser): def parse(data: str): parser = ShowRouteParser() - print("created parser", parser) for line in data.split("\n"): parser = parser.parse(line) parser = parser.parse(None) - print("returning result", parser.result) return parser.result diff --git a/python/BIRD/Test.py b/python/BIRD/Test.py index d35636ff..99d9f2df 100644 --- a/python/BIRD/Test.py +++ b/python/BIRD/Test.py @@ -4,6 +4,7 @@ import jinja2 import os import pathlib import sys +import yaml sys.path.insert(0, "/home/maria/flock") @@ -11,6 +12,58 @@ from flock.Hypervisor import Hypervisor from flock.Machine import Machine from .CLI import CLI, Transport +# TODO: move this to some aux file +class Differs(Exception): + def __init__(self, a, b, tree): + self.a = a + self.b = b + self.tree = tree + + @classmethod + def false(cls, a, b, deep, tree): + if deep: + raise cls(a, b, tree) + else: + return False + +def deep_eq(a, b, deep=False): + if a == b: + return True + + # Do not iterate over strings + if type(a) is str and type(b) is str: + return Differs.false(a, b, deep, tree=[]) + + try: + for k,v in a.items(): + try: + deep_eq(v, b[k], True) + except Differs as d: + d.tree.append(k) + raise d + except KeyError: + return Differs.false(v, None, deep, tree=[k]) + + for k in b: + if not k in a: + return Differs.false(None, b[k], deep, tree=[k]) + + except AttributeError: + try: + if len(a) != len(b): + return Differs.false(len(a), len(b), deep, tree=[len]) + + for i in range(len(a)): + try: + deep_eq(a[i], b[i]) + except Differs as d: + d.tree.append(i) + raise d + except TypeError: + return Differs.false(a, b, deep, []) + + return True + class MinimalistTransport(Transport): def __init__(self, socket, machine): self.sock = socket @@ -106,18 +159,26 @@ class Test: ipv6_link_pxlen = 64 ipv4_link_pxlen = 28 + SAVE = 1 + CHECK = 2 + + show_difs = False + # 198.51.100.0/24, 203.0.113.0/24 - def __init__(self, name): + def __init__(self, name, mode: int): self.name = name self.hypervisor = Hypervisor(name) self.machine_index = {} + self.mode = mode self._started = None self._starting = False self.ipv6_pxgen = self.ipv6_prefix.subnets(new_prefix=self.ipv6_link_pxlen) self.ipv4_pxgen = self.ipv4_prefix.subnets(new_prefix=self.ipv4_link_pxlen) + self.route_dump_id = 0 + async def hcom(self, *args): if self._started is None: self._started = asyncio.Future() @@ -190,10 +251,15 @@ class Test: await asyncio.gather(*[ v.cleanup() for v in self.machine_index.values() ]) await self.hcom("stop", True) - async def route_dump(self, timeout=None, machines=None): - if timeout is not None: - await asyncio.sleep(timeout) + async def route_dump(self, timeout, name, machines=None, check_timeout=10, check_retry_timeout=0.5): + # Compile dump ID + self.route_dump_id += 1 + if name is None: + name = f"dump-{self.route_dump_id:04d}.yaml" + else: + name = f"dump-{self.route_dump_id:04d}-{name}.yaml" + # Collect machines to dump if machines is None: machines = self.machine_index.values() else: @@ -202,16 +268,67 @@ class Test: for m in machines ] - print(*[ - await asyncio.gather(*[ + # Define the obtainer function + async def obtain(): + dump = await asyncio.gather(*[ where.show_route() for where in machines ]) - ]) + for d in dump: + for t in d["tables"].values(): + for n in t["networks"].values(): + for r in n["routes"]: + assert("when" in r) + r["when"] = True + return dump + match self.mode: + case Test.SAVE: + await asyncio.sleep(timeout) + dump = await obtain() + with open(name, "w") as y: + yaml.dump_all(dump, y) + print(f"{name}\t{self.route_dump_id}\t[ SAVED ]") + + case Test.CHECK: + with open(name, "r") as y: + c = [*yaml.safe_load_all(y)] + + seen = [] + try: + async with asyncio.timeout(check_timeout) as to: + while True: + dump = await obtain() + try: + deep_eq(c, dump, True) +# if deep_eq(c, dump): + spent = asyncio.get_running_loop().time() - to.when() + check_timeout + print(f"{name}\t{self.route_dump_id}\t[ OOK ]\t{spent:.6f}s") + return True + except Differs as d: + if self.show_difs: + print(f"Differs at {' -> '.join([str(s) for s in reversed(d.tree)])}: {d.a} != {d.b}") + + seen.append(dump) + await asyncio.sleep(check_retry_timeout) + except TimeoutError as e: + print(f"{name}\t{self.route_dump_id}\t[ BAD ]") + for q in range(len(seen)): + with open(f"__result_bad_{q}__{name}", "w") as y: + yaml.dump_all(seen[q], y) + + return False + + case _: + raise Exception("Invalid test mode") if __name__ == "__main__": name = sys.argv[1] + mode = Test.CHECK + + if name == "-s": + name = sys.argv[2] + mode = Test.SAVE p = (pathlib.Path(__file__).parent.parent.parent / "flock" / name).absolute() sys.path.insert(0, str(p)) @@ -222,4 +339,4 @@ if __name__ == "__main__": import test os.chdir(p) - asyncio.run(test.ThisTest(name).run()) + asyncio.run(test.ThisTest(name, mode).run())