trunk merge
This commit is contained in:
		| @@ -1098,6 +1098,70 @@ class ImageCommands(object): | ||||
|         self._convert_images(machine_images) | ||||
|  | ||||
|  | ||||
| class AgentBuildCommands(object): | ||||
|     """Class for managing agent builds.""" | ||||
|  | ||||
|     def create(self, os, architecture, version, url, md5hash, | ||||
|                 hypervisor='xen'): | ||||
|         """Creates a new agent build. | ||||
|         arguments: os architecture version url md5hash [hypervisor='xen']""" | ||||
|         ctxt = context.get_admin_context() | ||||
|         agent_build = db.agent_build_create(ctxt, | ||||
|                                             {'hypervisor': hypervisor, | ||||
|                                              'os': os, | ||||
|                                              'architecture': architecture, | ||||
|                                              'version': version, | ||||
|                                              'url': url, | ||||
|                                              'md5hash': md5hash}) | ||||
|  | ||||
|     def delete(self, os, architecture, hypervisor='xen'): | ||||
|         """Deletes an existing agent build. | ||||
|         arguments: os architecture [hypervisor='xen']""" | ||||
|         ctxt = context.get_admin_context() | ||||
|         agent_build_ref = db.agent_build_get_by_triple(ctxt, | ||||
|                                   hypervisor, os, architecture) | ||||
|         db.agent_build_destroy(ctxt, agent_build_ref['id']) | ||||
|  | ||||
|     def list(self, hypervisor=None): | ||||
|         """Lists all agent builds. | ||||
|         arguments: <none>""" | ||||
|         fmt = "%-10s  %-8s  %12s  %s" | ||||
|         ctxt = context.get_admin_context() | ||||
|         by_hypervisor = {} | ||||
|         for agent_build in db.agent_build_get_all(ctxt): | ||||
|             buildlist = by_hypervisor.get(agent_build.hypervisor) | ||||
|             if not buildlist: | ||||
|                 buildlist = by_hypervisor[agent_build.hypervisor] = [] | ||||
|  | ||||
|             buildlist.append(agent_build) | ||||
|  | ||||
|         for key, buildlist in by_hypervisor.iteritems(): | ||||
|             if hypervisor and key != hypervisor: | ||||
|                 continue | ||||
|  | ||||
|             print "Hypervisor: %s" % key | ||||
|             print fmt % ('-' * 10, '-' * 8, '-' * 12, '-' * 32) | ||||
|             for agent_build in buildlist: | ||||
|                 print fmt % (agent_build.os, agent_build.architecture, | ||||
|                              agent_build.version, agent_build.md5hash) | ||||
|                 print '    %s' % agent_build.url | ||||
|  | ||||
|             print | ||||
|  | ||||
|     def modify(self, os, architecture, version, url, md5hash, | ||||
|                hypervisor='xen'): | ||||
|         """Update an existing agent build. | ||||
|         arguments: os architecture version url md5hash [hypervisor='xen'] | ||||
|         """ | ||||
|         ctxt = context.get_admin_context() | ||||
|         agent_build_ref = db.agent_build_get_by_triple(ctxt, | ||||
|                                   hypervisor, os, architecture) | ||||
|         db.agent_build_update(ctxt, agent_build_ref['id'], | ||||
|                               {'version': version, | ||||
|                                'url': url, | ||||
|                                'md5hash': md5hash}) | ||||
|  | ||||
|  | ||||
| class ConfigCommands(object): | ||||
|     """Class for exposing the flags defined by flag_file(s).""" | ||||
|  | ||||
| @@ -1110,6 +1174,7 @@ class ConfigCommands(object): | ||||
|  | ||||
| CATEGORIES = [ | ||||
|     ('account', AccountCommands), | ||||
|     ('agent', AgentBuildCommands), | ||||
|     ('config', ConfigCommands), | ||||
|     ('db', DbCommands), | ||||
|     ('fixed', FixedIpCommands), | ||||
|   | ||||
| @@ -280,6 +280,14 @@ class ComputeTestCase(test.TestCase): | ||||
|                 "File Contents") | ||||
|         self.compute.terminate_instance(self.context, instance_id) | ||||
|  | ||||
|     def test_agent_update(self): | ||||
|         """Ensure instance can have its agent updated""" | ||||
|         instance_id = self._create_instance() | ||||
|         self.compute.run_instance(self.context, instance_id) | ||||
|         self.compute.agent_update(self.context, instance_id, | ||||
|                 'http://127.0.0.1/agent', '00112233445566778899aabbccddeeff') | ||||
|         self.compute.terminate_instance(self.context, instance_id) | ||||
|  | ||||
|     def test_snapshot(self): | ||||
|         """Ensure instance can be snapshotted""" | ||||
|         instance_id = self._create_instance() | ||||
|   | ||||
| @@ -37,9 +37,8 @@ from nova import exception | ||||
| from nova.virt import xenapi_conn | ||||
| from nova.virt.xenapi import fake as xenapi_fake | ||||
| from nova.virt.xenapi import volume_utils | ||||
| from nova.virt.xenapi import vmops | ||||
| from nova.virt.xenapi import vm_utils | ||||
| from nova.virt.xenapi.vmops import SimpleDH | ||||
| from nova.virt.xenapi.vmops import VMOps | ||||
| from nova.tests.db import fakes as db_fakes | ||||
| from nova.tests.xenapi import stubs | ||||
| from nova.tests.glance import stubs as glance_stubs | ||||
| @@ -84,7 +83,8 @@ class XenAPIVolumeTestCase(test.TestCase): | ||||
|                   'kernel_id': 2, | ||||
|                   'ramdisk_id': 3, | ||||
|                   'instance_type_id': '3',  # m1.large | ||||
|                   'os_type': 'linux'} | ||||
|                   'os_type': 'linux', | ||||
|                   'architecture': 'x86-64'} | ||||
|  | ||||
|     def _create_volume(self, size='0'): | ||||
|         """Create a volume object.""" | ||||
| @@ -191,7 +191,7 @@ class XenAPIVMTestCase(test.TestCase): | ||||
|         stubs.stubout_get_this_vm_uuid(self.stubs) | ||||
|         stubs.stubout_stream_disk(self.stubs) | ||||
|         stubs.stubout_is_vdi_pv(self.stubs) | ||||
|         self.stubs.Set(VMOps, 'reset_network', reset_network) | ||||
|         self.stubs.Set(vmops.VMOps, 'reset_network', reset_network) | ||||
|         stubs.stub_out_vm_methods(self.stubs) | ||||
|         glance_stubs.stubout_glance_client(self.stubs) | ||||
|         fake_utils.stub_out_utils_execute(self.stubs) | ||||
| @@ -210,7 +210,8 @@ class XenAPIVMTestCase(test.TestCase): | ||||
|                 'kernel_id': 2, | ||||
|                 'ramdisk_id': 3, | ||||
|                 'instance_type_id': '3',  # m1.large | ||||
|                 'os_type': 'linux'} | ||||
|                 'os_type': 'linux', | ||||
|                 'architecture': 'x86-64'} | ||||
|             network_info = [({'bridge': 'fa0', 'id': 0, 'injected': False}, | ||||
|                               {'broadcast': '192.168.0.255', | ||||
|                                'dns': ['192.168.0.1'], | ||||
| @@ -382,7 +383,8 @@ class XenAPIVMTestCase(test.TestCase): | ||||
|  | ||||
|     def _test_spawn(self, image_ref, kernel_id, ramdisk_id, | ||||
|                     instance_type_id="3", os_type="linux", | ||||
|                     instance_id=1, check_injection=False, create_record=True): | ||||
|                     architecture="x86-64", instance_id=1, | ||||
|                     check_injection=False): | ||||
|         stubs.stubout_loopingcall_start(self.stubs) | ||||
|         values = {'id': instance_id, | ||||
|                   'project_id': self.project.id, | ||||
| @@ -391,28 +393,28 @@ class XenAPIVMTestCase(test.TestCase): | ||||
|                   'kernel_id': kernel_id, | ||||
|                   'ramdisk_id': ramdisk_id, | ||||
|                   'instance_type_id': instance_type_id, | ||||
|                   'os_type': os_type} | ||||
|         if create_record: | ||||
|             instance = db.instance_create(self.context, values) | ||||
|             network_info = [({'bridge': 'fa0', 'id': 0, 'injected': True}, | ||||
|                               {'broadcast': '192.168.0.255', | ||||
|                                'dns': ['192.168.0.1'], | ||||
|                                'gateway': '192.168.0.1', | ||||
|                                'gateway6': 'dead:beef::1', | ||||
|                                'ip6s': [{'enabled': '1', | ||||
|                                          'ip': 'dead:beef::dcad:beff:feef:0', | ||||
|                                                'netmask': '64'}], | ||||
|                                'ips': [{'enabled': '1', | ||||
|                                         'ip': '192.168.0.100', | ||||
|                                         'netmask': '255.255.255.0'}], | ||||
|                                'label': 'fake', | ||||
|                                'mac': 'DE:AD:BE:EF:00:00', | ||||
|                                'rxtx_cap': 3})] | ||||
|             self.conn.spawn(instance, network_info) | ||||
|         else: | ||||
|             instance = db.instance_get(self.context, instance_id) | ||||
|                   'os_type': os_type, | ||||
|                   'architecture': architecture} | ||||
|         instance = db.instance_create(self.context, values) | ||||
|         network_info = [({'bridge': 'fa0', 'id': 0, 'injected': True}, | ||||
|                           {'broadcast': '192.168.0.255', | ||||
|                            'dns': ['192.168.0.1'], | ||||
|                            'gateway': '192.168.0.1', | ||||
|                            'gateway6': 'dead:beef::1', | ||||
|                            'ip6s': [{'enabled': '1', | ||||
|                                      'ip': 'dead:beef::dcad:beff:feef:0', | ||||
|                                            'netmask': '64'}], | ||||
|                            'ips': [{'enabled': '1', | ||||
|                                     'ip': '192.168.0.100', | ||||
|                                     'netmask': '255.255.255.0'}], | ||||
|                            'label': 'fake', | ||||
|                            'mac': 'DE:AD:BE:EF:00:00', | ||||
|                            'rxtx_cap': 3})] | ||||
|         self.conn.spawn(instance, network_info) | ||||
|         self.create_vm_record(self.conn, os_type, instance_id) | ||||
|         self.check_vm_record(self.conn, check_injection) | ||||
|         self.assertTrue(instance.os_type) | ||||
|         self.assertTrue(instance.architecture) | ||||
|  | ||||
|     def test_spawn_not_enough_memory(self): | ||||
|         FLAGS.xenapi_image_service = 'glance' | ||||
| @@ -437,7 +439,7 @@ class XenAPIVMTestCase(test.TestCase): | ||||
|     def test_spawn_vhd_glance_linux(self): | ||||
|         FLAGS.xenapi_image_service = 'glance' | ||||
|         self._test_spawn(glance_stubs.FakeGlance.IMAGE_VHD, None, None, | ||||
|                          os_type="linux") | ||||
|                          os_type="linux", architecture="x86-64") | ||||
|         self.check_vm_params_for_linux() | ||||
|  | ||||
|     def test_spawn_vhd_glance_swapdisk(self): | ||||
| @@ -466,7 +468,7 @@ class XenAPIVMTestCase(test.TestCase): | ||||
|     def test_spawn_vhd_glance_windows(self): | ||||
|         FLAGS.xenapi_image_service = 'glance' | ||||
|         self._test_spawn(glance_stubs.FakeGlance.IMAGE_VHD, None, None, | ||||
|                          os_type="windows") | ||||
|                          os_type="windows", architecture="i386") | ||||
|         self.check_vm_params_for_windows() | ||||
|  | ||||
|     def test_spawn_glance(self): | ||||
| @@ -630,7 +632,8 @@ class XenAPIVMTestCase(test.TestCase): | ||||
|             'kernel_id': 2, | ||||
|             'ramdisk_id': 3, | ||||
|             'instance_type_id': '3',  # m1.large | ||||
|             'os_type': 'linux'} | ||||
|             'os_type': 'linux', | ||||
|             'architecture': 'x86-64'} | ||||
|         instance = db.instance_create(self.context, values) | ||||
|         network_info = [({'bridge': 'fa0', 'id': 0, 'injected': False}, | ||||
|                           {'broadcast': '192.168.0.255', | ||||
| @@ -654,8 +657,8 @@ class XenAPIDiffieHellmanTestCase(test.TestCase): | ||||
|     """Unit tests for Diffie-Hellman code.""" | ||||
|     def setUp(self): | ||||
|         super(XenAPIDiffieHellmanTestCase, self).setUp() | ||||
|         self.alice = SimpleDH() | ||||
|         self.bob = SimpleDH() | ||||
|         self.alice = vmops.SimpleDH() | ||||
|         self.bob = vmops.SimpleDH() | ||||
|  | ||||
|     def test_shared(self): | ||||
|         alice_pub = self.alice.get_public() | ||||
| @@ -718,7 +721,8 @@ class XenAPIMigrateInstance(test.TestCase): | ||||
|                   'ramdisk_id': None, | ||||
|                   'local_gb': 5, | ||||
|                   'instance_type_id': '3',  # m1.large | ||||
|                   'os_type': 'linux'} | ||||
|                   'os_type': 'linux', | ||||
|                   'architecture': 'x86-64'} | ||||
|  | ||||
|         fake_utils.stub_out_utils_execute(self.stubs) | ||||
|         stubs.stub_out_migration_methods(self.stubs) | ||||
| @@ -772,6 +776,7 @@ class XenAPIDetermineDiskImageTestCase(test.TestCase): | ||||
|         self.fake_instance = FakeInstance() | ||||
|         self.fake_instance.id = 42 | ||||
|         self.fake_instance.os_type = 'linux' | ||||
|         self.fake_instance.architecture = 'x86-64' | ||||
|  | ||||
|     def assert_disk_type(self, disk_type): | ||||
|         dt = vm_utils.VMHelper.determine_disk_image_type( | ||||
| @@ -816,6 +821,28 @@ class XenAPIDetermineDiskImageTestCase(test.TestCase): | ||||
|         self.assert_disk_type(vm_utils.ImageType.DISK_VHD) | ||||
|  | ||||
|  | ||||
| class CompareVersionTestCase(test.TestCase): | ||||
|     def test_less_than(self): | ||||
|         """Test that cmp_version compares a as less than b""" | ||||
|         self.assertTrue(vmops.cmp_version('1.2.3.4', '1.2.3.5') < 0) | ||||
|  | ||||
|     def test_greater_than(self): | ||||
|         """Test that cmp_version compares a as greater than b""" | ||||
|         self.assertTrue(vmops.cmp_version('1.2.3.5', '1.2.3.4') > 0) | ||||
|  | ||||
|     def test_equal(self): | ||||
|         """Test that cmp_version compares a as equal to b""" | ||||
|         self.assertTrue(vmops.cmp_version('1.2.3.4', '1.2.3.4') == 0) | ||||
|  | ||||
|     def test_non_lexical(self): | ||||
|         """Test that cmp_version compares non-lexically""" | ||||
|         self.assertTrue(vmops.cmp_version('1.2.3.10', '1.2.3.4') > 0) | ||||
|  | ||||
|     def test_length(self): | ||||
|         """Test that cmp_version compares by length as last resort""" | ||||
|         self.assertTrue(vmops.cmp_version('1.2.3', '1.2.3.4') < 0) | ||||
|  | ||||
|  | ||||
| class FakeXenApi(object): | ||||
|     """Fake XenApi for testing HostState.""" | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Trey Morris
					Trey Morris