~rackspace-titan/nova/openstack-api-markers

« back to all changes in this revision

Viewing changes to nova/tests/test_vlan_network.py

  • Committer: Naveed Massjouni
  • Date: 2011-03-24 16:04:58 UTC
  • mfrom: (784.1.80 nova)
  • Revision ID: naveedm9@gmail.com-20110324160458-09aw4v7reem37sxa
MergeĀ fromĀ trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
 
2
 
 
3
# Copyright 2010 United States Government as represented by the
 
4
# Administrator of the National Aeronautics and Space Administration.
 
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
"""
 
19
Unit Tests for vlan network code
 
20
"""
 
21
import IPy
 
22
import os
 
23
 
 
24
from nova import context
 
25
from nova import db
 
26
from nova import exception
 
27
from nova import flags
 
28
from nova import log as logging
 
29
from nova import test
 
30
from nova import utils
 
31
from nova.auth import manager
 
32
from nova.tests.network import base
 
33
from nova.tests.network import binpath,\
 
34
    lease_ip, release_ip
 
35
 
 
36
FLAGS = flags.FLAGS
 
37
LOG = logging.getLogger('nova.tests.network')
 
38
 
 
39
 
 
40
class VlanNetworkTestCase(base.NetworkTestCase):
 
41
    """Test cases for network code"""
 
42
    def test_public_network_association(self):
 
43
        """Makes sure that we can allocaate a public ip"""
 
44
        # TODO(vish): better way of adding floating ips
 
45
        self.context._project = self.projects[0]
 
46
        self.context.project_id = self.projects[0].id
 
47
        pubnet = IPy.IP(flags.FLAGS.floating_range)
 
48
        address = str(pubnet[0])
 
49
        try:
 
50
            db.floating_ip_get_by_address(context.get_admin_context(), address)
 
51
        except exception.NotFound:
 
52
            db.floating_ip_create(context.get_admin_context(),
 
53
                                  {'address': address,
 
54
                                   'host': FLAGS.host})
 
55
        float_addr = self.network.allocate_floating_ip(self.context,
 
56
                                                       self.projects[0].id)
 
57
        fix_addr = self._create_address(0)
 
58
        lease_ip(fix_addr)
 
59
        self.assertEqual(float_addr, str(pubnet[0]))
 
60
        self.network.associate_floating_ip(self.context, float_addr, fix_addr)
 
61
        address = db.instance_get_floating_address(context.get_admin_context(),
 
62
                                                   self.instance_id)
 
63
        self.assertEqual(address, float_addr)
 
64
        self.network.disassociate_floating_ip(self.context, float_addr)
 
65
        address = db.instance_get_floating_address(context.get_admin_context(),
 
66
                                                   self.instance_id)
 
67
        self.assertEqual(address, None)
 
68
        self.network.deallocate_floating_ip(self.context, float_addr)
 
69
        self.network.deallocate_fixed_ip(self.context, fix_addr)
 
70
        release_ip(fix_addr)
 
71
        db.floating_ip_destroy(context.get_admin_context(), float_addr)
 
72
 
 
73
    def test_allocate_deallocate_fixed_ip(self):
 
74
        """Makes sure that we can allocate and deallocate a fixed ip"""
 
75
        address = self._create_address(0)
 
76
        self.assertTrue(self._is_allocated_in_project(address,
 
77
                                                      self.projects[0].id))
 
78
        lease_ip(address)
 
79
        self._deallocate_address(0, address)
 
80
 
 
81
        # Doesn't go away until it's dhcp released
 
82
        self.assertTrue(self._is_allocated_in_project(address,
 
83
                                                      self.projects[0].id))
 
84
 
 
85
        release_ip(address)
 
86
        self.assertFalse(self._is_allocated_in_project(address,
 
87
                                                       self.projects[0].id))
 
88
 
 
89
    def test_side_effects(self):
 
90
        """Ensures allocating and releasing has no side effects"""
 
91
        address = self._create_address(0)
 
92
        address2 = self._create_address(1, self.instance2_id)
 
93
 
 
94
        self.assertTrue(self._is_allocated_in_project(address,
 
95
                                                      self.projects[0].id))
 
96
        self.assertTrue(self._is_allocated_in_project(address2,
 
97
                                                      self.projects[1].id))
 
98
        self.assertFalse(self._is_allocated_in_project(address,
 
99
                                                       self.projects[1].id))
 
100
 
 
101
        # Addresses are allocated before they're issued
 
102
        lease_ip(address)
 
103
        lease_ip(address2)
 
104
 
 
105
        self._deallocate_address(0, address)
 
106
        release_ip(address)
 
107
        self.assertFalse(self._is_allocated_in_project(address,
 
108
                                                       self.projects[0].id))
 
109
 
 
110
        # First address release shouldn't affect the second
 
111
        self.assertTrue(self._is_allocated_in_project(address2,
 
112
                                                      self.projects[1].id))
 
113
 
 
114
        self._deallocate_address(1, address2)
 
115
        release_ip(address2)
 
116
        self.assertFalse(self._is_allocated_in_project(address2,
 
117
                                                 self.projects[1].id))
 
118
 
 
119
    def test_subnet_edge(self):
 
120
        """Makes sure that private ips don't overlap"""
 
121
        first = self._create_address(0)
 
122
        lease_ip(first)
 
123
        instance_ids = []
 
124
        for i in range(1, FLAGS.num_networks):
 
125
            instance_ref = self._create_instance(i, mac=utils.generate_mac())
 
126
            instance_ids.append(instance_ref['id'])
 
127
            address = self._create_address(i, instance_ref['id'])
 
128
            instance_ref = self._create_instance(i, mac=utils.generate_mac())
 
