~ubuntu-branches/ubuntu/precise/nova/precise

« back to all changes in this revision

Viewing changes to nova/tests/test_network.py

  • Committer: Package Import Robot
  • Author(s): Chuck Short, Chuck Short, Adam Gandleman
  • Date: 2012-03-09 13:07:19 UTC
  • mfrom: (1.1.48)
  • Revision ID: package-import@ubuntu.com-20120309130719-ytcnrxb0mj3epour
Tags: 2012.1~rc1~20120309.13261-0ubuntu1
[ Chuck Short ]
* New upstream release.
* Refreshed libvirt-console-patch again.

[ Adam Gandleman ]
* debian/patches/{ec2-fixes.patch, libvirt-console-pipe.patch}: Fix and
  refresh. Add dep3 headers from original git commits.
* debian/patches/ec2-fixes.patch: Dropped.  Merge upstream at 121537c3
* debain/{rules, nova-docs.doc}: Docs now built in doc/build/.
* debian/patches/libvirt-use-console-pipe.patch: Update use of
  instance['name'] instead of instance_name

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# vim: tabstop=4 shiftwidth=4 softtabstop=4
2
 
 
3
 
# Copyright 2011 Rackspace
4
 
# Copyright (c) 2011 X.commerce, a business unit of eBay Inc.
5
 
# All Rights Reserved.
6
 
#
7
 
# Licensed under the Apache License, Version 2.0 (the "License"); you may
8
 
# not use this file except in compliance with the License. You may obtain
9
 
# a copy of the License at
10
 
#
11
 
#      http://www.apache.org/licenses/LICENSE-2.0
12
 
#
13
 
# Unless required by applicable law or agreed to in writing, software
14
 
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15
 
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16
 
# License for the specific language governing permissions and limitations
17
 
# under the License.
18
 
import mox
19
 
import sys
20
 
 
21
 
from nova import context
22
 
from nova import db
23
 
from nova import exception
24
 
from nova import flags
25
 
from nova import log as logging
26
 
import nova.policy
27
 
from nova import rpc
28
 
from nova import test
29
 
from nova import utils
30
 
from nova.network import manager as network_manager
31
 
from nova.tests import fake_network
32
 
 
33
 
 
34
 
LOG = logging.getLogger(__name__)
35
 
 
36
 
 
37
 
HOST = "testhost"
38
 
 
39
 
 
40
 
networks = [{'id': 0,
41
 
             'uuid': "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
42
 
             'label': 'test0',
43
 
             'injected': False,
44
 
             'multi_host': False,
45
 
             'cidr': '192.168.0.0/24',
46
 
             'cidr_v6': '2001:db8::/64',
47
 
             'gateway_v6': '2001:db8::1',
48
 
             'netmask_v6': '64',
49
 
             'netmask': '255.255.255.0',
50
 
             'bridge': 'fa0',
51
 
             'bridge_interface': 'fake_fa0',
52
 
             'gateway': '192.168.0.1',
53
 
             'broadcast': '192.168.0.255',
54
 
             'dns1': '192.168.0.1',
55
 
             'dns2': '192.168.0.2',
56
 
             'vlan': None,
57
 
             'host': HOST,
58
 
             'project_id': 'fake_project',
59
 
             'vpn_public_address': '192.168.0.2'},
60
 
            {'id': 1,
61
 
             'uuid': "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
62
 
             'label': 'test1',
63
 
             'injected': False,
64
 
             'multi_host': False,
65
 
             'cidr': '192.168.1.0/24',
66
 
             'cidr_v6': '2001:db9::/64',
67
 
             'gateway_v6': '2001:db9::1',
68
 
             'netmask_v6': '64',
69
 
             'netmask': '255.255.255.0',
70
 
             'bridge': 'fa1',
71
 
             'bridge_interface': 'fake_fa1',
72
 
             'gateway': '192.168.1.1',
73
 
             'broadcast': '192.168.1.255',
74
 
             'dns1': '192.168.0.1',
75
 
             'dns2': '192.168.0.2',
76
 
             'vlan': None,
77
 
             'host': HOST,
78
 
             'project_id': 'fake_project',
79
 
             'vpn_public_address': '192.168.1.2'}]
80
 
 
81
 
fixed_ips = [{'id': 0,
82
 
              'network_id': 0,
83
 
              'address': '192.168.0.100',
84
 
              'instance_id': 0,
85
 
              'allocated': False,
86
 
              'virtual_interface_id': 0,
87
 
              'floating_ips': []},
88
 
             {'id': 0,
89
 
              'network_id': 1,
90
 
              'address': '192.168.1.100',
91
 
              'instance_id': 0,
92
 
              'allocated': False,
93
 
              'virtual_interface_id': 0,
94
 
              'floating_ips': []}]
95
 
 
96
 
 
97
 
flavor = {'id': 0,
98
 
          'rxtx_cap': 3}
99
 
 
100
 
 
101
 
floating_ip_fields = {'id': 0,
102
 
                      'address': '192.168.10.100',
103
 
                      'pool': 'nova',
104
 
                      'interface': 'eth0',
105
 
                      'fixed_ip_id': 0,
106
 
                      'project_id': None,
107
 
                      'auto_assigned': False}
108
 
 
109
 
vifs = [{'id': 0,
110
 
         'address': 'DE:AD:BE:EF:00:00',
111
 
         'uuid': '00000000-0000-0000-0000-0000000000000000',
112
 
         'network_id': 0,
113
 
         'instance_id': 0},
114
 
        {'id': 1,
115
 
         'address': 'DE:AD:BE:EF:00:01',
116
 
         'uuid': '00000000-0000-0000-0000-0000000000000001',
117
 
         'network_id': 1,
118
 
         'instance_id': 0},
119
 
        {'id': 2,
120
 
         'address': 'DE:AD:BE:EF:00:02',
121
 
         'uuid': '00000000-0000-0000-0000-0000000000000002',
122
 
         'network_id': 2,
123
 
         'instance_id': 0}]
124
 
 
125
 
 
126
 
class FlatNetworkTestCase(test.TestCase):
127
 
    def setUp(self):
128
 
        super(FlatNetworkTestCase, self).setUp()
129
 
        self.network = network_manager.FlatManager(host=HOST)
130
 
        temp = utils.import_object('nova.network.minidns.MiniDNS')
131
 
        self.network.instance_dns_manager = temp
132
 
        self.network.instance_dns_domain = ''
133
 
        self.network.db = db
134
 
        self.context = context.RequestContext('testuser', 'testproject',
135
 
                                              is_admin=False)
136
 
 
137
 
    def tearDown(self):
138
 
        super(FlatNetworkTestCase, self).tearDown()
139
 
        self.network.instance_dns_manager.delete_dns_file()
140
 
 
141
 
    def test_get_instance_nw_info(self):
142
 
        fake_get_instance_nw_info = fake_network.fake_get_instance_nw_info
143
 
 
144
 
        nw_info = fake_get_instance_nw_info(self.stubs, 0, 2)
145
 
        self.assertFalse(nw_info)
146
 
 
147
 
        nw_info = fake_get_instance_nw_info(self.stubs, 1, 2)
148
 
 
149
 
        for i, (nw, info) in enumerate(nw_info):
150
 
            nid = i + 1
151
 
            check = {'bridge': 'fake_br%d' % nid,
152
 
                     'cidr': '192.168.%s.0/24' % nid,
153
 
                     'cidr_v6': '2001:db8:0:%x::/64' % nid,
154
 
                     'id': '00000000-0000-0000-0000-00000000000000%02d' % nid,
155
 
                     'multi_host': False,
156
 
                     'injected': False,
157
 
                     'bridge_interface': None,
158
 
                     'vlan': None}
159
 
 
160
 
            self.assertDictMatch(nw, check)
161
 
 
162
 
            check = {'broadcast': '192.168.%d.255' % nid,
163
 
                     'dhcp_server': '192.168.%d.1' % nid,
164
 
                     'dns': ['192.168.%d.3' % nid, '192.168.%d.4' % nid],
165
 
                     'gateway': '192.168.%d.1' % nid,
166
 
                     'gateway_v6': 'fe80::def',
167
 
                     'ip6s': 'DONTCARE',
168
 
                     'ips': 'DONTCARE',
169
 
                     'label': 'test%d' % nid,
170
 
                     'mac': 'DE:AD:BE:EF:00:%02x' % nid,
171
 
                     'rxtx_cap': 0,
172
 
                     'vif_uuid':
173
 
                        '00000000-0000-0000-0000-00000000000000%02d' % nid,
174
 
                     'should_create_vlan': False,
175
 
                     'should_create_bridge': False}
176
 
            self.assertDictMatch(info, check)
177
 
 
178
 
            check = [{'enabled': 'DONTCARE',
179
 
                      'ip': '2001:db8:0:1::%x' % nid,
180
 
                      'netmask': 64,
181
 
                      'gateway': 'fe80::def'}]
182
 
            self.assertDictListMatch(info['ip6s'], check)
183
 
 
184
 
            num_fixed_ips = len(info['ips'])
185
 
            check = [{'enabled': 'DONTCARE',
186
 
                      'ip': '192.168.%d.%03d' % (nid, ip_num + 99),
187
 
                      'netmask': '255.255.255.0',
188
 
                      'gateway': '192.168.%d.1' % nid}
189
 
                      for ip_num in xrange(1, num_fixed_ips + 1)]
190
 
            self.assertDictListMatch(info['ips'], check)
191
 
 
192
 
    def test_validate_networks(self):
193
 
        self.mox.StubOutWithMock(db, 'network_get')
194
 
        self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
195
 
        self.mox.StubOutWithMock(db, "fixed_ip_get_by_address")
196
 
 
197
 
        requested_networks = [("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
198
 
                               "192.168.1.100")]
199
 
        db.network_get_all_by_uuids(mox.IgnoreArg(),
200
 
                                mox.IgnoreArg()).AndReturn(networks)
201
 
        db.network_get(mox.IgnoreArg(),
202
 
                       mox.IgnoreArg()).AndReturn(networks[1])
203
 
 
204
 
        ip = fixed_ips[1].copy()
205
 
        ip['instance_id'] = None
