From c7985efcf5af6e16cf18d2ecc2fa145ce25a55a5 Mon Sep 17 00:00:00 2001 From: ISHIDA Wataru Date: Tue, 2 Aug 2016 10:47:03 +0000 Subject: test: add test for unnumbered bgp feature Signed-off-by: ISHIDA Wataru --- test/lib/base.py | 38 ++++++++++++++++++++++++-------------- test/lib/gobgp.py | 42 ++++++++++++++++++++++-------------------- 2 files changed, 46 insertions(+), 34 deletions(-) (limited to 'test/lib') diff --git a/test/lib/base.py b/test/lib/base.py index 18fa487c..4b4ff4ef 100644 --- a/test/lib/base.py +++ b/test/lib/base.py @@ -293,36 +293,46 @@ class BGPContainer(Container): super(BGPContainer, self).run() return self.WAIT_FOR_BOOT + def peer_name(self, peer): + if peer not in self.peers: + raise Exception('not found peer {0}'.format(peer.router_id)) + name = self.peers[peer]['interface'] + if name == '': + name = self.peers[peer]['neigh_addr'].split('/')[0] + return name + def add_peer(self, peer, passwd=None, vpn=False, is_rs_client=False, policies=None, passive=False, is_rr_client=False, cluster_id=None, flowspec=False, bridge='', reload_config=True, as2=False, graceful_restart=None, local_as=None, prefix_limit=None, - v6=False, llgr=None, vrf=''): + v6=False, llgr=None, vrf='', interface=''): neigh_addr = '' local_addr = '' it = itertools.product(self.ip_addrs, peer.ip_addrs) if v6: it = itertools.product(self.ip6_addrs, peer.ip6_addrs) - for me, you in it: - if bridge != '' and bridge != me[2]: - continue - if me[2] == you[2]: - neigh_addr = you[1] - local_addr = me[1] - if v6: - addr, mask = local_addr.split('/') - local_addr = "{0}%{1}/{2}".format(addr, me[0], mask) - break - - if neigh_addr == '': - raise Exception('peer {0} seems not ip reachable'.format(peer)) + if interface == '': + for me, you in it: + if bridge != '' and bridge != me[2]: + continue + if me[2] == you[2]: + neigh_addr = you[1] + local_addr = me[1] + if v6: + addr, mask = local_addr.split('/') + local_addr = "{0}%{1}/{2}".format(addr, me[0], mask) + break + + if neigh_addr == '': + raise Exception('peer {0} seems not ip reachable'.format(peer)) if not policies: policies = {} self.peers[peer] = {'neigh_addr': neigh_addr, + 'interface': interface, 'passwd': passwd, 'vpn': vpn, 'flowspec': flowspec, diff --git a/test/lib/gobgp.py b/test/lib/gobgp.py index 84e30198..14fbfe1f 100644 --- a/test/lib/gobgp.py +++ b/test/lib/gobgp.py @@ -152,9 +152,7 @@ class GoBGPContainer(BGPContainer): return None def _trigger_peer_cmd(self, cmd, peer): - if peer not in self.peers: - raise Exception('not found peer {0}'.format(peer.router_id)) - peer_addr = self.peers[peer]['neigh_addr'].split('/')[0] + peer_addr = self.peer_name(peer) cmd = 'gobgp neighbor {0} {1}'.format(peer_addr, cmd) self.local(cmd) @@ -171,9 +169,7 @@ class GoBGPContainer(BGPContainer): self._trigger_peer_cmd('softreset{0} -a {1}'.format(type, rf), peer) def get_local_rib(self, peer, prefix='', rf='ipv4'): - if peer not in self.peers: - raise Exception('not found peer {0}'.format(peer.router_id)) - peer_addr = self.peers[peer]['neigh_addr'].split('/')[0] + peer_addr = self.peer_name(peer) cmd = 'gobgp -j neighbor {0} local {1} -a {2}'.format(peer_addr, prefix, rf) output = self.local(cmd, capture=True) ret = json.loads(output) @@ -226,9 +222,7 @@ class GoBGPContainer(BGPContainer): t.start() def _get_adj_rib(self, adj_type, peer, prefix='', rf='ipv4'): - if peer not in self.peers: - raise Exception('not found peer {0}'.format(peer.router_id)) - peer_addr = self.peers[peer]['neigh_addr'].split('/')[0] + peer_addr = self.peer_name(peer) cmd = 'gobgp neighbor {0} adj-{1} {2} -a {3} -j'.format(peer_addr, adj_type, prefix, rf) @@ -249,10 +243,7 @@ class GoBGPContainer(BGPContainer): return self._get_adj_rib('out', peer, prefix, rf) def get_neighbor(self, peer): - if peer not in self.peers: - raise Exception('not found peer {0}'.format(peer.router_id)) - peer_addr = self.peers[peer]['neigh_addr'].split('/')[0] - cmd = 'gobgp -j neighbor {0}'.format(peer_addr) + cmd = 'gobgp -j neighbor {0}'.format(self.peer_name(peer)) return json.loads(self.local(cmd, capture=True)) def get_neighbor_state(self, peer): @@ -317,13 +308,17 @@ class GoBGPContainer(BGPContainer): for peer, info in self.peers.iteritems(): afi_safi_list = [] - version = netaddr.IPNetwork(info['neigh_addr']).version - if version == 4: - afi_safi_list.append({'config': {'afi-safi-name': 'ipv4-unicast'}}) - elif version == 6: - afi_safi_list.append({'config': {'afi-safi-name': 'ipv6-unicast'}}) + if info['interface'] != '': + afi_safi_list.append({'config':{'afi-safi-name': 'ipv4-unicast'}}) + afi_safi_list.append({'config':{'afi-safi-name': 'ipv6-unicast'}}) else: - Exception('invalid ip address version. {0}'.format(version)) + version = netaddr.IPNetwork(info['neigh_addr']).version + if version == 4: + afi_safi_list.append({'config':{'afi-safi-name': 'ipv4-unicast'}}) + elif version == 6: + afi_safi_list.append({'config':{'afi-safi-name': 'ipv6-unicast'}}) + else: + Exception('invalid ip address version. {0}'.format(version)) if info['vpn']: afi_safi_list.append({'config': {'afi-safi-name': 'l3vpn-ipv4-unicast'}}) @@ -337,9 +332,16 @@ class GoBGPContainer(BGPContainer): afi_safi_list.append({'config': {'afi-safi-name': 'ipv6-flowspec'}}) afi_safi_list.append({'config': {'afi-safi-name': 'l3vpn-ipv6-flowspec'}}) + neigh_addr = None + interface = None + if info['interface'] == '': + neigh_addr = info['neigh_addr'].split('/')[0] + else: + interface = info['interface'] n = { 'config': { - 'neighbor-address': info['neigh_addr'].split('/')[0], + 'neighbor-address': neigh_addr, + 'neighbor-interface': interface, 'peer-as': peer.asn, 'auth-password': info['passwd'], 'vrf': info['vrf'], -- cgit v1.2.3