129
            instance_ids.append(instance_ref['id'])
 
130
            address2 = self._create_address(i, instance_ref['id'])
 
131
            instance_ref = self._create_instance(i, mac=utils.generate_mac())
 
132
            instance_ids.append(instance_ref['id'])
 
133
            address3 = self._create_address(i, instance_ref['id'])
 
134
            lease_ip(address)
 
135
            lease_ip(address2)
 
136
            lease_ip(address3)
 
137
            self.context._project = self.projects[i]
 
138
            self.context.project_id = self.projects[i].id
 
139
            self.assertFalse(self._is_allocated_in_project(address,
 
140
                                                     self.projects[0].id))
 
141
            self.assertFalse(self._is_allocated_in_project(address2,
 
142
                                                     self.projects[0].id))
 
143
            self.assertFalse(self._is_allocated_in_project(address3,
 
144
                                                     self.projects[0].id))
 
145
            self.network.deallocate_fixed_ip(self.context, address)
 
146
            self.network.deallocate_fixed_ip(self.context, address2)
 
147
            self.network.deallocate_fixed_ip(self.context, address3)
 
148
            release_ip(address)
 
149
            release_ip(address2)
 
150
            release_ip(address3)
 
151
        for instance_id in instance_ids:
 
152
            db.instance_destroy(context.get_admin_context(), instance_id)
 
153
        self.context._project = self.projects[0]
 
154
        self.context.project_id = self.projects[0].id
 
155
        self.network.deallocate_fixed_ip(self.context, first)
 
156
        self._deallocate_address(0, first)
 
157
        release_ip(first)
 
158
 
 
159
    def test_vpn_ip_and_port_looks_valid(self):
 
160
        """Ensure the vpn ip and port are reasonable"""
 
161
        self.assert_(self.projects[0].vpn_ip)
 
162
        self.assert_(self.projects[0].vpn_port >= FLAGS.vpn_start)
 
163
        self.assert_(self.projects[0].vpn_port <= FLAGS.vpn_start +
 
164
                                                  FLAGS.num_networks)
 
165
 
 
166
    def test_too_many_networks(self):
 
167
        """Ensure error is raised if we run out of networks"""
 
168
        projects = []
 
169
        networks_left = (FLAGS.num_networks -
 
170
                         db.network_count(context.get_admin_context()))
 
171
        for i in range(networks_left):
 
172
            project = self.manager.create_project('many%s' % i, self.user)
 
173
            projects.append(project)
 
174
            db.project_get_network(context.get_admin_context(), project.id)
 
175
        project = self.manager.create_project('last', self.user)
 
176
        projects.append(project)
 
177
        self.assertRaises(db.NoMoreNetworks,
 
178
                          db.project_get_network,
 
179
                          context.get_admin_context(),
 
180
                          project.id)
 
181
        for project in projects:
 
182
            self.manager.delete_project(project)
 
183
 
 
184
    def test_ips_are_reused(self):
 
185
        """Makes sure that ip addresses that are deallocated get reused"""
 
186
        address = self._create_address(0)
 
187
        lease_ip(address)
 
188
        self.network.deallocate_fixed_ip(self.context, address)
 
189
        release_ip(address)
 
190
 
 
191
        address2 = self._create_address(0)
 
192
        self.assertEqual(address, address2)
 
193
        lease_ip(address)
 
194
        self.network.deallocate_fixed_ip(self.context, address2)
 
195
        release_ip(address)
 
196
 
 
197
    def test_too_many_addresses(self):
 
198
        """Test for a NoMoreAddresses exception when all fixed ips are used.
 
199
        """
 
200
        admin_context = context.get_admin_context()
 
201
        network = db.project_get_network(admin_context, self.projects[0].id)
 
202
        num_available_ips = db.network_count_available_ips(admin_context,
 
203
                                                           network['id'])
 
204
        addresses = []
 
205
        instance_ids = []
 
206
        for i in range(num_available_ips):
 
207
            instance_ref = self._create_instance(0)
 
208
            instance_ids.append(instance_ref['id'])
 
209
            address = self._create_address(0, instance_ref['id'])
 
210
            addresses.append(address)
 
211
            lease_ip(address)
 
212
 
 
213
        ip_count = db.network_count_available_ips(context.get_admin_context(),
 
214
                                                  network['id'])
 
215
        self.assertEqual(ip_count, 0)
 
216
        self.assertRaises(db.NoMoreAddresses,
 
217
                          self.network.allocate_fixed_ip,
 
218
                          self.context,
 
219
                          'foo')
 
220
 
 
221
        for i in range(num_available_ips):
 
222
            self.network.deallocate_fixed_ip(self.context, addresses[i])
 
223
            release_ip(addresses[i])
 
224
            db.instance_destroy(context.get_admin_context(), instance_ids[i])
 
225
        ip_count = db.network_count_available_ips(context.get_admin_context(),
 
226
                                                  network['id'])
 
227
        self.assertEqual(ip_count, num_available_ips)
 
228
 
 
229
    def _is_allocated_in_project(self, address, project_id):
 
230
        """Returns true if address is in specified project"""
 
231
        project_net = db.project_get_network(context.get_admin_context(),
 
232
                                             project_id)
 
233
        network = db.fixed_ip_get_network(context.get_admin_context(),
 
234
                                          address)
 
235
        instance = db.fixed_ip_get_instance(context.get_admin_context(),
 
236
                                            address)
 
237
        # instance exists until release
 
238
        return instance is not None and network['id'] == project_net['id']
 
239
 
 
240
    def run(self, result=None):
 
241
        if(FLAGS.network_manager == 'nova.network.manager.VlanManager'):
 
242
            super(VlanNetworkTestCase, self).run(result)