Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
BGPaaSv2: schema transformer changes.
Populate gateway address in the bgpaas-client bgp_router to make the bgp
session bidirectional in v2 of bgp-as-a-service feature.

Setting ipv4-mapped ipv6 gateway address in case of
bgpaas-ipv4-mapped-ipv6-nexthop enabled bgp-as-a-service object.

Gateway addresses are not set when bgpaas-suppress-route-advertisement
property is set in bgp-as-a-service object to support v1 behaviour.

Partial-Bug: 1563075

Change-Id: Iec58cff7dd9fad778e9f4a45c42a54d894a9b483
  • Loading branch information
cijohnson committed Apr 12, 2016
1 parent a04ab11 commit 8849b1e
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 0 deletions.
59 changes: 59 additions & 0 deletions src/config/schema-transformer/config_db.py
Expand Up @@ -1273,6 +1273,18 @@ def handle_st_object_req(self):
]
return resp
# end handle_st_object_req

def get_gateway(self, address):
"""Returns the defualt gateway of the network
to which the 'address' belongs
"""
for ipam in self.ipams.values():
for ipam_subnet in ipam.ipam_subnets:
network = IPNetwork('%s/%s' % (ipam_subnet.subnet.ip_prefix,
ipam_subnet.subnet.ip_prefix_len))
if address in network:
return ipam_subnet.default_gateway
# end get_gateway
# end class VirtualNetworkST


Expand Down Expand Up @@ -2863,6 +2875,25 @@ def update_bgpaas_client(self, bgpaas):
if params.identifier != ip:
params.identifier = ip
update = True
if bgpaas.obj.bgpaas_suppress_route_advertisement:
if params.gateway_address:
params.gateway_address = None
update = True
if params.ipv6_gateway_address:
params.ipv6_gateway_address = None
update = True
else:
v4_gateway = vmi.get_v4_default_gateway()
if params.gateway_address != v4_gateway:
params.gateway_address = v4_gateway
update = True
if bgpaas.obj.bgpaas_ipv4_mapped_ipv6_nexthop:
v6_gateway = vmi.get_ipv4_mapped_ipv6_gateway()
else:
v6_gateway = vmi.get_v6_default_gateway()
if params.ipv6_gateway_address != v6_gateway:
params.ipv6_gateway_address = v6_gateway
update = True
if update:
self.obj.set_bgp_router_parameters(params)
router_refs = self.obj.get_bgp_router_refs()
Expand Down Expand Up @@ -3338,6 +3369,34 @@ def handle_st_object_req(self):
]
return resp
# end handle_st_object_req

def get_v4_default_gateway(self):
if not self.virtual_network:
return None
vn = VirtualNetworkST.get(self.virtual_network)
if not vn:
return None
v4_address = self.get_primary_instance_ip_address(ip_version=4)
if not v4_address:
return None
return vn.get_gateway(v4_address)
# end get_v4_default_gateway

def get_v6_default_gateway(self):
if not self.virtual_network:
return None
vn = VirtualNetworkST.get(self.virtual_network)
if not vn:
return None
v6_address = self.get_primary_instance_ip_address(ip_version=6)
if not v6_address:
return None
return vn.get_gateway(v6_address)
# end get_v6_default_gateway

def get_ipv4_mapped_ipv6_gateway(self):
return '::ffff:%s' % self.get_v4_default_gateway()
# end get_ipv4_mapped_ipv6_gateway
# end VirtualMachineInterfaceST


Expand Down
43 changes: 43 additions & 0 deletions src/config/schema-transformer/test/test_bgp.py
Expand Up @@ -100,6 +100,22 @@ def check_bgp_router_identifier(self, router_name, ip):
self.assertEqual(router_obj.get_bgp_router_parameters().identifier,
ip)

@retries(5)
def check_v4_bgp_gateway(self, router_name, gateway):
bgpaas_client_obj = self._vnc_lib.bgp_router_read(
fq_name_str=router_name)
self.assertEqual(
bgpaas_client_obj.get_bgp_router_parameters().gateway_address,
gateway)

@retries(5)
def check_v6_bgp_gateway(self, router_name, gateway):
bgpaas_client_obj = self._vnc_lib.bgp_router_read(
fq_name_str=router_name)
self.assertEqual(
bgpaas_client_obj.get_bgp_router_parameters().ipv6_gateway_address,
gateway)


class TestBgp(STTestCase, VerifyBgp):
# test logical router functionality
Expand Down Expand Up @@ -293,6 +309,33 @@ def test_bgpaas(self):
'10.0.0.252')

self.check_bgp_peering(server_router_obj, router1_obj, 1)
self.check_v4_bgp_gateway(router1_name, '10.0.0.254')
self.check_v6_bgp_gateway(router1_name,
'1000:ffff:ffff:ffff:ffff:ffff:ffff:fffe')
# Set suppress_route_advertisement; and expect the gateways
# to be reset to None in bgpaas-client router
bgpaas.set_bgpaas_suppress_route_advertisement(True)
self._vnc_lib.bgp_as_a_service_update(bgpaas)
self.check_v4_bgp_gateway(router1_name, None)
self.check_v6_bgp_gateway(router1_name, None)
# Unset suppress_route_advertisement; and expect the gateways
# to be set to gateway addresses in bgpaas-client router
bgpaas.set_bgpaas_suppress_route_advertisement(False)
self._vnc_lib.bgp_as_a_service_update(bgpaas)
self.check_v4_bgp_gateway(router1_name, '10.0.0.254')
self.check_v6_bgp_gateway(router1_name,
'1000:ffff:ffff:ffff:ffff:ffff:ffff:fffe')
# Set bgpaas_ipv4_mapped_ipv6_nexthop and expect the
# ipv4-mapped ipv6 address is set as gateway
bgpaas.set_bgpaas_ipv4_mapped_ipv6_nexthop(True)
self._vnc_lib.bgp_as_a_service_update(bgpaas)
self.check_v6_bgp_gateway(router1_name, '::ffff:10.0.0.254')
# unset bgpaas_ipv4_mapped_ipv6_nexthop and expect the
# subnets ipv6 gateway address is set as gateway
bgpaas.set_bgpaas_ipv4_mapped_ipv6_nexthop(False)
self._vnc_lib.bgp_as_a_service_update(bgpaas)
self.check_v6_bgp_gateway(router1_name,
'1000:ffff:ffff:ffff:ffff:ffff:ffff:fffe')

v4_obj.set_instance_ip_address('10.0.0.60')
self._vnc_lib.instance_ip_update(v4_obj)
Expand Down

0 comments on commit 8849b1e

Please sign in to comment.