summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/tests/virt/vmwareapi/db_fakes.py2
-rw-r--r--nova/tests/virt/vmwareapi/test_vmwareapi.py65
-rw-r--r--nova/virt/vmwareapi/fake.py56
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: