Merge "[apic_aim] Fix RouterPort queries" into stable/newton

This commit is contained in:
Jenkins 2017-09-27 18:21:18 +00:00 committed by Gerrit Code Review
commit 2ec4993043
2 changed files with 111 additions and 105 deletions

View File

@ -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 ==

View File

@ -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)