diff options
| -rwxr-xr-x | smoketest/scripts/cli/test_protocols_bgp.py | 148 | 
1 files changed, 88 insertions, 60 deletions
| diff --git a/smoketest/scripts/cli/test_protocols_bgp.py b/smoketest/scripts/cli/test_protocols_bgp.py index 941d7828f..540ef2ec4 100755 --- a/smoketest/scripts/cli/test_protocols_bgp.py +++ b/smoketest/scripts/cli/test_protocols_bgp.py @@ -28,6 +28,8 @@ base_path = ['protocols', 'bgp', ASN]  neighbor_config = {      '192.0.2.1' : { +        'cap_dynamic' : '', +        'cap_ext_next': '',          'remote_as'   : '100',          'adv_interv'  : '400',          'passive'     : '', @@ -35,6 +37,7 @@ neighbor_config = {          'shutdown'    : '',          'cap_over'    : '',          'ttl_security': '5', +        'local_as'    : '300',          },      '192.0.2.2' : {          'remote_as'   : '200', @@ -49,6 +52,7 @@ neighbor_config = {          'remote_as'   : '200',          'passive'     : '',          'multi_hop'   : '5', +        'update_src'  : 'lo',          },  } @@ -63,18 +67,23 @@ peer_group_config = {  #       'ttl_security': '5',          },      'bar' : { +#        XXX: not available in current Perl backend +#       'description' : 'foo peer bar group',          'remote_as'   : '200',          'shutdown'    : '',          'no_cap_nego' : '', +        'local_as'    : '300',          },      'baz' : { +        'cap_dynamic' : '', +        'cap_ext_next': '',          'remote_as'   : '200',          'passive'     : '',          'multi_hop'   : '5', +        'update_src'  : 'lo',          },  } -  def getFRRBGPconfig():      return cmd(f'vtysh -c "show run" | sed -n "/router bgp {ASN}/,/^!/p"') @@ -87,6 +96,35 @@ class TestProtocolsBGP(unittest.TestCase):          self.session.commit()          del self.session +    def verify_frr_config(self, peer, peer_config, frrconfig): +        # recurring patterns to verify for both a simple neighbor and a peer-group +        if 'cap_dynamic' in peer_config: +            self.assertIn(f' neighbor {peer} capability dynamic', frrconfig) +        if 'cap_ext_next' in peer_config: +            self.assertIn(f' neighbor {peer} capability extended-nexthop', frrconfig) +        if 'description' in peer_config: +            self.assertIn(f' neighbor {peer} description {peer_config["description"]}', frrconfig) +        if 'no_cap_nego' in peer_config: +            self.assertIn(f' neighbor {peer} dont-capability-negotiate', frrconfig) +        if 'multi_hop' in peer_config: +            self.assertIn(f' neighbor {peer} ebgp-multihop {peer_config["multi_hop"]}', frrconfig) +        if 'local_as' in peer_config: +            self.assertIn(f' neighbor {peer} local-as {peer_config["local_as"]}', frrconfig) +        if 'cap_over' in peer_config: +            self.assertIn(f' neighbor {peer} override-capability', frrconfig) +        if 'passive' in peer_config: +            self.assertIn(f' neighbor {peer} passive', frrconfig) +        if 'password' in peer_config: +            self.assertIn(f' neighbor {peer} password {peer_config["password"]}', frrconfig) +        if 'remote_as' in peer_config: +            self.assertIn(f' neighbor {peer} remote-as {peer_config["remote_as"]}', frrconfig) +        if 'shutdown' in peer_config: +            self.assertIn(f' neighbor {peer} shutdown', frrconfig) +        if 'ttl_security' in peer_config: +            self.assertIn(f' neighbor {peer} ttl-security hops {peer_config["ttl_security"]}', frrconfig) +        if 'update_src' in peer_config: +            self.assertIn(f' neighbor {peer} update-source {peer_config["update_src"]}', frrconfig) +      def test_bgp_01_simple(self):          router_id = '127.0.0.1'          local_pref = '500' @@ -113,31 +151,41 @@ class TestProtocolsBGP(unittest.TestCase):          self.assertTrue(process_named_running(PROCESS_NAME))      def test_bgp_02_neighbors(self): +        # Test out individual neighbor configuration items, not all of them are +        # also available to a peer-group!          for neighbor, config in neighbor_config.items(): -            if 'remote_as' in config: -                self.session.set(base_path + ['neighbor', neighbor, 'remote-as', config["remote_as"]]) -            if 'description' in config: -                self.session.set(base_path + ['neighbor', neighbor, 'description', config["description"]]) -            if 'passive' in config: -                self.session.set(base_path + ['neighbor', neighbor, 'passive']) -            if 'password' in config: -                self.session.set(base_path + ['neighbor', neighbor, 'password', config["password"]]) -            if 'shutdown' in config: -                self.session.set(base_path + ['neighbor', neighbor, 'shutdown'])              if 'adv_interv' in config:                  self.session.set(base_path + ['neighbor', neighbor, 'advertisement-interval', config["adv_interv"]]) +            if 'cap_dynamic' in config: +                self.session.set(base_path + ['neighbor', neighbor, 'capability', 'dynamic']) +            if 'cap_ext_next' in config: +                self.session.set(base_path + ['neighbor', neighbor, 'capability', 'extended-nexthop']) +            if 'description' in config: +                self.session.set(base_path + ['neighbor', neighbor, 'description', config["description"]])              if 'no_cap_nego' in config:                  self.session.set(base_path + ['neighbor', neighbor, 'disable-capability-negotiation']) -            if 'port' in config: -                self.session.set(base_path + ['neighbor', neighbor, 'port', config["port"]])              if 'multi_hop' in config:                  self.session.set(base_path + ['neighbor', neighbor, 'ebgp-multihop', config["multi_hop"]]) +            if 'local_as' in config: +                self.session.set(base_path + ['neighbor', neighbor, 'local-as', config["local_as"]])              if 'cap_over' in config:                  self.session.set(base_path + ['neighbor', neighbor, 'override-capability']) +            if 'passive' in config: +                self.session.set(base_path + ['neighbor', neighbor, 'passive']) +            if 'password' in config: +                self.session.set(base_path + ['neighbor', neighbor, 'password', config["password"]]) +            if 'port' in config: +                self.session.set(base_path + ['neighbor', neighbor, 'port', config["port"]]) +            if 'remote_as' in config: +                self.session.set(base_path + ['neighbor', neighbor, 'remote-as', config["remote_as"]])              if 'cap_strict' in config:                  self.session.set(base_path + ['neighbor', neighbor, 'strict-capability-match']) +            if 'shutdown' in config: +                self.session.set(base_path + ['neighbor', neighbor, 'shutdown'])              if 'ttl_security' in config:                  self.session.set(base_path + ['neighbor', neighbor, 'ttl-security', 'hops', config["ttl_security"]]) +            if 'update_src' in config: +                self.session.set(base_path + ['neighbor', neighbor, 'update-source', config["update_src"]])          # commit changes          self.session.commit() @@ -146,49 +194,45 @@ class TestProtocolsBGP(unittest.TestCase):          frrconfig = getFRRBGPconfig()          self.assertIn(f'router bgp {ASN}', frrconfig) -        for neighbor, config in neighbor_config.items(): -            if 'remote_as' in config: -                self.assertIn(f' neighbor {neighbor} remote-as {config["remote_as"]}', frrconfig) -            if 'description' in config: -                self.assertIn(f' neighbor {neighbor} description {config["description"]}', frrconfig) -            if 'passive' in config: -                self.assertIn(f' neighbor {neighbor} passive', frrconfig) -            if 'password' in config: -                self.assertIn(f' neighbor {neighbor} password {config["password"]}', frrconfig) -            if 'shutdown' in config: -                self.assertIn(f' neighbor {neighbor} shutdown', frrconfig) +        for peer, peer_config in neighbor_config.items():              if 'adv_interv' in config: -                self.assertIn(f' neighbor {neighbor} advertisement-interval {config["adv_interv"]}', frrconfig) -            if 'no_cap_nego' in config: -                self.assertIn(f' neighbor {neighbor} dont-capability-negotiate', frrconfig) +                self.assertIn(f' neighbor {peer} advertisement-interval {peer_config["adv_interv"]}', frrconfig)              if 'port' in config: -                self.assertIn(f' neighbor {neighbor} port {config["port"]}', frrconfig) -            if 'multi_hop' in config: -                self.assertIn(f' neighbor {neighbor} ebgp-multihop {config["multi_hop"]}', frrconfig) -            if 'cap_over' in config: -                self.assertIn(f' neighbor {neighbor} override-capability', frrconfig) +                self.assertIn(f' neighbor {peer} port {peer_config["port"]}', frrconfig)              if 'cap_strict' in config: -                self.assertIn(f' neighbor {neighbor} strict-capability-match', frrconfig) -            if 'ttl_security' in config: -                self.assertIn(f' neighbor {neighbor} ttl-security hops {config["ttl_security"]}', frrconfig) +                self.assertIn(f' neighbor {peer} strict-capability-match', frrconfig) + +            self.verify_frr_config(peer, peer_config, frrconfig)      def test_bgp_03_peer_groups(self): +        # Test out individual peer-group configuration items          for peer_group, config in peer_group_config.items(): -            self.session.set(base_path + ['peer-group', peer_group, 'remote-as', config["remote_as"]]) -            if 'passive' in config: -                self.session.set(base_path + ['peer-group', peer_group, 'passive']) -            if 'password' in config: -                self.session.set(base_path + ['peer-group', peer_group, 'password', config["password"]]) -            if 'shutdown' in config: -                self.session.set(base_path + ['peer-group', peer_group, 'shutdown']) +            if 'cap_dynamic' in config: +                self.session.set(base_path + ['peer-group', peer_group, 'capability', 'dynamic']) +            if 'cap_ext_next' in config: +                self.session.set(base_path + ['peer-group', peer_group, 'capability', 'extended-nexthop']) +            if 'description' in config: +                self.session.set(base_path + ['peer-group', peer_group, 'description', config["description"]])              if 'no_cap_nego' in config:                  self.session.set(base_path + ['peer-group', peer_group, 'disable-capability-negotiation'])              if 'multi_hop' in config:                  self.session.set(base_path + ['peer-group', peer_group, 'ebgp-multihop', config["multi_hop"]]) +            if 'local_as' in config: +                self.session.set(base_path + ['peer-group', peer_group, 'local-as', config["local_as"]])              if 'cap_over' in config:                  self.session.set(base_path + ['peer-group', peer_group, 'override-capability']) +            if 'passive' in config: +                self.session.set(base_path + ['peer-group', peer_group, 'passive']) +            if 'password' in config: +                self.session.set(base_path + ['peer-group', peer_group, 'password', config["password"]]) +            if 'remote_as' in config: +                self.session.set(base_path + ['peer-group', peer_group, 'remote-as', config["remote_as"]]) +            if 'shutdown' in config: +                self.session.set(base_path + ['peer-group', peer_group, 'shutdown'])              if 'ttl_security' in config:                  self.session.set(base_path + ['peer-group', peer_group, 'ttl-security', 'hops', config["ttl_security"]]) +            if 'update_src' in config: +                self.session.set(base_path + ['peer-group', peer_group, 'update-source', config["update_src"]])          # commit changes          self.session.commit() @@ -197,25 +241,9 @@ class TestProtocolsBGP(unittest.TestCase):          frrconfig = getFRRBGPconfig()          self.assertIn(f'router bgp {ASN}', frrconfig) -        for peer_group, config in peer_group_config.items(): +        for peer, peer_config in peer_group_config.items():              self.assertIn(f' neighbor {peer_group} peer-group', frrconfig) - -            if 'remote_as' in config: -                self.assertIn(f' neighbor {peer_group} remote-as {config["remote_as"]}', frrconfig) -            if 'passive' in config: -                self.assertIn(f' neighbor {peer_group} passive', frrconfig) -            if 'password' in config: -                self.assertIn(f' neighbor {peer_group} password {config["password"]}', frrconfig) -            if 'shutdown' in config: -                self.assertIn(f' neighbor {peer_group} shutdown', frrconfig) -            if 'no_cap_nego' in config: -                self.assertIn(f' neighbor {peer_group} dont-capability-negotiate', frrconfig) -            if 'multi_hop' in config: -                self.assertIn(f' neighbor {peer_group} ebgp-multihop {config["multi_hop"]}', frrconfig) -            if 'cap_over' in config: -                self.assertIn(f' neighbor {peer_group} override-capability', frrconfig) -            if 'ttl_security' in config: -                self.assertIn(f' neighbor {peer_group} ttl-security hops {config["ttl_security"]}', frrconfig) +            self.verify_frr_config(peer, peer_config, frrconfig)  if __name__ == '__main__':      unittest.main(verbosity=2) | 