206
 
        db.fixed_ip_get_by_address(mox.IgnoreArg(),
207
 
                                    mox.IgnoreArg()).AndReturn(ip)
208
 
 
209
 
        self.mox.ReplayAll()
210
 
        self.network.validate_networks(self.context, requested_networks)
211
 
 
212
 
    def test_validate_reserved(self):
213
 
        context_admin = context.RequestContext('testuser', 'testproject',
214
 
                                              is_admin=True)
215
 
        nets = self.network.create_networks(context_admin, 'fake',
216
 
                                       '192.168.0.0/24', False, 1,
217
 
                                       256, None, None, None, None, None)
218
 
        self.assertEqual(1, len(nets))
219
 
        network = nets[0]
220
 
        self.assertEqual(3, db.network_count_reserved_ips(context_admin,
221
 
                        network['id']))
222
 
 
223
 
    def test_validate_networks_none_requested_networks(self):
224
 
        self.network.validate_networks(self.context, None)
225
 
 
226
 
    def test_validate_networks_empty_requested_networks(self):
227
 
        requested_networks = []
228
 
        self.mox.ReplayAll()
229
 
 
230
 
        self.network.validate_networks(self.context, requested_networks)
231
 
 
232
 
    def test_validate_networks_invalid_fixed_ip(self):
233
 
        self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
234
 
        requested_networks = [(1, "192.168.0.100.1")]
235
 
        db.network_get_all_by_uuids(mox.IgnoreArg(),
236
 
                                mox.IgnoreArg()).AndReturn(networks)
237
 
        self.mox.ReplayAll()
238
 
 
239
 
        self.assertRaises(exception.FixedIpInvalid,
240
 
                          self.network.validate_networks, self.context,
241
 
                          requested_networks)
242
 
 
243
 
    def test_validate_networks_empty_fixed_ip(self):
244
 
        self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
245
 
 
246
 
        requested_networks = [(1, "")]
247
 
        db.network_get_all_by_uuids(mox.IgnoreArg(),
248
 
                                mox.IgnoreArg()).AndReturn(networks)
249
 
        self.mox.ReplayAll()
250
 
 
251
 
        self.assertRaises(exception.FixedIpInvalid,
252
 
                          self.network.validate_networks,
253
 
                          self.context, requested_networks)
254
 
 
255
 
    def test_validate_networks_none_fixed_ip(self):
256
 
        self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
257
 
 
258
 
        requested_networks = [(1, None)]
259
 
        db.network_get_all_by_uuids(mox.IgnoreArg(),
260
 
                                    mox.IgnoreArg()).AndReturn(networks)
261
 
        self.mox.ReplayAll()
262
 
 
263
 
        self.network.validate_networks(self.context, requested_networks)
264
 
 
265
 
    def test_add_fixed_ip_instance_without_vpn_requested_networks(self):
266
 
        self.mox.StubOutWithMock(db, 'network_get')
267
 
        self.mox.StubOutWithMock(db, 'network_update')
268
 
        self.mox.StubOutWithMock(db, 'fixed_ip_associate_pool')
269
 
        self.mox.StubOutWithMock(db, 'instance_get')
270
 
        self.mox.StubOutWithMock(db,
271
 
                              'virtual_interface_get_by_instance_and_network')
272
 
        self.mox.StubOutWithMock(db, 'fixed_ip_update')
273
 
 
274
 
        db.fixed_ip_update(mox.IgnoreArg(),
275
 
                           mox.IgnoreArg(),
276
 
                           mox.IgnoreArg())
277
 
        db.virtual_interface_get_by_instance_and_network(mox.IgnoreArg(),
278
 
                mox.IgnoreArg(), mox.IgnoreArg()).AndReturn({'id': 0})
279
 
 
280
 
        db.instance_get(mox.IgnoreArg(),
281
 
                        mox.IgnoreArg()).AndReturn({'security_groups':
282
 
                                                             [{'id': 0}]})
283
 
        db.instance_get(self.context,
284
 
                        1).AndReturn({'display_name': HOST,
285
 
                                      'uuid': 'test-00001'})
286
 
        db.instance_get(mox.IgnoreArg(),
287
 
                        mox.IgnoreArg()).AndReturn({'availability_zone': ''})
288
 
        db.fixed_ip_associate_pool(mox.IgnoreArg(),
289
 
                                   mox.IgnoreArg(),
290
 
                                   mox.IgnoreArg()).AndReturn('192.168.0.101')
291
 
        db.network_get(mox.IgnoreArg(),
292
 
                       mox.IgnoreArg()).AndReturn(networks[0])
293
 
        db.network_update(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg())
294
 
        self.mox.ReplayAll()
295
 
        self.network.add_fixed_ip_to_instance(self.context, 1, HOST,
296
 
                                              networks[0]['id'])
297
 
 
298
 
    def test_mini_dns_driver(self):
299
 
        zone1 = "example.org"
300
 
        zone2 = "example.com"
301
 
        driver = self.network.instance_dns_manager
302
 
        driver.create_entry("hostone", "10.0.0.1", "A", zone1)
303
 
        driver.create_entry("hosttwo", "10.0.0.2", "A", zone1)
304
 
        driver.create_entry("hostthree", "10.0.0.3", "A", zone1)
305
 
        driver.create_entry("hostfour", "10.0.0.4", "A", zone1)
306
 
        driver.create_entry("hostfive", "10.0.0.5", "A", zone2)
307
 
 
308
 
        driver.delete_entry("hostone", zone1)
309
 
        driver.modify_address("hostfour", "10.0.0.1", zone1)
310
 
        driver.modify_address("hostthree", "10.0.0.1", zone1)
311
 
        names = driver.get_entries_by_address("10.0.0.1", zone1)
312
 
        self.assertEqual(len(names), 2)
313
 
        self.assertIn('hostthree', names)
314
 
        self.assertIn('hostfour', names)
315
 
 
316
 
        names = driver.get_entries_by_address("10.0.0.5", zone2)
317
 
        self.assertEqual(len(names), 1)
318
 
        self.assertIn('hostfive', names)
319
 
 
320
 
        addresses = driver.get_entries_by_name("hosttwo", zone1)
321
 
        self.assertEqual(len(addresses), 1)
322
 
        self.assertIn('10.0.0.2', addresses)
323
 
 
324
 
        self.assertRaises(exception.InvalidInput,
325
 
                driver.create_entry,
326
 
                "hostname",
327
 
                "10.10.10.10",
328
 
                "invalidtype",
329
 
                zone1)
330
 
 
331
 
    def test_instance_dns(self):
332
 
        fixedip = '192.168.0.101'
333
 
        self.mox.StubOutWithMock(db, 'network_get')
334
 
        self.mox.StubOutWithMock(db, 'network_update')
335
 
        self.mox.StubOutWithMock(db, 'fixed_ip_associate_pool')
336
 
        self.mox.StubOutWithMock(db, 'instance_get')
337
 
        self.mox.StubOutWithMock(db,
338
 
                              'virtual_interface_get_by_instance_and_network')
339
 
        self.mox.StubOutWithMock(db, 'fixed_ip_update')
340
 
 
341
 
        db.fixed_ip_update(mox.IgnoreArg(),
342
 
                           mox.IgnoreArg(),
343
 
                           mox.IgnoreArg())
344
 
        db.virtual_interface_get_by_instance_and_network(mox.IgnoreArg(),
345
 
                mox.IgnoreArg(), mox.IgnoreArg()).AndReturn({'id': 0})
346
 
 
347
 
        db.instance_get(mox.IgnoreArg(),
348
 
                        mox.IgnoreArg()).AndReturn({'security_groups':
349
 
                                                             [{'id': 0}]})
350
 
 
351
 
        db.instance_get(self.context,
352
 
                        1).AndReturn({'display_name': HOST,
353
 
                                      'uuid': 'test-00001'})
354
 
        db.instance_get(mox.IgnoreArg(),
355
 
                        mox.IgnoreArg()).AndReturn({'availability_zone': ''})
356
 
        db.fixed_ip_associate_pool(mox.IgnoreArg(),
357
 
                                   mox.IgnoreArg(),
358
 
                                   mox.IgnoreArg()).AndReturn(fixedip)
359
 
        db.network_get(mox.IgnoreArg(),
360
 
                       mox.IgnoreArg()).AndReturn(networks[0])
361
 
        db.network_update(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg())
362
 
 
363
 
        self.mox.ReplayAll()
364
 
        self.network.add_fixed_ip_to_instance(self.context, 1, HOST,
365
 
                                              networks[0]['id'])
366
 
        instance_manager = self.network.instance_dns_manager
367
 
        addresses = instance_manager.get_entries_by_name(HOST,
368
 
                                             self.network.instance_dns_domain)
369
 
        self.assertEqual(len(addresses), 1)
370
 
        self.assertEqual(addresses[0], fixedip)
371
 
        addresses = instance_manager.get_entries_by_name('test-00001',
372
 
                                              self.network.instance_dns_domain)
373
 
        self.assertEqual(len(addresses), 1)
374
 
        self.assertEqual(addresses[0], fixedip)
375
 
 
376
 
 
377
 
class VlanNetworkTestCase(test.TestCase):
378
 
    def setUp(self):
379
 
        super(VlanNetworkTestCase, self).setUp()
380
 
        self.network = network_manager.VlanManager(host=HOST)
381
 
        self.network.db = db
382
 
        self.context = context.RequestContext('testuser', 'testproject',
383
 
                                              is_admin=False)
384
 
 
385
 
    def test_vpn_allocate_fixed_ip(self):
386
 
        self.mox.StubOutWithMock(db, 'fixed_ip_associate')
387
 
        self.mox.StubOutWithMock(db, 'fixed_ip_update')
388
 
        self.mox.StubOutWithMock(db,
389
 
                              'virtual_interface_get_by_instance_and_network')
390
 
 
391
 
        db.fixed_ip_associate(mox.IgnoreArg(),
392
 
                              mox.IgnoreArg(),
393
 
                              mox.IgnoreArg(),
394
 
                              mox.IgnoreArg(),
395
 
                              reserved=True).AndReturn('192.168.0.1')
396
 
        db.fixed_ip_update(mox.IgnoreArg(),
397
 
                           mox.IgnoreArg(),
398
 
                           mox.IgnoreArg())
