def sanitize_params(self): """ this method is used to verify user provided parameters """ self.vm_obj = self.get_vm() if self.vm_obj is None: vm_id = self.vm_uuid or self.vm_name or self.moid self.module.fail_json( msg="Failed to find the VM/template with %s" % vm_id) # connect to destination VC self.destination_content = connect_to_api( self.module, hostname=self.destination_vcenter, username=self.destination_vcenter_username, password=self.destination_vcenter_password, port=self.destination_vcenter_port, validate_certs=self.destination_vcenter_validate_certs, ) # Check if vm name already exists in the destination VC vm = find_vm_by_name( content=self.destination_content, vm_name=self.params["destination_vm_name"], ) if vm: self.module.exit_json( changed=False, msg="A VM with the given name already exists") datastore_name = self.params["destination_datastore"] datastore_cluster = find_obj(self.destination_content, [vim.StoragePod], datastore_name) if datastore_cluster: # If user specified datastore cluster so get recommended datastore datastore_name = self.get_recommended_datastore( datastore_cluster_obj=datastore_cluster) # Check if get_recommended_datastore or user specified datastore exists or not self.destination_datastore = find_datastore_by_name( content=self.destination_content, datastore_name=datastore_name) if self.destination_datastore is None: self.module.fail_json(msg="Destination datastore not found.") self.destination_host = find_hostsystem_by_name( content=self.destination_content, hostname=self.params["destination_host"], ) if self.destination_host is None: self.module.fail_json(msg="Destination host not found.") if self.params["destination_resource_pool"]: self.destination_resource_pool = find_resource_pool_by_name( content=self.destination_content, resource_pool_name=self.params["destination_resource_pool"], ) else: self.destination_resource_pool = ( self.destination_host.parent.resourcePool)
def get_vm_port(self, vm_name, nic_label): """Finds the port of the VM Returns ------- str the port number as a string, or None if the NIC couldnt be found """ vm = find_vm_by_name(self.content, vm_name) if vm is None: self.module.fail_json(msg="There is no VM with the name: {0:s}.".format(vm_name)) for hardware in vm.config.hardware.device: if isinstance(hardware, vim.vm.device.VirtualVmxnet3): if hardware.deviceInfo.label == nic_label: return hardware.backing.port.portKey return None
def get_new_vm_info(self, vm): # to check if vm has been cloned in the destination vc # query for the vm in destination vc # get the host and datastore info # get the power status of the newly cloned vm info = {} vm_obj = find_vm_by_name(content=self.destination_content, vm_name=vm) if vm_obj is None: self.module.fail_json(msg="Newly cloned VM is not found in the destination VCenter") else: vm_facts = gather_vm_facts(self.destination_content, vm_obj) info['vm_name'] = vm info['vcenter'] = self.destination_vcenter info['host'] = vm_facts['hw_esxi_host'] info['datastore'] = vm_facts['hw_datastores'] info['vm_folder'] = vm_facts['hw_folder'] info['power_on'] = vm_facts['hw_power_status'] return info
def get_lease(self): datastore, datacenter, resource_pool, network_mappings = ( self.get_objects() ) params = {"diskProvisioning": self.params["disk_provisioning"]} if self.params["name"]: params["entityName"] = self.params["name"] if network_mappings: params["networkMapping"] = network_mappings if self.params["deployment_option"]: params["deploymentOption"] = self.params["deployment_option"] if self.params["properties"]: params["propertyMapping"] = [] for key, value in self.params["properties"].items(): property_mapping = vim.KeyValue() property_mapping.key = key property_mapping.value = ( str(value) if isinstance(value, bool) else value ) params["propertyMapping"].append(property_mapping) if self.params["folder"]: folder = self.content.searchIndex.FindByInventoryPath( self.params["folder"] ) if not folder: self.module.fail_json( msg="Unable to find the specified folder %(folder)s" % self.params ) else: folder = datacenter.vmFolder spec_params = vim.OvfManager.CreateImportSpecParams(**params) ovf_descriptor = self.get_ovf_descriptor() self.import_spec = self.content.ovfManager.CreateImportSpec( ovf_descriptor, resource_pool, datastore, spec_params ) errors = [ to_native(e.msg) for e in getattr(self.import_spec, "error", []) ] if self.params["fail_on_spec_warnings"]: errors.extend( ( to_native(w.msg) for w in getattr(self.import_spec, "warning", []) ) ) if errors: self.module.fail_json( msg="Failure validating OVF import spec: %s" % ". ".join(errors) ) for warning in getattr(self.import_spec, "warning", []): self.module.warn( "Problem validating OVF import spec: %s" % to_native(warning.msg) ) if not self.params["allow_duplicates"]: name = self.import_spec.importSpec.configSpec.name match = find_vm_by_name(self.content, name, folder=folder) if match: self.module.exit_json( instance=gather_vm_facts(self.content, match), changed=False, ) if self.module.check_mode: self.module.exit_json(changed=True, instance={"hw_name": name}) try: self.lease = resource_pool.ImportVApp( self.import_spec.importSpec, folder ) except vmodl.fault.SystemError as e: self.module.fail_json( msg="Failed to start import: %s" % to_native(e.msg) ) while self.lease.state != vim.HttpNfcLease.State.ready: time.sleep(0.1) self.entity = self.lease.info.entity return self.lease, self.import_spec