diff options
-rw-r--r-- | nova/tests/virt/vmwareapi/db_fakes.py | 2 | ||||
-rw-r--r-- | nova/tests/virt/vmwareapi/test_vmwareapi.py | 65 | ||||
-rw-r--r-- | nova/virt/vmwareapi/fake.py | 56 |
3 files changed, 119 insertions, 4 deletions
diff --git a/nova/tests/virt/vmwareapi/db_fakes.py b/nova/tests/virt/vmwareapi/db_fakes.py index 93fcf6e13..87c3dde67 100644 --- a/nova/tests/virt/vmwareapi/db_fakes.py +++ b/nova/tests/virt/vmwareapi/db_fakes.py @@ -1,5 +1,6 @@ # vim: tabstop=4 shiftwidth=4 softtabstop=4 +# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. # Copyright (c) 2011 Citrix Systems, Inc. # Copyright 2011 OpenStack Foundation # @@ -74,6 +75,7 @@ def stub_out_db_instance_api(stubs): 'vcpus': type_data['vcpus'], 'mac_addresses': [{'address': values['mac_address']}], 'root_gb': type_data['root_gb'], + 'node': values['node'], } return FakeModel(base_options) diff --git a/nova/tests/virt/vmwareapi/test_vmwareapi.py b/nova/tests/virt/vmwareapi/test_vmwareapi.py index 69a9ffab8..5ba2f98af 100644 --- a/nova/tests/virt/vmwareapi/test_vmwareapi.py +++ b/nova/tests/virt/vmwareapi/test_vmwareapi.py @@ -1,5 +1,6 @@ # vim: tabstop=4 shiftwidth=4 softtabstop=4 +# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. # Copyright (c) 2012 VMware, Inc. # Copyright (c) 2011 Citrix Systems, Inc. # Copyright 2011 OpenStack Foundation @@ -111,6 +112,7 @@ class VMwareAPIVMTestCase(test.TestCase): use_linked_clone=False) self.user_id = 'fake' self.project_id = 'fake' + self.node_name = 'test_url' self.context = context.RequestContext(self.user_id, self.project_id) vmwareapi_fake.reset() db_fakes.stub_out_db_instance_api(self.stubs) @@ -143,6 +145,7 @@ class VMwareAPIVMTestCase(test.TestCase): 'ramdisk_id': "1", 'mac_address': "de:ad:be:ef:be:ef", 'instance_type': 'm1.large', + 'node': self.node_name, } self.instance = db.instance_create(None, values) @@ -500,6 +503,41 @@ class VMwareAPIVMTestCase(test.TestCase): def test_finish_revert_migration_power_off(self): self._test_finish_revert_migration(power_on=False) + def test_diagnostics_non_existent_vm(self): + self._create_instance_in_the_db() + self.assertRaises(exception.InstanceNotFound, + self.conn.get_diagnostics, + self.instance) + + def test_get_console_pool_info(self): + info = self.conn.get_console_pool_info("console_type") + self.assertEquals(info['address'], 'test_url') + self.assertEquals(info['username'], 'test_username') + self.assertEquals(info['password'], 'test_pass') + + def test_get_vnc_console_non_existent(self): + self._create_instance_in_the_db() + self.assertRaises(exception.InstanceNotFound, + self.conn.get_vnc_console, + self.instance) + + def test_get_vnc_console(self): + self._create_instance_in_the_db() + self._create_vm() + vnc_dict = self.conn.get_vnc_console(self.instance) + self.assertEquals(vnc_dict['host'], "test_url") + self.assertEquals(vnc_dict['port'], 5910) + + def test_host_ip_addr(self): + self.assertEquals(self.conn.get_host_ip_addr(), "test_url") + + def test_get_volume_connector(self): + self._create_instance_in_the_db() + connector_dict = self.conn.get_volume_connector(self.instance) + self.assertEquals(connector_dict['ip'], "test_url") + self.assertEquals(connector_dict['initiator'], "iscsi-name") + self.assertEquals(connector_dict['host'], "test_url") + class VMwareAPIHostTestCase(test.TestCase): """Unit tests for Vmware API host calls.""" @@ -547,3 +585,30 @@ class VMwareAPIHostTestCase(test.TestCase): def test_host_maintenance_off(self): self._test_host_action(self.conn.host_maintenance_mode, False) + + +class VMwareAPIVCDriverTestCase(VMwareAPIVMTestCase): + + def setUp(self): + super(VMwareAPIVCDriverTestCase, self).setUp() + self.flags( + vmwareapi_cluster_name='test_cluster', + vmwareapi_task_poll_interval=10, + vnc_enabled=False + ) + self.conn = driver.VMwareVCDriver(None, False) + + def tearDown(self): + super(VMwareAPIVCDriverTestCase, self).tearDown() + vmwareapi_fake.cleanup() + + def test_get_available_resource(self): + stats = self.conn.get_available_resource(self.node_name) + self.assertEquals(stats['vcpus'], 16) + self.assertEquals(stats['local_gb'], 1024) + self.assertEquals(stats['local_gb_used'], 1024 - 500) + self.assertEquals(stats['memory_mb'], 1024) + self.assertEquals(stats['memory_mb_used'], 1024 - 524) + self.assertEquals(stats['hypervisor_type'], 'VMware ESXi') + self.assertEquals(stats['hypervisor_version'], '5.0.0') + self.assertEquals(stats['hypervisor_hostname'], 'test_url') diff --git a/nova/virt/vmwareapi/fake.py b/nova/virt/vmwareapi/fake.py index 83c53e5cb..cd8302115 100644 --- a/nova/virt/vmwareapi/fake.py +++ b/nova/virt/vmwareapi/fake.py @@ -30,7 +30,7 @@ from nova.virt.vmwareapi import error_util _CLASSES = ['Datacenter', 'Datastore', 'ResourcePool', 'VirtualMachine', 'Network', 'HostSystem', 'HostNetworkSystem', 'Task', 'session', - 'files'] + 'files', 'ClusterComputeResource'] _FAKE_FILE_SIZE = 1024 @@ -61,6 +61,7 @@ def reset(): create_datacenter() create_datastore() create_res_pool() + create_cluster() def cleanup(): @@ -90,14 +91,20 @@ class Prop(object): self.val = None +class Obj(object): + def __init__(self, name, value): + self.value = value + self._type = name + + class ManagedObject(object): """Managed Data Object base class.""" - def __init__(self, name="ManagedObject", obj_ref=None): + def __init__(self, name="ManagedObject", obj_ref=None, value=None): """Sets the obj property which acts as a reference to the object.""" super(ManagedObject, self).__setattr__('objName', name) if obj_ref is None: - obj_ref = str(uuid.uuid4()) + obj_ref = Obj(name, value) object.__setattr__(self, 'obj', obj_ref) object.__setattr__(self, 'propSet', []) @@ -141,6 +148,10 @@ class DataObject(object): self.obj_name = obj_name +class HostInternetScsiHba(): + pass + + class VirtualDisk(DataObject): """ Virtual Disk class. @@ -186,7 +197,7 @@ class VirtualMachine(ManagedObject): """Virtual Machine class.""" def __init__(self, **kwargs): - super(VirtualMachine, self).__init__("VirtualMachine") + super(VirtualMachine, self).__init__("VirtualMachine", value='vm-10') self.set("name", kwargs.get("name")) self.set("runtime.connectionState", kwargs.get("conn_state", "connected")) @@ -250,6 +261,25 @@ class ResourcePool(ManagedObject): self.set("name", "ResPool") +class ClusterComputeResource(ManagedObject): + """Cluster class.""" + def __init__(self, **kwargs): + super(ClusterComputeResource, self).__init__("ClusterComputeResource", + value="domain-test") + r_pool = DataObject() + r_pool.ManagedObjectReference = [_get_objects("ResourcePool")[0].obj] + self.set("resourcePool", r_pool) + + host_sys = DataObject() + host_sys.ManagedObjectReference = [_get_objects("HostSystem")[0].obj] + self.set("host", host_sys) + self.set("name", "test_cluster") + + datastore = DataObject() + datastore.ManagedObjectReference = [_get_objects("Datastore")[0].obj] + self.set("datastore", datastore) + + class Datastore(ManagedObject): """Datastore class.""" @@ -347,6 +377,17 @@ class HostSystem(ManagedObject): host_pg.HostPortGroup = [host_pg_do] self.set("config.network.portgroup", host_pg) + config = DataObject() + storageDevice = DataObject() + + hostBusAdapter = HostInternetScsiHba() + hostBusAdapter.HostHostBusAdapter = [hostBusAdapter] + hostBusAdapter.iScsiName = "iscsi-name" + storageDevice.hostBusAdapter = hostBusAdapter + config.storageDevice = storageDevice + self.set("config.storageDevice.hostBusAdapter", + config.storageDevice.hostBusAdapter) + def _add_port_group(self, spec): """Adds a port group to the host system object in the db.""" pg_name = spec.name @@ -429,6 +470,11 @@ def create_network(): _create_object('Network', network) +def create_cluster(): + cluster = ClusterComputeResource() + _create_object('ClusterComputeResource', cluster) + + def create_task(task_name, state="running"): task = Task(task_name, state) _create_object("Task", task) @@ -682,6 +728,8 @@ class FakeVim(object): spec_set = kwargs.get("specSet")[0] type = spec_set.propSet[0].type properties = spec_set.propSet[0].pathSet + if not isinstance(properties, list): + properties = properties.split() objs = spec_set.objectSet lst_ret_objs = [] for obj in objs: |