399
 
        db.virtual_interface_get_by_instance_and_network(mox.IgnoreArg(),
400
 
                mox.IgnoreArg(), mox.IgnoreArg()).AndReturn({'id': 0})
401
 
        self.mox.ReplayAll()
402
 
 
403
 
        network = dict(networks[0])
404
 
        network['vpn_private_address'] = '192.168.0.2'
405
 
        self.network.allocate_fixed_ip(None, 0, network, vpn=True)
406
 
 
407
 
    def test_vpn_allocate_fixed_ip_no_network_id(self):
408
 
        network = dict(networks[0])
409
 
        network['vpn_private_address'] = '192.168.0.2'
410
 
        network['id'] = None
411
 
        context_admin = context.RequestContext('testuser', 'testproject',
412
 
                is_admin=True)
413
 
        self.assertRaises(exception.FixedIpNotFoundForNetwork,
414
 
                self.network.allocate_fixed_ip,
415
 
                context_admin,
416
 
                0,
417
 
                network,
418
 
                vpn=True)
419
 
 
420
 
    def test_allocate_fixed_ip(self):
421
 
        self.mox.StubOutWithMock(db, 'fixed_ip_associate_pool')
422
 
        self.mox.StubOutWithMock(db, 'fixed_ip_update')
423
 
        self.mox.StubOutWithMock(db,
424
 
                              'virtual_interface_get_by_instance_and_network')
425
 
        self.mox.StubOutWithMock(db, 'instance_get')
426
 
 
427
 
        db.instance_get(mox.IgnoreArg(),
428
 
                        mox.IgnoreArg()).AndReturn({'security_groups':
429
 
                                                             [{'id': 0}]})
430
 
        db.fixed_ip_associate_pool(mox.IgnoreArg(),
431
 
                                   mox.IgnoreArg(),
432
 
                                   mox.IgnoreArg()).AndReturn('192.168.0.1')
433
 
        db.fixed_ip_update(mox.IgnoreArg(),
434
 
                           mox.IgnoreArg(),
435
 
                           mox.IgnoreArg())
436
 
        db.virtual_interface_get_by_instance_and_network(mox.IgnoreArg(),
437
 
                mox.IgnoreArg(), mox.IgnoreArg()).AndReturn({'id': 0})
438
 
        self.mox.ReplayAll()
439
 
 
440
 
        network = dict(networks[0])
441
 
        network['vpn_private_address'] = '192.168.0.2'
442
 
        self.network.allocate_fixed_ip(self.context, 0, network)
443
 
 
444
 
    def test_create_networks_too_big(self):
445
 
        self.assertRaises(ValueError, self.network.create_networks, None,
446
 
                          num_networks=4094, vlan_start=1)
447
 
 
448
 
    def test_create_networks_too_many(self):
449
 
        self.assertRaises(ValueError, self.network.create_networks, None,
450
 
                          num_networks=100, vlan_start=1,
451
 
                          cidr='192.168.0.1/24', network_size=100)
452
 
 
453
 
    def test_validate_networks(self):
454
 
        def network_get(_context, network_id):
455
 
            return networks[network_id]
456
 
 
457
 
        self.stubs.Set(db, 'network_get', network_get)
458
 
        self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
459
 
        self.mox.StubOutWithMock(db, "fixed_ip_get_by_address")
460
 
 
461
 
        requested_networks = [("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
462
 
                               "192.168.1.100")]
463
 
        db.network_get_all_by_uuids(mox.IgnoreArg(),
464
 
                                mox.IgnoreArg(),
465
 
                                mox.IgnoreArg()).AndReturn(networks)
466
 
 
467
 
        fixed_ips[1]['network_id'] = networks[1]['id']
468
 
        fixed_ips[1]['instance_id'] = None
469
 
        db.fixed_ip_get_by_address(mox.IgnoreArg(),
470
 
                                    mox.IgnoreArg()).AndReturn(fixed_ips[1])
471
 
 
472
 
        self.mox.ReplayAll()
473
 
        self.network.validate_networks(self.context, requested_networks)
474
 
 
475
 
    def test_validate_networks_none_requested_networks(self):
476
 
        self.network.validate_networks(self.context, None)
477
 
 
478
 
    def test_validate_networks_empty_requested_networks(self):
479
 
        requested_networks = []
480
 
        self.mox.ReplayAll()
481
 
 
482
 
        self.network.validate_networks(self.context, requested_networks)
483
 
 
484
 
    def test_validate_networks_invalid_fixed_ip(self):
485
 
        self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
486
 
        requested_networks = [(1, "192.168.0.100.1")]
487
 
        db.network_get_all_by_uuids(mox.IgnoreArg(),
488
 
                                mox.IgnoreArg(),
489
 
                                mox.IgnoreArg()).AndReturn(networks)
490
 
        self.mox.ReplayAll()
491
 
 
492
 
        self.assertRaises(exception.FixedIpInvalid,
493
 
                          self.network.validate_networks, self.context,
494
 
                          requested_networks)
495
 
 
496
 
    def test_validate_networks_empty_fixed_ip(self):
497
 
        self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
498
 
 
499
 
        requested_networks = [(1, "")]
500
 
        db.network_get_all_by_uuids(mox.IgnoreArg(),
501
 
                                mox.IgnoreArg(),
502
 
                                mox.IgnoreArg()).AndReturn(networks)
503
 
        self.mox.ReplayAll()
504
 
 
505
 
        self.assertRaises(exception.FixedIpInvalid,
506
 
                          self.network.validate_networks,
507
 
                          self.context, requested_networks)
508
 
 
509
 
    def test_validate_networks_none_fixed_ip(self):
510
 
        self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
511
 
 
512
 
        requested_networks = [(1, None)]
513
 
        db.network_get_all_by_uuids(mox.IgnoreArg(),
514
 
                                mox.IgnoreArg(),
515
 
                                mox.IgnoreArg()).AndReturn(networks)
516
 
        self.mox.ReplayAll()
517
 
        self.network.validate_networks(self.context, requested_networks)
518
 
 
519
 
    def test_floating_ip_owned_by_project(self):
520
 
        ctxt = context.RequestContext('testuser', 'testproject',
521
 
                                      is_admin=False)
522
 
 
523
 
        # raises because floating_ip project_id is None
524
 
        floating_ip = {'address': '10.0.0.1',
525
 
                       'project_id': None}
526
 
        self.assertRaises(exception.NotAuthorized,
527
 
                          self.network._floating_ip_owned_by_project,
528
 
                          ctxt,
529
 
                          floating_ip)
530
 
 
531
 
        # raises because floating_ip project_id is not equal to ctxt project_id
532
 
        floating_ip = {'address': '10.0.0.1',
533
 
                       'project_id': ctxt.project_id + '1'}
534
 
        self.assertRaises(exception.NotAuthorized,
535
 
                          self.network._floating_ip_owned_by_project,
536
 
                          ctxt,
537
 
                          floating_ip)
538
 
 
539
 
        # does not raise (floating ip is owned by ctxt project)
540
 
        floating_ip = {'address': '10.0.0.1',
541
 
                       'project_id': ctxt.project_id}
542
 
        self.network._floating_ip_owned_by_project(ctxt, floating_ip)
543
 
 
544
 
    def test_allocate_floating_ip(self):
545
 
        ctxt = context.RequestContext('testuser', 'testproject',
546
 
                                      is_admin=False)
547
 
 
548
 
        def fake1(*args, **kwargs):
549
 
            return {'address': '10.0.0.1'}
550
 
 
551
 
        def fake2(*args, **kwargs):
552
 
            return 25
553
 
 
554
 
        def fake3(*args, **kwargs):
555
 
            return 0
556
 
 
557
 
        self.stubs.Set(self.network.db, 'floating_ip_allocate_address', fake1)
558
 
 
559
 
        # this time should raise
560
 
        self.stubs.Set(self.network.db, 'floating_ip_count_by_project', fake2)
561
 
        self.assertRaises(exception.QuotaError,
562
 
                          self.network.allocate_floating_ip,
563
 
                          ctxt,
564
 
                          ctxt.project_id)
565
 
 
566
 
        # this time should not
567
 
        self.stubs.Set(self.network.db, 'floating_ip_count_by_project', fake3)
568
 
        self.network.allocate_floating_ip(ctxt, ctxt.project_id)
569
 
 
570
 
    def test_deallocate_floating_ip(self):
571
 
        ctxt = context.RequestContext('testuser', 'testproject',
572
 
                                      is_admin=False)
573
 
 
574
 
        def fake1(*args, **kwargs):
575
 
            pass
576
 
 
577
 
        def fake2(*args, **kwargs):
578
 
            return {'address': '10.0.0.1', 'fixed_ip_id': 1}
579
 
 
580
 
        def fake3(*args, **kwargs):
581
 
            return {'address': '10.0.0.1', 'fixed_ip_id': None}
582
 
 
583
 
        self.stubs.Set(self.network.db, 'floating_ip_deallocate', fake1)
584
 
        self.stubs.Set(self.network, '_floating_ip_owned_by_project', fake1)
585
 
 
586
 
        # this time should raise because floating ip is associated to fixed_ip
587
 
        self.stubs.Set(self.network.db, 'floating_ip_get_by_address', fake2)
588
 
        self.assertRaises(exception.FloatingIpAssociated,
589
 
                          self.network.deallocate_floating_ip,
590
 
                          ctxt,
591
 
                          mox.IgnoreArg())
592
 
 
593
 
        # this time should not raise
594
 
        self.stubs.Set(self.network.db, 'floating_ip_get_by_address', fake3)
595
 
        self.network.deallocate_floating_ip(ctxt, ctxt.project_id)
596
 
 
597
 
    def test_associate_floating_ip(self):
598
 
        ctxt = context.RequestContext('testuser', 'testproject',
599
 
                                      is_admin=False)
600
 
 
601
 
        def fake1(*args, **kwargs):
602
 
            pass
603
 
 
604
 
        # floating ip that's already associated
605
 
        def fake2(*args, **kwargs):
606
 
            return {'address': '10.0.0.1',
607
 
                    'pool': 'nova',
608
 
                    'interface': 'eth0',
609
 
                    'fixed_ip_id': 1}
610
 
 
611
 
        # floating ip that isn't associated
