From 9a1b486555ef5955ca7456e67f43b123a6327c94 Mon Sep 17 00:00:00 2001 From: Igor Gajsin Date: Tue, 27 Oct 2015 19:47:20 +0300 Subject: [PATCH] Change plugin for adoptation to Fuel 8.0 Initial support of Fuel 8.0. Change metadata and other stuff. Completed according changes for support new, granularted neutron tasks Change-Id: Id8580ef4a00cbc1d185bcb3da60c7f54e3bb2c67 --- deployment_scripts/del_predefined_networks.sh | 15 - deployment_scripts/install_the_driver.sh | 53 - .../puppet/manifests/override_hiera.pp | 3 + deployment_scripts/puppet/manifests/site.pp | 7 - .../puppet/modules/vmware_dvs/files/vif.py | 199 +++ .../modules/vmware_dvs/files/vm_util.py | 1538 +++++++++++++++++ .../puppet/parser/functions/override_hiera.rb | 35 + .../modules/vmware_dvs/manifests/init.pp | 82 +- deployment_tasks.yaml | 57 +- nova.patch | 30 - ...on-mech-vmware-dvs_2015.1.0.dev138_all.deb | Bin 58414 -> 0 bytes ...-vmware-dvs_2015.1.dev124.g3ac1fba_all.deb | Bin 0 -> 55304 bytes ...-vmware-dvs_2015.1.dev143.g6450918_all.deb | Bin 58082 -> 0 bytes specs/fuel-plugin-vmware-dvs.rst | 2 +- 14 files changed, 1837 insertions(+), 184 deletions(-) delete mode 100755 deployment_scripts/del_predefined_networks.sh delete mode 100755 deployment_scripts/install_the_driver.sh create mode 100644 deployment_scripts/puppet/manifests/override_hiera.pp create mode 100644 deployment_scripts/puppet/modules/vmware_dvs/files/vif.py create mode 100644 deployment_scripts/puppet/modules/vmware_dvs/files/vm_util.py create mode 100644 deployment_scripts/puppet/modules/vmware_dvs/lib/puppet/parser/functions/override_hiera.rb delete mode 100644 nova.patch delete mode 100644 repositories/ubuntu/python-mech-vmware-dvs_2015.1.0.dev138_all.deb create mode 100644 repositories/ubuntu/python-mech-vmware-dvs_2015.1.dev124.g3ac1fba_all.deb delete mode 100644 repositories/ubuntu/python-mech-vmware-dvs_2015.1.dev143.g6450918_all.deb diff --git a/deployment_scripts/del_predefined_networks.sh b/deployment_scripts/del_predefined_networks.sh deleted file mode 100755 index 1c5039e..0000000 --- a/deployment_scripts/del_predefined_networks.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -. /root/openrc -router=router04 - -neutron router-gateway-clear $router - -for port in $(neutron router-port-list $router| grep ip_a| cut -f 2 -d\ ); do - neutron router-interface-delete $router port=$port - neutron port-delete $port -done - -for net in $(neutron net-list|grep '/'|cut -f 4 -d\ ); do - neutron net-delete $net -done diff --git a/deployment_scripts/install_the_driver.sh b/deployment_scripts/install_the_driver.sh deleted file mode 100755 index 43fb5cf..0000000 --- a/deployment_scripts/install_the_driver.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash - -if [ -f /etc/primary-controller.yaml ]; then - ln -sf /etc/primary-controller.yaml /etc/astute.yaml -elif [ -f /etc/controller.yaml ]; then - ln -sf /etc/controller.yaml /etc/astute.yaml -fi - -plugin_name=fuel-plugin-vmware-dvs -plugin_version=1.1 -ip=`hiera master_ip` -role=`hiera role` -port=8080 -_hostname=$(hostname) - -function _restart_crm_resource { - res=$1 - _where=$(crm resource show $res| awk '{print $6}') - if [ "$_where" = "$_hostname" ]; - then - echo restart $res - crm resource restart $res - else - echo resource $res launched not here - echo does not restart - fi -} - -function _nova_patch { - wget -O /usr/lib/python2.7/dist-packages/nova.patch "http://$ip:$port/plugins/$plugin_name-$plugin_version/nova.patch" && cd /usr/lib/python2.7/dist-packages/ ; patch -N -p1 < nova.patch - sed -i s/url_timeout=.*/url_timeout=3600/ /etc/nova/nova.conf - -} - -function _restart_nova { - for resource in $(crm_mon -1|awk '/nova_compute_vmware/ {print $1}'); do - _restart_crm_resource $resource - done -} - -case $role in -controller|primary-controller) - _nova_patch - _restart_nova - ;; -compute-vmware) - _nova_patch - service nova-compute restart - ;; -*) - echo "Not a vmware compute node" - ;; -esac diff --git a/deployment_scripts/puppet/manifests/override_hiera.pp b/deployment_scripts/puppet/manifests/override_hiera.pp new file mode 100644 index 0000000..441c73b --- /dev/null +++ b/deployment_scripts/puppet/manifests/override_hiera.pp @@ -0,0 +1,3 @@ +notice('MODULAR: vmware_dvs overrride hiera task') +$src = '/etc/hiera/override/plugins.yaml' +$res = override_hiera($src) diff --git a/deployment_scripts/puppet/manifests/site.pp b/deployment_scripts/puppet/manifests/site.pp index 1e780ee..6e5e840 100644 --- a/deployment_scripts/puppet/manifests/site.pp +++ b/deployment_scripts/puppet/manifests/site.pp @@ -17,15 +17,11 @@ notice('MODULAR: fuel-plugin-vmware-dvs') $vc_hash = hiera('vcenter', {}) $dvs_hash = hiera('fuel-plugin-vmware-dvs', {}) $neutron_hash = hiera('quantum_settings', {}) -$nets = $neutron_hash['predefined_networks'] $vsphere_hostname = inline_template('<%= @vc_hash["computes"][0]["vc_host"] %>') $vsphere_login = inline_template('<%= @vc_hash["computes"][0]["vc_user"] %>') $vsphere_password = inline_template('<%= @vc_hash["computes"][0]["vc_password"] %>') $dvs_network_maps = inline_template('<%= @dvs_hash["vmware_dvs_net_maps"] %>') $neutron_physnet = inline_template('<%= @neutron_hash["predefined_networks"]["net04"]["L2"]["physnet"] %>') -$access_hash = hiera('access', {}) -$keystone_admin_tenant = $access_hash[tenant] -$pnets = $neutron_hash['L2']['phys_nets'] class {'vmware_dvs': vsphere_hostname => $vsphere_hostname, @@ -33,9 +29,6 @@ class {'vmware_dvs': vsphere_password => $vsphere_password, network_maps => $dvs_network_maps, neutron_physnet => $neutron_physnet, - nets => $nets, - pnets => $pnets, - keystone_admin_tenant => $keystone_admin_tenant, driver_name => 'vmware_dvs', neutron_url_timeout => '3600', } diff --git a/deployment_scripts/puppet/modules/vmware_dvs/files/vif.py b/deployment_scripts/puppet/modules/vmware_dvs/files/vif.py new file mode 100644 index 0000000..d776838 --- /dev/null +++ b/deployment_scripts/puppet/modules/vmware_dvs/files/vif.py @@ -0,0 +1,199 @@ +# Copyright (c) 2011 Citrix Systems, Inc. +# Copyright 2011 OpenStack Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""VIF drivers for VMware.""" + +from oslo_config import cfg +from oslo_log import log as logging +from oslo_vmware import exceptions as vexc +from oslo_vmware import vim_util as vutil + +from nova import exception +from nova.i18n import _LW +from nova.network import model +from nova.virt.vmwareapi import network_util +from nova.virt.vmwareapi import vm_util + +LOG = logging.getLogger(__name__) +CONF = cfg.CONF + +vmwareapi_vif_opts = [ + cfg.StrOpt('vlan_interface', + default='vmnic0', + help='Physical ethernet adapter name for vlan networking'), + cfg.StrOpt('integration_bridge', + default='br-int', + help='Name of Integration Bridge'), +] + +CONF.register_opts(vmwareapi_vif_opts, 'vmware') + + +def _get_associated_vswitch_for_interface(session, interface, cluster=None): + # Check if the physical network adapter exists on the host. + if not network_util.check_if_vlan_interface_exists(session, + interface, cluster): + raise exception.NetworkAdapterNotFound(adapter=interface) + # Get the vSwitch associated with the Physical Adapter + vswitch_associated = network_util.get_vswitch_for_vlan_interface( + session, interface, cluster) + if not vswitch_associated: + raise exception.SwitchNotFoundForNetworkAdapter(adapter=interface) + return vswitch_associated + + +def ensure_vlan_bridge(session, vif, cluster=None, create_vlan=True): + """Create a vlan and bridge unless they already exist.""" + vlan_num = vif['network'].get_meta('vlan') + bridge = vif['network']['bridge'] + vlan_interface = CONF.vmware.vlan_interface + + network_ref = network_util.get_network_with_the_name(session, bridge, + cluster) + if network_ref and network_ref['type'] == 'DistributedVirtualPortgroup': + return network_ref + + if not network_ref: + # Create a port group on the vSwitch associated with the + # vlan_interface corresponding physical network adapter on the ESX + # host. + vswitch_associated = _get_associated_vswitch_for_interface(session, + vlan_interface, cluster) + network_util.create_port_group(session, bridge, + vswitch_associated, + vlan_num if create_vlan else 0, + cluster) + network_ref = network_util.get_network_with_the_name(session, + bridge, + cluster) + elif create_vlan: + # Get the vSwitch associated with the Physical Adapter + vswitch_associated = _get_associated_vswitch_for_interface(session, + vlan_interface, cluster) + # Get the vlan id and vswitch corresponding to the port group + _get_pg_info = network_util.get_vlanid_and_vswitch_for_portgroup + pg_vlanid, pg_vswitch = _get_pg_info(session, bridge, cluster) + + # Check if the vswitch associated is proper + if pg_vswitch != vswitch_associated: + raise exception.InvalidVLANPortGroup( + bridge=bridge, expected=vswitch_associated, + actual=pg_vswitch) + + # Check if the vlan id is proper for the port group + if pg_vlanid != vlan_num: + raise exception.InvalidVLANTag(bridge=bridge, tag=vlan_num, + pgroup=pg_vlanid) + return network_ref + + +def _is_valid_opaque_network_id(opaque_id, bridge_id, integration_bridge, + num_networks): + return (opaque_id == bridge_id or + (num_networks == 1 and + opaque_id == integration_bridge)) + + +def _get_network_ref_from_opaque(opaque_networks, integration_bridge, bridge): + num_networks = len(opaque_networks) + for network in opaque_networks: + if _is_valid_opaque_network_id(network['opaqueNetworkId'], bridge, + integration_bridge, num_networks): + return {'type': 'OpaqueNetwork', + 'network-id': network['opaqueNetworkId'], + 'network-name': network['opaqueNetworkName'], + 'network-type': network['opaqueNetworkType']} + LOG.warning(_LW("No valid network found in %(opaque)s, from %(bridge)s " + "or %(integration_bridge)s"), + {'opaque': opaque_networks, 'bridge': bridge, + 'integration_bridge': integration_bridge}) + + +def _get_opaque_network(session, cluster): + host = vm_util.get_host_ref(session, cluster) + try: + opaque = session._call_method(vutil, + "get_object_property", + host, + "config.network.opaqueNetwork") + except vexc.InvalidPropertyException: + opaque = None + return opaque + + +def get_neutron_network(session, network_name, cluster, vif): + opaque = None + if vif['type'] != model.VIF_TYPE_DVS: + opaque = _get_opaque_network(session, cluster) + if opaque: + bridge = vif['network']['id'] + opaque_networks = opaque.HostOpaqueNetworkInfo + network_ref = _get_network_ref_from_opaque(opaque_networks, + CONF.vmware.integration_bridge, bridge) + else: + bridge = network_name + network_ref = network_util.get_network_with_the_name( + session, network_name, cluster) + if not network_ref: + raise exception.NetworkNotFoundForBridge(bridge=bridge) + return network_ref + + +def get_network_ref(session, cluster, vif, is_neutron): + if is_neutron: + network_name = (vif['network']['bridge'] or + CONF.vmware.integration_bridge) + network_ref = get_neutron_network(session, network_name, cluster, vif) + try: + network_ref['dvs_port_key']=vif['details']['dvs_port_key'] + except KeyError: + pass + else: + create_vlan = vif['network'].get_meta('should_create_vlan', False) + network_ref = ensure_vlan_bridge(session, vif, cluster=cluster, + create_vlan=create_vlan) + return network_ref + + +def get_vif_dict(session, cluster, vif_model, is_neutron, vif): + mac = vif['address'] + name = vif['network']['bridge'] or CONF.vmware.integration_bridge + ref = get_network_ref(session, cluster, vif, is_neutron) + return {'network_name': name, + 'mac_address': mac, + 'network_ref': ref, + 'iface_id': vif['id'], + 'vif_model': vif_model} + + +def get_vif_info(session, cluster, is_neutron, vif_model, network_info): + vif_infos = [] + if network_info is None: + return vif_infos + for vif in network_info: + vif_infos.append(get_vif_dict(session, cluster, vif_model, + is_neutron, vif)) + return vif_infos + + +def get_network_device(hardware_devices, mac_address): + """Return the network device with MAC 'mac_address'.""" + if hardware_devices.__class__.__name__ == "ArrayOfVirtualDevice": + hardware_devices = hardware_devices.VirtualDevice + for device in hardware_devices: + if device.__class__.__name__ in vm_util.ALL_SUPPORTED_NETWORK_DEVICES: + if hasattr(device, 'macAddress'): + if device.macAddress == mac_address: + return device diff --git a/deployment_scripts/puppet/modules/vmware_dvs/files/vm_util.py b/deployment_scripts/puppet/modules/vmware_dvs/files/vm_util.py new file mode 100644 index 0000000..eea88db --- /dev/null +++ b/deployment_scripts/puppet/modules/vmware_dvs/files/vm_util.py @@ -0,0 +1,1538 @@ +# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. +# Copyright (c) 2012 VMware, Inc. +# Copyright (c) 2011 Citrix Systems, Inc. +# Copyright 2011 OpenStack Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +""" +The VMware API VM utility module to build SOAP object specs. +""" + +import collections +import copy +import functools + +from oslo_config import cfg +from oslo_log import log as logging +from oslo_utils import excutils +from oslo_utils import units +from oslo_vmware import exceptions as vexc +from oslo_vmware.objects import datastore as ds_obj +from oslo_vmware import pbm +from oslo_vmware import vim_util as vutil +import six + +from nova import exception +from nova.i18n import _, _LE, _LI, _LW +from nova.network import model as network_model +from nova.virt.vmwareapi import constants +from nova.virt.vmwareapi import vim_util + +LOG = logging.getLogger(__name__) + +vmware_utils_opts = [ + cfg.IntOpt('console_delay_seconds', + help='Set this value if affected by an increased network ' + 'latency causing repeated characters when typing in ' + 'a remote console.'), + cfg.StrOpt('serial_port_service_uri', + help='Identifies the remote system that serial port traffic ' + 'will be sent to. If this is not set, no serial ports ' + 'will be added to the created VMs.'), + cfg.StrOpt('serial_port_proxy_uri', + help='Identifies a proxy service that provides network access ' + 'to the serial_port_service_uri. This option is ignored ' + 'if serial_port_service_uri is not specified.'), + ] + +CONF = cfg.CONF +CONF.register_opts(vmware_utils_opts, 'vmware') + +ALL_SUPPORTED_NETWORK_DEVICES = ['VirtualE1000', 'VirtualE1000e', + 'VirtualPCNet32', 'VirtualSriovEthernetCard', + 'VirtualVmxnet', 'VirtualVmxnet3'] + +# A cache for VM references. The key will be the VM name +# and the value is the VM reference. The VM name is unique. This +# is either the UUID of the instance or UUID-rescue in the case +# that this is a rescue VM. This is in order to prevent +# unnecessary communication with the backend. +_VM_REFS_CACHE = {} + + +class Limits(object): + + def __init__(self, limit=None, reservation=None, + shares_level=None, shares_share=None): + """imits object holds instance limits for convenience.""" + self.limit = limit + self.reservation = reservation + self.shares_level = shares_level + self.shares_share = shares_share + + def validate(self): + if self.shares_level in ('high', 'normal', 'low'): + if self.shares_share: + reason = _("Share level '%s' cannot have share " + "configured") % self.shares_level + raise exception.InvalidInput(reason=reason) + return + if self.shares_level == 'custom': + return + if self.shares_level: + reason = _("Share '%s' is not supported") % self.shares_level + raise exception.InvalidInput(reason=reason) + + def has_limits(self): + return bool(self.limit or + self.reservation or + self.shares_level) + + +class ExtraSpecs(object): + + def __init__(self, cpu_limits=None, hw_version=None, + storage_policy=None, cores_per_socket=None, + memory_limits=None, disk_io_limits=None): + """ExtraSpecs object holds extra_specs for the instance.""" + if cpu_limits is None: + cpu_limits = Limits() + self.cpu_limits = cpu_limits + if memory_limits is None: + memory_limits = Limits() + self.memory_limits = memory_limits + if disk_io_limits is None: + disk_io_limits = Limits() + self.disk_io_limits = disk_io_limits + self.hw_version = hw_version + self.storage_policy = storage_policy + self.cores_per_socket = cores_per_socket + + +def vm_refs_cache_reset(): + global _VM_REFS_CACHE + _VM_REFS_CACHE = {} + + +def vm_ref_cache_delete(id): + _VM_REFS_CACHE.pop(id, None) + + +def vm_ref_cache_update(id, vm_ref): + _VM_REFS_CACHE[id] = vm_ref + + +def vm_ref_cache_get(id): + return _VM_REFS_CACHE.get(id) + + +def _vm_ref_cache(id, func, session, data): + vm_ref = vm_ref_cache_get(id) + if not vm_ref: + vm_ref = func(session, data) + vm_ref_cache_update(id, vm_ref) + return vm_ref + + +def vm_ref_cache_from_instance(func): + @functools.wraps(func) + def wrapper(session, instance): + id = instance.uuid + return _vm_ref_cache(id, func, session, instance) + return wrapper + + +def vm_ref_cache_from_name(func): + @functools.wraps(func) + def wrapper(session, name): + id = name + return _vm_ref_cache(id, func, session, name) + return wrapper + +# the config key which stores the VNC port +VNC_CONFIG_KEY = 'config.extraConfig["RemoteDisplay.vnc.port"]' + +VmdkInfo = collections.namedtuple('VmdkInfo', ['path', 'adapter_type', + 'disk_type', + 'capacity_in_bytes', + 'device']) + + +def _iface_id_option_value(client_factory, iface_id, port_index): + opt = client_factory.create('ns0:OptionValue') + opt.key = "nvp.iface-id.%d" % port_index + opt.value = iface_id + return opt + + +def _get_allocation_info(client_factory, limits, allocation_type): + allocation = client_factory.create(allocation_type) + if limits.limit: + allocation.limit = limits.limit + else: + # Set as 'umlimited' + allocation.limit = -1 + if limits.reservation: + allocation.reservation = limits.reservation + else: + allocation.reservation = 0 + shares = client_factory.create('ns0:SharesInfo') + if limits.shares_level: + shares.level = limits.shares_level + if (shares.level == 'custom' and + limits.shares_share): + shares.shares = limits.shares_share + else: + shares.shares = 0 + else: + shares.level = 'normal' + shares.shares = 0 + allocation.shares = shares + return allocation + + +def get_vm_create_spec(client_factory, instance, data_store_name, + vif_infos, extra_specs, + os_type=constants.DEFAULT_OS_TYPE, + profile_spec=None, metadata=None): + """Builds the VM Create spec.""" + config_spec = client_factory.create('ns0:VirtualMachineConfigSpec') + config_spec.name = instance.uuid + config_spec.guestId = os_type + # The name is the unique identifier for the VM. + config_spec.instanceUuid = instance.uuid + if metadata: + config_spec.annotation = metadata + # set the Hardware version + config_spec.version = extra_specs.hw_version + + # Allow nested hypervisor instances to host 64 bit VMs. + if os_type in ("vmkernel5Guest", "vmkernel6Guest", "windowsHyperVGuest"): + config_spec.nestedHVEnabled = "True" + + # Append the profile spec + if profile_spec: + config_spec.vmProfile = [profile_spec] + + vm_file_info = client_factory.create('ns0:VirtualMachineFileInfo') + vm_file_info.vmPathName = "[" + data_store_name + "]" + config_spec.files = vm_file_info + + tools_info = client_factory.create('ns0:ToolsConfigInfo') + tools_info.afterPowerOn = True + tools_info.afterResume = True + tools_info.beforeGuestStandby = True + tools_info.beforeGuestShutdown = True + tools_info.beforeGuestReboot = True + + config_spec.tools = tools_info + config_spec.numCPUs = int(instance.vcpus) + if extra_specs.cores_per_socket: + config_spec.numCoresPerSocket = int(extra_specs.cores_per_socket) + config_spec.memoryMB = int(instance.memory_mb) + + # Configure cpu information + if extra_specs.cpu_limits.has_limits(): + config_spec.cpuAllocation = _get_allocation_info( + client_factory, extra_specs.cpu_limits, + 'ns0:ResourceAllocationInfo') + + # Configure memory information + if extra_specs.memory_limits.has_limits(): + config_spec.memoryAllocation = _get_allocation_info( + client_factory, extra_specs.memory_limits, + 'ns0:ResourceAllocationInfo') + + devices = [] + for vif_info in vif_infos: + vif_spec = _create_vif_spec(client_factory, vif_info) + devices.append(vif_spec) + + serial_port_spec = create_serial_port_spec(client_factory) + if serial_port_spec: + devices.append(serial_port_spec) + + config_spec.deviceChange = devices + + # add vm-uuid and iface-id.x values for Neutron + extra_config = [] + opt = client_factory.create('ns0:OptionValue') + opt.key = "nvp.vm-uuid" + opt.value = instance.uuid + extra_config.append(opt) + + port_index = 0 + for vif_info in vif_infos: + if vif_info['iface_id']: + extra_config.append(_iface_id_option_value(client_factory, + vif_info['iface_id'], + port_index)) + port_index += 1 + + if (CONF.vmware.console_delay_seconds and + CONF.vmware.console_delay_seconds > 0): + opt = client_factory.create('ns0:OptionValue') + opt.key = 'keyboard.typematicMinDelay' + opt.value = CONF.vmware.console_delay_seconds * 1000000 + extra_config.append(opt) + + config_spec.extraConfig = extra_config + + # Set the VM to be 'managed' by 'OpenStack' + managed_by = client_factory.create('ns0:ManagedByInfo') + managed_by.extensionKey = constants.EXTENSION_KEY + managed_by.type = constants.EXTENSION_TYPE_INSTANCE + config_spec.managedBy = managed_by + + return config_spec + + +def create_serial_port_spec(client_factory): + """Creates config spec for serial port.""" + if not CONF.vmware.serial_port_service_uri: + return + + backing = client_factory.create('ns0:VirtualSerialPortURIBackingInfo') + backing.direction = "server" + backing.serviceURI = CONF.vmware.serial_port_service_uri + backing.proxyURI = CONF.vmware.serial_port_proxy_uri + + connectable_spec = client_factory.create('ns0:VirtualDeviceConnectInfo') + connectable_spec.startConnected = True + connectable_spec.allowGuestControl = True + connectable_spec.connected = True + + serial_port = client_factory.create('ns0:VirtualSerialPort') + serial_port.connectable = connectable_spec + serial_port.backing = backing + # we are using unique negative integers as temporary keys + serial_port.key = -2 + serial_port.yieldOnPoll = True + dev_spec = client_factory.create('ns0:VirtualDeviceConfigSpec') + dev_spec.operation = "add" + dev_spec.device = serial_port + return dev_spec + + +def get_vm_boot_spec(client_factory, device): + """Returns updated boot settings for the instance. + + The boot order for the instance will be changed to have the + input device as the boot disk. + """ + config_spec = client_factory.create('ns0:VirtualMachineConfigSpec') + boot_disk = client_factory.create( + 'ns0:VirtualMachineBootOptionsBootableDiskDevice') + boot_disk.deviceKey = device.key + boot_options = client_factory.create('ns0:VirtualMachineBootOptions') + boot_options.bootOrder = [boot_disk] + config_spec.bootOptions = boot_options + return config_spec + + +def get_vm_resize_spec(client_factory, vcpus, memory_mb, extra_specs, + metadata=None): + """Provides updates for a VM spec.""" + resize_spec = client_factory.create('ns0:VirtualMachineConfigSpec') + resize_spec.numCPUs = vcpus + resize_spec.memoryMB = memory_mb + resize_spec.cpuAllocation = _get_allocation_info( + client_factory, extra_specs.cpu_limits, + 'ns0:ResourceAllocationInfo') + if metadata: + resize_spec.annotation = metadata + return resize_spec + + +def create_controller_spec(client_factory, key, + adapter_type=constants.DEFAULT_ADAPTER_TYPE): + """Builds a Config Spec for the LSI or Bus Logic Controller's addition + which acts as the controller for the virtual hard disk to be attached + to the VM. + """ + # Create a controller for the Virtual Hard Disk + virtual_device_config = client_factory.create( + 'ns0:VirtualDeviceConfigSpec') + virtual_device_config.operation = "add" + if adapter_type == constants.ADAPTER_TYPE_BUSLOGIC: + virtual_controller = client_factory.create( + 'ns0:VirtualBusLogicController') + elif adapter_type == constants.ADAPTER_TYPE_LSILOGICSAS: + virtual_controller = client_factory.create( + 'ns0:VirtualLsiLogicSASController') + elif adapter_type == constants.ADAPTER_TYPE_PARAVIRTUAL: + virtual_controller = client_factory.create( + 'ns0:ParaVirtualSCSIController') + else: + virtual_controller = client_factory.create( + 'ns0:VirtualLsiLogicController') + virtual_controller.key = key + virtual_controller.busNumber = 0 + virtual_controller.sharedBus = "noSharing" + virtual_device_config.device = virtual_controller + return virtual_device_config + + +def convert_vif_model(name): + """Converts standard VIF_MODEL types to the internal VMware ones.""" + if name == network_model.VIF_MODEL_E1000: + return 'VirtualE1000' + if name == network_model.VIF_MODEL_E1000E: + return 'VirtualE1000e' + if name == network_model.VIF_MODEL_PCNET: + return 'VirtualPCNet32' + if name == network_model.VIF_MODEL_SRIOV: + return 'VirtualSriovEthernetCard' + if name == network_model.VIF_MODEL_VMXNET: + return 'VirtualVmxnet' + if name == network_model.VIF_MODEL_VMXNET3: + return 'VirtualVmxnet3' + if name not in ALL_SUPPORTED_NETWORK_DEVICES: + msg = _('%s is not supported.') % name + raise exception.Invalid(msg) + return name + + +def _create_vif_spec(client_factory, vif_info): + """Builds a config spec for the addition of a new network + adapter to the VM. + """ + network_spec = client_factory.create('ns0:VirtualDeviceConfigSpec') + network_spec.operation = "add" + + # Keep compatible with other Hyper vif model parameter. + vif_info['vif_model'] = convert_vif_model(vif_info['vif_model']) + + vif = 'ns0:' + vif_info['vif_model'] + net_device = client_factory.create(vif) + + # NOTE(asomya): Only works on ESXi if the portgroup binding is set to + # ephemeral. Invalid configuration if set to static and the NIC does + # not come up on boot if set to dynamic. + network_ref = vif_info['network_ref'] + network_name = vif_info['network_name'] + mac_address = vif_info['mac_address'] + backing = None + if network_ref and network_ref['type'] == 'OpaqueNetwork': + backing = client_factory.create( + 'ns0:VirtualEthernetCardOpaqueNetworkBackingInfo') + backing.opaqueNetworkId = network_ref['network-id'] + backing.opaqueNetworkType = network_ref['network-type'] + elif (network_ref and + network_ref['type'] == "DistributedVirtualPortgroup"): + backing = client_factory.create( + 'ns0:VirtualEthernetCardDistributedVirtualPortBackingInfo') + portgroup = client_factory.create( + 'ns0:DistributedVirtualSwitchPortConnection') + portgroup.switchUuid = network_ref['dvsw'] + portgroup.portgroupKey = network_ref['dvpg'] + try: + portgroup.portKey = network_ref['dvs_port_key'] + except KeyError: + pass + backing.port = portgroup + else: + backing = client_factory.create( + 'ns0:VirtualEthernetCardNetworkBackingInfo') + backing.deviceName = network_name + + connectable_spec = client_factory.create('ns0:VirtualDeviceConnectInfo') + connectable_spec.startConnected = True + connectable_spec.allowGuestControl = True + connectable_spec.connected = True + + net_device.connectable = connectable_spec + net_device.backing = backing + + # The Server assigns a Key to the device. Here we pass a -ve temporary key. + # -ve because actual keys are +ve numbers and we don't + # want a clash with the key that server might associate with the device + net_device.key = -47 + net_device.addressType = "manual" + net_device.macAddress = mac_address + net_device.wakeOnLanEnabled = True + + network_spec.device = net_device + return network_spec + + +def get_network_attach_config_spec(client_factory, vif_info, index): + """Builds the vif attach config spec.""" + config_spec = client_factory.create('ns0:VirtualMachineConfigSpec') + vif_spec = _create_vif_spec(client_factory, vif_info) + config_spec.deviceChange = [vif_spec] + if vif_info['iface_id'] is not None: + config_spec.extraConfig = [_iface_id_option_value(client_factory, + vif_info['iface_id'], + index)] + return config_spec + + +def get_network_detach_config_spec(client_factory, device, port_index): + """Builds the vif detach config spec.""" + config_spec = client_factory.create('ns0:VirtualMachineConfigSpec') + virtual_device_config = client_factory.create( + 'ns0:VirtualDeviceConfigSpec') + virtual_device_config.operation = "remove" + virtual_device_config.device = device + config_spec.deviceChange = [virtual_device_config] + # If a key is already present then it cannot be deleted, only updated. + # This enables us to reuse this key if there is an additional + # attachment. The keys need to be preserved. This is due to the fact + # that there is logic on the ESX that does the network wiring + # according to these values. If they are changed then this will + # break networking to and from the interface. + config_spec.extraConfig = [_iface_id_option_value(client_factory, + 'free', + port_index)] + return config_spec + + +def get_storage_profile_spec(session, storage_policy): + """Gets the vm profile spec configured for storage policy.""" + profile_id = pbm.get_profile_id_by_name(session, storage_policy) + if profile_id: + client_factory = session.vim.client.factory + storage_profile_spec = client_factory.create( + 'ns0:VirtualMachineDefinedProfileSpec') + storage_profile_spec.profileId = profile_id.uniqueId + return storage_profile_spec + + +def get_vmdk_attach_config_spec(client_factory, + disk_type=constants.DEFAULT_DISK_TYPE, + file_path=None, + disk_size=None, + linked_clone=False, + controller_key=None, + unit_number=None, + device_name=None, + disk_io_limits=None): + """Builds the vmdk attach config spec.""" + config_spec = client_factory.create('ns0:VirtualMachineConfigSpec') + + device_config_spec = [] + virtual_device_config_spec = _create_virtual_disk_spec(client_factory, + controller_key, disk_type, file_path, + disk_size, linked_clone, + unit_number, device_name, disk_io_limits) + + device_config_spec.append(virtual_device_config_spec) + + config_spec.deviceChange = device_config_spec + return config_spec + + +def get_cdrom_attach_config_spec(client_factory, + datastore, + file_path, + controller_key, + cdrom_unit_number): + """Builds and returns the cdrom attach config spec.""" + config_spec = client_factory.create('ns0:VirtualMachineConfigSpec') + + device_config_spec = [] + virtual_device_config_spec = create_virtual_cdrom_spec(client_factory, + datastore, + controller_key, + file_path, + cdrom_unit_number) + + device_config_spec.append(virtual_device_config_spec) + + config_spec.deviceChange = device_config_spec + return config_spec + + +def get_vmdk_detach_config_spec(client_factory, device, + destroy_disk=False): + """Builds the vmdk detach config spec.""" + config_spec = client_factory.create('ns0:VirtualMachineConfigSpec') + + device_config_spec = [] + virtual_device_config_spec = detach_virtual_disk_spec(client_factory, + device, + destroy_disk) + + device_config_spec.append(virtual_device_config_spec) + + config_spec.deviceChange = device_config_spec + return config_spec + + +def get_vm_extra_config_spec(client_factory, extra_opts): + """Builds extra spec fields from a dictionary.""" + config_spec = client_factory.create('ns0:VirtualMachineConfigSpec') + # add the key value pairs + extra_config = [] + for key, value in six.iteritems(extra_opts): + opt = client_factory.create('ns0:OptionValue') + opt.key = key + opt.value = value + extra_config.append(opt) + config_spec.extraConfig = extra_config + return config_spec + + +def _get_device_capacity(device): + # Devices pre-vSphere-5.5 only reports capacityInKB, which has + # rounding inaccuracies. Use that only if the more accurate + # attribute is absent. + if hasattr(device, 'capacityInBytes'): + return device.capacityInBytes + else: + return device.capacityInKB * units.Ki + + +def _get_device_disk_type(device): + if getattr(device.backing, 'thinProvisioned', False): + return constants.DISK_TYPE_THIN + else: + if getattr(device.backing, 'eagerlyScrub', False): + return constants.DISK_TYPE_EAGER_ZEROED_THICK + else: + return constants.DEFAULT_DISK_TYPE + + +def get_vmdk_info(session, vm_ref, uuid=None): + """Returns information for the primary VMDK attached to the given VM.""" + hardware_devices = session._call_method(vutil, + "get_object_property", + vm_ref, + "config.hardware.device") + if hardware_devices.__class__.__name__ == "ArrayOfVirtualDevice": + hardware_devices = hardware_devices.VirtualDevice + vmdk_file_path = None + vmdk_controller_key = None + disk_type = None + capacity_in_bytes = 0 + + # Determine if we need to get the details of the root disk + root_disk = None + root_device = None + if uuid: + root_disk = '%s.vmdk' % uuid + vmdk_device = None + + adapter_type_dict = {} + for device in hardware_devices: + if device.__class__.__name__ == "VirtualDisk": + if device.backing.__class__.__name__ == \ + "VirtualDiskFlatVer2BackingInfo": + path = ds_obj.DatastorePath.parse(device.backing.fileName) + if root_disk and path.basename == root_disk: + root_device = device + vmdk_device = device + elif device.__class__.__name__ == "VirtualLsiLogicController": + adapter_type_dict[device.key] = constants.DEFAULT_ADAPTER_TYPE + elif device.__class__.__name__ == "VirtualBusLogicController": + adapter_type_dict[device.key] = constants.ADAPTER_TYPE_BUSLOGIC + elif device.__class__.__name__ == "VirtualIDEController": + adapter_type_dict[device.key] = constants.ADAPTER_TYPE_IDE + elif device.__class__.__name__ == "VirtualLsiLogicSASController": + adapter_type_dict[device.key] = constants.ADAPTER_TYPE_LSILOGICSAS + elif device.__class__.__name__ == "ParaVirtualSCSIController": + adapter_type_dict[device.key] = constants.ADAPTER_TYPE_PARAVIRTUAL + + if root_disk: + vmdk_device = root_device + + if vmdk_device: + vmdk_file_path = vmdk_device.backing.fileName + capacity_in_bytes = _get_device_capacity(vmdk_device) + vmdk_controller_key = vmdk_device.controllerKey + disk_type = _get_device_disk_type(vmdk_device) + + adapter_type = adapter_type_dict.get(vmdk_controller_key) + return VmdkInfo(vmdk_file_path, adapter_type, disk_type, + capacity_in_bytes, vmdk_device) + + +scsi_controller_classes = { + 'ParaVirtualSCSIController': constants.ADAPTER_TYPE_PARAVIRTUAL, + 'VirtualLsiLogicController': constants.DEFAULT_ADAPTER_TYPE, + 'VirtualLsiLogicSASController': constants.ADAPTER_TYPE_LSILOGICSAS, + 'VirtualBusLogicController': constants.ADAPTER_TYPE_PARAVIRTUAL, +} + + +def get_scsi_adapter_type(hardware_devices): + """Selects a proper iscsi adapter type from the existing + hardware devices + """ + if hardware_devices.__class__.__name__ == "ArrayOfVirtualDevice": + hardware_devices = hardware_devices.VirtualDevice + + for device in hardware_devices: + if device.__class__.__name__ in scsi_controller_classes: + # find the controllers which still have available slots + if len(device.device) < constants.SCSI_MAX_CONNECT_NUMBER: + # return the first match one + return scsi_controller_classes[device.__class__.__name__] + raise exception.StorageError( + reason=_("Unable to find iSCSI Target")) + + +def _find_controller_slot(controller_keys, taken, max_unit_number): + for controller_key in controller_keys: + for unit_number in range(max_unit_number): + if unit_number not in taken.get(controller_key, []): + return controller_key, unit_number + + +def _is_ide_controller(device): + return device.__class__.__name__ == 'VirtualIDEController' + + +def _is_scsi_controller(device): + return device.__class__.__name__ in ['VirtualLsiLogicController', + 'VirtualLsiLogicSASController', + 'VirtualBusLogicController', + 'ParaVirtualSCSIController'] + + +def _find_allocated_slots(devices): + """Return dictionary which maps controller_key to list of allocated unit + numbers for that controller_key. + """ + taken = {} + for device in devices: + if hasattr(device, 'controllerKey') and hasattr(device, 'unitNumber'): + unit_numbers = taken.setdefault(device.controllerKey, []) + unit_numbers.append(device.unitNumber) + if _is_scsi_controller(device): + # the SCSI controller sits on its own bus + unit_numbers = taken.setdefault(device.key, []) + unit_numbers.append(device.scsiCtlrUnitNumber) + return taken + + +def allocate_controller_key_and_unit_number(client_factory, devices, + adapter_type): + """This function inspects the current set of hardware devices and returns + controller_key and unit_number that can be used for attaching a new virtual + disk to adapter with the given adapter_type. + """ + if devices.__class__.__name__ == "ArrayOfVirtualDevice": + devices = devices.VirtualDevice + + taken = _find_allocated_slots(devices) + + ret = None + if adapter_type == constants.ADAPTER_TYPE_IDE: + ide_keys = [dev.key for dev in devices if _is_ide_controller(dev)] + ret = _find_controller_slot(ide_keys, taken, 2) + elif adapter_type in [constants.DEFAULT_ADAPTER_TYPE, + constants.ADAPTER_TYPE_LSILOGICSAS, + constants.ADAPTER_TYPE_BUSLOGIC, + constants.ADAPTER_TYPE_PARAVIRTUAL]: + scsi_keys = [dev.key for dev in devices if _is_scsi_controller(dev)] + ret = _find_controller_slot(scsi_keys, taken, 16) + if ret: + return ret[0], ret[1], None + + # create new controller with the specified type and return its spec + controller_key = -101 + controller_spec = create_controller_spec(client_factory, controller_key, + adapter_type) + return controller_key, 0, controller_spec + + +def get_rdm_disk(hardware_devices, uuid): + """Gets the RDM disk key.""" + if hardware_devices.__class__.__name__ == "ArrayOfVirtualDevice": + hardware_devices = hardware_devices.VirtualDevice + + for device in hardware_devices: + if (device.__class__.__name__ == "VirtualDisk" and + device.backing.__class__.__name__ == + "VirtualDiskRawDiskMappingVer1BackingInfo" and + device.backing.lunUuid == uuid): + return device + + +def get_vmdk_create_spec(client_factory, size_in_kb, + adapter_type=constants.DEFAULT_ADAPTER_TYPE, + disk_type=constants.DEFAULT_DISK_TYPE): + """Builds the virtual disk create spec.""" + create_vmdk_spec = client_factory.create('ns0:FileBackedVirtualDiskSpec') + create_vmdk_spec.adapterType = get_vmdk_adapter_type(adapter_type) + create_vmdk_spec.diskType = disk_type + create_vmdk_spec.capacityKb = size_in_kb + return create_vmdk_spec + + +def create_virtual_cdrom_spec(client_factory, + datastore, + controller_key, + file_path, + cdrom_unit_number): + """Builds spec for the creation of a new Virtual CDROM to the VM.""" + config_spec = client_factory.create( + 'ns0:VirtualDeviceConfigSpec') + config_spec.operation = "add" + + cdrom = client_factory.create('ns0:VirtualCdrom') + + cdrom_device_backing = client_factory.create( + 'ns0:VirtualCdromIsoBackingInfo') + cdrom_device_backing.datastore = datastore + cdrom_device_backing.fileName = file_path + + cdrom.backing = cdrom_device_backing + cdrom.controllerKey = controller_key + cdrom.unitNumber = cdrom_unit_number + cdrom.key = -1 + + connectable_spec = client_factory.create('ns0:VirtualDeviceConnectInfo') + connectable_spec.startConnected = True + connectable_spec.allowGuestControl = False + connectable_spec.connected = True + + cdrom.connectable = connectable_spec + + config_spec.device = cdrom + return config_spec + + +def _create_virtual_disk_spec(client_factory, controller_key, + disk_type=constants.DEFAULT_DISK_TYPE, + file_path=None, + disk_size=None, + linked_clone=False, + unit_number=None, + device_name=None, + disk_io_limits=None): + """Builds spec for the creation of a new/ attaching of an already existing + Virtual Disk to the VM. + """ + virtual_device_config = client_factory.create( + 'ns0:VirtualDeviceConfigSpec') + virtual_device_config.operation = "add" + if (file_path is None) or linked_clone: + virtual_device_config.fileOperation = "create" + + virtual_disk = client_factory.create('ns0:VirtualDisk') + + if disk_type == "rdm" or disk_type == "rdmp": + disk_file_backing = client_factory.create( + 'ns0:VirtualDiskRawDiskMappingVer1BackingInfo') + disk_file_backing.compatibilityMode = "virtualMode" \ + if disk_type == "rdm" else "physicalMode" + disk_file_backing.diskMode = "independent_persistent" + disk_file_backing.deviceName = device_name or "" + else: + disk_file_backing = client_factory.create( + 'ns0:VirtualDiskFlatVer2BackingInfo') + disk_file_backing.diskMode = "persistent" + if disk_type == constants.DISK_TYPE_THIN: + disk_file_backing.thinProvisioned = True + else: + if disk_type == constants.DISK_TYPE_EAGER_ZEROED_THICK: + disk_file_backing.eagerlyScrub = True + disk_file_backing.fileName = file_path or "" + + connectable_spec = client_factory.create('ns0:VirtualDeviceConnectInfo') + connectable_spec.startConnected = True + connectable_spec.allowGuestControl = False + connectable_spec.connected = True + + if not linked_clone: + virtual_disk.backing = disk_file_backing + else: + virtual_disk.backing = copy.copy(disk_file_backing) + virtual_disk.backing.fileName = "" + virtual_disk.backing.parent = disk_file_backing + virtual_disk.connectable = connectable_spec + + # The Server assigns a Key to the device. Here we pass a -ve random key. + # -ve because actual keys are +ve numbers and we don't + # want a clash with the key that server might associate with the device + virtual_disk.key = -100 + virtual_disk.controllerKey = controller_key + virtual_disk.unitNumber = unit_number or 0 + virtual_disk.capacityInKB = disk_size or 0 + + if disk_io_limits and disk_io_limits.has_limits(): + virtual_disk.storageIOAllocation = _get_allocation_info( + client_factory, disk_io_limits, + 'ns0:StorageIOAllocationInfo') + + virtual_device_config.device = virtual_disk + + return virtual_device_config + + +def detach_virtual_disk_spec(client_factory, device, destroy_disk=False): + """Builds spec for the detach of an already existing Virtual Disk from VM. + """ + virtual_device_config = client_factory.create( + 'ns0:VirtualDeviceConfigSpec') + virtual_device_config.operation = "remove" + if destroy_disk: + virtual_device_config.fileOperation = "destroy" + virtual_device_config.device = device + + return virtual_device_config + + +def clone_vm_spec(client_factory, location, + power_on=False, snapshot=None, template=False, config=None): + """Builds the VM clone spec.""" + clone_spec = client_factory.create('ns0:VirtualMachineCloneSpec') + clone_spec.location = location + clone_spec.powerOn = power_on + if snapshot: + clone_spec.snapshot = snapshot + if config is not None: + clone_spec.config = config + clone_spec.template = template + return clone_spec + + +def relocate_vm_spec(client_factory, datastore=None, host=None, + disk_move_type="moveAllDiskBackingsAndAllowSharing"): + """Builds the VM relocation spec.""" + rel_spec = client_factory.create('ns0:VirtualMachineRelocateSpec') + rel_spec.datastore = datastore + rel_spec.diskMoveType = disk_move_type + if host: + rel_spec.host = host + return rel_spec + + +def get_machine_id_change_spec(client_factory, machine_id_str): + """Builds the machine id change config spec.""" + virtual_machine_config_spec = client_factory.create( + 'ns0:VirtualMachineConfigSpec') + + opt = client_factory.create('ns0:OptionValue') + opt.key = "machine.id" + opt.value = machine_id_str + virtual_machine_config_spec.extraConfig = [opt] + return virtual_machine_config_spec + + +def get_add_vswitch_port_group_spec(client_factory, vswitch_name, + port_group_name, vlan_id): + """Builds the virtual switch port group add spec.""" + vswitch_port_group_spec = client_factory.create('ns0:HostPortGroupSpec') + vswitch_port_group_spec.name = port_group_name + vswitch_port_group_spec.vswitchName = vswitch_name + + # VLAN ID of 0 means that VLAN tagging is not to be done for the network. + vswitch_port_group_spec.vlanId = int(vlan_id) + + policy = client_factory.create('ns0:HostNetworkPolicy') + nicteaming = client_factory.create('ns0:HostNicTeamingPolicy') + nicteaming.notifySwitches = True + policy.nicTeaming = nicteaming + + vswitch_port_group_spec.policy = policy + return vswitch_port_group_spec + + +def get_vnc_config_spec(client_factory, port): + """Builds the vnc config spec.""" + virtual_machine_config_spec = client_factory.create( + 'ns0:VirtualMachineConfigSpec') + + opt_enabled = client_factory.create('ns0:OptionValue') + opt_enabled.key = "RemoteDisplay.vnc.enabled" + opt_enabled.value = "true" + opt_port = client_factory.create('ns0:OptionValue') + opt_port.key = "RemoteDisplay.vnc.port" + opt_port.value = port + opt_keymap = client_factory.create('ns0:OptionValue') + opt_keymap.key = "RemoteDisplay.vnc.keyMap" + opt_keymap.value = CONF.vnc.keymap + + extras = [opt_enabled, opt_port, opt_keymap] + + virtual_machine_config_spec.extraConfig = extras + return virtual_machine_config_spec + + +def get_vnc_port(session): + """Return VNC port for an VM or None if there is no available port.""" + min_port = CONF.vmware.vnc_port + port_total = CONF.vmware.vnc_port_total + allocated_ports = _get_allocated_vnc_ports(session) + max_port = min_port + port_total + for port in range(min_port, max_port): + if port not in allocated_ports: + return port + raise exception.ConsolePortRangeExhausted(min_port=min_port, + max_port=max_port) + + +def _get_allocated_vnc_ports(session): + """Return an integer set of all allocated VNC ports.""" + # TODO(rgerganov): bug #1256944 + # The VNC port should be unique per host, not per vCenter + vnc_ports = set() + result = session._call_method(vim_util, "get_objects", + "VirtualMachine", [VNC_CONFIG_KEY]) + while result: + for obj in result.objects: + if not hasattr(obj, 'propSet'): + continue + dynamic_prop = obj.propSet[0] + option_value = dynamic_prop.val + vnc_port = option_value.value + vnc_ports.add(int(vnc_port)) + result = session._call_method(vutil, 'continue_retrieval', + result) + return vnc_ports + + +def _get_object_for_value(results, value): + for object in results.objects: + if object.propSet[0].val == value: + return object.obj + + +def _get_object_for_optionvalue(results, value): + for object in results.objects: + if hasattr(object, "propSet") and object.propSet: + if object.propSet[0].val.value == value: + return object.obj + + +def _get_object_from_results(session, results, value, func): + while results: + object = func(results, value) + if object: + session._call_method(vutil, 'cancel_retrieval', + results) + return object + results = session._call_method(vutil, 'continue_retrieval', + results) + + +def _get_vm_ref_from_name(session, vm_name): + """Get reference to the VM with the name specified.""" + vms = session._call_method(vim_util, "get_objects", + "VirtualMachine", ["name"]) + return _get_object_from_results(session, vms, vm_name, + _get_object_for_value) + + +@vm_ref_cache_from_name +def get_vm_ref_from_name(session, vm_name): + return (_get_vm_ref_from_vm_uuid(session, vm_name) or + _get_vm_ref_from_name(session, vm_name)) + + +def _get_vm_ref_from_uuid(session, instance_uuid): + """Get reference to the VM with the uuid specified. + + This method reads all of the names of the VM's that are running + on the backend, then it filters locally the matching + instance_uuid. It is far more optimal to use + _get_vm_ref_from_vm_uuid. + """ + vms = session._call_method(vim_util, "get_objects", + "VirtualMachine", ["name"]) + return _get_object_from_results(session, vms, instance_uuid, + _get_object_for_value) + + +def _get_vm_ref_from_vm_uuid(session, instance_uuid): + """Get reference to the VM. + + The method will make use of FindAllByUuid to get the VM reference. + This method finds all VM's on the backend that match the + instance_uuid, more specifically all VM's on the backend that have + 'config_spec.instanceUuid' set to 'instance_uuid'. + """ + vm_refs = session._call_method( + session.vim, + "FindAllByUuid", + session.vim.service_content.searchIndex, + uuid=instance_uuid, + vmSearch=True, + instanceUuid=True) + if vm_refs: + return vm_refs[0] + + +def _get_vm_ref_from_extraconfig(session, instance_uuid): + """Get reference to the VM with the uuid specified.""" + vms = session._call_method(vim_util, "get_objects", + "VirtualMachine", ['config.extraConfig["nvp.vm-uuid"]']) + return _get_object_from_results(session, vms, instance_uuid, + _get_object_for_optionvalue) + + +@vm_ref_cache_from_instance +def get_vm_ref(session, instance): + """Get reference to the VM through uuid or vm name.""" + uuid = instance.uuid + vm_ref = (search_vm_ref_by_identifier(session, uuid) or + _get_vm_ref_from_name(session, instance.name)) + if vm_ref is None: + raise exception.InstanceNotFound(instance_id=uuid) + return vm_ref + + +def search_vm_ref_by_identifier(session, identifier): + """Searches VM reference using the identifier. + + This method is primarily meant to separate out part of the logic for + vm_ref search that could be use directly in the special case of + migrating the instance. For querying VM linked to an instance always + use get_vm_ref instead. + """ + vm_ref = (_get_vm_ref_from_vm_uuid(session, identifier) or + _get_vm_ref_from_extraconfig(session, identifier) or + _get_vm_ref_from_uuid(session, identifier)) + return vm_ref + + +def get_host_ref_for_vm(session, instance): + """Get a MoRef to the ESXi host currently running an instance.""" + + vm_ref = get_vm_ref(session, instance) + return session._call_method(vutil, "get_object_property", + vm_ref, "runtime.host") + + +def get_host_name_for_vm(session, instance): + """Get the hostname of the ESXi host currently running an instance.""" + + host_ref = get_host_ref_for_vm(session, instance) + return session._call_method(vutil, "get_object_property", + host_ref, "name") + + +def get_vm_state(session, instance): + vm_ref = get_vm_ref(session, instance) + vm_state = session._call_method(vutil, "get_object_property", + vm_ref, "runtime.powerState") + return vm_state + + +def get_stats_from_cluster(session, cluster): + """Get the aggregate resource stats of a cluster.""" + vcpus = 0 + mem_info = {'total': 0, 'free': 0} + # Get the Host and Resource Pool Managed Object Refs + prop_dict = session._call_method(vutil, + "get_object_properties_dict", + cluster, + ["host", "resourcePool"]) + if prop_dict: + host_ret = prop_dict.get('host') + if host_ret: + host_mors = host_ret.ManagedObjectReference + result = session._call_method(vim_util, + "get_properties_for_a_collection_of_objects", + "HostSystem", host_mors, + ["summary.hardware", "summary.runtime"]) + for obj in result.objects: + hardware_summary = obj.propSet[0].val + runtime_summary = obj.propSet[1].val + if (runtime_summary.inMaintenanceMode is False and + runtime_summary.connectionState == "connected"): + # Total vcpus is the sum of all pCPUs of individual hosts + # The overcommitment ratio is factored in by the scheduler + vcpus += hardware_summary.numCpuThreads + + res_mor = prop_dict.get('resourcePool') + if res_mor: + res_usage = session._call_method(vutil, "get_object_property", + res_mor, "summary.runtime.memory") + if res_usage: + # maxUsage is the memory limit of the cluster available to VM's + mem_info['total'] = int(res_usage.maxUsage / units.Mi) + # overallUsage is the hypervisor's view of memory usage by VM's + consumed = int(res_usage.overallUsage / units.Mi) + mem_info['free'] = mem_info['total'] - consumed + stats = {'vcpus': vcpus, 'mem': mem_info} + return stats + + +def get_host_ref(session, cluster=None): + """Get reference to a host within the cluster specified.""" + if cluster is None: + results = session._call_method(vim_util, "get_objects", + "HostSystem") + session._call_method(vutil, 'cancel_retrieval', + results) + host_mor = results.objects[0].obj + else: + host_ret = session._call_method(vutil, "get_object_property", + cluster, "host") + if not host_ret or not host_ret.ManagedObjectReference: + msg = _('No host available on cluster') + raise exception.NoValidHost(reason=msg) + host_mor = host_ret.ManagedObjectReference[0] + + return host_mor + + +def propset_dict(propset): + """Turn a propset list into a dictionary + + PropSet is an optional attribute on ObjectContent objects + that are returned by the VMware API. + + You can read more about these at: + | http://pubs.vmware.com/vsphere-51/index.jsp + | #com.vmware.wssdk.apiref.doc/ + | vmodl.query.PropertyCollector.ObjectContent.html + + :param propset: a property "set" from ObjectContent + :return: dictionary representing property set + """ + if propset is None: + return {} + + return {prop.name: prop.val for prop in propset} + + +def get_vmdk_backed_disk_device(hardware_devices, uuid): + if hardware_devices.__class__.__name__ == "ArrayOfVirtualDevice": + hardware_devices = hardware_devices.VirtualDevice + + for device in hardware_devices: + if (device.__class__.__name__ == "VirtualDisk" and + device.backing.__class__.__name__ == + "VirtualDiskFlatVer2BackingInfo" and + device.backing.uuid == uuid): + return device + + +def get_vmdk_volume_disk(hardware_devices, path=None): + if hardware_devices.__class__.__name__ == "ArrayOfVirtualDevice": + hardware_devices = hardware_devices.VirtualDevice + + for device in hardware_devices: + if (device.__class__.__name__ == "VirtualDisk"): + if not path or path == device.backing.fileName: + return device + + +def get_res_pool_ref(session, cluster): + """Get the resource pool.""" + # Get the root resource pool of the cluster + res_pool_ref = session._call_method(vutil, + "get_object_property", + cluster, + "resourcePool") + return res_pool_ref + + +def get_all_cluster_mors(session): + """Get all the clusters in the vCenter.""" + try: + results = session._call_method(vim_util, "get_objects", + "ClusterComputeResource", ["name"]) + session._call_method(vutil, 'cancel_retrieval', + results) + return results.objects + + except Exception as excep: + LOG.warning(_LW("Failed to get cluster references %s"), excep) + + +def get_cluster_ref_by_name(session, cluster_name): + """Get reference to the vCenter cluster with the specified name.""" + all_clusters = get_all_cluster_mors(session) + for cluster in all_clusters: + if (hasattr(cluster, 'propSet') and + cluster.propSet[0].val == cluster_name): + return cluster.obj + + +def get_vmdk_adapter_type(adapter_type): + """Return the adapter type to be used in vmdk descriptor. + + Adapter type in vmdk descriptor is same for LSI-SAS, LSILogic & ParaVirtual + because Virtual Disk Manager API does not recognize the newer controller + types. + """ + if adapter_type in [constants.ADAPTER_TYPE_LSILOGICSAS, + constants.ADAPTER_TYPE_PARAVIRTUAL]: + vmdk_adapter_type = constants.DEFAULT_ADAPTER_TYPE + else: + vmdk_adapter_type = adapter_type + return vmdk_adapter_type + + +def create_vm(session, instance, vm_folder, config_spec, res_pool_ref): + """Create VM on ESX host.""" + LOG.debug("Creating VM on the ESX host", instance=instance) + vm_create_task = session._call_method( + session.vim, + "CreateVM_Task", vm_folder, + config=config_spec, pool=res_pool_ref) + try: + task_info = session._wait_for_task(vm_create_task) + except vexc.VMwareDriverException: + # An invalid guestId will result in an error with no specific fault + # type and the generic error 'A specified parameter was not correct'. + # As guestId is user-editable, we try to help the user out with some + # additional information if we notice that guestId isn't in our list of + # known-good values. + # We don't check this in advance or do anything more than warn because + # we can't guarantee that our list of known-good guestIds is complete. + # Consequently, a value which we don't recognise may in fact be valid. + with excutils.save_and_reraise_exception(): + if config_spec.guestId not in constants.VALID_OS_TYPES: + LOG.warning(_LW('vmware_ostype from image is not recognised: ' + '\'%(ostype)s\'. An invalid os type may be ' + 'one cause of this instance creation failure'), + {'ostype': config_spec.guestId}) + LOG.debug("Created VM on the ESX host", instance=instance) + return task_info.result + + +def destroy_vm(session, instance, vm_ref=None): + """Destroy a VM instance. Assumes VM is powered off.""" + try: + if not vm_ref: + vm_ref = get_vm_ref(session, instance) + LOG.debug("Destroying the VM", instance=instance) + destroy_task = session._call_method(session.vim, "Destroy_Task", + vm_ref) + session._wait_for_task(destroy_task) + LOG.info(_LI("Destroyed the VM"), instance=instance) + except Exception: + LOG.exception(_LE('Destroy VM failed'), instance=instance) + + +def create_virtual_disk(session, dc_ref, adapter_type, disk_type, + virtual_disk_path, size_in_kb): + # Create a Virtual Disk of the size of the flat vmdk file. This is + # done just to generate the meta-data file whose specifics + # depend on the size of the disk, thin/thick provisioning and the + # storage adapter type. + LOG.debug("Creating Virtual Disk of size " + "%(vmdk_file_size_in_kb)s KB and adapter type " + "%(adapter_type)s on the data store", + {"vmdk_file_size_in_kb": size_in_kb, + "adapter_type": adapter_type}) + + vmdk_create_spec = get_vmdk_create_spec( + session.vim.client.factory, + size_in_kb, + adapter_type, + disk_type) + + vmdk_create_task = session._call_method( + session.vim, + "CreateVirtualDisk_Task", + session.vim.service_content.virtualDiskManager, + name=virtual_disk_path, + datacenter=dc_ref, + spec=vmdk_create_spec) + + session._wait_for_task(vmdk_create_task) + LOG.debug("Created Virtual Disk of size %(vmdk_file_size_in_kb)s" + " KB and type %(disk_type)s", + {"vmdk_file_size_in_kb": size_in_kb, + "disk_type": disk_type}) + + +def copy_virtual_disk(session, dc_ref, source, dest): + """Copy a sparse virtual disk to a thin virtual disk. + + This is also done to generate the meta-data file whose specifics + depend on the size of the disk, thin/thick provisioning and the + storage adapter type. + + :param session: - session for connection + :param dc_ref: - data center reference object + :param source: - source datastore path + :param dest: - destination datastore path + :returns: None + """ + LOG.debug("Copying Virtual Disk %(source)s to %(dest)s", + {'source': source, 'dest': dest}) + vim = session.vim + vmdk_copy_task = session._call_method( + vim, + "CopyVirtualDisk_Task", + vim.service_content.virtualDiskManager, + sourceName=source, + sourceDatacenter=dc_ref, + destName=dest) + session._wait_for_task(vmdk_copy_task) + LOG.debug("Copied Virtual Disk %(source)s to %(dest)s", + {'source': source, 'dest': dest}) + + +def reconfigure_vm(session, vm_ref, config_spec): + """Reconfigure a VM according to the config spec.""" + reconfig_task = session._call_method(session.vim, + "ReconfigVM_Task", vm_ref, + spec=config_spec) + session._wait_for_task(reconfig_task) + + +def power_on_instance(session, instance, vm_ref=None): + """Power on the specified instance.""" + + if vm_ref is None: + vm_ref = get_vm_ref(session, instance) + + LOG.debug("Powering on the VM", instance=instance) + try: + poweron_task = session._call_method( + session.vim, + "PowerOnVM_Task", vm_ref) + session._wait_for_task(poweron_task) + LOG.debug("Powered on the VM", instance=instance) + except vexc.InvalidPowerStateException: + LOG.debug("VM already powered on", instance=instance) + + +def _get_vm_port_indices(session, vm_ref): + extra_config = session._call_method(vutil, + 'get_object_property', + vm_ref, + 'config.extraConfig') + ports = [] + if extra_config is not None: + options = extra_config.OptionValue + for option in options: + if (option.key.startswith('nvp.iface-id.') and + option.value != 'free'): + ports.append(int(option.key.split('.')[2])) + return ports + + +def get_attach_port_index(session, vm_ref): + """Get the first free port index.""" + ports = _get_vm_port_indices(session, vm_ref) + # No ports are configured on the VM + if not ports: + return 0 + ports.sort() + configured_ports_len = len(ports) + # Find the first free port index + for port_index in range(configured_ports_len): + if port_index != ports[port_index]: + return port_index + return configured_ports_len + + +def get_vm_detach_port_index(session, vm_ref, iface_id): + extra_config = session._call_method(vutil, + 'get_object_property', + vm_ref, + 'config.extraConfig') + if extra_config is not None: + options = extra_config.OptionValue + for option in options: + if (option.key.startswith('nvp.iface-id.') and + option.value == iface_id): + return int(option.key.split('.')[2]) + + +def power_off_instance(session, instance, vm_ref=None): + """Power off the specified instance.""" + + if vm_ref is None: + vm_ref = get_vm_ref(session, instance) + + LOG.debug("Powering off the VM", instance=instance) + try: + poweroff_task = session._call_method(session.vim, + "PowerOffVM_Task", vm_ref) + session._wait_for_task(poweroff_task) + LOG.debug("Powered off the VM", instance=instance) + except vexc.InvalidPowerStateException: + LOG.debug("VM already powered off", instance=instance) + + +def find_rescue_device(hardware_devices, instance): + """Returns the rescue device. + + The method will raise an exception if the rescue device does not + exist. The resuce device has suffix '-rescue.vmdk'. + :param hardware_devices: the hardware devices for the instance + :param instance: nova.objects.instance.Instance object + :return: the rescue disk device object + """ + for device in hardware_devices.VirtualDevice: + if (device.__class__.__name__ == "VirtualDisk" and + device.backing.__class__.__name__ == + 'VirtualDiskFlatVer2BackingInfo' and + device.backing.fileName.endswith('-rescue.vmdk')): + return device + + msg = _('Rescue device does not exist for instance %s') % instance.uuid + raise exception.NotFound(msg) + + +def get_ephemeral_name(id): + return 'ephemeral_%d.vmdk' % id + + +def _detach_and_delete_devices_config_spec(client_factory, devices): + config_spec = client_factory.create('ns0:VirtualMachineConfigSpec') + device_config_spec = [] + for device in devices: + virtual_device_config = client_factory.create( + 'ns0:VirtualDeviceConfigSpec') + virtual_device_config.operation = "remove" + virtual_device_config.device = device + virtual_device_config.fileOperation = "destroy" + device_config_spec.append(virtual_device_config) + config_spec.deviceChange = device_config_spec + return config_spec + + +def detach_devices_from_vm(session, vm_ref, devices): + """Detach specified devices from VM.""" + client_factory = session.vim.client.factory + config_spec = _detach_and_delete_devices_config_spec( + client_factory, devices) + reconfigure_vm(session, vm_ref, config_spec) + + +def get_ephemerals(session, vm_ref): + devices = [] + hardware_devices = session._call_method(vutil, + "get_object_property", + vm_ref, + "config.hardware.device") + + if hardware_devices.__class__.__name__ == "ArrayOfVirtualDevice": + hardware_devices = hardware_devices.VirtualDevice + + for device in hardware_devices: + if device.__class__.__name__ == "VirtualDisk": + if (device.backing.__class__.__name__ == + "VirtualDiskFlatVer2BackingInfo"): + if 'ephemeral' in device.backing.fileName: + devices.append(device) + return devices + + +def get_swap(session, vm_ref): + hardware_devices = session._call_method(vutil, "get_object_property", + vm_ref, "config.hardware.device") + + if hardware_devices.__class__.__name__ == "ArrayOfVirtualDevice": + hardware_devices = hardware_devices.VirtualDevice + + for device in hardware_devices: + if (device.__class__.__name__ == "VirtualDisk" and + device.backing.__class__.__name__ == + "VirtualDiskFlatVer2BackingInfo" and + 'swap' in device.backing.fileName): + return device diff --git a/deployment_scripts/puppet/modules/vmware_dvs/lib/puppet/parser/functions/override_hiera.rb b/deployment_scripts/puppet/modules/vmware_dvs/lib/puppet/parser/functions/override_hiera.rb new file mode 100644 index 0000000..90bca5a --- /dev/null +++ b/deployment_scripts/puppet/modules/vmware_dvs/lib/puppet/parser/functions/override_hiera.rb @@ -0,0 +1,35 @@ +module Puppet::Parser::Functions + newfunction(:override_hiera, :type => :rvalue, + :doc => <<-EOS + Construct properly network_maps string + EOS + ) do |args| + raise(Puppet::ParseError, 'No file name provided!') if args.size < 1 or args[0] == "" + require 'yaml' + require 'fileutils' + file=args[0] + dir=File.dirname(file) + # read data + if File.exists?(file) + old_data = YAML::load_file(file) || {} + new_data = Hash.new{|h,k| h[k]=Hash.new(&h.default_proc) }.merge(old_data) + else + new_data = Hash.new{|h,k| h[k]=Hash.new(&h.default_proc) } + end + # modify data + md = new_data["neutron_config"]["L2"]["mechanism_drivers"] + if not md or md == {} + md = "openvswitch,l2population,vmware_dvs" + else + if not md.include?('vmware_dvs') + md << ',vmware_dvs' + end + end + new_data["neutron_config"]["L2"]["mechanism_drivers"] = md + # write data + unless File.directory?(dir) + FileUtils.mkdir_p(dir) + end + File.open(file, 'w') {|f| f.write new_data.to_yaml} + end +end diff --git a/deployment_scripts/puppet/modules/vmware_dvs/manifests/init.pp b/deployment_scripts/puppet/modules/vmware_dvs/manifests/init.pp index 87f480a..c071126 100644 --- a/deployment_scripts/puppet/modules/vmware_dvs/manifests/init.pp +++ b/deployment_scripts/puppet/modules/vmware_dvs/manifests/init.pp @@ -15,29 +15,43 @@ # == Class: ::vmware_dvs # # edit /etc/neutron/neturon.conf and /etc/neutron/plugin.ini -# recreate net04 and net04_ext on primary-controller -# restart the neutron-server # # === Parameters # # [*vsphere_hostname*] -# (required) String. This is a name or ip of VMware vSphere server +# (required) String. This is the name or ip of VMware vSphere server # +# [*vsphere_login*] +# (required) String. This is the name of VMware vSphere user +# +# [*vsphere_password*] +# (required) String. This is the password of VMware vSphere user +# +# [*network_maps*] +# (required) String. This is a name of distributed vSwitch +# +# [*neutron_physnet*] +# (required) String. This is a name of physnet of neutron. +# +# [*driver_name*] +# (optional) String. This is the name of installed driver. +# +# [*neutron_url_timeout*] +# (optional) String. This is the timeout for neutron + + class vmware_dvs( $vsphere_hostname, $vsphere_login, $vsphere_password, $network_maps, $neutron_physnet, - $nets, - $pnets, - $keystone_admin_tenant, $driver_name = 'vmware_dvs', $neutron_url_timeout = '3600', ) { $true_network_maps = get_network_maps($network_maps, $neutron_physnet) - $primary_controller = inline_template("<% if File.exist?('/etc/primary-controller.yaml') -%>true<% end -%>") + Exec { path => '/usr/bin:/usr/sbin:/bin:/sbin' } @@ -57,14 +71,6 @@ class vmware_dvs( 'ml2_vmware/network_maps': value => $true_network_maps; } -> - ini_subsetting {'vmware_dvs_driver': - path => '/etc/neutron/plugin.ini', - section => 'ml2', - setting => 'mechanism_drivers', - subsetting => $driver_name, - subsetting_separator => ',' - } - file_line { 'neutron_timeout': path => '/etc/haproxy/conf.d/085-neutron.cfg', line => ' timeout server 1h', @@ -72,9 +78,9 @@ class vmware_dvs( } service { 'neutron-server': - ensure => running, - enable => true, - subscribe => [[Package['python-suds','python-mech-vmware-dvs']],Ini_Subsetting['vmware_dvs_driver']], + ensure => running, + enable => true, + subscribe => [[Package['python-suds','python-mech-vmware-dvs']]], } service {'haproxy': @@ -84,32 +90,22 @@ class vmware_dvs( subscribe => File_Line['neutron_timeout'], } - if $pnets['physnet2'] { - if $pnets['physnet2']['vlan_range'] { - $fallback = split($pnets['physnet2']['vlan_range'], ':') - Openstack::Network::Create_network { - tenant_name => $keystone_admin_tenant, - fallback_segment_id => $fallback[1] - } - } + # some changes for nova + + nova_config {'neutron/url_timeout': value => $neutron_url_timeout} + + + file {'/usr/lib/python2.7/dist-packages/nova/virt/vmwareapi/vif.py': + owner => 'root', + group => 'root', + mode => '0644', + source => 'puppet:///modules/vmware_dvs/vif.py' } - if $primary_controller and $nets and !empty($nets) { - - openstack::network::create_network{'net04': - netdata => $nets['net04'], - segmentation_type => 'vlan', - require => Service['neutron-server'], - } -> - openstack::network::create_network{'net04_ext': - netdata => $nets['net04_ext'], - segmentation_type => 'local', - } -> - openstack::network::create_router{'router04': - internal_network => 'net04', - external_network => 'net04_ext', - tenant_name => $keystone_admin_tenant - } + file {'/usr/lib/python2.7/dist-packages/nova/virt/vmwareapi/vm_util.py': + owner => 'root', + group => 'root', + mode => '0644', + source => 'puppet:///modules/vmware_dvs/vm_util.py' } - } diff --git a/deployment_tasks.yaml b/deployment_tasks.yaml index 17bf3a2..501f560 100644 --- a/deployment_tasks.yaml +++ b/deployment_tasks.yaml @@ -1,41 +1,27 @@ -- id: delete-predefined-networks +- id: vmware-dvs-property-hypervisor_type role: ['primary-controller'] required_for: [post_deployment_end] - requires: [post_deployment_start] - type: shell - parameters: - cmd: ./del_predefined_networks.sh 2>&1 | tee -a /tmp/dep_pre_nets.log - timeout: 120 -- id: property-hypervisor_type - role: ['primary-controller'] - required_for: [post_deployment_end] - requires: [upload_cirros] + requires: [disable_keystone_service_token] type: shell parameters: cmd: ./add_hyperv_type.sh 2>&1 | tee -a /tmp/add_hyper_type.log timeout: 120 -- id: install-the-driver - role: ['primary-controller','controller'] - required_for: [post_deployment_end] - requires: ['delete-predefined-networks'] - type: shell - parameters: - cmd: ./install_the_driver.sh 2>&1 | tee -a /tmp/ins_the_drivers.log - timeout: 720 -- id: install-the-driver-compute - type: shell - role: [compute-vmware] - required_for: [post_deployment_end] - requires: ['openstack-network-vmware-compute'] - condition: "settings:common.use_vcenter.value == true" - parameters: - cmd: ./install_the_driver.sh 2>&1 | tee -a /tmp/ins_the_drivers.log - timeout: 720 -- id: openstack-network-vmware-compute + +- id: vmware-dvs-override-hiera + groups: ['primary-controller','controller', 'compute-vmware'] + required_for: [openstack-network-plugins-l2] + requires: [openstack-network-server-config] type: puppet - role: [compute-vmware] - required_for: ['install-the-driver-compute'] - requires: ['delete-predefined-networks'] + parameters: + puppet_manifest: puppet/manifests/override_hiera.pp + puppet_modules: puppet/modules:/etc/puppet/modules + timeout: 720 + +- id: vmware-dvs-openstack-network-vmware-compute + type: puppet + groups: ['compute-vmware'] + required_for: [post_deployment_end] + requires: [vmware-dvs-override-hiera] condition: "settings:common.use_vcenter.value == true" parameters: puppet_manifest: /etc/puppet/modules/osnailyfacter/modular/openstack-network/openstack-network-compute.pp @@ -45,10 +31,11 @@ cmd: ruby /etc/puppet/modules/osnailyfacter/modular/openstack-network/openstack-network-compute_pre.rb test_post: cmd: ruby /etc/puppet/modules/osnailyfacter/modular/openstack-network/openstack-network-compute_post.rb -- id: setup-neutron-plugin - role: ['primary-controller','controller'] - required_for: [post_deployment_end] - requires: ['install-the-driver'] + +- id: vmware-dvs-setup-neutron-plugin + groups: ['primary-controller','controller'] + required_for: [openstack-network-plugins-l2] + requires: [vmware-dvs-override-hiera] type: puppet parameters: puppet_manifest: puppet/manifests/site.pp diff --git a/nova.patch b/nova.patch deleted file mode 100644 index 74cf772..0000000 --- a/nova.patch +++ /dev/null @@ -1,30 +0,0 @@ -diff --git a/nova/virt/vmwareapi/vif.py b/nova/virt/vmwareapi/vif.py -index 3d228d7..d513a74 100644 ---- a/nova/virt/vmwareapi/vif.py -+++ b/nova/virt/vmwareapi/vif.py -@@ -155,6 +155,10 @@ def get_network_ref(session, cluster, vif, is_neutron): - network_name = (vif['network']['bridge'] or - CONF.vmware.integration_bridge) - network_ref = get_neutron_network(session, network_name, cluster, vif) -+ try: -+ network_ref['dvs_port_key']=vif['details']['dvs_port_key'] -+ except KeyError: -+ pass - else: - create_vlan = vif['network'].get_meta('should_create_vlan', False) - network_ref = ensure_vlan_bridge(session, vif, cluster=cluster, -diff --git a/nova/virt/vmwareapi/vm_util.py b/nova/virt/vmwareapi/vm_util.py -index bbf2835..be68010 100644 ---- a/nova/virt/vmwareapi/vm_util.py -+++ b/nova/virt/vmwareapi/vm_util.py -@@ -339,6 +339,10 @@ def _create_vif_spec(client_factory, vif_info): - 'ns0:DistributedVirtualSwitchPortConnection') - portgroup.switchUuid = network_ref['dvsw'] - portgroup.portgroupKey = network_ref['dvpg'] -+ try: -+ portgroup.portKey = network_ref['dvs_port_key'] -+ except KeyError: -+ pass - backing.port = portgroup - else: - backing = client_factory.create( diff --git a/repositories/ubuntu/python-mech-vmware-dvs_2015.1.0.dev138_all.deb b/repositories/ubuntu/python-mech-vmware-dvs_2015.1.0.dev138_all.deb deleted file mode 100644 index d2a46b44b6fe542b097c2fc3d76ae2ff02037a04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58414 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 diff --git a/repositories/ubuntu/python-mech-vmware-dvs_2015.1.dev124.g3ac1fba_all.deb b/repositories/ubuntu/python-mech-vmware-dvs_2015.1.dev124.g3ac1fba_all.deb new file mode 100644 index 0000000000000000000000000000000000000000..1831d85700910292b7d3c35e8f908a4f95c7b17b GIT binary patch literal 55304 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

MIT`%$O(UB`)2@;&d)6kN#q|yO zx&Q?Kn9ZCF5d*$=KYFsH^(L8rwjSAbEfiRV_a!_HCo=al8R{L*k;G}al*gEM+PJan zCOPKfLe6ua%uQ(bZTa{C`}95Xc~1I|V!vO=Pv}WG?_96f)~`FYk9*Vy=>NHR{(t(y zv=0`hrl;q{f7$Cj8jtUz*1uV=x7yX~bpN~b)2sb2$OUo!O26~gmrrMRu`p?`I6{+Cos@Cd1!fjtfDOIiM0h^PgVr z|609u{zsg~dAGD?ciR5~1Hk@c?&7q#oT2?cGc$Xz|M%l_utmSWKc5Zy|3aAlpF5!c z_v6zm{9m!joZPOJcZyX3SqD78XY{il>)+-1Z_@v>7Y_1&?91oi{Qv&`^lJa#`r7;F zmzLkVNquzK|1-0*GlBg-KRtDj|8-wJH)K}E^HNoRIXj)7&QRKl%V77<^O~O*Yo5_n zq8C52vbDKcYVKUl$^;dy(r8#;XL&JC#V7FRxW40~TUJI)Cq zVS*rM?#swpB8IW$vj2>3QMmvq)#SG5ej=Y0ZHuW#)6@t5q#oUk`j!|M1<~26!MK!1 zW0%Ssx=|!o&u8Ba1ej5YQpk8f#-Z6>fqEM5Vw@hHI#Ov?U8iE_b*uW~=2kPiE~cEC z6*INARpsn2Xdz4X2f<0vuQ{#^7E1ICrHR+Ast~~RzBF4jJWN-;CgbR0JQLY%r=&-C z<-2WFYD*ONWso7cL|K~0q$p7}`^R2UvTa;lj&tA^1QDTnC?Adjv zRorHFUzDDe%X{|er#;+*&mMnzwf|Rceo(l&xB}|0!~UP1yLiFa|B(M(B>Mkg|M&ir zFOx7uEOE1($v1YYPOT-bu6%I&t2YZPnX3pWcfG!zSz2DXedYS~eA8`Zq-#v3uz2O# zjYSlZ^KQOTYLz!K(me(dZD{#3uHD*dkT1WyYV2fMwt%fr#a8`s-l;hmyH$RZjL*qC z#56aedu{v(L-ztPN+Rw{AGXjPo!v5Y$4jOYb<^{{kGLB%jIhi+zJ{@@;wwd|UgK*A z4K?FynkGH*wba2MU&F^5hGvOCqy4gS4f-y2T4AGV{E`}#+ODoqubZeh-yI(l|I@zf zMIVIZcV+)SJ#}Gz=D_}cKR&_rms0ONg@fI%|IEyVxr6oJk5AnC$DF^<)ki1#kDR@y z#fr~eoS&Jadeie4XXX#+zy0`R?s;y0_cO0&cj*-?o(THkF1)>AwBa-i_tCFp$ZZ@> zuB3vCcQ7@Yg-`6l+i;%^Immv+sHj?7csrt9^t?NVNs3EmIAv1i0#Q{IO<%5TuOKS@ zq%4`yCDYW8Tea;5yhsh7RT)&5U0F-wC2Hr_>$rAzYGw9xHI&}$j!h1zVr=3n>`}XL uAwNaE?Z$7lqn9d$Q1g4wE=*4y2n7#52cLt_!RLGL^Zx^j*}X~t=mP-lir+N= literal 0 HcmV?d00001 diff --git a/repositories/ubuntu/python-mech-vmware-dvs_2015.1.dev143.g6450918_all.deb b/repositories/ubuntu/python-mech-vmware-dvs_2015.1.dev143.g6450918_all.deb deleted file mode 100644 index adba2b955d731f1a3902a2b69c158bc0253d91a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58082 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 E1>tP6Bme*a diff --git a/specs/fuel-plugin-vmware-dvs.rst b/specs/fuel-plugin-vmware-dvs.rst index cb727a9..dadbe71 100644 --- a/specs/fuel-plugin-vmware-dvs.rst +++ b/specs/fuel-plugin-vmware-dvs.rst @@ -118,7 +118,7 @@ Limitations: #. Only VLANs are supported for tenant network separation (VxLAN support can be added later, if project will be continued). - #. Only vSphere 5.5 is supported + #. Only vSphere 5.5 or 6.0 is supported Alternatives ------------