Skip to content

Commit

Permalink
Merge "add bgp router and its all peer bgp router ip's to the dynamic…
Browse files Browse the repository at this point in the history
…-tunnel config" into R2.20
  • Loading branch information
Zuul authored and opencontrail-ci-admin committed May 14, 2015
2 parents 8064db0 + 2566458 commit e66ca37
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 9 deletions.
21 changes: 17 additions & 4 deletions src/config/device-manager/device_manager/db.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,18 @@ def sandesh_request(cls, req):
resp.bgp_routers.extend(sandesh_router)
resp.response(req.context())

def get_all_bgp_router_ips(self):
if self.params['address'] is not None:
bgp_router_ips = set([self.params['address']])
else:
bgp_router_ips = set()
for peer_uuid in self.bgp_routers:
peer = BgpRouterDM.get(peer_uuid)
if peer is None or peer.params['address'] is None:
continue
bgp_router_ips.add(peer.params['address'])
return bgp_router_ips
#end get_all_bgp_router_ips

# end class BgpRouterDM

Expand Down Expand Up @@ -137,9 +149,10 @@ def push_config(self):
params, external)
self.config_manager.set_bgp_config(bgp_router.params)

if self.dataplane_ip is not None and GlobalSystemConfigDM.ip_fabric_subnets is not None:
self.config_manager.add_dynamic_tunnels(self.dataplane_ip, GlobalSystemConfigDM.ip_fabric_subnets)

bgp_router_ips = bgp_router.get_all_bgp_router_ips()
if self.dataplane_ip is not None:
self.config_manager.add_dynamic_tunnels(self.dataplane_ip,
GlobalSystemConfigDM.ip_fabric_subnets, bgp_router_ips)
vn_dict = {}
for vn_id in self.virtual_networks:
vn_dict[vn_id] = []
Expand Down Expand Up @@ -236,7 +249,7 @@ def update(self, obj=None):
if obj is None:
obj = self.read_obj(self.uuid)
GlobalSystemConfigDM.global_asn = obj.get('autonomous_system')
GlobalSystemConfigDM.ip_fabric_subnets = obj.get('ip_fabric_subnets', [])
GlobalSystemConfigDM.ip_fabric_subnets = obj.get('ip_fabric_subnets')
self.set_children('physical_router', obj)
# end update

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,17 +82,20 @@ def send_netconf(self, new_config, default_operation="merge",
e.message))
# end send_config

def add_dynamic_tunnels(self, tunnel_source_ip, ip_fabric_nets):
def add_dynamic_tunnels(self, tunnel_source_ip, ip_fabric_nets, bgp_router_ips):
self.tunnel_config = etree.Element("routing-options")
dynamic_tunnels = etree.SubElement(self.tunnel_config, "dynamic-tunnels")
dynamic_tunnel = etree.SubElement(dynamic_tunnels, "dynamic-tunnel")
etree.SubElement(dynamic_tunnel, "name").text = "__contrail__"
etree.SubElement(dynamic_tunnel, "source-address").text = tunnel_source_ip
etree.SubElement(dynamic_tunnel, "gre")
for subnet in ip_fabric_nets.get("subnet", []):
if ip_fabric_nets is not None:
for subnet in ip_fabric_nets.get("subnet", []):
dest_network = etree.SubElement(dynamic_tunnel, "destination-networks")
etree.SubElement(dest_network, "name").text = subnet['ip_prefix'] + '/' + str(subnet['ip_prefix_len'])
for bgp_router_ip in bgp_router_ips:
dest_network = etree.SubElement(dynamic_tunnel, "destination-networks")
etree.SubElement(dest_network, "name").text = subnet['ip_prefix'] + '/' + str(subnet['ip_prefix_len'])

etree.SubElement(dest_network, "name").text = bgp_router_ip + '/32'
#end add_dynamic_tunnels