612
 
        def fake3(*args, **kwargs):
613
 
            return {'address': '10.0.0.1',
614
 
                    'pool': 'nova',
615
 
                    'interface': 'eth0',
616
 
                    'fixed_ip_id': None}
617
 
 
618
 
        # fixed ip with remote host
619
 
        def fake4(*args, **kwargs):
620
 
            return {'address': '10.0.0.1',
621
 
                    'pool': 'nova',
622
 
                    'interface': 'eth0',
623
 
                    'network_id': 'blah'}
624
 
 
625
 
        def fake4_network(*args, **kwargs):
626
 
            return {'multi_host': False, 'host': 'jibberjabber'}
627
 
 
628
 
        # fixed ip with local host
629
 
        def fake5(*args, **kwargs):
630
 
            return {'address': '10.0.0.1',
631
 
                    'pool': 'nova',
632
 
                    'interface': 'eth0',
633
 
                    'network_id': 'blahblah'}
634
 
 
635
 
        def fake5_network(*args, **kwargs):
636
 
            return {'multi_host': False, 'host': 'testhost'}
637
 
 
638
 
        def fake6(*args, **kwargs):
639
 
            self.local = False
640
 
 
641
 
        def fake7(*args, **kwargs):
642
 
            self.local = True
643
 
 
644
 
        def fake8(*args, **kwargs):
645
 
            raise exception.ProcessExecutionError('',
646
 
                    'Cannot find device "em0"\n')
647
 
 
648
 
        # raises because interface doesn't exist
649
 
        self.stubs.Set(self.network.db,
650
 
                       'floating_ip_fixed_ip_associate',
651
 
                       fake1)
652
 
        self.stubs.Set(self.network.db, 'floating_ip_disassociate', fake1)
653
 
        self.stubs.Set(self.network.driver, 'bind_floating_ip', fake8)
654
 
        self.assertRaises(exception.NoFloatingIpInterface,
655
 
                          self.network._associate_floating_ip,
656
 
                          ctxt,
657
 
                          mox.IgnoreArg(),
658
 
                          mox.IgnoreArg(),
659
 
                          mox.IgnoreArg())
660
 
 
661
 
        self.stubs.Set(self.network, '_floating_ip_owned_by_project', fake1)
662
 
 
663
 
        # raises because floating_ip is already associated to a fixed_ip
664
 
        self.stubs.Set(self.network.db, 'floating_ip_get_by_address', fake2)
665
 
        self.assertRaises(exception.FloatingIpAssociated,
666
 
                          self.network.associate_floating_ip,
667
 
                          ctxt,
668
 
                          mox.IgnoreArg(),
669
 
                          mox.IgnoreArg())
670
 
 
671
 
        self.stubs.Set(self.network.db, 'floating_ip_get_by_address', fake3)
672
 
 
673
 
        # does not raise and makes call remotely
674
 
        self.local = True
675
 
        self.stubs.Set(self.network.db, 'fixed_ip_get_by_address', fake4)
676
 
        self.stubs.Set(self.network.db, 'network_get', fake4_network)
677
 
        self.stubs.Set(rpc, 'cast', fake6)
678
 
        self.network.associate_floating_ip(ctxt, mox.IgnoreArg(),
679
 
                                                 mox.IgnoreArg())
680
 
        self.assertFalse(self.local)
681
 
 
682
 
        # does not raise and makes call locally
683
 
        self.local = False
684
 
        self.stubs.Set(self.network.db, 'fixed_ip_get_by_address', fake5)
685
 
        self.stubs.Set(self.network.db, 'network_get', fake5_network)
686
 
        self.stubs.Set(self.network, '_associate_floating_ip', fake7)
687
 
        self.network.associate_floating_ip(ctxt, mox.IgnoreArg(),
688
 
                                                 mox.IgnoreArg())
689
 
        self.assertTrue(self.local)
690
 
 
691
 
    def test_disassociate_floating_ip(self):
692
 
        ctxt = context.RequestContext('testuser', 'testproject',
693
 
                                      is_admin=False)
694
 
 
695
 
        def fake1(*args, **kwargs):
696
 
            pass
697
 
 
698
 
        # floating ip that isn't associated
699
 
        def fake2(*args, **kwargs):
700
 
            return {'address': '10.0.0.1',
701
 
                    'pool': 'nova',
702
 
                    'interface': 'eth0',
703
 
                    'fixed_ip_id': None}
704
 
 
705
 
        # floating ip that is associated
706
 
        def fake3(*args, **kwargs):
707
 
            return {'address': '10.0.0.1',
708
 
                    'pool': 'nova',
709
 
                    'interface': 'eth0',
710
 
                    'fixed_ip_id': 1}
711
 
 
712
 
        # fixed ip with remote host
713
 
        def fake4(*args, **kwargs):
714
 
            return {'address': '10.0.0.1',
715
 
                    'pool': 'nova',
716
 
                    'interface': 'eth0',
717
 
                    'network_id': 'blah'}
718
 
 
719
 
        def fake4_network(*args, **kwargs):
720
 
            return {'multi_host': False,
721
 
                    'host': 'jibberjabber'}
722
 
 
723
 
        # fixed ip with local host
724
 
        def fake5(*args, **kwargs):
725
 
            return {'address': '10.0.0.1',
726
 
                    'pool': 'nova',
727
 
                    'interface': 'eth0',
728
 
                    'network_id': 'blahblah'}
729
 
 
730
 
        def fake5_network(*args, **kwargs):
731
 
            return {'multi_host': False, 'host': 'testhost'}
732
 
 
733
 
        def fake6(*args, **kwargs):
734
 
            self.local = False
735
 
 
736
 
        def fake7(*args, **kwargs):
737
 
            self.local = True
738
 
 
739
 
        self.stubs.Set(self.network, '_floating_ip_owned_by_project', fake1)
740
 
 
741
 
        # raises because floating_ip is not associated to a fixed_ip
742
 
        self.stubs.Set(self.network.db, 'floating_ip_get_by_address', fake2)
743
 
        self.assertRaises(exception.FloatingIpNotAssociated,
744
 
                          self.network.disassociate_floating_ip,
745
 
                          ctxt,
746
 
                          mox.IgnoreArg())
747
 
 
748
 
        self.stubs.Set(self.network.db, 'floating_ip_get_by_address', fake3)
749
 
 
750
 
        # does not raise and makes call remotely
751
 
        self.local = True
752
 
        self.stubs.Set(self.network.db, 'fixed_ip_get', fake4)
753
 
        self.stubs.Set(self.network.db, 'network_get', fake4_network)
754
 
        self.stubs.Set(rpc, 'cast', fake6)
755
 
        self.network.disassociate_floating_ip(ctxt, mox.IgnoreArg())
756
 
        self.assertFalse(self.local)
757
 
 
758
 
        # does not raise and makes call locally
759
 
        self.local = False
760
 
        self.stubs.Set(self.network.db, 'fixed_ip_get', fake5)
761
 
        self.stubs.Set(self.network.db, 'network_get', fake5_network)
762
 
        self.stubs.Set(self.network, '_disassociate_floating_ip', fake7)
763
 
        self.network.disassociate_floating_ip(ctxt, mox.IgnoreArg())
764
 
        self.assertTrue(self.local)
765
 
 
766
 
    def test_add_fixed_ip_instance_without_vpn_requested_networks(self):
767
 
        self.mox.StubOutWithMock(db, 'network_get')
768
 
        self.mox.StubOutWithMock(db, 'fixed_ip_associate_pool')
769
 
        self.mox.StubOutWithMock(db, 'instance_get')
770
 
        self.mox.StubOutWithMock(db,
771
 
                              'virtual_interface_get_by_instance_and_network')
772
 
        self.mox.StubOutWithMock(db, 'fixed_ip_update')
773
 
 
774
 
        db.fixed_ip_update(mox.IgnoreArg(),
775
 
                           mox.IgnoreArg(),
776
 
                           mox.IgnoreArg())
777
 
        db.virtual_interface_get_by_instance_and_network(mox.IgnoreArg(),
778
 
                mox.IgnoreArg(), mox.IgnoreArg()).AndReturn({'id': 0})
779
 
 
780
 
        db.instance_get(mox.IgnoreArg(),
781
 
                        mox.IgnoreArg()).AndReturn({'security_groups':
782
 
                                                             [{'id': 0}],
783
 
                                                    'availability_zone': ''})
784
 
        db.fixed_ip_associate_pool(mox.IgnoreArg(),
785
 
                                   mox.IgnoreArg(),
786
 
                                   mox.IgnoreArg()).AndReturn('192.168.0.101')
787
 
        db.network_get(mox.IgnoreArg(),
788
 
                       mox.IgnoreArg()).AndReturn(networks[0])
789
 
        self.mox.ReplayAll()
790
 
        self.network.add_fixed_ip_to_instance(self.context, 1, HOST,
791
 
                                              networks[0]['id'])
792
 
 
793
 
    def test_ip_association_and_allocation_of_other_project(self):
794
 
        """Makes sure that we cannot deallocaate or disassociate
795
 
        a public ip of other project"""
796
 
 
797
 
        def network_get(_context, network_id):
798
 
            return networks[network_id]
799
 
 
800
 
        self.stubs.Set(db, 'network_get', network_get)
801
 
 
802
 
        context1 = context.RequestContext('user', 'project1')
803
 
        context2 = context.RequestContext('user', 'project2')
804
 
 
805
 
        address = '1.2.3.4'
806
 
        float_addr = db.floating_ip_create(context1.elevated(),
807
 
                {'address': address,
808
 
                 'project_id': context1.project_id})
809
 
 
810
 
        instance = db.instance_create(context1,
811
 
                {'project_id': 'project1'})
812
 
 
813
 
        fix_addr = db.fixed_ip_associate_pool(context1.elevated(),
814
 
                1, instance['id'])
815
 
 
816
 
        # Associate the IP with non-admin user context
817
 
        self.assertRaises(exception.NotAuthorized,
818
 
                          self.network.associate_floating_ip,
819
 
                          context2,
820
 
                          float_addr,
821
 
                          fix_addr)
822
 
 
823
 
        # Deallocate address from other project
