Add utility function for datastore clusters

Add new function which returns reference and name of the specified
datastore cluster. The cluster can be specified either by name or by its
moid.

Change-Id: I73df95294accc1954da571437efc8302edf544d2
This commit is contained in:
Radoslav Gerganov 2018-07-09 17:11:50 +03:00
parent d1cfde2b6d
commit 80112baaf6
2 changed files with 68 additions and 0 deletions

View File

@ -15,6 +15,7 @@
import logging
import posixpath
import random
import re
import six.moves.http_client as httplib
import six.moves.urllib.parse as urlparse
@ -54,6 +55,34 @@ def get_datastore_by_ref(session, ds_ref):
type=props.get("summary.type"))
def get_dsc_ref_and_name(session, dsc_val):
"""Return reference and name of the specified datastore cluster.
:param ds_val: datastore cluster name or datastore cluster moid
:return: tuple of dastastore cluster moref and datastore cluster name
"""
if re.match("group-p\d+", dsc_val):
# the configured value is moid
dsc_ref = vim_util.get_moref(dsc_val, 'StoragePod')
try:
dsc_name = session.invoke_api(vim_util, 'get_object_property',
session.vim, dsc_ref, 'name')
return dsc_ref, dsc_name
except exceptions.ManagedObjectNotFoundException:
# not a moid, try as a datastore cluster name
pass
result = session.invoke_api(vim_util, 'get_objects', session.vim,
'StoragePod', 100, ['name'])
with vim_util.WithRetrieval(session.vim, result) as objs:
for obj in objs:
if not hasattr(obj, 'propSet'):
continue
if obj.propSet[0].val == dsc_val:
return obj.obj, dsc_val
return None, None
class Datastore(object):
def __init__(self, ref, name, capacity=None, freespace=None,

View File

@ -169,6 +169,45 @@ class DatastoreTestCase(base.TestCase):
self.assertFalse(datastore.Datastore.is_datastore_mount_usable(m))
class DatastoreClusterTestCase(base.TestCase):
def test_get_dsc_with_moid(self):
session = mock.Mock()
session.invoke_api = mock.Mock()
session.invoke_api.return_value = 'ds-cluster'
dsc_moid = 'group-p123'
dsc_ref, dsc_name = datastore.get_dsc_ref_and_name(session, dsc_moid)
self.assertEqual((dsc_moid, 'StoragePod'),
(dsc_ref.value, dsc_ref._type))
self.assertEqual('ds-cluster', dsc_name)
session.invoke_api.assert_called_once_with(vim_util,
'get_object_property',
session.vim,
mock.ANY,
'name')
@mock.patch('oslo_vmware.vim_util.continue_retrieval')
@mock.patch('oslo_vmware.vim_util.cancel_retrieval')
def test_get_dsc_by_name(self, cancel_retrieval, continue_retrieval):
pod_prop = mock.Mock()
pod_prop.val = 'ds-cluster'
pod_ref = vim_util.get_moref('group-p456', 'StoragePod')
pod = mock.Mock()
pod.propSet = [pod_prop]
pod.obj = pod_ref
retrieve_result = mock.Mock()
retrieve_result.objects = [pod]
session = mock.Mock()
session.invoke_api = mock.Mock()
session.invoke_api.return_value = retrieve_result
name = 'ds-cluster'
dsc_ref, dsc_name = datastore.get_dsc_ref_and_name(session, name)
self.assertEqual((pod_ref.value, pod_ref._type),
(dsc_ref.value, dsc_ref._type))
class DatastorePathTestCase(base.TestCase):
"""Test the DatastorePath object."""