diff --git a/gbpservice/neutron/plugins/ml2plus/drivers/apic_aim/mechanism_driver.py b/gbpservice/neutron/plugins/ml2plus/drivers/apic_aim/mechanism_driver.py index 150334fcb..b5dfdea61 100644 --- a/gbpservice/neutron/plugins/ml2plus/drivers/apic_aim/mechanism_driver.py +++ b/gbpservice/neutron/plugins/ml2plus/drivers/apic_aim/mechanism_driver.py @@ -775,7 +775,8 @@ class ApicMechanismDriver(api_plus.MechanismDriver, join(models_v2.Subnet, models_v2.Subnet.id == models_v2.IPAllocation.subnet_id). join(models_v2.Network). - join(models_v2.Port). + join(models_v2.Port, models_v2.Port.id == + models_v2.IPAllocation.port_id). join(l3_db.RouterPort). filter(l3_db.RouterPort.router_id == router_db.id, l3_db.RouterPort.port_type == @@ -1866,6 +1867,7 @@ class ApicMechanismDriver(api_plus.MechanismDriver, return (session.query(models_v2.IPAllocation.ip_address, l3_db.RouterPort.router_id). join(models_v2.Port). + join(l3_db.RouterPort). filter( models_v2.IPAllocation.subnet_id == subnet_id, l3_db.RouterPort.port_type == diff --git a/gbpservice/neutron/tests/unit/plugins/ml2plus/test_apic_aim.py b/gbpservice/neutron/tests/unit/plugins/ml2plus/test_apic_aim.py index b9caabde7..d95d87977 100644 --- a/gbpservice/neutron/tests/unit/plugins/ml2plus/test_apic_aim.py +++ b/gbpservice/neutron/tests/unit/plugins/ml2plus/test_apic_aim.py @@ -13,6 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. +import copy import mock import netaddr import six @@ -234,6 +235,17 @@ class ApicAimTestCase(test_address_scope.AddressScopeTestCase, resource = cls.from_dn(dn) return self.aim_mgr.get(aim_ctx, resource) + def _check_dn_is_resource(self, dns, key, resource): + dn = dns.pop(key, None) + self.assertIsInstance(dn, six.string_types) + self.assertEqual(resource.dn, dn) + + def _check_dn_has_resource(self, dns, key, cls): + dn = dns.pop(key, None) + self.assertIsInstance(dn, six.string_types) + resource = self._find_by_dn(dn, cls) + self.assertIsNotNone(resource) + def _check_dn(self, resource, aim_resource, key): dist_names = resource.get('apic:distinguished_names') self.assertIsInstance(dist_names, dict) @@ -452,6 +464,8 @@ class TestAimMapping(ApicAimTestCase): def _check_network(self, net, routers=None, scope=None, project=None, vrf=None): + dns = copy.copy(net.get(DN)) + project = project or net['tenant_id'] tenant_aname = self.name_mapper.project(None, project) self._get_tenant(tenant_aname) @@ -502,7 +516,7 @@ class TestAimMapping(ApicAimTestCase): self.assertTrue(aim_bd.limit_ip_learn_to_subnets) self.assertEqual('proxy', aim_bd.l2_unknown_unicast_mode) self.assertEqual('garp', aim_bd.ep_move_detect_mode) - self._check_dn(net, aim_bd, 'BridgeDomain') + self._check_dn_is_resource(dns, 'BridgeDomain', aim_bd) aim_epg = self._get_epg(aname, tenant_aname, self._app_profile_name) self.assertEqual(tenant_aname, aim_epg.tenant_name) @@ -514,7 +528,7 @@ class TestAimMapping(ApicAimTestCase): self.assertItemsEqual(router_anames, aim_epg.consumed_contract_names) # REVISIT(rkukura): Check openstack_vmm_domain_names and # physical_domain_names? - self._check_dn(net, aim_epg, 'EndpointGroup') + self._check_dn_is_resource(dns, 'EndpointGroup', aim_epg) aim_tenant = self._get_tenant(vrf_tenant_aname) self.assertEqual(vrf_tenant_aname, aim_tenant.name) @@ -526,7 +540,9 @@ class TestAimMapping(ApicAimTestCase): self.assertEqual(vrf_aname, aim_vrf.name) self.assertEqual(vrf_dname, aim_vrf.display_name) self.assertEqual('enforced', aim_vrf.policy_enforcement_pref) - self._check_dn(net, aim_vrf, 'VRF') + self._check_dn_is_resource(dns, 'VRF', aim_vrf) + + self.assertFalse(dns) def _check_network_deleted(self, net): aname = self.name_mapper.network(None, net['id']) @@ -535,6 +551,7 @@ class TestAimMapping(ApicAimTestCase): def _check_subnet(self, subnet, net, expected_gws, unexpected_gw_ips, scope=None, project=None): + dns = copy.copy(subnet.get(DN)) prefix_len = subnet['cidr'].split('/')[1] scope = scope and self._actual_scopes.get(scope['id'], scope) @@ -556,13 +573,15 @@ class TestAimMapping(ApicAimTestCase): (subnet['name'] or subnet['cidr']))) display_name = aim_utils.sanitize_display_name(display_name) self.assertEqual(display_name, aim_subnet.display_name) - self._check_dn(subnet, aim_subnet, gw_ip) + self._check_dn_is_resource(dns, gw_ip, aim_subnet) for gw_ip in unexpected_gw_ips: gw_ip_mask = gw_ip + '/' + prefix_len self._subnet_should_not_exist(gw_ip_mask, net_aname) self._check_no_dn(subnet, gw_ip) + self.assertFalse(dns) + def _check_subnet_deleted(self, subnet): # REVISIT(rkukura): Anything to check? We could find all the # AIM Subnets with the network's bd_name, and make sure none @@ -570,6 +589,8 @@ class TestAimMapping(ApicAimTestCase): pass def _check_address_scope(self, scope): + dns = copy.copy(scope.get(DN)) + actual_scope = self._actual_scopes.get(scope['id'], scope) tenant_aname = self.name_mapper.project( @@ -583,14 +604,17 @@ class TestAimMapping(ApicAimTestCase): self.assertEqual(aname, aim_vrf.name) self.assertEqual(actual_scope['name'], aim_vrf.display_name) self.assertEqual('enforced', aim_vrf.policy_enforcement_pref) - self._check_dn(scope, aim_vrf, 'VRF') + self._check_dn_is_resource(dns, 'VRF', aim_vrf) + + self.assertFalse(dns) def _check_address_scope_deleted(self, scope): aname = self.name_mapper.address_scope(None, scope['id']) self._vrf_should_not_exist(aname) - def _check_router(self, router, expected_gw_ips, unexpected_gw_ips, - scopes=None, unscoped_project=None): + def _check_router(self, router, expected_gw_ips, scopes=None, + unscoped_project=None): + dns = copy.copy(router.get(DN)) aname = self.name_mapper.router(None, router['id']) aim_contract = self._get_contract(aname, 'common') @@ -598,7 +622,7 @@ class TestAimMapping(ApicAimTestCase): self.assertEqual(aname, aim_contract.name) self.assertEqual(router['name'], aim_contract.display_name) self.assertEqual('context', aim_contract.scope) # REVISIT(rkukura) - self._check_dn(router, aim_contract, 'Contract') + self._check_dn_is_resource(dns, 'Contract', aim_contract) aim_subject = self._get_subject('route', aname, 'common') self.assertEqual('common', aim_subject.tenant_name) @@ -609,40 +633,31 @@ class TestAimMapping(ApicAimTestCase): self.assertEqual([], aim_subject.out_filters) self.assertEqual([self.driver.apic_system_id + '_AnyFilter'], aim_subject.bi_filters) - self._check_dn(router, aim_subject, 'ContractSubject') + self._check_dn_is_resource(dns, 'ContractSubject', aim_subject) self._check_any_filter() - dist_names = router.get('apic:distinguished_names') - vrf_dns = {k: v for (k, v) in six.iteritems(dist_names) - if k.endswith('-VRF')} - if expected_gw_ips: if unscoped_project: self._check_router_vrf( 'DefaultVRF', 'DefaultRoutedVRF', unscoped_project, - vrf_dns, 'no_scope-VRF') + dns, 'no_scope-VRF') for scope in scopes or []: actual_scope = self._actual_scopes.get(scope['id'], scope) self._check_router_vrf( self.name_mapper.address_scope(None, actual_scope['id']), actual_scope['name'], actual_scope['tenant_id'], - vrf_dns, 'as_%s-VRF' % scope['id']) - - self.assertFalse(vrf_dns) + dns, 'as_%s-VRF' % scope['id']) # The AIM Subnets are validated in _check_subnet, so just # check that their DNs are present and valid. for gw_ip in expected_gw_ips: - self.assertIn(gw_ip, dist_names) - aim_subnet = self._find_by_dn(dist_names[gw_ip], - aim_resource.Subnet) - self.assertIsNotNone(aim_subnet) - for gw_ip in unexpected_gw_ips: - self.assertNotIn(gw_ip, dist_names) + self._check_dn_has_resource(dns, gw_ip, aim_resource.Subnet) - def _check_router_vrf(self, aname, dname, project_id, vrf_dns, key): + self.assertFalse(dns) + + def _check_router_vrf(self, aname, dname, project_id, dns, key): tenant_aname = self.name_mapper.project(None, project_id) tenant_dname = TEST_TENANT_NAMES[project_id] @@ -656,8 +671,7 @@ class TestAimMapping(ApicAimTestCase): self.assertEqual(dname, aim_vrf.display_name) self.assertEqual('enforced', aim_vrf.policy_enforcement_pref) - dn = vrf_dns.pop(key, None) - self.assertEqual(aim_vrf.dn, dn) + self._check_dn_is_resource(dns, key, aim_vrf) def _check_router_deleted(self, router): aname = self.name_mapper.router(None, router['id']) @@ -759,16 +773,16 @@ class TestAimMapping(ApicAimTestCase): router = self._make_router( self.fmt, 'test-tenant', 'router1')['router'] router_id = router['id'] - self._check_router(router, [], []) + self._check_router(router, []) # Test show. router = self._show('routers', router_id)['router'] - self._check_router(router, [], []) + self._check_router(router, []) # Test update. data = {'router': {'name': 'newnameforrouter'}} router = self._update('routers', router_id, data)['router'] - self._check_router(router, [], []) + self._check_router(router, []) # Test delete. self._delete('routers', router_id) @@ -784,7 +798,7 @@ class TestAimMapping(ApicAimTestCase): router = self._make_router( self.fmt, self._tenant_id, 'router1')['router'] router_id = router['id'] - self._check_router(router, [], []) + self._check_router(router, []) # Create network. net_resp = self._make_network(self.fmt, 'net1', True) @@ -832,8 +846,7 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [gw1_ip], [], - unscoped_project=self._tenant_id) + self._check_router(router, [gw1_ip], unscoped_project=self._tenant_id) # Check network. net = self._show('networks', net_id)['network'] @@ -855,8 +868,7 @@ class TestAimMapping(ApicAimTestCase): # Test router update. data = {'router': {'name': 'newnameforrouter'}} router = self._update('routers', router_id, data)['router'] - self._check_router(router, [gw1_ip], [], - unscoped_project=self._tenant_id) + self._check_router(router, [gw1_ip], unscoped_project=self._tenant_id) self._check_subnet(subnet, net, [(gw1_ip, router)], []) # Add subnet2 to router by port. @@ -873,8 +885,8 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [gw1_ip, gw2_ip], [], - unscoped_project=self._tenant_id) + self._check_router( + router, [gw1_ip, gw2_ip], unscoped_project=self._tenant_id) # Check network. net = self._show('networks', net_id)['network'] @@ -900,8 +912,7 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [gw2_ip], [gw1_ip], - unscoped_project=self._tenant_id) + self._check_router(router, [gw2_ip], unscoped_project=self._tenant_id) # Check network. net = self._show('networks', net_id)['network'] @@ -926,7 +937,7 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [], [gw1_ip, gw2_ip]) + self._check_router(router, []) # Check network. net = self._show('networks', net_id)['network'] @@ -967,7 +978,7 @@ class TestAimMapping(ApicAimTestCase): router = self._make_router( self.fmt, 'test-tenant', 'router1')['router'] router_id = router['id'] - self._check_router(router, [], [], scopes=[scope]) + self._check_router(router, [], scopes=[scope]) # Create network. net_resp = self._make_network(self.fmt, 'net1', True) @@ -1019,7 +1030,7 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [gw1_ip], [], scopes=[scope]) + self._check_router(router, [gw1_ip], scopes=[scope]) # Check network. net = self._show('networks', net_id)['network'] @@ -1041,7 +1052,7 @@ class TestAimMapping(ApicAimTestCase): # Test router update. data = {'router': {'name': 'newnameforrouter'}} router = self._update('routers', router_id, data)['router'] - self._check_router(router, [gw1_ip], [], scopes=[scope]) + self._check_router(router, [gw1_ip], scopes=[scope]) self._check_subnet(subnet, net, [(gw1_ip, router)], [], scope) # Add subnet2 to router by port. @@ -1058,7 +1069,7 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [gw1_ip, gw2_ip], [], scopes=[scope]) + self._check_router(router, [gw1_ip, gw2_ip], scopes=[scope]) # Check network. net = self._show('networks', net_id)['network'] @@ -1084,7 +1095,7 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [gw2_ip], [gw1_ip], scopes=[scope]) + self._check_router(router, [gw2_ip], scopes=[scope]) # Check network. net = self._show('networks', net_id)['network'] @@ -1109,7 +1120,7 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [], [gw1_ip, gw2_ip], scopes=[scope]) + self._check_router(router, [], scopes=[scope]) # Check network. net = self._show('networks', net_id)['network'] @@ -1318,7 +1329,6 @@ class TestAimMapping(ApicAimTestCase): def check(nets, scopes, unscoped_project): router = self._show('routers', router_id)['router'] expected_gw_ips = [] - unexpected_gw_ips = [] for net, routed_subnets, unrouted_subnets, scope, project in nets: net = self._show('networks', net['id'])['network'] self._check_network( @@ -1331,13 +1341,11 @@ class TestAimMapping(ApicAimTestCase): subnet, net, [(gw_ip, router)], [], scope, project) for subnet in unrouted_subnets: gw_ip = subnet['gateway_ip'] - unexpected_gw_ips.append(gw_ip) subnet = self._show('subnets', subnet['id'])['subnet'] self._check_subnet( subnet, net, [], [gw_ip], scope, project) self._check_router( - router, expected_gw_ips, unexpected_gw_ips, scopes, - unscoped_project) + router, expected_gw_ips, scopes, unscoped_project) def check_ns(disconnect_vrf_dns, from_net_dn, connect_vrf_dns, to_net_dn): @@ -1571,7 +1579,7 @@ class TestAimMapping(ApicAimTestCase): router = self._make_router( self.fmt, 'tenant_2', 'router1')['router'] router_id = router['id'] - self._check_router(router, [], [], scopes=[scope]) + self._check_router(router, [], scopes=[scope]) # Create network as tenant_2. net_resp = self._make_network(self.fmt, 'net1', True, @@ -1596,7 +1604,7 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [gw1_ip], [], scopes=[scope]) + self._check_router(router, [gw1_ip], scopes=[scope]) # Check network. net = self._show('networks', net_id)['network'] @@ -1622,7 +1630,7 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [gw1_ip, gw2_ip], [], scopes=[scope]) + self._check_router(router, [gw1_ip, gw2_ip], scopes=[scope]) # Check network. net = self._show('networks', net_id)['network'] @@ -1644,7 +1652,7 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [gw2_ip], [gw1_ip], scopes=[scope]) + self._check_router(router, [gw2_ip], scopes=[scope]) # Check network. net = self._show('networks', net_id)['network'] @@ -1666,7 +1674,7 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [], [gw1_ip, gw2_ip]) + self._check_router(router, []) # Check network. net = self._show('networks', net_id)['network'] @@ -1689,7 +1697,7 @@ class TestAimMapping(ApicAimTestCase): self.fmt, 'tenant_1', 'router')['router'] router_id = router['id'] router_ctx = n_context.Context(None, 'tenant_1') - self._check_router(router, [], []) + self._check_router(router, []) # Create net1 as tenant_1. net1_resp = self._make_network( @@ -1741,8 +1749,7 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [gw1_ip], [gw2_ip, gw3_ip], - unscoped_project='tenant_1') + self._check_router(router, [gw1_ip], unscoped_project='tenant_1') # Check net1. net1 = self._show('networks', net1_id)['network'] @@ -1775,8 +1782,8 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [gw1_ip, gw2_ip], [gw3_ip], - unscoped_project='tenant_2') + self._check_router( + router, [gw1_ip, gw2_ip], unscoped_project='tenant_2') # Check net1, which should be moved to tenant_2. net1 = self._show('networks', net1_id)['network'] @@ -1810,8 +1817,8 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [gw1_ip, gw2_ip, gw3_ip], [], - unscoped_project='tenant_2') + self._check_router( + router, [gw1_ip, gw2_ip, gw3_ip], unscoped_project='tenant_2') # Check net1, which should still be moved to tenant_2. net1 = self._show('networks', net1_id)['network'] @@ -1846,8 +1853,8 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [gw1_ip, gw2_ip], [gw3_ip], - unscoped_project='tenant_2') + self._check_router( + router, [gw1_ip, gw2_ip], unscoped_project='tenant_2') # Check net1, which should still be moved to tenant_2. net1 = self._show('networks', net1_id)['network'] @@ -1881,8 +1888,7 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [gw1_ip], [gw2_ip, gw3_ip], - unscoped_project='tenant_1') + self._check_router(router, [gw1_ip], unscoped_project='tenant_1') # Check net1, which should be moved back to tenant_1. net1 = self._show('networks', net1_id)['network'] @@ -1915,8 +1921,7 @@ class TestAimMapping(ApicAimTestCase): # Check router. router = self._show('routers', router_id)['router'] - self._check_router(router, [], [gw1_ip, gw2_ip, gw3_ip], - unscoped_project='tenant_1') + self._check_router(router, [], unscoped_project='tenant_1') # Check net1. net1 = self._show('networks', net1_id)['network'] @@ -1968,7 +1973,7 @@ class TestAimMapping(ApicAimTestCase): def make_router(letter, project): name = 'router%s' % letter router = self._make_router(self.fmt, project, name)['router'] - self._check_router(router, [], []) + self._check_router(router, []) return router def add_interface(router, net_id, subnet_id, gw_ip, project): @@ -1995,11 +2000,10 @@ class TestAimMapping(ApicAimTestCase): self._check_subnet( subnet, net, expected_gws, unexpected_gw_ips, project=project) - def check_router(router, expected_gw_ips, unexpected_gw_ips, project): + def check_router(router, expected_gw_ips, project): router = self._show('routers', router['id'])['router'] self._check_router( - router, expected_gw_ips, unexpected_gw_ips, - unscoped_project=project) + router, expected_gw_ips, unscoped_project=project) def check_port_notify(ports=None): if not ports: @@ -2034,9 +2038,9 @@ class TestAimMapping(ApicAimTestCase): gw4C = '10.0.4.3' # Check initial state with no routing. - check_router(rA, [], [gw1A, gw2A], t1) - check_router(rB, [], [gw2B, gw3B], t1) - check_router(rC, [], [gw3C, gw4C], t1) + check_router(rA, [], t1) + check_router(rB, [], t1) + check_router(rC, [], t1) check_net(net1, sn1, [], [], [gw1A], t1) check_net(net2, sn2, [], [], [gw2A, gw2B], t1) check_net(net3, sn3, [], [], [gw3B, gw3C], t1) @@ -2045,9 +2049,9 @@ class TestAimMapping(ApicAimTestCase): # Add subnet 1 to router A. add_interface(rA, net1, sn1, gw1A, t1) check_port_notify([p1]) - check_router(rA, [gw1A], [gw2A], t1) - check_router(rB, [], [gw2B, gw3B], t1) - check_router(rC, [], [gw3C, gw4C], t1) + check_router(rA, [gw1A], t1) + check_router(rB, [], t1) + check_router(rC, [], t1) check_net(net1, sn1, [rA], [(gw1A, rA)], [], t1) check_net(net2, sn2, [], [], [gw2A, gw2B], t1) check_net(net3, sn3, [], [], [gw3B, gw3C], t1) @@ -2056,9 +2060,9 @@ class TestAimMapping(ApicAimTestCase): # Add subnet 2 to router A. add_interface(rA, net2, sn2, gw2A, t1) check_port_notify([p2]) - check_router(rA, [gw1A, gw2A], [], t1) - check_router(rB, [], [gw2B, gw3B], t1) - check_router(rC, [], [gw3C, gw4C], t1) + check_router(rA, [gw1A, gw2A], t1) + check_router(rB, [], t1) + check_router(rC, [], t1) check_net(net1, sn1, [rA], [(gw1A, rA)], [], t1) check_net(net2, sn2, [rA], [(gw2A, rA)], [gw2B], t1) check_net(net3, sn3, [], [], [gw3B, gw3C], t1) @@ -2067,9 +2071,9 @@ class TestAimMapping(ApicAimTestCase): # Add subnet 2 to router B. add_interface(rB, net2, sn2, gw2B, t1) check_port_notify() - check_router(rA, [gw1A, gw2A], [], t1) - check_router(rB, [gw2B], [gw3B], t1) - check_router(rC, [], [gw3C, gw4C], t1) + check_router(rA, [gw1A, gw2A], t1) + check_router(rB, [gw2B], t1) + check_router(rC, [], t1) check_net(net1, sn1, [rA], [(gw1A, rA)], [], t1) check_net(net2, sn2, [rA, rB], [(gw2A, rA), (gw2B, rB)], [], t1) check_net(net3, sn3, [], [], [gw3B, gw3C], t1) @@ -2078,9 +2082,9 @@ class TestAimMapping(ApicAimTestCase): # Add subnet 3 to router B. add_interface(rB, net3, sn3, gw3B, t1) check_port_notify([p3]) - check_router(rA, [gw1A, gw2A], [], t1) - check_router(rB, [gw2B, gw3B], [], t1) - check_router(rC, [], [gw3C, gw4C], t1) + check_router(rA, [gw1A, gw2A], t1) + check_router(rB, [gw2B, gw3B], t1) + check_router(rC, [], t1) check_net(net1, sn1, [rA], [(gw1A, rA)], [], t1) check_net(net2, sn2, [rA, rB], [(gw2A, rA), (gw2B, rB)], [], t1) check_net(net3, sn3, [rB], [(gw3B, rB)], [gw3C], t1) @@ -2089,9 +2093,9 @@ class TestAimMapping(ApicAimTestCase): # Add subnet 3 to router C. add_interface(rC, net3, sn3, gw3C, t1) check_port_notify() - check_router(rA, [gw1A, gw2A], [], t1) - check_router(rB, [gw2B, gw3B], [], t1) - check_router(rC, [gw3C], [gw4C], t1) + check_router(rA, [gw1A, gw2A], t1) + check_router(rB, [gw2B, gw3B], t1) + check_router(rC, [gw3C], t1) check_net(net1, sn1, [rA], [(gw1A, rA)], [], t1) check_net(net2, sn2, [rA, rB], [(gw2A, rA), (gw2B, rB)], [], t1) check_net(net3, sn3, [rB, rC], [(gw3B, rB), (gw3C, rC)], [], t1) @@ -2102,9 +2106,9 @@ class TestAimMapping(ApicAimTestCase): # tenant 2. add_interface(rC, net4, sn4, gw4C, t1) check_port_notify([p1, p2, p3]) - check_router(rA, [gw1A, gw2A], [], t2) - check_router(rB, [gw2B, gw3B], [], t2) - check_router(rC, [gw3C, gw4C], [], t2) + check_router(rA, [gw1A, gw2A], t2) + check_router(rB, [gw2B, gw3B], t2) + check_router(rC, [gw3C, gw4C], t2) check_net(net1, sn1, [rA], [(gw1A, rA)], [], t2) check_net(net2, sn2, [rA, rB], [(gw2A, rA), (gw2B, rB)], [], t2) check_net(net3, sn3, [rB, rC], [(gw3B, rB), (gw3C, rC)], [], t2) @@ -2114,9 +2118,9 @@ class TestAimMapping(ApicAimTestCase): # topology (networks 1 and 2 and routers A and B) to tenant 1. remove_interface(rB, net3, sn3, gw3B, t1) check_port_notify([p1, p2]) - check_router(rA, [gw1A, gw2A], [], t1) - check_router(rB, [gw2B], [gw3B], t1) - check_router(rC, [gw3C, gw4C], [], t2) + check_router(rA, [gw1A, gw2A], t1) + check_router(rB, [gw2B], t1) + check_router(rC, [gw3C, gw4C], t2) check_net(net1, sn1, [rA], [(gw1A, rA)], [], t1) check_net(net2, sn2, [rA, rB], [(gw2A, rA), (gw2B, rB)], [], t1) check_net(net3, sn3, [rC], [(gw3C, rC)], [gw3B], t2) @@ -2127,9 +2131,9 @@ class TestAimMapping(ApicAimTestCase): # again. add_interface(rB, net3, sn3, gw3B, t1) check_port_notify([p1, p2]) - check_router(rA, [gw1A, gw2A], [], t2) - check_router(rB, [gw2B, gw3B], [], t2) - check_router(rC, [gw3C, gw4C], [], t2) + check_router(rA, [gw1A, gw2A], t2) + check_router(rB, [gw2B, gw3B], t2) + check_router(rC, [gw3C, gw4C], t2) check_net(net1, sn1, [rA], [(gw1A, rA)], [], t2) check_net(net2, sn2, [rA, rB], [(gw2A, rA), (gw2B, rB)], [], t2) check_net(net3, sn3, [rB, rC], [(gw3B, rB), (gw3C, rC)], [], t2) @@ -2139,9 +2143,9 @@ class TestAimMapping(ApicAimTestCase): # topology (networks 1 and 2 and router A) back to tenant 1. remove_interface(rB, net2, sn2, gw2B, t1) check_port_notify([p1, p2]) - check_router(rA, [gw1A, gw2A], [], t1) - check_router(rB, [gw3B], [gw2B], t2) - check_router(rC, [gw3C, gw4C], [], t2) + check_router(rA, [gw1A, gw2A], t1) + check_router(rB, [gw3B], t2) + check_router(rC, [gw3C, gw4C], t2) check_net(net1, sn1, [rA], [(gw1A, rA)], [], t1) check_net(net2, sn2, [rA], [(gw2A, rA)], [gw2B], t1) check_net(net3, sn3, [rB, rC], [(gw3B, rB), (gw3C, rC)], [], t2) @@ -2151,9 +2155,9 @@ class TestAimMapping(ApicAimTestCase): # topology (networks 1 and 2 and router A) to tenant 2 again. add_interface(rB, net2, sn2, gw2B, t1) check_port_notify([p1, p2]) - check_router(rA, [gw1A, gw2A], [], t2) - check_router(rB, [gw2B, gw3B], [], t2) - check_router(rC, [gw3C, gw4C], [], t2) + check_router(rA, [gw1A, gw2A], t2) + check_router(rB, [gw2B, gw3B], t2) + check_router(rC, [gw3C, gw4C], t2) check_net(net1, sn1, [rA], [(gw1A, rA)], [], t2) check_net(net2, sn2, [rA, rB], [(gw2A, rA), (gw2B, rB)], [], t2) check_net(net3, sn3, [rB, rC], [(gw3B, rB), (gw3C, rC)], [], t2)