824
 
        self.assertRaises(exception.NotAuthorized,
825
 
                          self.network.deallocate_floating_ip,
826
 
                          context2,
827
 
                          float_addr)
828
 
 
829
 
        # Now Associates the address to the actual project
830
 
        self.network.associate_floating_ip(context1, float_addr, fix_addr)
831
 
 
832
 
        # Now try dis-associating from other project
833
 
        self.assertRaises(exception.NotAuthorized,
834
 
                          self.network.disassociate_floating_ip,
835
 
                          context2,
836
 
                          float_addr)
837
 
 
838
 
        # Clean up the ip addresses
839
 
        self.network.disassociate_floating_ip(context1, float_addr)
840
 
        self.network.deallocate_floating_ip(context1, float_addr)
841
 
        self.network.deallocate_fixed_ip(context1, fix_addr)
842
 
        db.floating_ip_destroy(context1.elevated(), float_addr)
843
 
        db.fixed_ip_disassociate(context1.elevated(), fix_addr)
844
 
 
845
 
 
846
 
class CommonNetworkTestCase(test.TestCase):
847
 
 
848
 
    def setUp(self):
849
 
        super(CommonNetworkTestCase, self).setUp()
850
 
        self.context = context.RequestContext('fake', 'fake')
851
 
 
852
 
    def fake_create_fixed_ips(self, context, network_id, fixed_cidr=None):
853
 
        return None
854
 
 
855
 
    def test_remove_fixed_ip_from_instance(self):
856
 
        manager = fake_network.FakeNetworkManager()
857
 
        manager.remove_fixed_ip_from_instance(self.context, 99, '10.0.0.1')
858
 
 
859
 
        self.assertEquals(manager.deallocate_called, '10.0.0.1')
860
 
 
861
 
    def test_remove_fixed_ip_from_instance_bad_input(self):
862
 
        manager = fake_network.FakeNetworkManager()
863
 
        self.assertRaises(exception.FixedIpNotFoundForSpecificInstance,
864
 
                          manager.remove_fixed_ip_from_instance,
865
 
                          self.context, 99, 'bad input')
866
 
 
867
 
    def test_validate_cidrs(self):
868
 
        manager = fake_network.FakeNetworkManager()
869
 
        nets = manager.create_networks(None, 'fake', '192.168.0.0/24',
870
 
                                       False, 1, 256, None, None, None,
871
 
                                       None, None)
872
 
        self.assertEqual(1, len(nets))
873
 
        cidrs = [str(net['cidr']) for net in nets]
874
 
        self.assertTrue('192.168.0.0/24' in cidrs)
875
 
 
876
 
    def test_validate_cidrs_split_exact_in_half(self):
877
 
        manager = fake_network.FakeNetworkManager()
878
 
        nets = manager.create_networks(None, 'fake', '192.168.0.0/24',
879
 
                                       False, 2, 128, None, None, None,
880
 
                                       None, None)
881
 
        self.assertEqual(2, len(nets))
882
 
        cidrs = [str(net['cidr']) for net in nets]
883
 
        self.assertTrue('192.168.0.0/25' in cidrs)
884
 
        self.assertTrue('192.168.0.128/25' in cidrs)
885
 
 
886
 
    def test_validate_cidrs_split_cidr_in_use_middle_of_range(self):
887
 
        manager = fake_network.FakeNetworkManager()
888
 
        self.mox.StubOutWithMock(manager.db, 'network_get_all')
889
 
        ctxt = mox.IgnoreArg()
890
 
        manager.db.network_get_all(ctxt).AndReturn([{'id': 1,
891
 
                                     'cidr': '192.168.2.0/24'}])
892
 
        self.mox.ReplayAll()
893
 
        nets = manager.create_networks(None, 'fake', '192.168.0.0/16',
894
 
                                       False, 4, 256, None, None, None,
895
 
                                       None, None)
896
 
        self.assertEqual(4, len(nets))
897
 
        cidrs = [str(net['cidr']) for net in nets]
898
 
        exp_cidrs = ['192.168.0.0/24', '192.168.1.0/24', '192.168.3.0/24',
899
 
                     '192.168.4.0/24']
900
 
        for exp_cidr in exp_cidrs:
901
 
            self.assertTrue(exp_cidr in cidrs)
902
 
        self.assertFalse('192.168.2.0/24' in cidrs)
903
 
 
904
 
    def test_validate_cidrs_smaller_subnet_in_use(self):
905
 
        manager = fake_network.FakeNetworkManager()
906
 
        self.mox.StubOutWithMock(manager.db, 'network_get_all')
907
 
        ctxt = mox.IgnoreArg()
908
 
        manager.db.network_get_all(ctxt).AndReturn([{'id': 1,
909
 
                                     'cidr': '192.168.2.9/25'}])
910
 
        self.mox.ReplayAll()
911
 
        # ValueError: requested cidr (192.168.2.0/24) conflicts with
912
 
        #             existing smaller cidr
913
 
        args = (None, 'fake', '192.168.2.0/24', False, 1, 256, None, None,
914
 
                None, None, None)
915
 
        self.assertRaises(ValueError, manager.create_networks, *args)
916
 
 
917
 
    def test_validate_cidrs_split_smaller_cidr_in_use(self):
918
 
        manager = fake_network.FakeNetworkManager()
919
 
        self.mox.StubOutWithMock(manager.db, 'network_get_all')
920
 
        ctxt = mox.IgnoreArg()
921
 
        manager.db.network_get_all(ctxt).AndReturn([{'id': 1,
922
 
                                     'cidr': '192.168.2.0/25'}])
923
 
        self.mox.ReplayAll()
924
 
        nets = manager.create_networks(None, 'fake', '192.168.0.0/16',
925
 
                                       False, 4, 256, None, None, None, None,
926
 
                                       None)
927
 
        self.assertEqual(4, len(nets))
928
 
        cidrs = [str(net['cidr']) for net in nets]
929
 
        exp_cidrs = ['192.168.0.0/24', '192.168.1.0/24', '192.168.3.0/24',
930
 
                     '192.168.4.0/24']
931
 
        for exp_cidr in exp_cidrs:
932
 
            self.assertTrue(exp_cidr in cidrs)
933
 
        self.assertFalse('192.168.2.0/24' in cidrs)
934
 
 
935
 
    def test_validate_cidrs_split_smaller_cidr_in_use2(self):
936
 
        manager = fake_network.FakeNetworkManager()
937
 
        self.mox.StubOutWithMock(manager.db, 'network_get_all')
938
 
        ctxt = mox.IgnoreArg()
939
 
        manager.db.network_get_all(ctxt).AndReturn([{'id': 1,
940
 
                                     'cidr': '192.168.2.9/29'}])
941
 
        self.mox.ReplayAll()
942
 
        nets = manager.create_networks(None, 'fake', '192.168.2.0/24',
943
 
                                       False, 3, 32, None, None, None, None,
944
 
                                       None)
945
 
        self.assertEqual(3, len(nets))
946
 
        cidrs = [str(net['cidr']) for net in nets]
947
 
        exp_cidrs = ['192.168.2.32/27', '192.168.2.64/27', '192.168.2.96/27']
948
 
        for exp_cidr in exp_cidrs:
949
 
            self.assertTrue(exp_cidr in cidrs)
950
 
        self.assertFalse('192.168.2.0/27' in cidrs)
951
 
 
952
 
    def test_validate_cidrs_split_all_in_use(self):
953
 
        manager = fake_network.FakeNetworkManager()
954
 
        self.mox.StubOutWithMock(manager.db, 'network_get_all')
955
 
        ctxt = mox.IgnoreArg()
956
 
        in_use = [{'id': 1, 'cidr': '192.168.2.9/29'},
957
 
                  {'id': 2, 'cidr': '192.168.2.64/26'},
958
 
                  {'id': 3, 'cidr': '192.168.2.128/26'}]
959
 
        manager.db.network_get_all(ctxt).AndReturn(in_use)
960
 
        self.mox.ReplayAll()
961
 
        args = (None, 'fake', '192.168.2.0/24', False, 3, 64, None, None,
962
 
                None, None, None)
963
 
        # ValueError: Not enough subnets avail to satisfy requested num_
964
 
        #             networks - some subnets in requested range already
965
 
        #             in use
966
 
        self.assertRaises(ValueError, manager.create_networks, *args)
967
 
 
968
 
    def test_validate_cidrs_one_in_use(self):
969
 
        manager = fake_network.FakeNetworkManager()
970
 
        args = (None, 'fake', '192.168.0.0/24', False, 2, 256, None, None,
971
 
                None, None, None)
972
 
        # ValueError: network_size * num_networks exceeds cidr size
973
 
        self.assertRaises(ValueError, manager.create_networks, *args)
974
 
 
975
 
    def test_validate_cidrs_already_used(self):
976
 
        manager = fake_network.FakeNetworkManager()
977
 
        self.mox.StubOutWithMock(manager.db, 'network_get_all')
978
 
        ctxt = mox.IgnoreArg()
979
 
        manager.db.network_get_all(ctxt).AndReturn([{'id': 1,
980
 
                                     'cidr': '192.168.0.0/24'}])
981
 
        self.mox.ReplayAll()
982
 
        # ValueError: cidr already in use
983
 
        args = (None, 'fake', '192.168.0.0/24', False, 1, 256, None, None,
984
 
                None, None, None)
985
 
        self.assertRaises(ValueError, manager.create_networks, *args)
986
 
 
987
 
    def test_validate_cidrs_too_many(self):
988
 
        manager = fake_network.FakeNetworkManager()
989
 
        args = (None, 'fake', '192.168.0.0/24', False, 200, 256, None, None,
990
 
                None, None, None)
991
 
        # ValueError: Not enough subnets avail to satisfy requested
992
 
        #             num_networks
993
 
        self.assertRaises(ValueError, manager.create_networks, *args)
994
 
 
995
 
    def test_validate_cidrs_split_partial(self):
996
 
        manager = fake_network.FakeNetworkManager()
997
 
        nets = manager.create_networks(None, 'fake', '192.168.0.0/16',
998
 
                                       False, 2, 256, None, None, None, None,
999
 
                                       None)
1000
 
        returned_cidrs = [str(net['cidr']) for net in nets]
1001
 
        self.assertTrue('192.168.0.0/24' in returned_cidrs)
