mirror of
https://github.com/saltstack/salt.git
synced 2025-04-17 10:10:20 +00:00
If datacenter is specified then look under it instead of looking under inventory root folder
This commit is contained in:
parent
54b9641330
commit
fcf77b738e
2 changed files with 46 additions and 21 deletions
|
@ -237,7 +237,7 @@ def _add_new_hard_disk_helper(disk_label, size_gb, unit_number):
|
|||
return disk_spec
|
||||
|
||||
|
||||
def _edit_existing_network_adapter(network_adapter, new_network_name, adapter_type, switch_type):
|
||||
def _edit_existing_network_adapter(network_adapter, new_network_name, adapter_type, switch_type, container_ref=None):
|
||||
adapter_type.strip().lower()
|
||||
switch_type.strip().lower()
|
||||
|
||||
|
@ -254,12 +254,12 @@ def _edit_existing_network_adapter(network_adapter, new_network_name, adapter_ty
|
|||
edited_network_adapter = network_adapter
|
||||
|
||||
if switch_type == 'standard':
|
||||
network_ref = salt.utils.vmware.get_mor_by_property(_get_si(), vim.Network, new_network_name)
|
||||
network_ref = salt.utils.vmware.get_mor_by_property(_get_si(), vim.Network, new_network_name, container_ref)
|
||||
edited_network_adapter.backing = vim.vm.device.VirtualEthernetCard.NetworkBackingInfo()
|
||||
edited_network_adapter.backing.deviceName = new_network_name
|
||||
edited_network_adapter.backing.network = network_ref
|
||||
elif switch_type == 'distributed':
|
||||
network_ref = salt.utils.vmware.get_mor_by_property(_get_si(), vim.dvs.DistributedVirtualPortgroup, new_network_name)
|
||||
network_ref = salt.utils.vmware.get_mor_by_property(_get_si(), vim.dvs.DistributedVirtualPortgroup, new_network_name, container_ref)
|
||||
dvs_port_connection = vim.dvs.PortConnection(
|
||||
portgroupKey=network_ref.key,
|
||||
switchUuid=network_ref.config.distributedVirtualSwitch.uuid
|
||||
|
@ -291,7 +291,7 @@ def _edit_existing_network_adapter(network_adapter, new_network_name, adapter_ty
|
|||
return network_spec
|
||||
|
||||
|
||||
def _add_new_network_adapter_helper(network_adapter_label, network_name, adapter_type, switch_type):
|
||||
def _add_new_network_adapter_helper(network_adapter_label, network_name, adapter_type, switch_type, container_ref=None):
|
||||
random_key = randint(-4099, -4000)
|
||||
|
||||
adapter_type.strip().lower()
|
||||
|
@ -315,11 +315,13 @@ def _add_new_network_adapter_helper(network_adapter_label, network_name, adapter
|
|||
network_spec.device.backing.deviceName = network_name
|
||||
network_spec.device.backing.network = salt.utils.vmware.get_mor_by_property(_get_si(),
|
||||
vim.Network,
|
||||
network_name)
|
||||
network_name,
|
||||
container_ref)
|
||||
elif switch_type == 'distributed':
|
||||
network_ref = salt.utils.vmware.get_mor_by_property(_get_si(),
|
||||
vim.dvs.DistributedVirtualPortgroup,
|
||||
network_name)
|
||||
network_name,
|
||||
container_ref)
|
||||
dvs_port_connection = vim.dvs.PortConnection(
|
||||
portgroupKey=network_ref.key,
|
||||
switchUuid=network_ref.config.distributedVirtualSwitch.uuid
|
||||
|
@ -490,7 +492,7 @@ def _set_network_adapter_mapping(adapter_specs):
|
|||
return adapter_mapping
|
||||
|
||||
|
||||
def _manage_devices(devices, vm):
|
||||
def _manage_devices(devices, vm, container_ref=None):
|
||||
unit_number = 0
|
||||
bus_number = 0
|
||||
device_specs = []
|
||||
|
@ -527,7 +529,7 @@ def _manage_devices(devices, vm):
|
|||
network_name = devices['network'][device.deviceInfo.label]['name']
|
||||
adapter_type = devices['network'][device.deviceInfo.label]['adapter_type'] if 'adapter_type' in devices['network'][device.deviceInfo.label] else ''
|
||||
switch_type = devices['network'][device.deviceInfo.label]['switch_type'] if 'switch_type' in devices['network'][device.deviceInfo.label] else ''
|
||||
network_spec = _edit_existing_network_adapter(device, network_name, adapter_type, switch_type)
|
||||
network_spec = _edit_existing_network_adapter(device, network_name, adapter_type, switch_type, container_ref)
|
||||
adapter_mapping = _set_network_adapter_mapping(devices['network'][device.deviceInfo.label])
|
||||
device_specs.append(network_spec)
|
||||
nics_map.append(adapter_mapping)
|
||||
|
@ -585,7 +587,7 @@ def _manage_devices(devices, vm):
|
|||
adapter_type = devices['network'][network_adapter_label]['adapter_type'] if 'adapter_type' in devices['network'][network_adapter_label] else ''
|
||||
switch_type = devices['network'][network_adapter_label]['switch_type'] if 'switch_type' in devices['network'][network_adapter_label] else ''
|
||||
# create the network adapter
|
||||
network_spec = _add_new_network_adapter_helper(network_adapter_label, network_name, adapter_type, switch_type)
|
||||
network_spec = _add_new_network_adapter_helper(network_adapter_label, network_name, adapter_type, switch_type, container_ref)
|
||||
adapter_mapping = _set_network_adapter_mapping(devices['network'][network_adapter_label])
|
||||
device_specs.append(network_spec)
|
||||
nics_map.append(adapter_mapping)
|
||||
|
@ -2079,14 +2081,18 @@ def create(vm_):
|
|||
|
||||
# Either a datacenter or a folder can be optionally specified
|
||||
# If not specified, the existing VM/template\'s parent folder is used.
|
||||
container_ref = None
|
||||
if datacenter:
|
||||
datacenter_ref = salt.utils.vmware.get_mor_by_property(_get_si(), vim.Datacenter, datacenter)
|
||||
container_ref = datacenter_ref if datacenter_ref else None
|
||||
|
||||
if folder:
|
||||
folder_ref = salt.utils.vmware.get_mor_by_property(_get_si(), vim.Folder, folder)
|
||||
folder_ref = salt.utils.vmware.get_mor_by_property(_get_si(), vim.Folder, folder, container_ref)
|
||||
if not folder_ref:
|
||||
log.error("Specified folder: '{0}' does not exist".format(folder))
|
||||
log.debug("Using folder in which {0} {1} is present".format(clone_type, vm_['clonefrom']))
|
||||
folder_ref = object_ref.parent
|
||||
elif datacenter:
|
||||
datacenter_ref = salt.utils.vmware.get_mor_by_property(_get_si(), vim.Datacenter, datacenter)
|
||||
if not datacenter_ref:
|
||||
log.error("Specified datacenter: '{0}' does not exist".format(datacenter))
|
||||
log.debug("Using datacenter folder in which {0} {1} is present".format(clone_type, vm_['clonefrom']))
|
||||
|
@ -2106,12 +2112,12 @@ def create(vm_):
|
|||
# Either a datastore/datastore cluster can be optionally specified.
|
||||
# If not specified, the current datastore is used.
|
||||
if datastore:
|
||||
datastore_ref = salt.utils.vmware.get_mor_by_property(_get_si(), vim.Datastore, datastore)
|
||||
datastore_ref = salt.utils.vmware.get_mor_by_property(_get_si(), vim.Datastore, datastore, container_ref)
|
||||
if datastore_ref:
|
||||
# specific datastore has been specified
|
||||
reloc_spec.datastore = datastore_ref
|
||||
else:
|
||||
datastore_cluster_ref = salt.utils.vmware.get_mor_by_property(_get_si(), vim.StoragePod, datastore)
|
||||
datastore_cluster_ref = salt.utils.vmware.get_mor_by_property(_get_si(), vim.StoragePod, datastore, container_ref)
|
||||
if not datastore_cluster_ref:
|
||||
log.error("Specified datastore/datastore cluster: '{0}' does not exist".format(datastore))
|
||||
log.debug("Using datastore used by the {0} {1}".format(clone_type, vm_['clonefrom']))
|
||||
|
@ -2120,7 +2126,7 @@ def create(vm_):
|
|||
log.debug("Using datastore used by the {0} {1}".format(clone_type, vm_['clonefrom']))
|
||||
|
||||
if host:
|
||||
host_ref = salt.utils.vmware.get_mor_by_property(_get_si(), vim.HostSystem, host)
|
||||
host_ref = salt.utils.vmware.get_mor_by_property(_get_si(), vim.HostSystem, host, container_ref)
|
||||
if host_ref:
|
||||
reloc_spec.host = host_ref
|
||||
else:
|
||||
|
@ -2163,7 +2169,7 @@ def create(vm_):
|
|||
config_spec.memoryMB = memory_mb
|
||||
|
||||
if devices:
|
||||
specs = _manage_devices(devices, object_ref)
|
||||
specs = _manage_devices(devices, object_ref, container_ref)
|
||||
config_spec.deviceChange = specs['device_specs']
|
||||
|
||||
if extra_config:
|
||||
|
|
|
@ -176,7 +176,7 @@ def get_inventory(service_instance):
|
|||
return service_instance.RetrieveContent()
|
||||
|
||||
|
||||
def get_content(service_instance, obj_type, property_list=None):
|
||||
def get_content(service_instance, obj_type, property_list=None, container_ref=None):
|
||||
'''
|
||||
Returns the content of the specified type of object for a Service Instance.
|
||||
|
||||
|
@ -191,10 +191,19 @@ def get_content(service_instance, obj_type, property_list=None):
|
|||
|
||||
property_list
|
||||
An optional list of object properties to used to return even more filtered content results.
|
||||
|
||||
container_ref
|
||||
An optional reference to the managed object to search under. Can either be an object of type Folder, Datacenter,
|
||||
ComputeResource, Resource Pool or HostSystem. If not specified, default behaviour is to search under the inventory
|
||||
rootFolder.
|
||||
'''
|
||||
# Start at the rootFolder if container starting point not specified
|
||||
if not container_ref:
|
||||
container_ref = service_instance.content.rootFolder
|
||||
|
||||
# Create an object view
|
||||
obj_view = service_instance.content.viewManager.CreateContainerView(
|
||||
service_instance.content.rootFolder, [obj_type], True)
|
||||
container_ref, [obj_type], True)
|
||||
|
||||
# Create traversal spec to determine the path for collection
|
||||
traversal_spec = vmodl.query.PropertyCollector.TraversalSpec(
|
||||
|
@ -234,7 +243,7 @@ def get_content(service_instance, obj_type, property_list=None):
|
|||
return content
|
||||
|
||||
|
||||
def get_mor_by_property(service_instance, object_type, property_value, property_name='name'):
|
||||
def get_mor_by_property(service_instance, object_type, property_value, property_name='name', container_ref=None):
|
||||
'''
|
||||
Returns the first managed object reference having the specified property value.
|
||||
|
||||
|
@ -249,9 +258,14 @@ def get_mor_by_property(service_instance, object_type, property_value, property_
|
|||
|
||||
property_name
|
||||
An object property used to return the specified object reference results. Defaults to ``name``.
|
||||
|
||||
container_ref
|
||||
An optional reference to the managed object to search under. Can either be an object of type Folder, Datacenter,
|
||||
ComputeResource, Resource Pool or HostSystem. If not specified, default behaviour is to search under the inventory
|
||||
rootFolder.
|
||||
'''
|
||||
# Get list of all managed object references with specified property
|
||||
object_list = get_mors_with_properties(service_instance, object_type, property_list=[property_name])
|
||||
object_list = get_mors_with_properties(service_instance, object_type, property_list=[property_name], container_ref=container_ref)
|
||||
|
||||
for obj in object_list:
|
||||
if obj[property_name] == property_value:
|
||||
|
@ -260,7 +274,7 @@ def get_mor_by_property(service_instance, object_type, property_value, property_
|
|||
return None
|
||||
|
||||
|
||||
def get_mors_with_properties(service_instance, object_type, property_list=None):
|
||||
def get_mors_with_properties(service_instance, object_type, property_list=None, container_ref=None):
|
||||
'''
|
||||
Returns a list containing properties and managed object references for the managed object.
|
||||
|
||||
|
@ -272,9 +286,14 @@ def get_mors_with_properties(service_instance, object_type, property_list=None):
|
|||
|
||||
property_list
|
||||
An optional list of object properties used to return even more filtered managed object reference results.
|
||||
|
||||
container_ref
|
||||
An optional reference to the managed object to search under. Can either be an object of type Folder, Datacenter,
|
||||
ComputeResource, Resource Pool or HostSystem. If not specified, default behaviour is to search under the inventory
|
||||
rootFolder.
|
||||
'''
|
||||
# Get all the content
|
||||
content = get_content(service_instance, object_type, property_list=property_list)
|
||||
content = get_content(service_instance, object_type, property_list=property_list, container_ref=container_ref)
|
||||
|
||||
object_list = []
|
||||
for obj in content:
|
||||
|
|
Loading…
Add table
Reference in a new issue