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 f7dedf34b..07b5214fe 100644 --- a/gbpservice/neutron/plugins/ml2plus/drivers/apic_aim/mechanism_driver.py +++ b/gbpservice/neutron/plugins/ml2plus/drivers/apic_aim/mechanism_driver.py @@ -779,7 +779,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 == @@ -1868,6 +1869,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 09b6fcdcb..e945eff8b 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 @@ -241,6 +242,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) @@ -459,6 +471,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) @@ -509,7 +523,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) @@ -521,7 +535,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) @@ -533,7 +547,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']) @@ -542,6 +558,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) @@ -563,13 +580,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 @@ -577,6 +596,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( @@ -590,14 +611,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') @@ -605,7 +629,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) @@ -616,40 +640,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] @@ -663,8 +678,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']) @@ -766,16 +780,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) @@ -791,7 +805,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) @@ -839,8 +853,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'] @@ -862,8 +875,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. @@ -880,8 +892,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'] @@ -907,8 +919,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'] @@ -933,7 +944,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'] @@ -974,7 +985,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) @@ -1026,7 +1037,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'] @@ -1048,7 +1059,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. @@ -1065,7 +1076,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'] @@ -1091,7 +1102,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'] @@ -1116,7 +1127,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'] @@ -1325,7 +1336,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( @@ -1338,13 +1348,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): @@ -1578,7 +1586,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, @@ -1603,7 +1611,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'] @@ -1629,7 +1637,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'] @@ -1651,7 +1659,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'] @@ -1673,7 +1681,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'] @@ -1696,7 +1704,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( @@ -1748,8 +1756,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'] @@ -1782,8 +1789,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'] @@ -1817,8 +1824,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'] @@ -1853,8 +1860,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'] @@ -1888,8 +1895,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'] @@ -1922,8 +1928,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'] @@ -1975,7 +1980,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): @@ -2002,11 +2007,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: @@ -2041,9 +2045,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) @@ -2052,9 +2056,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) @@ -2063,9 +2067,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) @@ -2074,9 +2078,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) @@ -2085,9 +2089,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) @@ -2096,9 +2100,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) @@ -2109,9 +2113,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) @@ -2121,9 +2125,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) @@ -2134,9 +2138,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) @@ -2146,9 +2150,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) @@ -2158,9 +2162,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)