summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--oslo_vmware/objects/datastore.py28
-rw-r--r--oslo_vmware/vim_util.py28
2 files changed, 56 insertions, 0 deletions
diff --git a/oslo_vmware/objects/datastore.py b/oslo_vmware/objects/datastore.py
index dbfa2e2..01bcd22 100644
--- a/oslo_vmware/objects/datastore.py
+++ b/oslo_vmware/objects/datastore.py
@@ -55,6 +55,34 @@ def get_datastore_by_ref(session, ds_ref):
type=props.get("summary.type"))
+def get_recommended_datastore_clone(session,
+ dsc_ref,
+ clone_spec,
+ vm_ref,
+ folder,
+ name,
+ resource_pool=None,
+ host_ref=None):
+ """Returns a key which identifies the most recommended datastore from the
+ specified datastore cluster where the specified VM can be cloned to.
+ """
+ sp_spec = vim_util.storage_placement_spec(session.vim.client.factory,
+ dsc_ref,
+ 'clone',
+ clone_spec=clone_spec,
+ vm_ref=vm_ref,
+ folder=folder,
+ clone_name=name,
+ res_pool_ref=resource_pool,
+ host_ref=host_ref)
+ spr = session.invoke_api(
+ session.vim,
+ "RecommendDatastores",
+ session.vim.service_content.storageResourceManager,
+ storageSpec=sp_spec)
+ return spr.recommendations[0].key
+
+
def get_dsc_ref_and_name(session, dsc_val):
"""Return reference and name of the specified datastore cluster.
diff --git a/oslo_vmware/vim_util.py b/oslo_vmware/vim_util.py
index 4105cda..85a7fd8 100644
--- a/oslo_vmware/vim_util.py
+++ b/oslo_vmware/vim_util.py
@@ -628,3 +628,31 @@ def propset_dict(propset):
return {}
return {prop.name: prop.val for prop in propset}
+
+
+def storage_placement_spec(client_factory,
+ dsc_ref,
+ type,
+ clone_spec=None,
+ config_spec=None,
+ relocate_spec=None,
+ vm_ref=None,
+ folder=None,
+ clone_name=None,
+ res_pool_ref=None,
+ host_ref=None):
+ pod_sel_spec = client_factory.create('ns0:StorageDrsPodSelectionSpec')
+ pod_sel_spec.storagePod = dsc_ref
+
+ spec = client_factory.create('ns0:StoragePlacementSpec')
+ spec.podSelectionSpec = pod_sel_spec
+ spec.type = type
+ spec.vm = vm_ref
+ spec.folder = folder
+ spec.cloneSpec = clone_spec
+ spec.configSpec = config_spec
+ spec.relocateSpec = relocate_spec
+ spec.cloneName = clone_name
+ spec.resourcePool = res_pool_ref
+ spec.host = host_ref
+ return spec