From 2bfa91575d36363b16c25c29623f7ac988e844bb Mon Sep 17 00:00:00 2001 From: Ryu Ishimoto Date: Wed, 20 Jul 2011 22:22:07 +0900 Subject: First attempt at vmware API VIF driver integration --- nova/virt/vmwareapi/vmops.py | 29 ++++++++++++++++++++++++++--- nova/virt/vmwareapi_conn.py | 9 ++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/nova/virt/vmwareapi/vmops.py b/nova/virt/vmwareapi/vmops.py index 94d9e6226..eded4391e 100644 --- a/nova/virt/vmwareapi/vmops.py +++ b/nova/virt/vmwareapi/vmops.py @@ -31,6 +31,7 @@ from nova import db from nova import exception from nova import flags from nova import log as logging +from nova import utils from nova.compute import power_state from nova.virt.vmwareapi import vim_util from nova.virt.vmwareapi import vm_util @@ -38,6 +39,10 @@ from nova.virt.vmwareapi import vmware_images from nova.virt.vmwareapi import network_utils FLAGS = flags.FLAGS +flags.DEFINE_string('vmware_vif_driver', + 'nova.virt.vmwareapi.vif.VMWareVlanBridgeDriver', + 'The VMWare VIF driver to configure the VIFs.') + LOG = logging.getLogger("nova.virt.vmwareapi.vmops") VMWARE_POWER_STATES = { @@ -52,6 +57,7 @@ class VMWareVMOps(object): def __init__(self, session): """Initializer.""" self._session = session + self._vif_driver = utils.import_object(FLAGS.vmware_vif_driver) def _wait_with_callback(self, instance_id, task, callback): """Waits for the task to finish and does a callback after.""" @@ -83,7 +89,7 @@ class VMWareVMOps(object): LOG.debug(_("Got total of %s instances") % str(len(lst_vm_names))) return lst_vm_names - def spawn(self, instance): + def spawn(self, instance, network_info): """ Creates a VM instance. @@ -117,6 +123,7 @@ class VMWareVMOps(object): if network_ref is None: raise exception.NetworkNotFoundForBridge(bridge=net_name) + self.plug_vifs(instance, network_info) _check_if_network_bridge_exists() def _get_datastore_ref(): @@ -472,11 +479,14 @@ class VMWareVMOps(object): _clean_temp_data() - def reboot(self, instance): + def reboot(self, instance, network_info): """Reboot a VM instance.""" vm_ref = self._get_vm_ref_from_the_name(instance.name) if vm_ref is None: raise exception.InstanceNotFound(instance_id=instance.id) + + self.plug_vifs(instance, network_info) + lst_properties = ["summary.guest.toolsStatus", "runtime.powerState", "summary.guest.toolsRunningStatus"] props = self._session._call_method(vim_util, "get_object_properties", @@ -514,7 +524,7 @@ class VMWareVMOps(object): self._session._wait_for_task(instance.id, reset_task) LOG.debug(_("Did hard reboot of VM %s") % instance.name) - def destroy(self, instance): + def destroy(self, instance, network_info): """ Destroy a VM instance. Steps followed are: 1. Power off the VM, if it is in poweredOn state. @@ -560,6 +570,8 @@ class VMWareVMOps(object): LOG.warn(_("In vmwareapi:vmops:destroy, got this exception" " while un-registering the VM: %s") % str(excep)) + self._unplug_vifs(instance, network_info) + # Delete the folder holding the VM related content on # the datastore. try: @@ -784,3 +796,14 @@ class VMWareVMOps(object): if vm.propSet[0].val == vm_name: return vm.obj return None + + def plug_vifs(self, instance, network_info): + """Plug VIFs into networks.""" + for (network, mapping) in network_info: + self._vif_driver.plug(instance, network, mapping) + + def _unplug_vifs(self, instance, network_info): + """Unplug VIFs from networks.""" + for (network, mapping) in network_info: + self._vif_driver.unplug(instance, network, mapping) + diff --git a/nova/virt/vmwareapi_conn.py b/nova/virt/vmwareapi_conn.py index 9e15510ab..2492c9951 100644 --- a/nova/virt/vmwareapi_conn.py +++ b/nova/virt/vmwareapi_conn.py @@ -126,7 +126,7 @@ class VMWareESXConnection(driver.ComputeDriver): def spawn(self, instance, network_info, block_device_mapping=None): """Create VM instance.""" - self._vmops.spawn(instance) + self._vmops.spawn(instance, network_info) def snapshot(self, instance, name): """Create snapshot from a running VM instance.""" @@ -134,11 +134,11 @@ class VMWareESXConnection(driver.ComputeDriver): def reboot(self, instance, network_info): """Reboot VM instance.""" - self._vmops.reboot(instance) + self._vmops.reboot(instance, network_info) def destroy(self, instance, network_info): """Destroy VM instance.""" - self._vmops.destroy(instance) + self._vmops.destroy(instance, network_info) def pause(self, instance, callback): """Pause VM instance.""" @@ -194,6 +194,9 @@ class VMWareESXConnection(driver.ComputeDriver): """Sets the specified host's ability to accept new instances.""" pass + def plug_vifs(self, instance, network_info): + """Plugs in VIFs to networks.""" + self._vmops.plug_vifs(instance, network_info) class VMWareAPISession(object): """ -- cgit