135
139
def test_get_instance_nw_info(self):
136
self.mox.StubOutWithMock(db, 'fixed_ip_get_by_instance')
137
self.mox.StubOutWithMock(db, 'virtual_interface_get_by_instance')
138
self.mox.StubOutWithMock(db, 'instance_type_get')
140
db.fixed_ip_get_by_instance(mox.IgnoreArg(),
141
mox.IgnoreArg()).AndReturn(fixed_ips)
142
db.virtual_interface_get_by_instance(mox.IgnoreArg(),
143
mox.IgnoreArg()).AndReturn(vifs)
144
db.instance_type_get(mox.IgnoreArg(),
145
mox.IgnoreArg()).AndReturn(flavor)
148
nw_info = self.network.get_instance_nw_info(None, 0, 0, None)
150
self.assertTrue(nw_info)
152
for i, nw in enumerate(nw_info):
154
check = {'bridge': 'fa%s' % i,
140
fake_get_instance_nw_info = fake_network.fake_get_instance_nw_info
142
nw_info = fake_get_instance_nw_info(self.stubs, 0, 2)
143
self.assertFalse(nw_info)
145
for i, (nw, info) in enumerate(nw_info):
146
check = {'bridge': 'fake_br%d' % i,
155
147
'cidr': '192.168.%s.0/24' % i,
156
'cidr_v6': '2001:db%s::/64' % i8,
148
'cidr_v6': '2001:db8:0:%x::/64' % i,
158
150
'multi_host': False,
159
'injected': 'DONTCARE',
160
'bridge_interface': 'fake_fa%s' % i,
152
'bridge_interface': 'fake_eth%d' % i,
163
self.assertDictMatch(nw[0], check)
155
self.assertDictMatch(nw, check)
165
check = {'broadcast': '192.168.%s.255' % i,
166
'dhcp_server': '192.168.%s.1' % i,
168
'gateway': '192.168.%s.1' % i,
169
'gateway6': '2001:db%s::1' % i8,
157
check = {'broadcast': '192.168.%d.255' % i,
158
'dhcp_server': '192.168.%d.1' % i,
159
'dns': ['192.168.%d.3' % n, '192.168.%d.4' % n],
160
'gateway': '192.168.%d.1' % i,
161
'gateway6': '2001:db8:0:%x::1' % i,
170
162
'ip6s': 'DONTCARE',
171
163
'ips': 'DONTCARE',
172
'label': 'test%s' % i,
173
'mac': 'DE:AD:BE:EF:00:0%s' % i,
174
'vif_uuid': ('00000000-0000-0000-0000-000000000000000%s' %
176
'rxtx_cap': 'DONTCARE',
164
'label': 'test%d' % i,
165
'mac': 'DE:AD:BE:EF:00:%02x' % i,
167
'00000000-0000-0000-0000-00000000000000%02d' % i,
177
169
'should_create_vlan': False,
178
170
'should_create_bridge': False}
179
self.assertDictMatch(nw[1], check)
171
self.assertDictMatch(info, check)
181
173
check = [{'enabled': 'DONTCARE',
182
'ip': '2001:db%s::dcad:beff:feef:%s' % (i8, i),
174
'ip': '2001:db8::dcad:beff:feef:%s' % i,
183
175
'netmask': '64'}]
184
self.assertDictListMatch(nw[1]['ip6s'], check)
176
self.assertDictListMatch(info['ip6s'], check)
186
check = [{'enabled': '1',
187
'ip': '192.168.%s.100' % i,
188
'netmask': '255.255.255.0'}]
189
self.assertDictListMatch(nw[1]['ips'], check)
178
num_fixed_ips = len(info['ips'])
179
check = [{'enabled': 'DONTCARE',
180
'ip': '192.168.%d.1%02d' % (i, ip_num),
181
'netmask': '255.255.255.0'}
182
for ip_num in xrange(num_fixed_ips)]
183
self.assertDictListMatch(info['ips'], check)
191
185
def test_validate_networks(self):
192
186
self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
248
242
self.network.validate_networks(None, requested_networks)
244
def test_add_fixed_ip_instance_without_vpn_requested_networks(self):
245
self.mox.StubOutWithMock(db, 'network_get')
246
self.mox.StubOutWithMock(db, 'network_update')
247
self.mox.StubOutWithMock(db, 'fixed_ip_associate_pool')
248
self.mox.StubOutWithMock(db, 'instance_get')
249
self.mox.StubOutWithMock(db,
250
'virtual_interface_get_by_instance_and_network')
251
self.mox.StubOutWithMock(db, 'fixed_ip_update')
253
db.fixed_ip_update(mox.IgnoreArg(),
256
db.virtual_interface_get_by_instance_and_network(mox.IgnoreArg(),
257
mox.IgnoreArg(), mox.IgnoreArg()).AndReturn({'id': 0})
259
db.instance_get(mox.IgnoreArg(),
260
mox.IgnoreArg()).AndReturn({'security_groups':
262
db.fixed_ip_associate_pool(mox.IgnoreArg(),
264
mox.IgnoreArg()).AndReturn('192.168.0.101')
265
db.network_get(mox.IgnoreArg(),
266
mox.IgnoreArg()).AndReturn(networks[0])
267
db.network_update(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg())
269
self.network.add_fixed_ip_to_instance(self.context, 1, HOST,
251
273
class VlanNetworkTestCase(test.TestCase):
371
394
self.mox.ReplayAll()
372
395
self.network.validate_networks(self.context, requested_networks)
397
def test_cant_associate_associated_floating_ip(self):
398
ctxt = context.RequestContext('testuser', 'testproject',
401
def fake_floating_ip_get_by_address(context, address):
402
return {'address': '10.10.10.10',
403
'fixed_ip': {'address': '10.0.0.1'}}
404
self.stubs.Set(self.network.db, 'floating_ip_get_by_address',
405
fake_floating_ip_get_by_address)
407
self.assertRaises(exception.FloatingIpAlreadyInUse,
408
self.network.associate_floating_ip,
413
def test_add_fixed_ip_instance_without_vpn_requested_networks(self):
414
self.mox.StubOutWithMock(db, 'network_get')
415
self.mox.StubOutWithMock(db, 'fixed_ip_associate_pool')
416
self.mox.StubOutWithMock(db, 'instance_get')
417
self.mox.StubOutWithMock(db,
418
'virtual_interface_get_by_instance_and_network')
419
self.mox.StubOutWithMock(db, 'fixed_ip_update')
421
db.fixed_ip_update(mox.IgnoreArg(),
424
db.virtual_interface_get_by_instance_and_network(mox.IgnoreArg(),
425
mox.IgnoreArg(), mox.IgnoreArg()).AndReturn({'id': 0})
427
db.instance_get(mox.IgnoreArg(),
428
mox.IgnoreArg()).AndReturn({'security_groups':
430
db.fixed_ip_associate_pool(mox.IgnoreArg(),
432
mox.IgnoreArg()).AndReturn('192.168.0.101')
433
db.network_get(mox.IgnoreArg(),
434
mox.IgnoreArg()).AndReturn(networks[0])
436
self.network.add_fixed_ip_to_instance(self.context, 1, HOST,
439
def test_ip_association_and_allocation_of_other_project(self):
440
"""Makes sure that we cannot deallocaate or disassociate
441
a public ip of other project"""
443
context1 = context.RequestContext('user', 'project1')
444
context2 = context.RequestContext('user', 'project2')
447
float_addr = db.floating_ip_create(context1.elevated(),
449
'project_id': context1.project_id})
451
instance = db.instance_create(context1,
452
{'project_id': 'project1'})
454
fix_addr = db.fixed_ip_associate_pool(context1.elevated(),
457
# Associate the IP with non-admin user context
458
self.assertRaises(exception.NotAuthorized,
459
self.network.associate_floating_ip,
464
# Deallocate address from other project
465
self.assertRaises(exception.NotAuthorized,
466
self.network.deallocate_floating_ip,
470
# Now Associates the address to the actual project
471
self.network.associate_floating_ip(context1, float_addr, fix_addr)
473
# Now try dis-associating from other project
474
self.assertRaises(exception.NotAuthorized,
475
self.network.disassociate_floating_ip,
479
# Clean up the ip addresses
480
self.network.deallocate_floating_ip(context1, float_addr)
481
self.network.deallocate_fixed_ip(context1, fix_addr)
482
db.floating_ip_destroy(context1.elevated(), float_addr)
483
db.fixed_ip_disassociate(context1.elevated(), fix_addr)
375
486
class CommonNetworkTestCase(test.TestCase):
377
class FakeNetworkManager(network_manager.NetworkManager):
378
"""This NetworkManager doesn't call the base class so we can bypass all
379
inherited service cruft and just perform unit tests.
383
def fixed_ip_get_by_instance(self, context, instance_id):
384
return [dict(address='10.0.0.0'), dict(address='10.0.0.1'),
385
dict(address='10.0.0.2')]
387
def network_get_by_cidr(self, context, cidr):
388
raise exception.NetworkNotFoundForCidr()
390
def network_create_safe(self, context, net):
395
def network_get_all(self, context):
396
raise exception.NoNetworksFound()
399
self.db = self.FakeDB()
400
self.deallocate_called = None
402
def deallocate_fixed_ip(self, context, address):
403
self.deallocate_called = address
405
def _create_fixed_ips(self, context, network_id):
408
487
def fake_create_fixed_ips(self, context, network_id):
411
490
def test_remove_fixed_ip_from_instance(self):
412
manager = self.FakeNetworkManager()
491
manager = fake_network.FakeNetworkManager()
413
492
manager.remove_fixed_ip_from_instance(None, 99, '10.0.0.1')
415
494
self.assertEquals(manager.deallocate_called, '10.0.0.1')
417
496
def test_remove_fixed_ip_from_instance_bad_input(self):
418
manager = self.FakeNetworkManager()
497
manager = fake_network.FakeNetworkManager()
419
498
self.assertRaises(exception.FixedIpNotFoundForSpecificInstance,
420
499
manager.remove_fixed_ip_from_instance,
421
500
None, 99, 'bad input')
423
502
def test_validate_cidrs(self):
424
manager = self.FakeNetworkManager()
503
manager = fake_network.FakeNetworkManager()
425
504
nets = manager.create_networks(None, 'fake', '192.168.0.0/24',
426
505
False, 1, 256, None, None, None,
591
669
def test_create_networks_many(self):
592
670
cidr = '192.168.0.0/16'
593
manager = self.FakeNetworkManager()
671
manager = fake_network.FakeNetworkManager()
594
672
self.stubs.Set(manager, '_create_fixed_ips',
595
673
self.fake_create_fixed_ips)
596
674
args = [None, 'foo', cidr, None, 10, 256, 'fd00::/48', None, None,
598
676
self.assertTrue(manager.create_networks(*args))
678
def test_get_instance_uuids_by_ip_regex(self):
679
manager = fake_network.FakeNetworkManager()
680
_vifs = manager.db.virtual_interface_get_all(None)
682
# Greedy get eveything
683
res = manager.get_instance_uuids_by_ip_filter(None, {'ip': '.*'})
684
self.assertEqual(len(res), len(_vifs))
687
res = manager.get_instance_uuids_by_ip_filter(None, {'ip': '10.0.0.1'})
688
self.assertFalse(res)
691
res = manager.get_instance_uuids_by_ip_filter(None,
692
{'ip': '172.16.0.2'})
694
self.assertEqual(len(res), 1)
695
self.assertEqual(res[0]['instance_id'], _vifs[1]['instance_id'])
698
res = manager.get_instance_uuids_by_ip_filter(None,
699
{'ip': '173.16.0.2'})
701
self.assertEqual(len(res), 1)
702
self.assertEqual(res[0]['instance_id'], _vifs[2]['instance_id'])
704
# Get instance 0 and 1
705
res = manager.get_instance_uuids_by_ip_filter(None,
706
{'ip': '172.16.0.*'})
708
self.assertEqual(len(res), 2)
709
self.assertEqual(res[0]['instance_id'], _vifs[0]['instance_id'])
710
self.assertEqual(res[1]['instance_id'], _vifs[1]['instance_id'])
712
# Get instance 1 and 2
713
res = manager.get_instance_uuids_by_ip_filter(None,
714
{'ip': '17..16.0.2'})
716
self.assertEqual(len(res), 2)
717
self.assertEqual(res[0]['instance_id'], _vifs[1]['instance_id'])
718
self.assertEqual(res[1]['instance_id'], _vifs[2]['instance_id'])
720
def test_get_instance_uuids_by_ipv6_regex(self):
721
manager = fake_network.FakeNetworkManager()
722
_vifs = manager.db.virtual_interface_get_all(None)
724
# Greedy get eveything
725
res = manager.get_instance_uuids_by_ip_filter(None, {'ip6': '.*'})
726
self.assertEqual(len(res), len(_vifs))
729
res = manager.get_instance_uuids_by_ip_filter(None,
731
self.assertFalse(res)
734
res = manager.get_instance_uuids_by_ip_filter(None,
735
{'ip6': '2001:.*:2'})
737
self.assertEqual(len(res), 1)
738
self.assertEqual(res[0]['instance_id'], _vifs[1]['instance_id'])
741
ip6 = '2002:db8::dcad:beff:feef:2'
742
res = manager.get_instance_uuids_by_ip_filter(None, {'ip6': ip6})
744
self.assertEqual(len(res), 1)
745
self.assertEqual(res[0]['instance_id'], _vifs[2]['instance_id'])
747
# Get instance 0 and 1
748
res = manager.get_instance_uuids_by_ip_filter(None, {'ip6': '2001:.*'})
750
self.assertEqual(len(res), 2)
751
self.assertEqual(res[0]['instance_id'], _vifs[0]['instance_id'])
752
self.assertEqual(res[1]['instance_id'], _vifs[1]['instance_id'])
754
# Get instance 1 and 2
755
ip6 = '200.:db8::dcad:beff:feef:2'
756
res = manager.get_instance_uuids_by_ip_filter(None, {'ip6': ip6})
758
self.assertEqual(len(res), 2)
759
self.assertEqual(res[0]['instance_id'], _vifs[1]['instance_id'])
760
self.assertEqual(res[1]['instance_id'], _vifs[2]['instance_id'])
762
def test_get_instance_uuids_by_ip(self):
763
manager = fake_network.FakeNetworkManager()
764
_vifs = manager.db.virtual_interface_get_all(None)
767
res = manager.get_instance_uuids_by_ip_filter(None,
769
self.assertFalse(res)
773
res = manager.get_instance_uuids_by_ip_filter(None,
775
self.assertFalse(res)
779
res = manager.get_instance_uuids_by_ip_filter(None,
782
self.assertEqual(len(res), 1)
783
self.assertEqual(res[0]['instance_id'], _vifs[1]['instance_id'])
787
res = manager.get_instance_uuids_by_ip_filter(None,
790
self.assertEqual(len(res), 1)
791
self.assertEqual(res[0]['instance_id'], _vifs[2]['instance_id'])