84
85
fixed_ips = [{'id': 0,
86
87
'address': '192.168.0.100',
88
89
'allocated': False,
89
90
'virtual_interface_id': 0,
90
91
'floating_ips': []},
93
94
'address': '192.168.1.100',
95
96
'allocated': False,
96
97
'virtual_interface_id': 0,
97
98
'floating_ips': []}]
113
114
'address': 'DE:AD:BE:EF:00:00',
114
115
'uuid': '00000000-0000-0000-0000-0000000000000000',
118
119
'address': 'DE:AD:BE:EF:00:01',
119
120
'uuid': '00000000-0000-0000-0000-0000000000000001',
123
124
'address': 'DE:AD:BE:EF:00:02',
124
125
'uuid': '00000000-0000-0000-0000-0000000000000002',
129
130
class FlatNetworkTestCase(test.TestCase):
197
198
def test_validate_networks(self):
198
199
self.mox.StubOutWithMock(db, 'network_get')
199
200
self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
200
self.mox.StubOutWithMock(db, "fixed_ip_get_by_address")
201
self.mox.StubOutWithMock(db, 'fixed_ip_get_by_address')
202
requested_networks = [("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
203
requested_networks = [('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb',
204
205
db.network_get_all_by_uuids(mox.IgnoreArg(),
205
mox.IgnoreArg()).AndReturn(networks)
206
mox.IgnoreArg()).AndReturn(networks)
206
207
db.network_get(mox.IgnoreArg(),
207
208
mox.IgnoreArg()).AndReturn(networks[1])
209
210
ip = fixed_ips[1].copy()
210
ip['instance_id'] = None
211
ip['instance_uuid'] = None
211
212
db.fixed_ip_get_by_address(mox.IgnoreArg(),
212
mox.IgnoreArg()).AndReturn(ip)
213
mox.IgnoreArg()).AndReturn(ip)
214
215
self.mox.ReplayAll()
215
216
self.network.validate_networks(self.context, requested_networks)
282
283
db.virtual_interface_get_by_instance_and_network(mox.IgnoreArg(),
283
284
mox.IgnoreArg(), mox.IgnoreArg()).AndReturn({'id': 0})
285
db.instance_get(mox.IgnoreArg(),
286
mox.IgnoreArg()).AndReturn({'security_groups':
288
286
db.instance_get(self.context,
289
287
1).AndReturn({'display_name': HOST,
290
288
'uuid': 'test-00001'})
291
289
db.instance_get(mox.IgnoreArg(),
292
mox.IgnoreArg()).AndReturn({'availability_zone': ''})
290
mox.IgnoreArg()).AndReturn({'security_groups':
293
292
db.fixed_ip_associate_pool(mox.IgnoreArg(),
295
294
mox.IgnoreArg()).AndReturn('192.168.0.101')
315
314
db.virtual_interface_get_by_instance_and_network(mox.IgnoreArg(),
316
315
mox.IgnoreArg(), mox.IgnoreArg()).AndReturn({'id': 0})
318
db.instance_get(mox.IgnoreArg(),
319
mox.IgnoreArg()).AndReturn({'security_groups':
321
317
db.instance_get(self.context,
322
318
1).AndReturn({'display_name': HOST,
323
319
'uuid': 'test-00001'})
324
320
db.instance_get(mox.IgnoreArg(),
325
mox.IgnoreArg()).AndReturn({'availability_zone': ''})
321
mox.IgnoreArg()).AndReturn({'security_groups':
326
323
db.fixed_ip_associate_pool(mox.IgnoreArg(),
328
325
mox.IgnoreArg()).AndReturn('192.168.0.101')
372
369
self.mox.StubOutWithMock(db, 'network_update')
373
370
self.mox.StubOutWithMock(db, 'fixed_ip_associate_pool')
374
371
self.mox.StubOutWithMock(db, 'instance_get')
372
self.mox.StubOutWithMock(db, 'instance_get_by_uuid')
375
373
self.mox.StubOutWithMock(db,
376
374
'virtual_interface_get_by_instance_and_network')
377
375
self.mox.StubOutWithMock(db, 'fixed_ip_update')
382
380
db.virtual_interface_get_by_instance_and_network(mox.IgnoreArg(),
383
381
mox.IgnoreArg(), mox.IgnoreArg()).AndReturn({'id': 0})
385
db.instance_get(mox.IgnoreArg(),
386
mox.IgnoreArg()).AndReturn({'security_groups':
389
383
db.instance_get(self.context,
390
384
1).AndReturn({'display_name': HOST,
391
385
'uuid': 'test-00001'})
392
386
db.instance_get(mox.IgnoreArg(),
393
mox.IgnoreArg()).AndReturn({'availability_zone': ''})
387
mox.IgnoreArg()).AndReturn({'security_groups':
394
390
db.fixed_ip_associate_pool(mox.IgnoreArg(),
396
392
mox.IgnoreArg()).AndReturn(fixedip)
423
419
def test_vpn_allocate_fixed_ip(self):
420
self.mox.StubOutWithMock(db, 'instance_get')
424
421
self.mox.StubOutWithMock(db, 'fixed_ip_associate')
425
422
self.mox.StubOutWithMock(db, 'fixed_ip_update')
426
423
self.mox.StubOutWithMock(db,
427
424
'virtual_interface_get_by_instance_and_network')
426
db.instance_get(mox.IgnoreArg(),
427
mox.IgnoreArg()).AndReturn({'uuid': '42'})
429
428
db.fixed_ip_associate(mox.IgnoreArg(),
446
445
network = dict(networks[0])
447
446
network['vpn_private_address'] = '192.168.0.2'
448
447
network['id'] = None
448
instance = db.instance_create(self.context, {})
449
449
context_admin = context.RequestContext('testuser', 'testproject',
451
451
self.assertRaises(exception.FixedIpNotFoundForNetwork,
452
452
self.network.allocate_fixed_ip,
463
463
self.mox.StubOutWithMock(db, 'instance_get')
465
465
db.instance_get(mox.IgnoreArg(),
466
mox.IgnoreArg()).AndReturn({'uuid': FAKEUUID})
467
db.instance_get(mox.IgnoreArg(),
466
468
mox.IgnoreArg()).AndReturn({'security_groups':
468
470
db.fixed_ip_associate_pool(mox.IgnoreArg(),
503
505
mox.IgnoreArg()).AndReturn(networks)
505
507
fixed_ips[1]['network_id'] = networks[1]['id']
506
fixed_ips[1]['instance_id'] = None
508
fixed_ips[1]['instance_uuid'] = None
507
509
db.fixed_ip_get_by_address(mox.IgnoreArg(),
508
510
mox.IgnoreArg()).AndReturn(fixed_ips[1])
670
672
raise exception.ProcessExecutionError('',
671
673
'Cannot find device "em0"\n')
675
def fake9(*args, **kwargs):
676
raise test.TestingException()
673
678
# raises because interface doesn't exist
674
679
self.stubs.Set(self.network.db,
675
680
'floating_ip_fixed_ip_associate',
688
693
# raises because floating_ip is already associated to a fixed_ip
689
694
self.stubs.Set(self.network.db, 'floating_ip_get_by_address', fake2)
690
self.assertRaises(exception.FloatingIpAssociated,
695
self.stubs.Set(self.network, 'disassociate_floating_ip', fake9)
697
def fake_fixed_ip_get(context, fixed_ip_id):
698
return {'instance_uuid': 'fake_uuid'}
700
self.stubs.Set(self.network.db, 'fixed_ip_get', fake_fixed_ip_get)
702
self.assertRaises(test.TestingException,
691
703
self.network.associate_floating_ip,
837
849
'virtual_interface_get_by_instance_and_network')
838
850
self.mox.StubOutWithMock(db, 'fixed_ip_update')
852
db.instance_get(mox.IgnoreArg(),
853
mox.IgnoreArg()).AndReturn({'uuid': FAKEUUID})
840
854
db.fixed_ip_update(mox.IgnoreArg(),
846
860
db.instance_get(mox.IgnoreArg(),
847
861
mox.IgnoreArg()).AndReturn({'security_groups':
849
'availability_zone': ''})
863
'availability_zone': '',
850
865
db.fixed_ip_associate_pool(mox.IgnoreArg(),
852
867
mox.IgnoreArg()).AndReturn('192.168.0.101')
871
886
address = '1.2.3.4'
872
887
float_addr = db.floating_ip_create(context1.elevated(),
874
'project_id': context1.project_id})
889
'project_id': context1.project_id})
876
891
instance = db.instance_create(context1,
877
{'project_id': 'project1'})
892
{'project_id': 'project1'})
879
894
fix_addr = db.fixed_ip_associate_pool(context1.elevated(),
882
897
# Associate the IP with non-admin user context
883
898
self.assertRaises(exception.NotAuthorized,
928
943
{'project_id': 'project1'})
930
945
elevated = context1.elevated()
931
fix_addr = db.fixed_ip_associate_pool(elevated, 1, instance['id'])
946
fix_addr = db.fixed_ip_associate_pool(elevated, 1, instance['uuid'])
932
947
values = {'allocated': True,
933
948
'virtual_interface_id': 3}
934
949
db.fixed_ip_update(elevated, fix_addr, values)
963
978
{'project_id': 'project1'})
965
980
elevated = context1.elevated()
966
fix_addr = db.fixed_ip_associate_pool(elevated, 1, instance['id'])
981
fix_addr = db.fixed_ip_associate_pool(elevated, 1, instance['uuid'])
967
982
db.fixed_ip_update(elevated, fix_addr, {'deleted': 1})
968
983
elevated.read_deleted = 'yes'
969
984
delfixed = db.fixed_ip_get_by_address(elevated, fix_addr)
970
985
values = {'address': fix_addr,
972
'instance_id': delfixed['instance_id']}
987
'instance_uuid': delfixed['instance_uuid']}
973
988
db.fixed_ip_create(elevated, values)
974
989
elevated.read_deleted = 'no'
975
990
newfixed = db.fixed_ip_get_by_address(elevated, fix_addr)
996
1011
context1 = context.RequestContext('user', 'project1')
998
1013
instance = db.instance_create(context1,
999
{'project_id': 'project1'})
1014
{'project_id': 'project1'})
1001
1016
elevated = context1.elevated()
1002
fix_addr = db.fixed_ip_associate_pool(elevated, 1, instance['id'])
1017
fix_addr = db.fixed_ip_associate_pool(elevated, 1, instance['uuid'])
1003
1018
values = {'allocated': True,
1004
1019
'virtual_interface_id': 3}
1005
1020
db.fixed_ip_update(elevated, fix_addr, values)
1007
1022
self.flags(force_dhcp_release=True)
1008
1023
self.network.deallocate_fixed_ip(context1, fix_addr, 'fake')
1025
def test_fixed_ip_cleanup_fail(self):
1026
"""Verify IP is not deallocated if the security group refresh fails."""
1027
def network_get(_context, network_id):
1028
return networks[network_id]
1030
self.stubs.Set(db, 'network_get', network_get)
1032
context1 = context.RequestContext('user', 'project1')
1034
instance = db.instance_create(context1,
1035
{'project_id': 'project1'})
1037
elevated = context1.elevated()
1038
fix_addr = db.fixed_ip_associate_pool(elevated, 1, instance['uuid'])
1039
values = {'allocated': True,
1040
'virtual_interface_id': 3}
1041
db.fixed_ip_update(elevated, fix_addr, values)
1042
fixed = db.fixed_ip_get_by_address(elevated, fix_addr)
1043
network = db.network_get(elevated, fixed['network_id'])
1045
db.instance_destroy(self.context.elevated(), instance['uuid'])
1046
self.assertRaises(exception.InstanceNotFound,
1047
self.network.deallocate_fixed_ip,
1051
fixed = db.fixed_ip_get_by_address(elevated, fix_addr)
1052
self.assertTrue(fixed['allocated'])
1011
1055
class CommonNetworkTestCase(test.TestCase):
1229
1273
{'ip': '172.16.0.2'})
1230
1274
self.assertTrue(res)
1231
1275
self.assertEqual(len(res), 1)
1232
self.assertEqual(res[0]['instance_id'], _vifs[1]['instance_id'])
1276
self.assertEqual(res[0]['instance_uuid'], _vifs[1]['instance_uuid'])
1234
1278
# Get instance 2
1235
1279
res = manager.get_instance_uuids_by_ip_filter(fake_context,
1236
1280
{'ip': '173.16.0.2'})
1237
1281
self.assertTrue(res)
1238
1282
self.assertEqual(len(res), 1)
1239
self.assertEqual(res[0]['instance_id'], _vifs[2]['instance_id'])
1283
self.assertEqual(res[0]['instance_uuid'], _vifs[2]['instance_uuid'])
1241
1285
# Get instance 0 and 1
1242
1286
res = manager.get_instance_uuids_by_ip_filter(fake_context,
1243
1287
{'ip': '172.16.0.*'})
1244
1288
self.assertTrue(res)
1245
1289
self.assertEqual(len(res), 2)
1246
self.assertEqual(res[0]['instance_id'], _vifs[0]['instance_id'])
1247
self.assertEqual(res[1]['instance_id'], _vifs[1]['instance_id'])
1290
self.assertEqual(res[0]['instance_uuid'], _vifs[0]['instance_uuid'])
1291
self.assertEqual(res[1]['instance_uuid'], _vifs[1]['instance_uuid'])
1249
1293
# Get instance 1 and 2
1250
1294
res = manager.get_instance_uuids_by_ip_filter(fake_context,
1251
1295
{'ip': '17..16.0.2'})
1252
1296
self.assertTrue(res)
1253
1297
self.assertEqual(len(res), 2)
1254
self.assertEqual(res[0]['instance_id'], _vifs[1]['instance_id'])
1255
self.assertEqual(res[1]['instance_id'], _vifs[2]['instance_id'])
1298
self.assertEqual(res[0]['instance_uuid'], _vifs[1]['instance_uuid'])
1299
self.assertEqual(res[1]['instance_uuid'], _vifs[2]['instance_uuid'])
1257
1301
def test_get_instance_uuids_by_ipv6_regex(self):
1258
1302
manager = fake_network.FakeNetworkManager()
1274
1318
{'ip6': '2001:.*2'})
1275
1319
self.assertTrue(res)
1276
1320
self.assertEqual(len(res), 1)
1277
self.assertEqual(res[0]['instance_id'], _vifs[1]['instance_id'])
1321
self.assertEqual(res[0]['instance_uuid'], _vifs[1]['instance_uuid'])
1279
1323
# Get instance 2
1280
1324
ip6 = '2001:db8:69:1f:dead:beff:feff:ef03'
1283
1327
self.assertTrue(res)
1284
1328
self.assertEqual(len(res), 1)
1285
self.assertEqual(res[0]['instance_id'], _vifs[2]['instance_id'])
1329
self.assertEqual(res[0]['instance_uuid'], _vifs[2]['instance_uuid'])
1287
1331
# Get instance 0 and 1
1288
1332
res = manager.get_instance_uuids_by_ip_filter(fake_context,
1289
1333
{'ip6': '.*ef0[1,2]'})
1290
1334
self.assertTrue(res)
1291
1335
self.assertEqual(len(res), 2)
1292
self.assertEqual(res[0]['instance_id'], _vifs[0]['instance_id'])
1293
self.assertEqual(res[1]['instance_id'], _vifs[1]['instance_id'])
1336
self.assertEqual(res[0]['instance_uuid'], _vifs[0]['instance_uuid'])
1337
self.assertEqual(res[1]['instance_uuid'], _vifs[1]['instance_uuid'])
1295
1339
# Get instance 1 and 2
1296
1340
ip6 = '2001:db8:69:1.:dead:beff:feff:ef0.'
1299
1343
self.assertTrue(res)
1300
1344
self.assertEqual(len(res), 2)
1301
self.assertEqual(res[0]['instance_id'], _vifs[1]['instance_id'])
1302
self.assertEqual(res[1]['instance_id'], _vifs[2]['instance_id'])
1345
self.assertEqual(res[0]['instance_uuid'], _vifs[1]['instance_uuid'])
1346
self.assertEqual(res[1]['instance_uuid'], _vifs[2]['instance_uuid'])
1304
1348
def test_get_instance_uuids_by_ip(self):
1305
1349
manager = fake_network.FakeNetworkManager()
1323
1367
{'fixed_ip': ip})
1324
1368
self.assertTrue(res)
1325
1369
self.assertEqual(len(res), 1)
1326
self.assertEqual(res[0]['instance_id'], _vifs[1]['instance_id'])
1370
self.assertEqual(res[0]['instance_uuid'], _vifs[1]['instance_uuid'])
1328
1372
# Get instance 2
1329
1373
ip = '173.16.0.2'
1331
1375
{'fixed_ip': ip})
1332
1376
self.assertTrue(res)
1333
1377
self.assertEqual(len(res), 1)
1334
self.assertEqual(res[0]['instance_id'], _vifs[2]['instance_id'])
1378
self.assertEqual(res[0]['instance_uuid'], _vifs[2]['instance_uuid'])
1336
1380
def test_get_network(self):
1337
1381
manager = fake_network.FakeNetworkManager()
1454
1498
{'host': self.network.host})
1455
1499
project_id = self.context.project_id
1456
1500
nw_info = self.network.allocate_for_instance(self.context,
1457
instance_id=inst['id'],
1462
project_id=project_id)
1501
instance_id=inst['id'], instance_uuid=inst['uuid'],
1502
host=inst['host'], vpn=None, rxtx_factor=3,
1503
project_id=project_id)
1463
1504
self.assertEquals(1, len(nw_info))
1464
1505
fixed_ip = nw_info.fixed_ips()[0]['address']
1465
1506
self.assertTrue(utils.is_valid_ipv4(fixed_ip))