summaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorSatoshi Fujimoto <satoshi.fujimoto7@gmail.com>2017-10-04 16:01:09 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2017-11-07 21:53:46 +0900
commit88862a1017a48e1bb8d11f8d06d7d6ef24283425 (patch)
tree5274e9410f79dc787cb03840785864e6aa951ff2 /test
parent002dca7e3b3c509ed6741343d5fecfeb183e19d2 (diff)
test/lib: Add bgp config structure for GoBGP/Quagga containers
This commit introduces 'bgp_config' attribute for GoBGP/Quagga containers to configure complex settings. Adding to this, this commit enables to configure BGP confederation settings to GoBGP/Quagga conrainers. Signed-off-by: Satoshi Fujimoto <satoshi.fujimoto7@gmail.com>
Diffstat (limited to 'test')
-rw-r--r--test/lib/base.py5
-rw-r--r--test/lib/gobgp.py29
-rw-r--r--test/lib/quagga.py23
3 files changed, 50 insertions, 7 deletions
diff --git a/test/lib/base.py b/test/lib/base.py
index 9dc44e82..b0f66ec4 100644
--- a/test/lib/base.py
+++ b/test/lib/base.py
@@ -327,7 +327,7 @@ class BGPContainer(Container):
graceful_restart=None, local_as=None, prefix_limit=None,
v6=False, llgr=None, vrf='', interface='', allow_as_in=0,
remove_private_as=None, replace_peer_as=False, addpath=False,
- treat_as_withdraw=False):
+ treat_as_withdraw=False, remote_as=None):
neigh_addr = ''
local_addr = ''
it = itertools.product(self.ip_addrs, peer.ip_addrs)
@@ -373,7 +373,8 @@ class BGPContainer(Container):
'remove_private_as': remove_private_as,
'replace_peer_as': replace_peer_as,
'addpath': addpath,
- 'treat_as_withdraw': treat_as_withdraw}
+ 'treat_as_withdraw': treat_as_withdraw,
+ 'remote_as': remote_as or peer.asn}
if self.is_running and reload_config:
self.create_config()
self.reload_config()
diff --git a/test/lib/gobgp.py b/test/lib/gobgp.py
index 7fa90291..601883e5 100644
--- a/test/lib/gobgp.py
+++ b/test/lib/gobgp.py
@@ -27,6 +27,7 @@ from fabric.utils import indent
import netaddr
import toml
import yaml
+import collections
from lib.base import (
BGPContainer,
@@ -55,7 +56,7 @@ class GoBGPContainer(BGPContainer):
def __init__(self, name, asn, router_id, ctn_image_name='osrg/gobgp',
log_level='debug', zebra=False, config_format='toml',
- zapi_version=2, ospfd_config=None):
+ zapi_version=2, bgp_config=None, ospfd_config=None):
super(GoBGPContainer, self).__init__(name, asn, router_id,
ctn_image_name)
self.shared_volumes.append((self.config_dir, self.SHARED_VOLUME))
@@ -72,6 +73,20 @@ class GoBGPContainer(BGPContainer):
self.zapi_version = zapi_version
self.config_format = config_format
+ # bgp_config is equivalent to config.BgpConfigSet structure
+ # Example:
+ # bgp_config = {
+ # 'global': {
+ # 'confederation': {
+ # 'config': {
+ # 'identifier': 10,
+ # 'member-as-list': [65001],
+ # }
+ # },
+ # },
+ # }
+ self.bgp_config = bgp_config or {}
+
# To start OSPFd in GoBGP container, specify 'ospfd_config' as a dict
# type value.
# Example:
@@ -294,6 +309,14 @@ class GoBGPContainer(BGPContainer):
if self.ospfd_config:
self._create_config_ospfd()
+ def _merge_dict(self, dct, merge_dct):
+ for k, v in merge_dct.iteritems():
+ if (k in dct and isinstance(dct[k], dict)
+ and isinstance(merge_dct[k], collections.Mapping)):
+ self._merge_dict(dct[k], merge_dct[k])
+ else:
+ dct[k] = merge_dct[k]
+
def _create_config_bgp(self):
config = {
'global': {
@@ -310,6 +333,8 @@ class GoBGPContainer(BGPContainer):
'neighbors': [],
}
+ self._merge_dict(config, self.bgp_config)
+
if self.zebra and self.zapi_version == 2:
config['global']['use-multiple-paths'] = {'config': {'enabled': True}}
@@ -349,7 +374,7 @@ class GoBGPContainer(BGPContainer):
'config': {
'neighbor-address': neigh_addr,
'neighbor-interface': interface,
- 'peer-as': peer.asn,
+ 'peer-as': info['remote_as'],
'auth-password': info['passwd'],
'vrf': info['vrf'],
'remove-private-as': info['remove_private_as'],
diff --git a/test/lib/quagga.py b/test/lib/quagga.py
index 86a468d8..8f5f17c1 100644
--- a/test/lib/quagga.py
+++ b/test/lib/quagga.py
@@ -38,12 +38,24 @@ class QuaggaBGPContainer(BGPContainer):
WAIT_FOR_BOOT = 1
SHARED_VOLUME = '/etc/quagga'
- def __init__(self, name, asn, router_id, ctn_image_name='osrg/quagga', zebra=False):
+ def __init__(self, name, asn, router_id, ctn_image_name='osrg/quagga', bgpd_config=None, zebra=False):
super(QuaggaBGPContainer, self).__init__(name, asn, router_id,
ctn_image_name)
self.shared_volumes.append((self.config_dir, self.SHARED_VOLUME))
self.zebra = zebra
+ # bgp_config is equivalent to config.BgpConfigSet structure
+ # Example:
+ # bgpd_config = {
+ # 'global': {
+ # 'confederation': {
+ # 'identifier': 10,
+ # 'peers': [65001],
+ # },
+ # },
+ # }
+ self.bgpd_config = bgpd_config or {}
+
def run(self):
super(QuaggaBGPContainer, self).run()
return self.WAIT_FOR_BOOT
@@ -160,14 +172,19 @@ class QuaggaBGPContainer(BGPContainer):
if any(info['graceful_restart'] for info in self.peers.itervalues()):
c << 'bgp graceful-restart'
+ if 'global' in self.bgpd_config:
+ if 'confederation' in self.bgpd_config['global']:
+ conf = self.bgpd_config['global']['confederation']['config']
+ c << 'bgp confederation identifier {0}'.format(conf['identifier'])
+ c << 'bgp confederation peers {0}'.format(' '.join([str(i) for i in conf['member-as-list']]))
+
version = 4
for peer, info in self.peers.iteritems():
version = netaddr.IPNetwork(info['neigh_addr']).version
n_addr = info['neigh_addr'].split('/')[0]
if version == 6:
c << 'no bgp default ipv4-unicast'
-
- c << 'neighbor {0} remote-as {1}'.format(n_addr, peer.asn)
+ c << 'neighbor {0} remote-as {1}'.format(n_addr, info['remote_as'])
if info['is_rs_client']:
c << 'neighbor {0} route-server-client'.format(n_addr)
for typ, p in info['policies'].iteritems():