1002
 
        self.assertTrue('192.168.1.0/24' in returned_cidrs)
1003
 
 
1004
 
    def test_validate_cidrs_conflict_existing_supernet(self):
1005
 
        manager = fake_network.FakeNetworkManager()
1006
 
        self.mox.StubOutWithMock(manager.db, 'network_get_all')
1007
 
        ctxt = mox.IgnoreArg()
1008
 
        fakecidr = [{'id': 1, 'cidr': '192.168.0.0/8'}]
1009
 
        manager.db.network_get_all(ctxt).AndReturn(fakecidr)
1010
 
        self.mox.ReplayAll()
1011
 
        args = (None, 'fake', '192.168.0.0/24', False, 1, 256, None, None,
1012
 
                None, None, None)
1013
 
        # ValueError: requested cidr (192.168.0.0/24) conflicts
1014
 
        #             with existing supernet
1015
 
        self.assertRaises(ValueError, manager.create_networks, *args)
1016
 
 
1017
 
    def test_create_networks(self):
1018
 
        cidr = '192.168.0.0/24'
1019
 
        manager = fake_network.FakeNetworkManager()
1020
 
        self.stubs.Set(manager, '_create_fixed_ips',
1021
 
                                self.fake_create_fixed_ips)
1022
 
        args = [None, 'foo', cidr, None, 1, 256, 'fd00::/48', None, None,
1023
 
                None, None, None]
1024
 
        self.assertTrue(manager.create_networks(*args))
1025
 
 
1026
 
    def test_create_networks_cidr_already_used(self):
1027
 
        manager = fake_network.FakeNetworkManager()
1028
 
        self.mox.StubOutWithMock(manager.db, 'network_get_all')
1029
 
        ctxt = mox.IgnoreArg()
1030
 
        fakecidr = [{'id': 1, 'cidr': '192.168.0.0/24'}]
1031
 
        manager.db.network_get_all(ctxt).AndReturn(fakecidr)
1032
 
        self.mox.ReplayAll()
1033
 
        args = [None, 'foo', '192.168.0.0/24', None, 1, 256,
1034
 
                 'fd00::/48', None, None, None, None, None]
1035
 
        self.assertRaises(ValueError, manager.create_networks, *args)
1036
 
 
1037
 
    def test_create_networks_many(self):
1038
 
        cidr = '192.168.0.0/16'
1039
 
        manager = fake_network.FakeNetworkManager()
1040
 
        self.stubs.Set(manager, '_create_fixed_ips',
1041
 
                                self.fake_create_fixed_ips)
1042
 
        args = [None, 'foo', cidr, None, 10, 256, 'fd00::/48', None, None,
1043
 
                None, None, None]
1044
 
        self.assertTrue(manager.create_networks(*args))
1045
 
 
1046
 
    def test_get_instance_uuids_by_ip_regex(self):
1047
 
        manager = fake_network.FakeNetworkManager()
1048
 
        _vifs = manager.db.virtual_interface_get_all(None)
1049
 
        fake_context = context.RequestContext('user', 'project')
1050
 
 
1051
 
        # Greedy get eveything
1052
 
        res = manager.get_instance_uuids_by_ip_filter(fake_context,
1053
 
                                                      {'ip': '.*'})
1054
 
        self.assertEqual(len(res), len(_vifs))
1055
 
 
1056
 
        # Doesn't exist
1057
 
        res = manager.get_instance_uuids_by_ip_filter(fake_context,
1058
 
                                                      {'ip': '10.0.0.1'})
1059
 
        self.assertFalse(res)
1060
 
 
1061
 
        # Get instance 1
1062
 
        res = manager.get_instance_uuids_by_ip_filter(fake_context,
1063
 
                                                      {'ip': '172.16.0.2'})
1064
 
        self.assertTrue(res)
1065
 
        self.assertEqual(len(res), 1)
1066
 
        self.assertEqual(res[0]['instance_id'], _vifs[1]['instance_id'])
1067
 
 
1068
 
        # Get instance 2
1069
 
        res = manager.get_instance_uuids_by_ip_filter(fake_context,
1070
 
                                                      {'ip': '173.16.0.2'})
1071
 
        self.assertTrue(res)
1072
 
        self.assertEqual(len(res), 1)
1073
 
        self.assertEqual(res[0]['instance_id'], _vifs[2]['instance_id'])
1074
 
 
1075
 
        # Get instance 0 and 1
1076
 
        res = manager.get_instance_uuids_by_ip_filter(fake_context,
1077
 
                                                      {'ip': '172.16.0.*'})
1078
 
        self.assertTrue(res)
1079
 
        self.assertEqual(len(res), 2)
1080
 
        self.assertEqual(res[0]['instance_id'], _vifs[0]['instance_id'])
1081
 
        self.assertEqual(res[1]['instance_id'], _vifs[1]['instance_id'])
1082
 
 
1083
 
        # Get instance 1 and 2
1084
 
        res = manager.get_instance_uuids_by_ip_filter(fake_context,
1085
 
                                                      {'ip': '17..16.0.2'})
1086
 
        self.assertTrue(res)
1087
 
        self.assertEqual(len(res), 2)
1088
 
        self.assertEqual(res[0]['instance_id'], _vifs[1]['instance_id'])
1089
 
        self.assertEqual(res[1]['instance_id'], _vifs[2]['instance_id'])
1090
 
 
1091
 
    def test_get_instance_uuids_by_ipv6_regex(self):
1092
 
        manager = fake_network.FakeNetworkManager()
1093
 
        _vifs = manager.db.virtual_interface_get_all(None)
1094
 
        fake_context = context.RequestContext('user', 'project')
1095
 
 
1096
 
        # Greedy get eveything
1097
 
        res = manager.get_instance_uuids_by_ip_filter(fake_context,
1098
 
                                                      {'ip6': '.*'})
1099
 
        self.assertEqual(len(res), len(_vifs))
1100
 
 
1101
 
        # Doesn't exist
1102
 
        res = manager.get_instance_uuids_by_ip_filter(fake_context,
1103
 
                                                      {'ip6': '.*1034.*'})
1104
 
        self.assertFalse(res)
1105
 
 
1106
 
        # Get instance 1
1107
 
        res = manager.get_instance_uuids_by_ip_filter(fake_context,
1108
 
                                                      {'ip6': '2001:.*2'})
1109
 
        self.assertTrue(res)
1110
 
        self.assertEqual(len(res), 1)
1111
 
        self.assertEqual(res[0]['instance_id'], _vifs[1]['instance_id'])
1112
 
 
1113
 
        # Get instance 2
1114
 
        ip6 = '2001:db8:69:1f:dead:beff:feff:ef03'
1115
 
        res = manager.get_instance_uuids_by_ip_filter(fake_context,
1116
 
                                                      {'ip6': ip6})
1117
 
        self.assertTrue(res)
1118
 
        self.assertEqual(len(res), 1)
1119
 
        self.assertEqual(res[0]['instance_id'], _vifs[2]['instance_id'])
1120
 
 
1121
 
        # Get instance 0 and 1
1122
 
        res = manager.get_instance_uuids_by_ip_filter(fake_context,
1123
 
                                                      {'ip6': '.*ef0[1,2]'})
1124
 
        self.assertTrue(res)
1125
 
        self.assertEqual(len(res), 2)
1126
 
        self.assertEqual(res[0]['instance_id'], _vifs[0]['instance_id'])
1127
 
        self.assertEqual(res[1]['instance_id'], _vifs[1]['instance_id'])
1128
 
 
1129
 
        # Get instance 1 and 2
1130
 
        ip6 = '2001:db8:69:1.:dead:beff:feff:ef0.'
1131
 
        res = manager.get_instance_uuids_by_ip_filter(fake_context,
1132
 
                                                      {'ip6': ip6})
1133
 
        self.assertTrue(res)
1134
 
        self.assertEqual(len(res), 2)
1135
 
        self.assertEqual(res[0]['instance_id'], _vifs[1]['instance_id'])
1136
 
        self.assertEqual(res[1]['instance_id'], _vifs[2]['instance_id'])
1137
 
 
1138
 
    def test_get_instance_uuids_by_ip(self):
1139
 
        manager = fake_network.FakeNetworkManager()
1140
 
        _vifs = manager.db.virtual_interface_get_all(None)
1141
 
        fake_context = context.RequestContext('user', 'project')
1142
 
 
1143
 
        # No regex for you!
1144
 
        res = manager.get_instance_uuids_by_ip_filter(fake_context,
1145
 
                                                      {'fixed_ip': '.*'})
1146
 
        self.assertFalse(res)
1147
 
 
1148
 
        # Doesn't exist
1149
 
        ip = '10.0.0.1'
1150
 
        res = manager.get_instance_uuids_by_ip_filter(fake_context,
1151
 
                                                      {'fixed_ip': ip})
1152
 
        self.assertFalse(res)
1153
 
 
1154
 
        # Get instance 1
1155
 
        ip = '172.16.0.2'
1156
 
        res = manager.get_instance_uuids_by_ip_filter(fake_context,
1157
 
                                                      {'fixed_ip': ip})
1158
 
        self.assertTrue(res)
1159
 
        self.assertEqual(len(res), 1)
1160
 
        self.assertEqual(res[0]['instance_id'], _vifs[1]['instance_id'])
1161
 
 
1162
 
        # Get instance 2
1163
 
        ip = '173.16.0.2'
1164
 
        res = manager.get_instance_uuids_by_ip_filter(fake_context,
1165
 
                                                      {'fixed_ip': ip})
1166
 
        self.assertTrue(res)
1167
 
        self.assertEqual(len(res), 1)
1168
 
        self.assertEqual(res[0]['instance_id'], _vifs[2]['instance_id'])
1169
 
 
1170
 
    def test_get_network(self):
1171
 
        manager = fake_network.FakeNetworkManager()
1172
 
        fake_context = context.RequestContext('user', 'project')
1173
 
        self.mox.StubOutWithMock(manager.db, 'network_get_all_by_uuids')
1174
 
        manager.db.network_get_all_by_uuids(
1175
 
                mox.IgnoreArg(),
1176
 
                mox.IgnoreArg()).AndReturn(networks)
