abstracted network code in the base class for flat and vlan
This commit is contained in:
		| @@ -30,96 +30,15 @@ from nova import log as logging | ||||
| from nova import test | ||||
| from nova import utils | ||||
| from nova.auth import manager | ||||
| from nova.tests.network import base | ||||
|  | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| LOG = logging.getLogger('nova.tests.network') | ||||
|  | ||||
|  | ||||
| class FlatNetworkTestCase(test.TestCase): | ||||
| class FlatNetworkTestCase(base.NetworkTestCase): | ||||
|     """Test cases for network code""" | ||||
|     def setUp(self): | ||||
|         super(FlatNetworkTestCase, self).setUp() | ||||
|         # NOTE(vish): if you change these flags, make sure to change the | ||||
|         #             flags in the corresponding section in nova-dhcpbridge | ||||
|         self.flags(connection_type='fake', | ||||
|                    fake_call=True, | ||||
|                    fake_network=True) | ||||
|         self.manager = manager.AuthManager() | ||||
|         self.user = self.manager.create_user('netuser', 'netuser', 'netuser') | ||||
|         self.projects = [] | ||||
|         self.network = utils.import_object(FLAGS.network_manager) | ||||
|         self.context = context.RequestContext(project=None, user=self.user) | ||||
|         for i in range(5): | ||||
|             name = 'project%s' % i | ||||
|             project = self.manager.create_project(name, 'netuser', name) | ||||
|             self.projects.append(project) | ||||
|             # create the necessary network data for the project | ||||
|             user_context = context.RequestContext(project=self.projects[i], | ||||
|                                                      user=self.user) | ||||
|             host = self.network.get_network_host(user_context.elevated()) | ||||
|         instance_ref = self._create_instance(0) | ||||
|         self.instance_id = instance_ref['id'] | ||||
|         instance_ref = self._create_instance(1) | ||||
|         self.instance2_id = instance_ref['id'] | ||||
|  | ||||
|     def tearDown(self): | ||||
|         # TODO(termie): this should really be instantiating clean datastores | ||||
|         #               in between runs, one failure kills all the tests | ||||
|         db.instance_destroy(context.get_admin_context(), self.instance_id) | ||||
|         db.instance_destroy(context.get_admin_context(), self.instance2_id) | ||||
|         for project in self.projects: | ||||
|             self.manager.delete_project(project) | ||||
|         self.manager.delete_user(self.user) | ||||
|         super(FlatNetworkTestCase, self).tearDown() | ||||
|  | ||||
|     def _create_instance(self, project_num, mac=None): | ||||
|         if not mac: | ||||
|             mac = utils.generate_mac() | ||||
|         project = self.projects[project_num] | ||||
|         self.context._project = project | ||||
|         self.context.project_id = project.id | ||||
|         return db.instance_create(self.context, | ||||
|                                   {'project_id': project.id, | ||||
|                                    'mac_address': mac}) | ||||
|  | ||||
|     def _create_address(self, project_num, instance_id=None): | ||||
|         """Create an address in given project num""" | ||||
|         if instance_id is None: | ||||
|             instance_id = self.instance_id | ||||
|         self.context._project = self.projects[project_num] | ||||
|         self.context.project_id = self.projects[project_num].id | ||||
|         return self.network.allocate_fixed_ip(self.context, instance_id) | ||||
|  | ||||
|     def _deallocate_address(self, project_num, address): | ||||
|         self.context._project = self.projects[project_num] | ||||
|         self.context.project_id = self.projects[project_num].id | ||||
|         self.network.deallocate_fixed_ip(self.context, address) | ||||
|  | ||||
|     def test_private_ipv6(self): | ||||
|         """Make sure ipv6 is OK""" | ||||
|         if FLAGS.use_ipv6: | ||||
|             instance_ref = self._create_instance(0) | ||||
|             address = self._create_address(0, instance_ref['id']) | ||||
|             network_ref = db.project_get_network( | ||||
|                                                  context.get_admin_context(), | ||||
|                                                  self.context.project_id) | ||||
|             address_v6 = db.instance_get_fixed_address_v6( | ||||
|                                                  context.get_admin_context(), | ||||
|                                                  instance_ref['id']) | ||||
|             self.assertEqual(instance_ref['mac_address'], | ||||
|                              utils.to_mac(address_v6)) | ||||
|             instance_ref2 = db.fixed_ip_get_instance_v6( | ||||
|                                                  context.get_admin_context(), | ||||
|                                                  address_v6) | ||||
|             self.assertEqual(instance_ref['id'], instance_ref2['id']) | ||||
|             self.assertEqual(address_v6, | ||||
|                              utils.to_global_ipv6( | ||||
|                                                  network_ref['cidr_v6'], | ||||
|                                                  instance_ref['mac_address'])) | ||||
|             self._deallocate_address(0, address) | ||||
|             db.instance_destroy(context.get_admin_context(), | ||||
|                                 instance_ref['id']) | ||||
|  | ||||
|     def test_public_network_association(self): | ||||
|         """Makes sure that we can allocate a public ip""" | ||||
|         # TODO(vish): better way of adding floating ips | ||||
| @@ -167,28 +86,34 @@ class FlatNetworkTestCase(test.TestCase): | ||||
|     def test_allocate_deallocate_fixed_ip(self): | ||||
|         """Makes sure that we can allocate and deallocate a fixed ip""" | ||||
|         address = self._create_address(0) | ||||
|         self.assertTrue(is_allocated_in_project(address, self.projects[0].id)) | ||||
|         self.assertTrue(self._is_allocated_in_project(address, | ||||
|                                                       self.projects[0].id)) | ||||
|         self._deallocate_address(0, address) | ||||
|  | ||||
|         # check if the fixed ip address is really deallocated | ||||
|         self.assertFalse(is_allocated_in_project(address, self.projects[0].id)) | ||||
|         self.assertFalse(self._is_allocated_in_project(address, | ||||
|                                                        self.projects[0].id)) | ||||
|  | ||||
|     def test_side_effects(self): | ||||
|         """Ensures allocating and releasing has no side effects""" | ||||
|         address = self._create_address(0) | ||||
|         address2 = self._create_address(1, self.instance2_id) | ||||
|  | ||||
|         self.assertTrue(is_allocated_in_project(address, self.projects[0].id)) | ||||
|         self.assertTrue(is_allocated_in_project(address2, self.projects[1].id)) | ||||
|         self.assertTrue(self._is_allocated_in_project(address, | ||||
|                                                       self.projects[0].id)) | ||||
|         self.assertTrue(self._is_allocated_in_project(address2, | ||||
|                                                       self.projects[1].id)) | ||||
|  | ||||
|         self._deallocate_address(0, address) | ||||
|         self.assertFalse(is_allocated_in_project(address, self.projects[0].id)) | ||||
|         self.assertFalse(self._is_allocated_in_project(address, | ||||
|                                                        self.projects[0].id)) | ||||
|  | ||||
|         # First address release shouldn't affect the second | ||||
|         self.assertTrue(is_allocated_in_project(address2, self.projects[0].id)) | ||||
|         self.assertTrue(self._is_allocated_in_project(address2, | ||||
|                                                       self.projects[0].id)) | ||||
|  | ||||
|         self._deallocate_address(1, address2) | ||||
|         self.assertFalse(is_allocated_in_project(address2, | ||||
|         self.assertFalse(self._is_allocated_in_project(address2, | ||||
|                                                  self.projects[1].id)) | ||||
|  | ||||
|     def test_ips_are_reused(self): | ||||
| @@ -201,29 +126,6 @@ class FlatNetworkTestCase(test.TestCase): | ||||
|  | ||||
|         self.network.deallocate_fixed_ip(self.context, address2) | ||||
|  | ||||
|     def test_available_ips(self): | ||||
|         """Make sure the number of available ips for the network is correct | ||||
|  | ||||
|         The number of available IP addresses depends on the test | ||||
|         environment's setup. | ||||
|  | ||||
|         Network size is set in test fixture's setUp method. | ||||
|  | ||||
|         There are ips reserved at the bottom and top of the range. | ||||
|         services (network, gateway, CloudPipe, broadcast) | ||||
|         """ | ||||
|         network = db.project_get_network(context.get_admin_context(), | ||||
|                                          self.projects[0].id) | ||||
|         net_size = flags.FLAGS.network_size | ||||
|         admin_context = context.get_admin_context() | ||||
|         total_ips = (db.network_count_available_ips(admin_context, | ||||
|                                                     network['id']) + | ||||
|                      db.network_count_reserved_ips(admin_context, | ||||
|                                                    network['id']) + | ||||
|                      db.network_count_allocated_ips(admin_context, | ||||
|                                                     network['id'])) | ||||
|         self.assertEqual(total_ips, net_size) | ||||
|  | ||||
|     def test_too_many_addresses(self): | ||||
|         """Test for a NoMoreAddresses exception when all fixed ips are used. | ||||
|         """ | ||||
| @@ -257,20 +159,3 @@ class FlatNetworkTestCase(test.TestCase): | ||||
|     def run(self, result=None): | ||||
|         if(FLAGS.network_manager == 'nova.network.manager.FlatManager'): | ||||
|             super(FlatNetworkTestCase, self).run(result) | ||||
|  | ||||
|  | ||||
| def is_allocated_in_project(address, project_id): | ||||
|     """Returns true if address is in specified project""" | ||||
|     #project_net = db.project_get_network(context.get_admin_context(), | ||||
|     #                                     project_id) | ||||
|     project_net = db.network_get_by_bridge(context.get_admin_context(), | ||||
|                                            FLAGS.flat_network_bridge) | ||||
|     network = db.fixed_ip_get_network(context.get_admin_context(), address) | ||||
|     instance = db.fixed_ip_get_instance(context.get_admin_context(), address) | ||||
|     # instance exists until release | ||||
|     return instance is not None and network['id'] == project_net['id'] | ||||
|  | ||||
|  | ||||
| def binpath(script): | ||||
|     """Returns the absolute path to a script in bin""" | ||||
|     return os.path.abspath(os.path.join(__file__, "../../../bin", script)) | ||||
|   | ||||
| @@ -29,100 +29,16 @@ from nova import log as logging | ||||
| from nova import test | ||||
| from nova import utils | ||||
| from nova.auth import manager | ||||
| from nova.tests.network import base | ||||
| from nova.tests.network import binpath,\ | ||||
|     lease_ip, release_ip | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| LOG = logging.getLogger('nova.tests.network') | ||||
|  | ||||
|  | ||||
| class VlanNetworkTestCase(test.TestCase): | ||||
| class VlanNetworkTestCase(base.NetworkTestCase): | ||||
|     """Test cases for network code""" | ||||
|     def setUp(self): | ||||
|         super(VlanNetworkTestCase, self).setUp() | ||||
|         # NOTE(vish): if you change these flags, make sure to change the | ||||
|         #             flags in the corresponding section in nova-dhcpbridge | ||||
|         self.flags(connection_type='fake', | ||||
|                    fake_call=True, | ||||
|                    fake_network=True) | ||||
|         self.manager = manager.AuthManager() | ||||
|         self.user = self.manager.create_user('netuser', 'netuser', 'netuser') | ||||
|         self.projects = [] | ||||
|         self.network = utils.import_object(FLAGS.network_manager) | ||||
|         self.context = context.RequestContext(project=None, user=self.user) | ||||
|         for i in range(FLAGS.num_networks): | ||||
|             name = 'project%s' % i | ||||
|             project = self.manager.create_project(name, 'netuser', name) | ||||
|             self.projects.append(project) | ||||
|             # create the necessary network data for the project | ||||
|             user_context = context.RequestContext(project=self.projects[i], | ||||
|                                                      user=self.user) | ||||
|             host = self.network.get_network_host(user_context.elevated()) | ||||
|         instance_ref = self._create_instance(0) | ||||
|         self.instance_id = instance_ref['id'] | ||||
|         instance_ref = self._create_instance(1) | ||||
|         self.instance2_id = instance_ref['id'] | ||||
|  | ||||
|     def tearDown(self): | ||||
|         # TODO(termie): this should really be instantiating clean datastores | ||||
|         #               in between runs, one failure kills all the tests | ||||
|         db.instance_destroy(context.get_admin_context(), self.instance_id) | ||||
|         db.instance_destroy(context.get_admin_context(), self.instance2_id) | ||||
|         for project in self.projects: | ||||
|             self.manager.delete_project(project) | ||||
|         self.manager.delete_user(self.user) | ||||
|         super(VlanNetworkTestCase, self).tearDown() | ||||
|  | ||||
|     def run(self, result=None): | ||||
|         if(FLAGS.network_manager == 'nova.network.manager.VlanManager'): | ||||
|             super(VlanNetworkTestCase, self).run(result) | ||||
|  | ||||
|     def _create_instance(self, project_num, mac=None): | ||||
|         if not mac: | ||||
|             mac = utils.generate_mac() | ||||
|         project = self.projects[project_num] | ||||
|         self.context._project = project | ||||
|         self.context.project_id = project.id | ||||
|         return db.instance_create(self.context, | ||||
|                                   {'project_id': project.id, | ||||
|                                    'mac_address': mac}) | ||||
|  | ||||
|     def _create_address(self, project_num, instance_id=None): | ||||
|         """Create an address in given project num""" | ||||
|         if instance_id is None: | ||||
|             instance_id = self.instance_id | ||||
|         self.context._project = self.projects[project_num] | ||||
|         self.context.project_id = self.projects[project_num].id | ||||
|         return self.network.allocate_fixed_ip(self.context, instance_id) | ||||
|  | ||||
|     def _deallocate_address(self, project_num, address): | ||||
|         self.context._project = self.projects[project_num] | ||||
|         self.context.project_id = self.projects[project_num].id | ||||
|         self.network.deallocate_fixed_ip(self.context, address) | ||||
|  | ||||
|     def test_private_ipv6(self): | ||||
|         """Make sure ipv6 is OK""" | ||||
|         if FLAGS.use_ipv6: | ||||
|             instance_ref = self._create_instance(0) | ||||
|             address = self._create_address(0, instance_ref['id']) | ||||
|             network_ref = db.project_get_network( | ||||
|                                                  context.get_admin_context(), | ||||
|                                                  self.context.project_id) | ||||
|             address_v6 = db.instance_get_fixed_address_v6( | ||||
|                                                  context.get_admin_context(), | ||||
|                                                  instance_ref['id']) | ||||
|             self.assertEqual(instance_ref['mac_address'], | ||||
|                              utils.to_mac(address_v6)) | ||||
|             instance_ref2 = db.fixed_ip_get_instance_v6( | ||||
|                                                  context.get_admin_context(), | ||||
|                                                  address_v6) | ||||
|             self.assertEqual(instance_ref['id'], instance_ref2['id']) | ||||
|             self.assertEqual(address_v6, | ||||
|                              utils.to_global_ipv6( | ||||
|                                                  network_ref['cidr_v6'], | ||||
|                                                  instance_ref['mac_address'])) | ||||
|             self._deallocate_address(0, address) | ||||
|             db.instance_destroy(context.get_admin_context(), | ||||
|                                 instance_ref['id']) | ||||
|  | ||||
|     def test_public_network_association(self): | ||||
|         """Makes sure that we can allocaate a public ip""" | ||||
|         # TODO(vish): better way of adding floating ips | ||||
| @@ -157,24 +73,30 @@ class VlanNetworkTestCase(test.TestCase): | ||||
|     def test_allocate_deallocate_fixed_ip(self): | ||||
|         """Makes sure that we can allocate and deallocate a fixed ip""" | ||||
|         address = self._create_address(0) | ||||
|         self.assertTrue(is_allocated_in_project(address, self.projects[0].id)) | ||||
|         self.assertTrue(self._is_allocated_in_project(address, | ||||
|                                                       self.projects[0].id)) | ||||
|         lease_ip(address) | ||||
|         self._deallocate_address(0, address) | ||||
|  | ||||
|         # Doesn't go away until it's dhcp released | ||||
|         self.assertTrue(is_allocated_in_project(address, self.projects[0].id)) | ||||
|         self.assertTrue(self._is_allocated_in_project(address, | ||||
|                                                       self.projects[0].id)) | ||||
|  | ||||
|         release_ip(address) | ||||
|         self.assertFalse(is_allocated_in_project(address, self.projects[0].id)) | ||||
|         self.assertFalse(self._is_allocated_in_project(address, | ||||
|                                                        self.projects[0].id)) | ||||
|  | ||||
|     def test_side_effects(self): | ||||
|         """Ensures allocating and releasing has no side effects""" | ||||
|         address = self._create_address(0) | ||||
|         address2 = self._create_address(1, self.instance2_id) | ||||
|  | ||||
|         self.assertTrue(is_allocated_in_project(address, self.projects[0].id)) | ||||
|         self.assertTrue(is_allocated_in_project(address2, self.projects[1].id)) | ||||
|         self.assertFalse(is_allocated_in_project(address, self.projects[1].id)) | ||||
|         self.assertTrue(self._is_allocated_in_project(address, | ||||
|                                                       self.projects[0].id)) | ||||
|         self.assertTrue(self._is_allocated_in_project(address2, | ||||
|                                                       self.projects[1].id)) | ||||
|         self.assertFalse(self._is_allocated_in_project(address, | ||||
|                                                        self.projects[1].id)) | ||||
|  | ||||
|         # Addresses are allocated before they're issued | ||||
|         lease_ip(address) | ||||
| @@ -182,14 +104,16 @@ class VlanNetworkTestCase(test.TestCase): | ||||
|  | ||||
|         self._deallocate_address(0, address) | ||||
|         release_ip(address) | ||||
|         self.assertFalse(is_allocated_in_project(address, self.projects[0].id)) | ||||
|         self.assertFalse(self._is_allocated_in_project(address, | ||||
|                                                        self.projects[0].id)) | ||||
|  | ||||
|         # First address release shouldn't affect the second | ||||
|         self.assertTrue(is_allocated_in_project(address2, self.projects[1].id)) | ||||
|         self.assertTrue(self._is_allocated_in_project(address2, | ||||
|                                                       self.projects[1].id)) | ||||
|  | ||||
|         self._deallocate_address(1, address2) | ||||
|         release_ip(address2) | ||||
|         self.assertFalse(is_allocated_in_project(address2, | ||||
|         self.assertFalse(self._is_allocated_in_project(address2, | ||||
|                                                  self.projects[1].id)) | ||||
|  | ||||
|     def test_subnet_edge(self): | ||||
| @@ -212,11 +136,11 @@ class VlanNetworkTestCase(test.TestCase): | ||||
|             lease_ip(address3) | ||||
|             self.context._project = self.projects[i] | ||||
|             self.context.project_id = self.projects[i].id | ||||
|             self.assertFalse(is_allocated_in_project(address, | ||||
|             self.assertFalse(self._is_allocated_in_project(address, | ||||
|                                                      self.projects[0].id)) | ||||
|             self.assertFalse(is_allocated_in_project(address2, | ||||
|             self.assertFalse(self._is_allocated_in_project(address2, | ||||
|                                                      self.projects[0].id)) | ||||
|             self.assertFalse(is_allocated_in_project(address3, | ||||
|             self.assertFalse(self._is_allocated_in_project(address3, | ||||
|                                                      self.projects[0].id)) | ||||
|             self.network.deallocate_fixed_ip(self.context, address) | ||||
|             self.network.deallocate_fixed_ip(self.context, address2) | ||||
| @@ -270,29 +194,6 @@ class VlanNetworkTestCase(test.TestCase): | ||||
|         self.network.deallocate_fixed_ip(self.context, address2) | ||||
|         release_ip(address) | ||||
|  | ||||
|     def test_available_ips(self): | ||||
|         """Make sure the number of available ips for the network is correct | ||||
|  | ||||
|         The number of available IP addresses depends on the test | ||||
|         environment's setup. | ||||
|  | ||||
|         Network size is set in test fixture's setUp method. | ||||
|  | ||||
|         There are ips reserved at the bottom and top of the range. | ||||
|         services (network, gateway, CloudPipe, broadcast) | ||||
|         """ | ||||
|         network = db.project_get_network(context.get_admin_context(), | ||||
|                                          self.projects[0].id) | ||||
|         net_size = flags.FLAGS.network_size | ||||
|         admin_context = context.get_admin_context() | ||||
|         total_ips = (db.network_count_available_ips(admin_context, | ||||
|                                                     network['id']) + | ||||
|                      db.network_count_reserved_ips(admin_context, | ||||
|                                                    network['id']) + | ||||
|                      db.network_count_allocated_ips(admin_context, | ||||
|                                                     network['id'])) | ||||
|         self.assertEqual(total_ips, net_size) | ||||
|  | ||||
|     def test_too_many_addresses(self): | ||||
|         """Test for a NoMoreAddresses exception when all fixed ips are used. | ||||
|         """ | ||||
| @@ -325,49 +226,17 @@ class VlanNetworkTestCase(test.TestCase): | ||||
|                                                   network['id']) | ||||
|         self.assertEqual(ip_count, num_available_ips) | ||||
|  | ||||
|     def _is_allocated_in_project(self, address, project_id): | ||||
|         """Returns true if address is in specified project""" | ||||
|         project_net = db.project_get_network(context.get_admin_context(), | ||||
|                                              project_id) | ||||
|         network = db.fixed_ip_get_network(context.get_admin_context(), | ||||
|                                           address) | ||||
|         instance = db.fixed_ip_get_instance(context.get_admin_context(), | ||||
|                                             address) | ||||
|         # instance exists until release | ||||
|         return instance is not None and network['id'] == project_net['id'] | ||||
|  | ||||
| def is_allocated_in_project(address, project_id): | ||||
|     """Returns true if address is in specified project""" | ||||
|     project_net = db.project_get_network(context.get_admin_context(), | ||||
|                                          project_id) | ||||
|     network = db.fixed_ip_get_network(context.get_admin_context(), address) | ||||
|     instance = db.fixed_ip_get_instance(context.get_admin_context(), address) | ||||
|     # instance exists until release | ||||
|     return instance is not None and network['id'] == project_net['id'] | ||||
|  | ||||
|  | ||||
| def binpath(script): | ||||
|     """Returns the absolute path to a script in bin""" | ||||
|     return os.path.abspath(os.path.join(__file__, "../../../bin", script)) | ||||
|  | ||||
|  | ||||
| def lease_ip(private_ip): | ||||
|     """Run add command on dhcpbridge""" | ||||
|     network_ref = db.fixed_ip_get_network(context.get_admin_context(), | ||||
|                                           private_ip) | ||||
|     instance_ref = db.fixed_ip_get_instance(context.get_admin_context(), | ||||
|                                             private_ip) | ||||
|     cmd = "%s add %s %s fake" % (binpath('nova-dhcpbridge'), | ||||
|                                  instance_ref['mac_address'], | ||||
|                                  private_ip) | ||||
|     env = {'DNSMASQ_INTERFACE': network_ref['bridge'], | ||||
|            'TESTING': '1', | ||||
|            'FLAGFILE': FLAGS.dhcpbridge_flagfile} | ||||
|     (out, err) = utils.execute(cmd, addl_env=env) | ||||
|     LOG.debug("ISSUE_IP: %s, %s ", out, err) | ||||
|  | ||||
|  | ||||
| def release_ip(private_ip): | ||||
|     """Run del command on dhcpbridge""" | ||||
|     network_ref = db.fixed_ip_get_network(context.get_admin_context(), | ||||
|                                           private_ip) | ||||
|     instance_ref = db.fixed_ip_get_instance(context.get_admin_context(), | ||||
|                                             private_ip) | ||||
|     cmd = "%s del %s %s fake" % (binpath('nova-dhcpbridge'), | ||||
|                                  instance_ref['mac_address'], | ||||
|                                  private_ip) | ||||
|     env = {'DNSMASQ_INTERFACE': network_ref['bridge'], | ||||
|            'TESTING': '1', | ||||
|            'FLAGFILE': FLAGS.dhcpbridge_flagfile} | ||||
|     (out, err) = utils.execute(cmd, addl_env=env) | ||||
|     LOG.debug("RELEASE_IP: %s, %s ", out, err) | ||||
|     def run(self, result=None): | ||||
|         if(FLAGS.network_manager == 'nova.network.manager.VlanManager'): | ||||
|             super(VlanNetworkTestCase, self).run(result) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Tushar Patil
					Tushar Patil