1075
1125
self._test_dvr_serviced_port_exists_on_subnet(port=vip_port)
1127
def _create_port(self, port_name, tenant_id, host, subnet_id, ip_address,
1129
device_owner='compute:nova'):
1131
'id': port_name + '-port-id',
1132
'tenant_id': tenant_id,
1133
'device_id': port_name,
1134
'device_owner': device_owner,
1136
'binding:host_id': host,
1139
'subnet_id': subnet_id,
1140
'ip_address': ip_address
1145
def test_dvr_deletens_if_no_port_no_routers(self):
1146
# Delete a vm port, the port subnet has no router interface.
1147
vm_tenant_id = 'tenant-1'
1148
my_context = q_context.Context('user-1', vm_tenant_id, is_admin=False)
1149
vm_port_host = 'compute-node-1'
1151
vm_port = self._create_port(
1152
'deleted-vm', vm_tenant_id, vm_port_host,
1153
'shared-subnet', '10.10.10.3',
1156
vm_port_id = vm_port['id']
1157
fakePortDB = FakePortDB([vm_port])
1159
with contextlib.nested(
1160
mock.patch.object(my_context, 'elevated',
1161
return_value=self.adminContext),
1162
mock.patch('neutron.plugins.ml2.db.'
1163
'get_port_binding_host', return_value=vm_port_host),
1164
mock.patch('neutron.db.db_base_plugin_v2.NeutronDbPluginV2.'
1165
'get_ports', side_effect=fakePortDB.get_ports),
1166
mock.patch('neutron.db.db_base_plugin_v2.NeutronDbPluginV2.'
1167
'get_port', return_value=vm_port)) as (
1168
_, mock_get_port_binding_host, _, _):
1170
routers = self.dut.dvr_deletens_if_no_port(my_context, vm_port_id)
1171
self.assertEqual([], routers)
1172
mock_get_port_binding_host.assert_called_once_with(
1173
self.adminContext.session, vm_port_id)
1175
def test_dvr_deletens_if_no_ports_no_removeable_routers(self):
1176
# A VM port is deleted, but the router can't be unscheduled from the
1177
# compute node because there is another VM port present.
1178
vm_tenant_id = 'tenant-1'
1179
my_context = q_context.Context('user-1', vm_tenant_id, is_admin=False)
1180
shared_subnet_id = '80947d4a-fbc8-484b-9f92-623a6bfcf3e0',
1181
vm_port_host = 'compute-node-1'
1183
dvr_port = self._create_port(
1184
'dvr-router', 'admin-tenant', vm_port_host,
1185
shared_subnet_id, '10.10.10.1',
1186
device_owner=constants.DEVICE_OWNER_DVR_INTERFACE)
1188
deleted_vm_port = self._create_port(
1189
'deleted-vm', vm_tenant_id, vm_port_host,
1190
shared_subnet_id, '10.10.10.3',
1192
deleted_vm_port_id = deleted_vm_port['id']
1194
running_vm_port = self._create_port(
1195
'running-vn', 'tenant-2', vm_port_host,
1196
shared_subnet_id, '10.10.10.33')
1198
fakePortDB = FakePortDB([running_vm_port, deleted_vm_port, dvr_port])
1201
'port_id': deleted_vm_port_id,
1202
'host': vm_port_host
1205
with contextlib.nested(
1206
mock.patch.object(my_context, 'elevated',
1207
return_value=self.adminContext),
1208
mock.patch('neutron.plugins.ml2.db.get_port_binding_host',
1209
return_value=vm_port_host),
1210
mock.patch('neutron.db.db_base_plugin_v2.NeutronDbPluginV2.'
1211
'get_port', side_effect=fakePortDB.get_port),
1212
mock.patch('neutron.db.db_base_plugin_v2.NeutronDbPluginV2.'
1213
'get_ports', side_effect=fakePortDB.get_ports),
1214
mock.patch('neutron.plugins.ml2.db.get_dvr_port_binding_by_host',
1215
return_value=vm_port_binding)) as (_,
1216
mock_get_port_binding_host, _,
1218
mock_get_dvr_port_binding_by_host):
1220
routers = self.dut.dvr_deletens_if_no_port(
1221
my_context, deleted_vm_port_id)
1222
self.assertEqual([], routers)
1224
mock_get_port_binding_host.assert_called_once_with(
1225
self.adminContext.session, deleted_vm_port_id)
1226
self.assertTrue(mock_get_ports.called)
1227
self.assertFalse(mock_get_dvr_port_binding_by_host.called)
1229
def _test_dvr_deletens_if_no_ports_delete_routers(self,
1232
class FakeAgent(object):
1233
def __init__(self, id, host, agent_type):
1236
self.agent_type = agent_type
1238
my_context = q_context.Context('user-1', vm_tenant, is_admin=False)
1239
shared_subnet_id = '80947d4a-fbc8-484b-9f92-623a6bfcf3e0',
1240
vm_port_host = 'compute-node-1'
1242
router_id = 'dvr-router'
1243
dvr_port = self._create_port(
1244
router_id, router_tenant, vm_port_host,
1245
shared_subnet_id, '10.10.10.1',
1246
device_owner=constants.DEVICE_OWNER_DVR_INTERFACE)
1247
dvr_port_id = dvr_port['id']
1249
deleted_vm_port = self._create_port(
1250
'deleted-vm', vm_tenant, vm_port_host,
1251
shared_subnet_id, '10.10.10.3',
1253
deleted_vm_port_id = deleted_vm_port['id']
1255
running_vm_port = self._create_port(
1256
'running-vn', vm_tenant, 'compute-node-2',
1257
shared_subnet_id, '10.10.10.33')
1259
fakePortDB = FakePortDB([running_vm_port, dvr_port, deleted_vm_port])
1261
dvr_port_binding = {
1262
'port_id': dvr_port_id, 'host': vm_port_host
1265
agent_id = 'l3-agent-on-compute-node-1'
1266
l3_agent_on_vm_host = FakeAgent(agent_id,
1268
constants.AGENT_TYPE_L3)
1270
with contextlib.nested(
1271
mock.patch.object(my_context, 'elevated',
1272
return_value=self.adminContext),
1273
mock.patch('neutron.plugins.ml2.db.get_port_binding_host',
1274
return_value=vm_port_host),
1275
mock.patch('neutron.db.db_base_plugin_v2.NeutronDbPluginV2.'
1276
'get_port', side_effect=fakePortDB.get_port),
1277
mock.patch('neutron.db.db_base_plugin_v2.NeutronDbPluginV2.'
1278
'get_ports', side_effect=fakePortDB.get_ports),
1279
mock.patch('neutron.plugins.ml2.db.get_dvr_port_binding_by_host',
1280
return_value=dvr_port_binding),
1281
mock.patch('neutron.db.agents_db.AgentDbMixin.'
1282
'_get_agent_by_type_and_host',
1283
return_value=l3_agent_on_vm_host)) as (_,
1284
mock_get_port_binding_host, _,
1286
mock_get_dvr_port_binding_by_host,
1287
mock__get_agent_by_type_and_host):
1289
routers = self.dut.dvr_deletens_if_no_port(
1290
my_context, deleted_vm_port_id)
1293
'router_id': router_id,
1294
'host': vm_port_host,
1295
'agent_id': agent_id
1297
self.assertEqual([expected_router], routers)
1299
mock_get_port_binding_host.assert_called_once_with(
1300
self.adminContext.session, deleted_vm_port_id)
1301
self.assertTrue(mock_get_ports.called)
1302
mock_get_dvr_port_binding_by_host.assert_called_once_with(
1303
my_context.session, dvr_port_id, vm_port_host)
1305
def test_dvr_deletens_if_no_ports_delete_admin_routers(self):
1306
# test to see whether the last VM using a router created
1307
# by the admin will be unscheduled on the compute node
1308
self._test_dvr_deletens_if_no_ports_delete_routers(
1309
'tenant-1', 'admin-tenant')
1311
def test_dvr_deletens_if_no_ports_delete_tenant_routers(self):
1312
# test to see whether the last VM using a tenant's private
1313
# router will be unscheduled on the compute node
1314
self._test_dvr_deletens_if_no_ports_delete_routers(
1315
'tenant-1', 'tenant-1')
1077
1317
def test_dvr_serviced_dhcp_port_exists_on_subnet(self):
1079
1319
'id': 'dhcp-port1',