1177
 
        self.mox.ReplayAll()
1178
 
        uuid = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'
1179
 
        network = manager.get_network(fake_context, uuid)
1180
 
        self.assertEqual(network['uuid'], uuid)
1181
 
 
1182
 
    def test_get_network_not_found(self):
1183
 
        manager = fake_network.FakeNetworkManager()
1184
 
        fake_context = context.RequestContext('user', 'project')
1185
 
        self.mox.StubOutWithMock(manager.db, 'network_get_all_by_uuids')
1186
 
        manager.db.network_get_all_by_uuids(mox.IgnoreArg(),
1187
 
                                            mox.IgnoreArg()).AndReturn([])
1188
 
        self.mox.ReplayAll()
1189
 
        uuid = 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee'
1190
 
        self.assertRaises(exception.NetworkNotFound,
1191
 
                          manager.get_network, fake_context, uuid)
1192
 
 
1193
 
    def test_get_all_networks(self):
1194
 
        manager = fake_network.FakeNetworkManager()
1195
 
        fake_context = context.RequestContext('user', 'project')
1196
 
        self.mox.StubOutWithMock(manager.db, 'network_get_all')
1197
 
        manager.db.network_get_all(mox.IgnoreArg()).AndReturn(networks)
1198
 
        self.mox.ReplayAll()
1199
 
        output = manager.get_all_networks(fake_context)
1200
 
        self.assertEqual(len(networks), 2)
1201
 
        self.assertEqual(output[0]['uuid'],
1202
 
                         'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa')
1203
 
        self.assertEqual(output[1]['uuid'],
1204
 
                         'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb')
1205
 
 
1206
 
    def test_disassociate_network(self):
1207
 
        manager = fake_network.FakeNetworkManager()
1208
 
        fake_context = context.RequestContext('user', 'project')
1209
 
        self.mox.StubOutWithMock(manager.db, 'network_get_all_by_uuids')
1210
 
        manager.db.network_get_all_by_uuids(
1211
 
                mox.IgnoreArg(),
1212
 
                mox.IgnoreArg()).AndReturn(networks)
1213
 
        self.mox.ReplayAll()
1214
 
        uuid = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'
1215
 
        manager.disassociate_network(fake_context, uuid)
1216
 
 
1217
 
    def test_disassociate_network_not_found(self):
1218
 
        manager = fake_network.FakeNetworkManager()
1219
 
        fake_context = context.RequestContext('user', 'project')
1220
 
        self.mox.StubOutWithMock(manager.db, 'network_get_all_by_uuids')
1221
 
        manager.db.network_get_all_by_uuids(mox.IgnoreArg(),
1222
 
                                            mox.IgnoreArg()).AndReturn([])
1223
 
        self.mox.ReplayAll()
1224
 
        uuid = 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee'
1225
 
        self.assertRaises(exception.NetworkNotFound,
1226
 
                          manager.disassociate_network, fake_context, uuid)
1227
 
 
1228
 
 
1229
 
class TestRPCFixedManager(network_manager.RPCAllocateFixedIP,
1230
 
        network_manager.NetworkManager):
1231
 
    """Dummy manager that implements RPCAllocateFixedIP"""
1232
 
 
1233
 
 
1234
 
class RPCAllocateTestCase(test.TestCase):
1235
 
    """Tests nova.network.manager.RPCAllocateFixedIP"""
1236
 
    def setUp(self):
1237
 
        super(RPCAllocateTestCase, self).setUp()
1238
 
        self.rpc_fixed = TestRPCFixedManager()
1239
 
        self.context = context.RequestContext('fake', 'fake')
1240
 
 
1241
 
    def test_rpc_allocate(self):
1242
 
        """Test to verify bug 855030 doesn't resurface.
1243
 
 
1244
 
        Mekes sure _rpc_allocate_fixed_ip returns a value so the call
1245
 
        returns properly and the greenpool completes."""
1246
 
        address = '10.10.10.10'
1247
 
 
1248
 
        def fake_allocate(*args, **kwargs):
1249
 
            return address
1250
 
 
1251
 
        def fake_network_get(*args, **kwargs):
1252
 
            return {}
1253
 
 
1254
 
        self.stubs.Set(self.rpc_fixed, 'allocate_fixed_ip', fake_allocate)
1255
 
        self.stubs.Set(self.rpc_fixed.db, 'network_get', fake_network_get)
1256
 
        rval = self.rpc_fixed._rpc_allocate_fixed_ip(self.context,
1257
 
                                                     'fake_instance',
1258
 
                                                     'fake_network')
1259
 
        self.assertEqual(rval, address)
1260
 
 
1261
 
 
1262
 
class TestFloatingIPManager(network_manager.FloatingIP,
1263
 
        network_manager.NetworkManager):
1264
 
    """Dummy manager that implements FloatingIP"""
1265
 
 
1266
 
 
1267
 
class FloatingIPTestCase(test.TestCase):
1268
 
    """Tests nova.network.manager.FloatingIP"""
1269
 
    def setUp(self):
1270
 
        super(FloatingIPTestCase, self).setUp()
1271
 
        self.network = TestFloatingIPManager()
1272
 
        temp = utils.import_object('nova.network.minidns.MiniDNS')
1273
 
        self.network.floating_dns_manager = temp
1274
 
        self.network.db = db
1275
 
        self.project_id = 'testproject'
1276
 
        self.context = context.RequestContext('testuser', self.project_id,
1277
 
            is_admin=False)
1278
 
 
1279
 
    def tearDown(self):
1280
 
        super(FloatingIPTestCase, self).tearDown()
1281
 
        self.network.floating_dns_manager.delete_dns_file()
1282
 
 
1283
 
    def test_double_deallocation(self):
1284
 
        instance_ref = db.api.instance_create(self.context,
1285
 
                {"project_id": self.project_id})
1286
 
        # Run it twice to make it fault if it does not handle
1287
 
        # instances without fixed networks
1288
 
        # If this fails in either, it does not handle having no addresses
1289
 
        self.network.deallocate_for_instance(self.context,
1290
 
                instance_id=instance_ref['id'])
1291
 
        self.network.deallocate_for_instance(self.context,
1292
 
                instance_id=instance_ref['id'])
1293
 
 
1294
 
    def test_deallocation_deleted_instance(self):
1295
 
        instance_ref = db.api.instance_create(self.context,
1296
 
                {"project_id": self.project_id, "deleted": True})
1297
 
        self.network.deallocate_for_instance(self.context,
1298
 
                instance_id=instance_ref['id'])
1299
 
 
1300
 
    def test_floating_dns_create_conflict(self):
1301
 
        zone = "example.org"
1302
 
        address1 = "10.10.10.11"
1303
 
        name1 = "foo"
1304
 
        name2 = "bar"
1305
 
 
1306
 
        self.network.add_dns_entry(self.context, address1, name1, "A", zone)
1307
 
 
1308
 
        self.assertRaises(exception.FloatingIpDNSExists,
1309
 
                          self.network.add_dns_entry, self.context,
1310
 
                          address1, name1, "A", zone)
1311
 
 
1312
 
    def test_floating_create_and_get(self):
1313
 
        zone = "example.org"
1314
 
        address1 = "10.10.10.11"
1315
 
        name1 = "foo"
1316
 
        name2 = "bar"
1317
 
        entries = self.network.get_dns_entries_by_address(self.context,
1318
 
                                                          address1, zone)
1319
 
        self.assertFalse(entries)
1320
 
 
1321
 
        self.network.add_dns_entry(self.context, address1, name1, "A", zone)
1322
 
        self.network.add_dns_entry(self.context, address1, name2, "A", zone)
1323
 
        entries = self.network.get_dns_entries_by_address(self.context,
1324
 
                                                          address1, zone)
1325
 
        self.assertEquals(len(entries), 2)
1326
 
        self.assertEquals(entries[0], name1)
1327
 
        self.assertEquals(entries[1], name2)
1328
 
 
1329
 
        entries = self.network.get_dns_entries_by_name(self.context,
1330
 
                                                       name1, zone)
1331
 
        self.assertEquals(len(entries), 1)
1332
 
        self.assertEquals(entries[0], address1)
1333
 
 
1334
 
    def test_floating_dns_delete(self):
1335
 
        zone = "example.org"
1336
 
        address1 = "10.10.10.11"
1337
 
        name1 = "foo"
1338
 
        name2 = "bar"
1339
 
 
1340
 
        self.network.add_dns_entry(self.context, address1, name1, "A", zone)
1341
 
        self.network.add_dns_entry(self.context, address1, name2, "A", zone)
1342
 
        self.network.delete_dns_entry(self.context, name1, zone)
1343
 
 
1344
 
        entries = self.network.get_dns_entries_by_address(self.context,
1345
 
                                                          address1, zone)
1346
 
        self.assertEquals(len(entries), 1)
1347
 
        self.assertEquals(entries[0], name2)
1348
 
 
1349
 
        self.assertRaises(exception.NotFound,
1350
 
                          self.network.delete_dns_entry, self.context,
1351
 
                          name1, zone)
1352
 
 
1353
 
    def test_floating_dns_domains_public(self):
1354
 
        zone1 = "testzone"
1355
 
        domain1 = "example.org"
1356
 
        domain2 = "example.com"
1357
 
        address1 = '10.10.10.10'
1358
 
        entryname = 'testentry'
1359
 
 
1360
 
        context_admin = context.RequestContext('testuser', 'testproject',
1361
 
                                               is_admin=True)
1362
 
 
1363
 
        self.assertRaises(exception.AdminRequired,
1364
 
                          self.network.create_public_dns_domain, self.context,
1365
 
                          domain1, zone1)
1366
 
        self.network.create_public_dns_domain(context_admin, domain1,
1367
 
                                              'testproject')
1368
 
        self.network.create_public_dns_domain(context_admin, domain2,
1369
 
                                              'fakeproject')
1370
 
 
1371
 
        domains = self.network.get_dns_domains(self.context)
1372
 
        self.assertEquals(len(domains), 2)
1373
 
        self.assertEquals(domains[0]['domain'], domain1)
1374
 
        self.assertEquals(domains[1]['domain'], domain2)
1375
 
        self.assertEquals(domains[0]['project'], 'testproject')
