diff options
Diffstat (limited to 'test/lib/gobgp.py')
-rw-r--r-- | test/lib/gobgp.py | 122 |
1 files changed, 76 insertions, 46 deletions
diff --git a/test/lib/gobgp.py b/test/lib/gobgp.py index 8c0d9cdd..468bd0ae 100644 --- a/test/lib/gobgp.py +++ b/test/lib/gobgp.py @@ -13,22 +13,39 @@ # See the License for the specific language governing permissions and # limitations under the License. -from base import * +from __future__ import absolute_import + import json -import toml -import yaml from itertools import chain from threading import Thread -import socket import subprocess import os +from fabric import colors +from fabric.api import local +from fabric.utils import indent +import netaddr +import toml +import yaml + +from lib.base import ( + BGPContainer, + CmdBuffer, + BGP_ATTR_TYPE_AS_PATH, + BGP_ATTR_TYPE_NEXT_HOP, + BGP_ATTR_TYPE_MULTI_EXIT_DISC, + BGP_ATTR_TYPE_LOCAL_PREF, + BGP_ATTR_TYPE_MP_REACH_NLRI, +) + + def extract_path_attribute(path, typ): for a in path['attrs']: if a['type'] == typ: return a return None + class GoBGPContainer(BGPContainer): SHARED_VOLUME = '/root/shared_volume' @@ -45,6 +62,7 @@ class GoBGPContainer(BGPContainer): self.prefix_set = None self.neighbor_set = None self.bgp_set = None + self.statements = None self.default_policy = None self.zebra = zebra self.zapi_version = zapi_version @@ -81,26 +99,29 @@ class GoBGPContainer(BGPContainer): self._start_gobgp() return self.WAIT_FOR_BOOT - def _get_as_path(self, path): - asps = (p['as_paths'] for p in path['attrs'] if - p['type'] == BGP_ATTR_TYPE_AS_PATH and 'as_paths' in p - and p['as_paths'] != None) + @staticmethod + def _get_as_path(path): + asps = (p['as_paths'] for p in path['attrs'] + if p['type'] == BGP_ATTR_TYPE_AS_PATH and 'as_paths' in p and p['as_paths'] is not None) asps = chain.from_iterable(asps) asns = (asp['asns'] for asp in asps) return list(chain.from_iterable(asns)) - def _get_nexthop(self, path): + @staticmethod + def _get_nexthop(path): for p in path['attrs']: if p['type'] == BGP_ATTR_TYPE_NEXT_HOP or p['type'] == BGP_ATTR_TYPE_MP_REACH_NLRI: return p['nexthop'] - def _get_local_pref(self, path): + @staticmethod + def _get_local_pref(path): for p in path['attrs']: if p['type'] == BGP_ATTR_TYPE_LOCAL_PREF: return p['value'] return None - def _get_med(self, path): + @staticmethod + def _get_med(path): for p in path['attrs']: if p['type'] == BGP_ATTR_TYPE_MULTI_EXIT_DISC: return p['metric'] @@ -222,7 +243,7 @@ class GoBGPContainer(BGPContainer): self.statements = [] def set_prefix_set(self, ps): - if type(ps) is not list: + if not isinstance(ps, list): ps = [ps] self.prefix_set = ps @@ -232,7 +253,7 @@ class GoBGPContainer(BGPContainer): self.prefix_set.append(ps) def set_neighbor_set(self, ns): - if type(ns) is not list: + if not isinstance(ns, list): ns = [ns] self.neighbor_set = ns @@ -250,13 +271,20 @@ class GoBGPContainer(BGPContainer): self._create_config_zebra() def _create_config_bgp(self): - config = {'global': {'config': {'as': self.asn, 'router-id': self.router_id}, - 'route-selection-options':{ + config = { + 'global': { + 'config': { + 'as': self.asn, + 'router-id': self.router_id, + }, + 'route-selection-options': { 'config': { 'external-compare-router-id': True, }, }, - }} + }, + 'neighbors': [], + } if self.zebra and self.zapi_version == 2: config['global']['use-multiple-paths'] = {'config': {'enabled': True}} @@ -265,9 +293,9 @@ class GoBGPContainer(BGPContainer): afi_safi_list = [] version = netaddr.IPNetwork(info['neigh_addr']).version if version == 4: - afi_safi_list.append({'config':{'afi-safi-name': 'ipv4-unicast'}}) + afi_safi_list.append({'config': {'afi-safi-name': 'ipv4-unicast'}}) elif version == 6: - afi_safi_list.append({'config':{'afi-safi-name': 'ipv6-unicast'}}) + afi_safi_list.append({'config': {'afi-safi-name': 'ipv6-unicast'}}) else: Exception('invalid ip address version. {0}'.format(version)) @@ -283,18 +311,23 @@ class GoBGPContainer(BGPContainer): afi_safi_list.append({'config': {'afi-safi-name': 'ipv6-flowspec'}}) afi_safi_list.append({'config': {'afi-safi-name': 'l3vpn-ipv6-flowspec'}}) - n = {'config': - {'neighbor-address': info['neigh_addr'].split('/')[0], - 'peer-as': peer.asn, - 'auth-password': info['passwd'], - 'vrf': info['vrf'], - }, - 'afi-safis': afi_safi_list, - 'timers': {'config': { - 'connect-retry': 10, - }}, - 'transport': {'config': {}}, - } + n = { + 'config': { + 'neighbor-address': info['neigh_addr'].split('/')[0], + 'peer-as': peer.asn, + 'auth-password': info['passwd'], + 'vrf': info['vrf'], + }, + 'afi-safis': afi_safi_list, + 'timers': { + 'config': { + 'connect-retry': 10, + }, + }, + 'transport': { + 'config': {}, + }, + } if ':' in info['local_addr']: n['transport']['config']['local-address'] = info['local_addr'].split('/')[0] @@ -310,7 +343,7 @@ class GoBGPContainer(BGPContainer): if info['prefix_limit']: for v in afi_safi_list: - v['prefix-limit'] = {'config': {'max-prefixes': info['prefix_limit'], 'shutdown-threshold-pct': 80 }} + v['prefix-limit'] = {'config': {'max-prefixes': info['prefix_limit'], 'shutdown-threshold-pct': 80}} if info['graceful_restart'] is not None: n['graceful-restart'] = {'config': {'enabled': True, 'restart-time': 20}} @@ -324,11 +357,11 @@ class GoBGPContainer(BGPContainer): afi_safi['long-lived-graceful-restart'] = {'config': {'enabled': True, 'restart-time': 30}} if info['is_rr_client']: - clusterId = self.router_id + cluster_id = self.router_id if 'cluster_id' in info and info['cluster_id'] is not None: - clusterId = info['cluster_id'] - n['route-reflector'] = {'config' : {'route-reflector-client': True, - 'route-reflector-cluster-id': clusterId}} + cluster_id = info['cluster_id'] + n['route-reflector'] = {'config': {'route-reflector-client': True, + 'route-reflector-cluster-id': cluster_id}} if len(info.get('default-policy', [])) + len(info.get('policies', [])) > 0: n['apply-policy'] = {'config': {}} @@ -336,7 +369,7 @@ class GoBGPContainer(BGPContainer): for typ, p in info.get('policies', {}).iteritems(): n['apply-policy']['config']['{0}-policy-list'.format(typ)] = [p['name']] - def f(v): + def _f(v): if v == 'reject': return 'reject-route' elif v == 'accept': @@ -344,10 +377,7 @@ class GoBGPContainer(BGPContainer): raise Exception('invalid default policy type {0}'.format(v)) for typ, d in info.get('default-policy', {}).iteritems(): - n['apply-policy']['config']['default-{0}-policy'.format(typ)] = f(d) - - if 'neighbors' not in config: - config['neighbors'] = [] + n['apply-policy']['config']['default-{0}-policy'.format(typ)] = _f(d) config['neighbors'].append(n) @@ -372,9 +402,9 @@ class GoBGPContainer(BGPContainer): config['policy-definitions'] = policy_list if self.zebra: - config['zebra'] = {'config':{'enabled': True, - 'redistribute-route-type-list':['connect'], - 'version': self.zapi_version}} + config['zebra'] = {'config': {'enabled': True, + 'redistribute-route-type-list': ['connect'], + 'version': self.zapi_version}} with open('{0}/gobgpd.conf'.format(self.config_dir), 'w') as f: print colors.yellow('[{0}\'s new config]'.format(self.name)) @@ -405,8 +435,7 @@ class GoBGPContainer(BGPContainer): f.writelines(str(c)) def reload_config(self): - daemon = [] - daemon.append('gobgpd') + daemon = ['gobgpd'] if self.zebra: daemon.append('zebra') for d in daemon: @@ -428,7 +457,7 @@ class GoBGPContainer(BGPContainer): cmd = 'gobgp global '\ 'rib add match {0} then {1} -a {2}'.format(' '.join(v['matchs']), ' '.join(v['thens']), v['rf']) else: - raise Exception('unsupported route faily: {0}'.format(rf)) + raise Exception('unsupported route faily: {0}'.format(v['rf'])) self.local(cmd) @@ -449,6 +478,7 @@ class RawGoBGPContainer(GoBGPContainer): super(RawGoBGPContainer, self).__init__(name, asn, router_id, ctn_image_name, log_level, zebra, config_format) + def create_config(self): with open('{0}/gobgpd.conf'.format(self.config_dir), 'w') as f: print colors.yellow('[{0}\'s new config]'.format(self.name)) |