def add_routing_instance(self, ri_name, import_targets, export_targets,
Expand Down
71 changes: 70 additions & 1 deletion src/config/device-manager/test/test_dm_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,8 @@ def test_tunnels_dm_1(self):

gevent.sleep(2)

xml_config_str = '<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0"><configuration><groups operation="replace"><name>__contrail__</name><protocols><bgp><group operation="replace"><name>__contrail__</name><type>internal</type><multihop/><local-address>1.1.1.1</local-address><family><route-target/><inet-vpn><unicast/></inet-vpn><evpn><signaling/></evpn><inet6-vpn><unicast/></inet6-vpn></family><keep>all</keep></group><group operation="replace"><name>__contrail_external__</name><type>external</type><multihop/><local-address>1.1.1.1</local-address><family><route-target/><inet-vpn><unicast/></inet-vpn><evpn><signaling/></evpn><inet6-vpn><unicast/></inet6-vpn></family><keep>all</keep></group></bgp></protocols><routing-options><route-distinguisher-id/><autonomous-system>64512</autonomous-system></routing-options><routing-options><dynamic-tunnels><dynamic-tunnel><name>__contrail__</name><source-address>5.5.5.5</source-address><gre/><destination-networks><name>10.0.0.0/24</name></destination-networks><destination-networks><name>20.0.0.0/32</name></destination-networks></dynamic-tunnel></dynamic-tunnels></routing-options></groups><apply-groups operation="replace">__contrail__</apply-groups></configuration></config>'
xml_config_str = '<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0"><configuration><groups operation="replace"><name>__contrail__</name><protocols><bgp><group operation="replace"><name>__contrail__</name><type>internal</type><multihop/><local-address>1.1.1.1</local-address><family><route-target/><inet-vpn><unicast/></inet-vpn><evpn><signaling/></evpn><inet6-vpn><unicast/></inet6-vpn></family><hold-time>90</hold-time><keep>all</keep></group><group operation="replace"><name>__contrail_external__</name><type>external</type><multihop/><local-address>1.1.1.1</local-address><family><route-target/><inet-vpn><unicast/></inet-vpn><evpn><signaling/></evpn><inet6-vpn><unicast/></inet6-vpn></family><hold-time>90</hold-time><keep>all</keep></group></bgp></protocols><routing-options><route-distinguisher-id/><autonomous-system>64512</autonomous-system></routing-options><routing-options><dynamic-tunnels><dynamic-tunnel><name>__contrail__</name><source-address>5.5.5.5</source-address><gre/><destination-networks><name>10.0.0.0/24</name></destination-networks><destination-networks><name>20.0.0.0/32</name></destination-networks><destination-networks><name>1.1.1.1/32</name></destination-networks></dynamic-tunnel></dynamic-tunnels></routing-options></groups><apply-groups operation="replace">__contrail__</apply-groups></configuration></config>'

self.check_netconf_config_mesg('1.1.1.1', xml_config_str)

#end test_tunnels_dm_1
Expand Down Expand Up @@ -249,6 +250,74 @@ def test_tunnels_dm_4(self):
xml_config_str = '<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0"><configuration><groups operation="replace"><name>__contrail__</name><protocols><bgp><group operation="replace"><name>__contrail__</name><type>internal</type><multihop/><local-address>1.1.1.1</local-address><family><route-target/><inet-vpn><unicast/></inet-vpn><evpn><signaling/></evpn><inet6-vpn><unicast/></inet6-vpn></family><keep>all</keep></group><group operation="replace"><name>__contrail_external__</name><type>external</type><multihop/><local-address>1.1.1.1</local-address><family><route-target/><inet-vpn><unicast/></inet-vpn><evpn><signaling/></evpn><inet6-vpn><unicast/></inet6-vpn></family><keep>all</keep></group></bgp></protocols><routing-options><route-distinguisher-id/><autonomous-system>64512</autonomous-system></routing-options><routing-options><dynamic-tunnels><dynamic-tunnel><name>__contrail__</name><source-address>5.5.5.5</source-address><gre/><destination-networks><name>30.0.0.0/24</name></destination-networks></dynamic-tunnel></dynamic-tunnels></routing-options></groups><apply-groups operation="replace">__contrail__</apply-groups></configuration></config>'
self.check_netconf_config_mesg('1.1.1.1', xml_config_str)
#end test_tunnels_dm_3

#dynamic tunnel test case - 5
# 1. configure ip fabric subnets,
# 2. create physical router with data plane source ip
# 3. check netconf XML config generated
# 4. add a new bgp peer
# 5. check if new peer ip is present in netconf XML config generated for dynamic tunnels
def test_tunnels_dm_5(self):
gs = self._vnc_lib.global_system_config_read(fq_name=[u'default-global-system-config'])
gs.set_ip_fabric_subnets(SubnetListType([SubnetType("10.0.0.0", 24), SubnetType("20.0.0.0", 16)]))
self._vnc_lib.global_system_config_update(gs)

bgp_router, pr = self.create_router('router1', '1.1.1.1')
pr.physical_router_dataplane_ip = "5.5.5.5"
self._vnc_lib.physical_router_update(pr)

gevent.sleep(2)

xml_config_str = '<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0"><configuration><groups operation="replace"><name>__contrail__</name><protocols><bgp><group operation="replace"><name>__contrail__</name><type>internal</type><multihop/><local-address>1.1.1.1</local-address><family><route-target/><inet-vpn><unicast/></inet-vpn><evpn><signaling/></evpn><inet6-vpn><unicast/></inet6-vpn></family><hold-time>90</hold-time><keep>all</keep></group><group operation="replace"><name>__contrail_external__</name><type>external</type><multihop/><local-address>1.1.1.1</local-address><family><route-target/><inet-vpn><unicast/></inet-vpn><evpn><signaling/></evpn><inet6-vpn><unicast/></inet6-vpn></family><hold-time>90</hold-time><keep>all</keep></group></bgp></protocols><routing-options><route-distinguisher-id/><autonomous-system>64512</autonomous-system></routing-options><routing-options><dynamic-tunnels><dynamic-tunnel><name>__contrail__</name><source-address>5.5.5.5</source-address><gre/><destination-networks><name>10.0.0.0/24</name></destination-networks><destination-networks><name>20.0.0.0/16</name></destination-networks><destination-networks><name>1.1.1.1/32</name></destination-networks></dynamic-tunnel></dynamic-tunnels></routing-options></groups><apply-groups operation="replace">__contrail__</apply-groups></configuration></config>'

self.check_netconf_config_mesg('1.1.1.1', xml_config_str)

bgp_router2, pr2 = self.create_router('router2', '20.2.2.2')
families = AddressFamilies(['route-target', 'inet-vpn', 'e-vpn'])
bgp_sess_attrs = [BgpSessionAttributes(address_families=families)]
bgp_sessions = [BgpSession(attributes=bgp_sess_attrs)]
bgp_peering_attrs = BgpPeeringAttributes(session=bgp_sessions)
bgp_router.add_bgp_router(bgp_router2, bgp_peering_attrs)
self._vnc_lib.bgp_router_update(bgp_router)

xml_config_str = '<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0"><configuration><groups operation="replace"><name>__contrail__</name><protocols><bgp><group operation="replace"><name>__contrail__</name><type>internal</type><multihop/><local-address>1.1.1.1</local-address><family><route-target/><inet-vpn><unicast/></inet-vpn><evpn><signaling/></evpn><inet6-vpn><unicast/></inet6-vpn></family><hold-time>90</hold-time><keep>all</keep></group><group operation="replace"><name>__contrail_external__</name><type>external</type><multihop/><local-address>1.1.1.1</local-address><family><route-target/><inet-vpn><unicast/></inet-vpn><evpn><signaling/></evpn><inet6-vpn><unicast/></inet6-vpn></family><hold-time>90</hold-time><keep>all</keep></group></bgp></protocols><routing-options><route-distinguisher-id/><autonomous-system>64512</autonomous-system></routing-options><routing-options><dynamic-tunnels><dynamic-tunnel><name>__contrail__</name><source-address>5.5.5.5</source-address><gre/><destination-networks><name>10.0.0.0/24</name></destination-networks><destination-networks><name>20.0.0.0/16</name></destination-networks><destination-networks><name>1.1.1.1/32</name></destination-networks><destination-networks><name>20.2.2.2/32</name></destination-networks></dynamic-tunnel></dynamic-tunnels></routing-options></groups><apply-groups operation="replace">__contrail__</apply-groups></configuration></config>'

self.check_netconf_config_mesg('1.1.1.1', xml_config_str)

#end test_tunnels_dm_5

#dynamic tunnel test case - 6
# 1. dont configure ip fabric subnets,
# 2. create physical router with data plane source ip
# 3. check netconf XML config generated, should show dynamic tunnel config with only bgp router ip
# 4. add a new bgp peer
# 5. check if new peer ip is present in netconf XML config generated for dynamic tunnels
def test_tunnels_dm_6(self):
gs = self._vnc_lib.global_system_config_read(fq_name=[u'default-global-system-config'])

bgp_router, pr = self.create_router('router1', '1.1.1.1')
pr.physical_router_dataplane_ip = "5.5.5.5"
self._vnc_lib.physical_router_update(pr)

gevent.sleep(2)

xml_config_str = '<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0"><configuration><groups operation="replace"><name>__contrail__</name><protocols><bgp><group operation="replace"><name>__contrail__</name><type>internal</type><multihop/><local-address>1.1.1.1</local-address><family><route-target/><inet-vpn><unicast/></inet-vpn><evpn><signaling/></evpn><inet6-vpn><unicast/></inet6-vpn></family><hold-time>90</hold-time><keep>all</keep></group><group operation="replace"><name>__contrail_external__</name><type>external</type><multihop/><local-address>1.1.1.1</local-address><family><route-target/><inet-vpn><unicast/></inet-vpn><evpn><signaling/></evpn><inet6-vpn><unicast/></inet6-vpn></family><hold-time>90</hold-time><keep>all</keep></group></bgp></protocols><routing-options><route-distinguisher-id/><autonomous-system>64512</autonomous-system></routing-options><routing-options><dynamic-tunnels><dynamic-tunnel><name>__contrail__</name><source-address>5.5.5.5</source-address><gre/><destination-networks><name>1.1.1.1/32</name></destination-networks></dynamic-tunnel></dynamic-tunnels></routing-options></groups><apply-groups operation="replace">__contrail__</apply-groups></configuration></config>'

self.check_netconf_config_mesg('1.1.1.1', xml_config_str)

bgp_router2, pr2 = self.create_router('router2', '20.2.2.2')
families = AddressFamilies(['route-target', 'inet-vpn', 'e-vpn'])
bgp_sess_attrs = [BgpSessionAttributes(address_families=families)]
bgp_sessions = [BgpSession(attributes=bgp_sess_attrs)]
bgp_peering_attrs = BgpPeeringAttributes(session=bgp_sessions)
bgp_router.add_bgp_router(bgp_router2, bgp_peering_attrs)
self._vnc_lib.bgp_router_update(bgp_router)

xml_config_str = '<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0"><configuration><groups operation="replace"><name>__contrail__</name><protocols><bgp><group operation="replace"><name>__contrail__</name><type>internal</type><multihop/><local-address>1.1.1.1</local-address><family><route-target/><inet-vpn><unicast/></inet-vpn><evpn><signaling/></evpn><inet6-vpn><unicast/></inet6-vpn></family><hold-time>90</hold-time><keep>all</keep></group><group operation="replace"><name>__contrail_external__</name><type>external</type><multihop/><local-address>1.1.1.1</local-address><family><route-target/><inet-vpn><unicast/></inet-vpn><evpn><signaling/></evpn><inet6-vpn><unicast/></inet6-vpn></family><hold-time>90</hold-time><keep>all</keep></group></bgp></protocols><routing-options><route-distinguisher-id/><autonomous-system>64512</autonomous-system></routing-options><routing-options><dynamic-tunnels><dynamic-tunnel><name>__contrail__</name><source-address>5.5.5.5</source-address><gre/><destination-networks><name>1.1.1.1/32</name></destination-networks><destination-networks><name>20.2.2.2/32</name></destination-networks></dynamic-tunnel></dynamic-tunnels></routing-options></groups><apply-groups operation="replace">__contrail__</apply-groups></configuration></config>'

self.check_netconf_config_mesg('1.1.1.1', xml_config_str)

#end test_tunnels_dm_6

def test_basic_dm(self):
vn1_name = 'vn1'
Expand Down

0 comments on commit e66ca37

Please sign in to comment.