1376
 
        self.assertEquals(domains[1]['project'], 'fakeproject')
1377
 
 
1378
 
        self.network.add_dns_entry(self.context, address1, entryname,
1379
 
                                   'A', domain1)
1380
 
        entries = self.network.get_dns_entries_by_name(self.context,
1381
 
                                                       entryname, domain1)
1382
 
        self.assertEquals(len(entries), 1)
1383
 
        self.assertEquals(entries[0], address1)
1384
 
 
1385
 
        self.assertRaises(exception.AdminRequired,
1386
 
                          self.network.delete_dns_domain, self.context,
1387
 
                          domain1)
1388
 
        self.network.delete_dns_domain(context_admin, domain1)
1389
 
        self.network.delete_dns_domain(context_admin, domain2)
1390
 
 
1391
 
        # Verify that deleting the domain deleted the associated entry
1392
 
        entries = self.network.get_dns_entries_by_name(self.context,
1393
 
                                                       entryname, domain1)
1394
 
        self.assertFalse(entries)
1395
 
 
1396
 
    def test_delete_all_by_ip(self):
1397
 
        domain1 = "example.org"
1398
 
        domain2 = "example.com"
1399
 
        address = "10.10.10.10"
1400
 
        name1 = "foo"
1401
 
        name2 = "bar"
1402
 
 
1403
 
        def fake_domains(context):
1404
 
            return [{'domain': 'example.org', 'scope': 'public'},
1405
 
                    {'domain': 'example.com', 'scope': 'public'},
1406
 
                    {'domain': 'test.example.org', 'scope': 'public'}]
1407
 
 
1408
 
        self.stubs.Set(self.network, 'get_dns_domains', fake_domains)
1409
 
 
1410
 
        context_admin = context.RequestContext('testuser', 'testproject',
1411
 
                                              is_admin=True)
1412
 
 
1413
 
        self.network.create_public_dns_domain(context_admin, domain1,
1414
 
                                              'testproject')
1415
 
        self.network.create_public_dns_domain(context_admin, domain2,
1416
 
                                              'fakeproject')
1417
 
 
1418
 
        domains = self.network.get_dns_domains(self.context)
1419
 
        for domain in domains:
1420
 
            self.network.add_dns_entry(self.context, address,
1421
 
                                       name1, "A", domain['domain'])
1422
 
            self.network.add_dns_entry(self.context, address,
1423
 
                                       name2, "A", domain['domain'])
1424
 
            entries = self.network.get_dns_entries_by_address(self.context,
1425
 
                                                              address,
1426
 
                                                              domain['domain'])
1427
 
            self.assertEquals(len(entries), 2)
1428
 
 
1429
 
        self.network._delete_all_entries_for_ip(self.context, address)
1430
 
 
1431
 
        for domain in domains:
1432
 
            entries = self.network.get_dns_entries_by_address(self.context,
1433
 
                                                              address,
1434
 
                                                              domain['domain'])
1435
 
            self.assertFalse(entries)
1436
 
 
1437
 
        self.network.delete_dns_domain(context_admin, domain1)
1438
 
        self.network.delete_dns_domain(context_admin, domain2)
1439
 
 
1440
 
 
1441
 
class NetworkPolicyTestCase(test.TestCase):
1442
 
    def setUp(self):
1443
 
        super(NetworkPolicyTestCase, self).setUp()
1444
 
 
1445
 
        nova.policy.reset()
1446
 
        nova.policy.init()
1447
 
 
1448
 
        self.context = context.get_admin_context()
1449
 
 
1450
 
    def tearDown(self):
1451
 
        super(NetworkPolicyTestCase, self).tearDown()
1452
 
        nova.policy.reset()
1453
 
 
1454
 
    def _set_rules(self, rules):
1455
 
        nova.common.policy.set_brain(nova.common.policy.HttpBrain(rules))
1456
 
 
1457
 
    def test_check_policy(self):
1458
 
        self.mox.StubOutWithMock(nova.policy, 'enforce')
1459
 
        target = {
1460
 
            'project_id': self.context.project_id,
1461
 
            'user_id': self.context.user_id,
1462
 
        }
1463
 
        nova.policy.enforce(self.context, 'network:get_all', target)
1464
 
        self.mox.ReplayAll()
1465
 
        network_manager.check_policy(self.context, 'get_all')
1466
 
        self.mox.UnsetStubs()
1467
 
        self.mox.VerifyAll()
1468
 
 
1469
 
 
1470
 
class InstanceDNSTestCase(test.TestCase):
1471
 
    """Tests nova.network.manager instance DNS"""
1472
 
    def setUp(self):
1473
 
        super(InstanceDNSTestCase, self).setUp()
1474
 
        self.network = TestFloatingIPManager()
1475
 
        temp = utils.import_object('nova.network.minidns.MiniDNS')
1476
 
        self.network.instance_dns_manager = temp
1477
 
        temp = utils.import_object('nova.network.dns_driver.DNSDriver')
1478
 
        self.network.floating_dns_manager = temp
1479
 
        self.network.db = db
1480
 
        self.project_id = 'testproject'
1481
 
        self.context = context.RequestContext('testuser', self.project_id,
1482
 
            is_admin=False)
1483
 
 
1484
 
    def tearDown(self):
1485
 
        super(InstanceDNSTestCase, self).tearDown()
1486
 
        self.network.instance_dns_manager.delete_dns_file()
1487
 
 
1488
 
    def test_dns_domains_private(self):
1489
 
        zone1 = 'testzone'
1490
 
        domain1 = 'example.org'
1491
 
 
1492
 
        context_admin = context.RequestContext('testuser', 'testproject',
1493
 
                                              is_admin=True)
1494
 
 
1495
 
        self.assertRaises(exception.AdminRequired,
1496
 
                          self.network.create_private_dns_domain, self.context,
1497
 
                          domain1, zone1)
1498
 
 
1499
 
        self.network.create_private_dns_domain(context_admin, domain1, zone1)
1500
 
        domains = self.network.get_dns_domains(self.context)
1501
 
        self.assertEquals(len(domains), 1)
1502
 
        self.assertEquals(domains[0]['domain'], domain1)
1503
 
        self.assertEquals(domains[0]['availability_zone'], zone1)
1504
 
 
1505
 
        self.assertRaises(exception.AdminRequired,
1506
 
                          self.network.delete_dns_domain, self.context,
1507
 
                          domain1)
1508
 
        self.network.delete_dns_domain(context_admin, domain1)
1509
 
 
1510
 
 
1511
 
domain1 = "example.org"
1512
 
domain2 = "example.com"
1513
 
 
1514
 
 
1515
 
class LdapDNSTestCase(test.TestCase):
1516
 
    """Tests nova.network.ldapdns.LdapDNS"""
1517
 
    def setUp(self):
1518
 
        super(LdapDNSTestCase, self).setUp()
1519
 
 
1520
 
        self.saved_ldap = sys.modules.get('ldap')
1521
 
        import nova.auth.fakeldap
1522
 
        sys.modules['ldap'] = nova.auth.fakeldap
1523
 
 
1524
 
        temp = utils.import_object('nova.network.ldapdns.FakeLdapDNS')
1525
 
        self.driver = temp
1526
 
        self.driver.create_domain(domain1)
1527
 
        self.driver.create_domain(domain2)
1528
 
 
1529
 
    def tearDown(self):
1530
 
        super(LdapDNSTestCase, self).tearDown()
1531
 
        self.driver.delete_domain(domain1)
1532
 
        self.driver.delete_domain(domain2)
1533
 
        sys.modules['ldap'] = self.saved_ldap
1534
 
 
1535
 
    def test_ldap_dns_domains(self):
1536
 
        domains = self.driver.get_domains()
1537
 
        self.assertEqual(len(domains), 2)
1538
 
        self.assertIn(domain1, domains)
1539
 
        self.assertIn(domain2, domains)
1540
 
 
1541
 
    def test_ldap_dns_create_conflict(self):
1542
 
        address1 = "10.10.10.11"
1543
 
        name1 = "foo"
1544
 
        name2 = "bar"
1545
 
 
1546
 
        self.driver.create_entry(name1, address1, "A", domain1)
1547
 
 
1548
 
        self.assertRaises(exception.FloatingIpDNSExists,
1549
 
                          self.driver.create_entry,
1550
 
                          name1, address1, "A", domain1)
1551
 
 
1552
 
    def test_ldap_dns_create_and_get(self):
1553
 
        address1 = "10.10.10.11"
1554
 
        name1 = "foo"
1555
 
        name2 = "bar"
1556
 
        entries = self.driver.get_entries_by_address(address1, domain1)
1557
 
        self.assertFalse(entries)
1558
 
 
1559
 
        self.driver.create_entry(name1, address1, "A", domain1)
1560
 
        self.driver.create_entry(name2, address1, "A", domain1)
1561
 
        entries = self.driver.get_entries_by_address(address1, domain1)
1562
 
        self.assertEquals(len(entries), 2)
1563
 
        self.assertEquals(entries[0], name1)
1564
 
        self.assertEquals(entries[1], name2)
1565
 
 
1566
 
        entries = self.driver.get_entries_by_name(name1, domain1)
1567
 
        self.assertEquals(len(entries), 1)
1568
 
        self.assertEquals(entries[0], address1)
1569
 
 
1570
 
    def test_ldap_dns_delete(self):
1571
 
        address1 = "10.10.10.11"
1572
 
        name1 = "foo"
1573
 
        name2 = "bar"
1574
 
 
1575
 
        self.driver.create_entry(name1, address1, "A", domain1)
1576
 
        self.driver.create_entry(name2, address1, "A", domain1)
1577
 
        entries = self.driver.get_entries_by_address(address1, domain1)
1578
 
        self.assertEquals(len(entries), 2)
1579
 
 
1580
 
        self.driver.delete_entry(name1, domain1)
1581
 
        entries = self.driver.get_entries_by_address(address1, domain1)
1582
 
        LOG.debug("entries: %s" % entries)
1583
 
        self.assertEquals(len(entries), 1)
1584
 
        self.assertEquals(entries[0], name2)
1585
 
 
1586
 
        self.assertRaises(exception.NotFound,
1587
 
                          self.driver.delete_entry,
1588
 
                          name1, domain1)