From 8849b1ef80cf4973266d569c065963efe135d921 Mon Sep 17 00:00:00 2001 From: Ignatious Johnson Christopher Date: Fri, 8 Apr 2016 00:56:13 +0000 Subject: [PATCH] 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 --- src/config/schema-transformer/config_db.py | 59 +++++++++++++++++++ .../schema-transformer/test/test_bgp.py | 43 ++++++++++++++ 2 files changed, 102 insertions(+) diff --git a/src/config/schema-transformer/config_db.py b/src/config/schema-transformer/config_db.py index 2dad0dd1500..7172b78cd48 100644 --- a/src/config/schema-transformer/config_db.py +++ b/src/config/schema-transformer/config_db.py @@ -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 @@ -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() @@ -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 diff --git a/src/config/schema-transformer/test/test_bgp.py b/src/config/schema-transformer/test/test_bgp.py index 6e05e06cdb5..0593b7b7c53 100644 --- a/src/config/schema-transformer/test/test_bgp.py +++ b/src/config/schema-transformer/test/test_bgp.py @@ -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 @@ -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)