diff --git a/gbpservice/neutron/services/sfc/aim/sfc_driver.py b/gbpservice/neutron/services/sfc/aim/sfc_driver.py index 61cd65a63..8265b2a71 100644 --- a/gbpservice/neutron/services/sfc/aim/sfc_driver.py +++ b/gbpservice/neutron/services/sfc/aim/sfc_driver.py @@ -45,6 +45,7 @@ FLOWC_DST = 'dst' LOG = logging.getLogger(__name__) PHYSDOM_TYPE = 'PhysDom' SUPPORTED_DOM_TYPES = [PHYSDOM_TYPE] +DEFAULT_SUBNETS = ['128.0.0.0/1', '0.0.0.0/1', '8000::/1', '::/1'] MAX_PPGS_PER_CHAIN = 3 @@ -597,26 +598,20 @@ class SfcAIMDriver(SfcAIMDriverBase): cidr = netaddr.IPNetwork(cidr) l3out = self.aim_mech._get_svi_net_l3out(net) if l3out: - if cidr.prefixlen == 0: - # Use default External Network - ext_net = self.aim_mech._get_svi_default_external_epg(net) - ext_net_db = self.aim.get(aim_ctx, ext_net) - if not ext_net_db: - raise exceptions.DefaultExternalNetworkNotFound( - id=net['id']) - else: - # Create ExternalNetwork and ExternalSubnet on the proper - # L3Out. Return the External network - ext_net = aim_resource.ExternalNetwork( - tenant_name=l3out.tenant_name, l3out_name=l3out.name, - name=flc_aid) + # Create ExternalNetwork and ExternalSubnet on the proper + # L3Out. Return the External network + ext_net = aim_resource.ExternalNetwork( + tenant_name=l3out.tenant_name, l3out_name=l3out.name, + name=flc_aid) + ext_net_db = self.aim.get(aim_ctx, ext_net) + if not ext_net_db: + ext_net_db = self.aim.create(aim_ctx, ext_net) + subnets = [str(cidr)] if cidr.prefixlen != 0 else DEFAULT_SUBNETS + for sub in subnets: ext_sub = aim_resource.ExternalSubnet( tenant_name=ext_net.tenant_name, l3out_name=ext_net.l3out_name, - external_network_name=ext_net.name, cidr=str(cidr)) - ext_net_db = self.aim.get(aim_ctx, ext_net) - if not ext_net_db: - ext_net_db = self.aim.create(aim_ctx, ext_net) + external_network_name=ext_net.name, cidr=sub) ext_sub_db = self.aim.get(aim_ctx, ext_sub) if not ext_sub_db: self.aim.create(aim_ctx, ext_sub) @@ -644,14 +639,10 @@ class SfcAIMDriver(SfcAIMDriverBase): cidr = netaddr.IPNetwork(cidr) ext_net = None if l3out: - if cidr.prefixlen != 0: - ext_net = aim_resource.ExternalNetwork( - tenant_name=l3out.tenant_name, l3out_name=l3out.name, - name=flc_aid) - epg = self.aim.get(aim_ctx, ext_net) - else: - epg = self.aim.get( - aim_ctx, self.aim_mech._get_svi_default_external_epg(net)) + ext_net = aim_resource.ExternalNetwork( + tenant_name=l3out.tenant_name, l3out_name=l3out.name, + name=flc_aid) + epg = self.aim.get(aim_ctx, ext_net) else: epg = self.aim.get(aim_ctx, self.aim_mech._get_epg_by_network_id( plugin_context.session, net['id'])) @@ -977,7 +968,11 @@ class SfcAIMDriver(SfcAIMDriverBase): else: cidr = flowc['destination_ip_prefix'] net = self._get_flowc_dst_network(plugin_context, flowc) - cidr = aim_utils.sanitize_display_name(cidr) + cidr = netaddr.IPNetwork(cidr) + if cidr.prefixlen == 0: + cidr = 'default' + else: + cidr = aim_utils.sanitize_display_name(str(cidr)) name = self.name_mapper.network(plugin_context.session, net['id'], prefix=cidr + '_') return name diff --git a/gbpservice/neutron/tests/unit/services/sfc/test_aim_sfc_driver.py b/gbpservice/neutron/tests/unit/services/sfc/test_aim_sfc_driver.py index caf0b8ab8..ae07c8c48 100644 --- a/gbpservice/neutron/tests/unit/services/sfc/test_aim_sfc_driver.py +++ b/gbpservice/neutron/tests/unit/services/sfc/test_aim_sfc_driver.py @@ -436,21 +436,26 @@ class TestAIMServiceFunctionChainingBase(test_aim_base.AIMBaseTestCase): # DN extension for external networks. ext = aim_res.ExternalNetwork.from_dn( net['apic:distinguished_names']['ExternalNetwork']) + name_prefix = cidr.replace('/', '_') + subnets = [cidr] if cidr in ['0.0.0.0/0', '::/0']: # use default external EPG - ext_net = self.aim_mgr.get(ctx, ext) - else: - ext_net = self.aim_mgr.get( - ctx, aim_res.ExternalNetwork( - tenant_name=ext.tenant_name, - l3out_name=ext.l3out_name, - name=cidr.replace( - '/', '_') + '_' + 'net_' + net['id'])) - ext_sub = self.aim_mgr.get(ctx, aim_res.ExternalSubnet( - tenant_name=ext.tenant_name, l3out_name=ext.l3out_name, - external_network_name=ext_net.name, cidr=cidr)) + name_prefix = 'default' + subnets = ['128.0.0.0/1', '0.0.0.0/1', '8000::/1', + '::/1'] + ext_net = self.aim_mgr.get( + ctx, aim_res.ExternalNetwork( + tenant_name=ext.tenant_name, + l3out_name=ext.l3out_name, + name=name_prefix + '_' + 'net_' + net['id'])) + for sub in subnets: + ext_sub = self.aim_mgr.get(ctx, aim_res.ExternalSubnet( + tenant_name=ext.tenant_name, + l3out_name=ext.l3out_name, + external_network_name=ext_net.name, cidr=sub)) + self.assertIsNotNone(ext_sub) + self.assertIsNotNone(ext_net) - self.assertIsNotNone(ext_sub) self.assertTrue( contract.name in (ext_net.consumed_contract_names if pref == 'src_' else