mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-24 03:11:24 -07:00
VMware: vmware_guest - allow existing vmdk files to be attached to guest (#45953)
This commit is contained in:
parent
2f0c666b5b
commit
8eff4cae10
3 changed files with 154 additions and 17 deletions
|
@ -8,6 +8,7 @@ __metaclass__ = type
|
|||
|
||||
import atexit
|
||||
import os
|
||||
import re
|
||||
import ssl
|
||||
import time
|
||||
from random import randint
|
||||
|
@ -26,7 +27,7 @@ try:
|
|||
except ImportError:
|
||||
HAS_PYVMOMI = False
|
||||
|
||||
from ansible.module_utils._text import to_text
|
||||
from ansible.module_utils._text import to_text, to_native
|
||||
from ansible.module_utils.six import integer_types, iteritems, string_types, raise_from
|
||||
from ansible.module_utils.basic import env_fallback
|
||||
|
||||
|
@ -1162,3 +1163,78 @@ class PyVmomi(object):
|
|||
if dsc.name == datastore_cluster_name:
|
||||
return dsc
|
||||
return None
|
||||
|
||||
# VMDK stuff
|
||||
def vmdk_disk_path_split(self, vmdk_path):
|
||||
"""
|
||||
Takes a string in the format
|
||||
|
||||
[datastore_name] path/to/vm_name.vmdk
|
||||
|
||||
Returns a tuple with multiple strings:
|
||||
|
||||
1. datastore_name: The name of the datastore (without brackets)
|
||||
2. vmdk_fullpath: The "path/to/vm_name.vmdk" portion
|
||||
3. vmdk_filename: The "vm_name.vmdk" portion of the string (os.path.basename equivalent)
|
||||
4. vmdk_folder: The "path/to/" portion of the string (os.path.dirname equivalent)
|
||||
"""
|
||||
try:
|
||||
datastore_name = re.match(r'^\[(.*?)\]', vmdk_path, re.DOTALL).groups()[0]
|
||||
vmdk_fullpath = re.match(r'\[.*?\] (.*)$', vmdk_path).groups()[0]
|
||||
vmdk_filename = os.path.basename(vmdk_fullpath)
|
||||
vmdk_folder = os.path.dirname(vmdk_fullpath)
|
||||
return datastore_name, vmdk_fullpath, vmdk_filename, vmdk_folder
|
||||
except (IndexError, AttributeError) as e:
|
||||
self.module.fail_json(msg="Bad path '%s' for filename disk vmdk image: %s" % (vmdk_path, to_native(e)))
|
||||
|
||||
def find_vmdk_file(self, datastore_obj, vmdk_fullpath, vmdk_filename, vmdk_folder):
|
||||
"""
|
||||
Return vSphere file object or fail_json
|
||||
Args:
|
||||
datastore_obj: Managed object of datastore
|
||||
vmdk_fullpath: Path of VMDK file e.g., path/to/vm/vmdk_filename.vmdk
|
||||
vmdk_filename: Name of vmdk e.g., VM0001_1.vmdk
|
||||
vmdk_folder: Base dir of VMDK e.g, path/to/vm
|
||||
|
||||
"""
|
||||
|
||||
browser = datastore_obj.browser
|
||||
datastore_name = datastore_obj.name
|
||||
datastore_name_sq = "[" + datastore_name + "]"
|
||||
if browser is None:
|
||||
self.module.fail_json(msg="Unable to access browser for datastore %s" % datastore_name)
|
||||
|
||||
detail_query = vim.host.DatastoreBrowser.FileInfo.Details(
|
||||
fileOwner=True,
|
||||
fileSize=True,
|
||||
fileType=True,
|
||||
modification=True
|
||||
)
|
||||
search_spec = vim.host.DatastoreBrowser.SearchSpec(
|
||||
details=detail_query,
|
||||
matchPattern=[vmdk_filename],
|
||||
searchCaseInsensitive=True,
|
||||
)
|
||||
search_res = browser.SearchSubFolders(
|
||||
datastorePath=datastore_name_sq,
|
||||
searchSpec=search_spec
|
||||
)
|
||||
|
||||
changed = False
|
||||
vmdk_path = datastore_name_sq + " " + vmdk_fullpath
|
||||
try:
|
||||
changed, result = wait_for_task(search_res)
|
||||
except TaskError as task_e:
|
||||
self.module.fail_json(msg=to_native(task_e))
|
||||
|
||||
if not changed:
|
||||
self.module.fail_json(msg="No valid disk vmdk image found for path %s" % vmdk_path)
|
||||
|
||||
target_folder_path = datastore_name_sq + " " + vmdk_folder + '/'
|
||||
|
||||
for file_result in search_res.info.result:
|
||||
for f in getattr(file_result, 'file'):
|
||||
if f.path == vmdk_filename and file_result.folderPath == target_folder_path:
|
||||
return f
|
||||
|
||||
self.module.fail_json(msg="No vmdk file found for path specified [%s]" % vmdk_path)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue