diff --git a/changelogs/fragments/vmware-use_non_default.yml b/changelogs/fragments/vmware-use_non_default.yml new file mode 100644 index 00000000000..48e9c793800 --- /dev/null +++ b/changelogs/fragments/vmware-use_non_default.yml @@ -0,0 +1,2 @@ +bugfixes: + - vmware_deploy_ovf use user specified resource pool or resource pool pod rather than cluster default (https://github.com/ansible/ansible/issues/61645). diff --git a/lib/ansible/module_utils/vmware.py b/lib/ansible/module_utils/vmware.py index be18bd5b591..f1136b36ba7 100644 --- a/lib/ansible/module_utils/vmware.py +++ b/lib/ansible/module_utils/vmware.py @@ -1216,6 +1216,52 @@ class PyVmomi(object): return dsc return None + # Resource pool + def find_resource_pool_by_name(self, resource_pool_name, folder=None): + """ + Get resource pool managed object by name + Args: + resource_pool_name: Name of resource pool + + Returns: Resource pool managed object if found else None + + """ + if not folder: + folder = self.content.rootFolder + + resource_pools = get_all_objs(self.content, [vim.ResourcePool], folder=folder) + for rp in resource_pools: + if rp.name == resource_pool_name: + return rp + return None + + def find_resource_pool_by_cluster(self, resource_pool_name='Resources', cluster=None): + """ + Get resource pool managed object by cluster object + Args: + resource_pool_name: Name of resource pool + cluster: Managed object of cluster + + Returns: Resource pool managed object if found else None + + """ + desired_rp = None + if not cluster: + return desired_rp + + if resource_pool_name != 'Resources': + # Resource pool name is different than default 'Resources' + resource_pools = cluster.resourcePool.resourcePool + if resource_pools: + for rp in resource_pools: + if rp.name == resource_pool_name: + desired_rp = rp + break + else: + desired_rp = cluster.resourcePool + + return desired_rp + # VMDK stuff def vmdk_disk_path_split(self, vmdk_path): """ diff --git a/lib/ansible/modules/cloud/vmware/vmware_deploy_ovf.py b/lib/ansible/modules/cloud/vmware/vmware_deploy_ovf.py index b160b613523..d60a0df56c8 100644 --- a/lib/ansible/modules/cloud/vmware/vmware_deploy_ovf.py +++ b/lib/ansible/modules/cloud/vmware/vmware_deploy_ovf.py @@ -31,16 +31,20 @@ options: default: ha-datacenter description: - Datacenter to deploy to. + type: str cluster: description: - Cluster to deploy to. + type: str datastore: default: datastore1 description: - Datastore to deploy to. + type: str deployment_option: description: - The key of the chosen deployment option. + type: str disk_provisioning: choices: - flat @@ -56,6 +60,7 @@ options: default: thin description: - Disk provisioning type. + type: str fail_on_spec_warnings: description: - Cause the module to treat OVF Import Spec warnings as errors. @@ -75,6 +80,7 @@ options: - ' folder: /folder1/datacenter1/vm' - ' folder: folder1/datacenter1/vm' - ' folder: /folder1/datacenter1/vm/folder2' + type: str inject_ovf_env: description: - Force the given properties to be inserted into an OVF Environment and injected through VMware Tools. @@ -84,11 +90,13 @@ options: description: - Name of the VM to work with. - Virtual machine names in vCenter are not necessarily unique, which may be problematic. + type: str networks: default: VM Network: VM Network description: - 'C(key: value) mapping of OVF network name, to the vCenter network name.' + type: dict ovf: description: - 'Path to OVF or OVA file to deploy.' @@ -102,10 +110,12 @@ options: properties: description: - The assignment of values to the properties found in the OVF as key value pairs. + type: dict resource_pool: default: Resources description: - - 'Resource Pool to deploy to.' + - Resource Pool to deploy to. + type: str wait: default: true description: @@ -172,8 +182,7 @@ from ansible.module_utils._text import to_native from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.six import string_types from ansible.module_utils.urls import generic_urlparse, open_url, urlparse, urlunparse -from ansible.module_utils.vmware import (HAS_PYVMOMI, connect_to_api, find_datacenter_by_name, find_datastore_by_name, - find_network_by_name, find_resource_pool_by_name, find_vm_by_name, find_cluster_by_name, +from ansible.module_utils.vmware import (find_network_by_name, find_vm_by_name, PyVmomi, gather_vm_facts, vmware_argument_spec, wait_for_task, wait_for_vm_ip) try: from ansible.module_utils.vmware import vim @@ -290,9 +299,9 @@ class VMDKUploader(Thread): self.e = sys.exc_info() -class VMwareDeployOvf: +class VMwareDeployOvf(PyVmomi): def __init__(self, module): - self.si = connect_to_api(module) + super(VMwareDeployOvf, self).__init__(module) self.module = module self.params = module.params @@ -309,24 +318,25 @@ class VMwareDeployOvf: self.entity = None def get_objects(self): - self.datastore = find_datastore_by_name(self.si, self.params['datastore']) - if not self.datastore: - self.module.fail_json(msg='%(datastore)s could not be located' % self.params) - - self.datacenter = find_datacenter_by_name(self.si, self.params['datacenter']) + self.datacenter = self.find_datacenter_by_name(self.params['datacenter']) if not self.datacenter: self.module.fail_json(msg='%(datacenter)s could not be located' % self.params) + self.datastore = self.find_datastore_by_name(self.params['datastore']) + + if not self.datastore: + self.module.fail_json(msg='%(datastore)s could not be located' % self.params) + if self.params['cluster']: - cluster = find_cluster_by_name(self.si, self.params['cluster']) + cluster = self.find_cluster_by_name(self.params['cluster'], datacenter_name=self.datacenter) if cluster is None: self.module.fail_json(msg="Unable to find cluster '%(cluster)s'" % self.params) - else: - self.resource_pool = cluster.resourcePool + self.resource_pool = self.find_resource_pool_by_cluster(self.params['resource_pool'], cluster=cluster) else: - self.resource_pool = find_resource_pool_by_name(self.si, self.params['resource_pool']) - if not self.resource_pool: - self.module.fail_json(msg='%(resource_pool)s could not be located' % self.params) + self.resource_pool = self.find_resource_pool_by_name(self.params['resource_pool']) + + if not self.resource_pool: + self.module.fail_json(msg='%(resource_pool)s could not be located' % self.params) for key, value in self.params['networks'].items(): network = find_network_by_name(self.si, value) @@ -663,9 +673,6 @@ def main(): supports_check_mode=True, ) - if not HAS_PYVMOMI: - module.fail_json(msg='pyvmomi python library not found') - deploy_ovf = VMwareDeployOvf(module) deploy_ovf.upload() deploy_ovf.complete()