diff --git a/openstack/clustering/v1/_proxy.py b/openstack/clustering/v1/_proxy.py index 36d697d53..f461aa0d8 100644 --- a/openstack/clustering/v1/_proxy.py +++ b/openstack/clustering/v1/_proxy.py @@ -1155,3 +1155,17 @@ class Proxy(proxy.Proxy): :class:`~openstack.clustering.v1.service.Service` """ return self._list(_service.Service, paginated=False, **query) + + def list_profile_type_operations(self, profile_type): + """Get the operation about a profile type. + + :param profile_type: The name of the profile_type to retrieve or an + object of :class:`~openstack.clustering.v1.profile_type.ProfileType`. + + :returns: A :class:`~openstack.clustering.v1.profile_type.ProfileType` + object. + :raises: :class:`~openstack.exceptions.ResourceNotFound` when no + profile_type matching the name could be found. + """ + obj = self._get_resource(_profile_type.ProfileType, profile_type) + return obj.type_ops(self) diff --git a/openstack/clustering/v1/profile_type.py b/openstack/clustering/v1/profile_type.py index 3d7e4df23..0f105920a 100644 --- a/openstack/clustering/v1/profile_type.py +++ b/openstack/clustering/v1/profile_type.py @@ -12,6 +12,7 @@ from openstack.clustering import clustering_service from openstack import resource +from openstack import utils class ProfileType(resource.Resource): @@ -31,3 +32,8 @@ class ProfileType(resource.Resource): schema = resource.Body('schema') #: The support status of the profile type support_status = resource.Body('support_status') + + def type_ops(self, session): + url = utils.urljoin(self.base_path, self.id, 'ops') + resp = session.get(url) + return resp.json() diff --git a/openstack/tests/unit/clustering/v1/test_profile_type.py b/openstack/tests/unit/clustering/v1/test_profile_type.py index f3c7f91a8..6c1ffd5ca 100644 --- a/openstack/tests/unit/clustering/v1/test_profile_type.py +++ b/openstack/tests/unit/clustering/v1/test_profile_type.py @@ -10,6 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. +import mock from openstack.tests.unit import base from openstack.clustering.v1 import profile_type @@ -46,3 +47,14 @@ class TestProfileType(base.TestCase): self.assertEqual(FAKE['name'], sot.name) self.assertEqual(FAKE['schema'], sot.schema) self.assertEqual(FAKE['support_status'], sot.support_status) + + def test_ops(self): + sot = profile_type.ProfileType(**FAKE) + + resp = mock.Mock() + resp.json = mock.Mock(return_value='') + sess = mock.Mock() + sess.get = mock.Mock(return_value=resp) + self.assertEqual('', sot.type_ops(sess)) + url = 'profile-types/%s/ops' % sot.id + sess.get.assert_called_once_with(url) diff --git a/openstack/tests/unit/clustering/v1/test_proxy.py b/openstack/tests/unit/clustering/v1/test_proxy.py index 74b472b6d..6d8118100 100644 --- a/openstack/tests/unit/clustering/v1/test_proxy.py +++ b/openstack/tests/unit/clustering/v1/test_proxy.py @@ -576,3 +576,15 @@ class TestClusterProxy(test_proxy_base.TestProxyBase): self.proxy.wait_for_delete(mock_resource, 1, 2) mock_wait.assert_called_once_with(self.proxy, mock_resource, 1, 2) + + @deprecation.fail_if_not_removed + @mock.patch.object(proxy_base.Proxy, '_get_resource') + def test_profile_type_ops(self, mock_get): + mock_profile = profile_type.ProfileType.new(id='FAKE_PROFILE') + mock_get.return_value = mock_profile + self._verify( + "openstack.clustering.v1.profile_type.ProfileType.type_ops", + self.proxy.list_profile_type_operations, + method_args=["FAKE_PROFILE"]) + mock_get.assert_called_once_with(profile_type.ProfileType, + "FAKE_PROFILE")