diff --git a/oslo_vmware/objects/datastore.py b/oslo_vmware/objects/datastore.py index dbfa2e2a..01bcd22b 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 4105cda5..85a7fd88 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