Merge "Support to Profile resource for cluster service"

This commit is contained in:
Jenkins
2015-11-03 09:24:58 +00:00
committed by Gerrit Code Review
4 changed files with 233 additions and 0 deletions

View File

@@ -14,11 +14,103 @@ from openstack.cluster.v1 import action
from openstack.cluster.v1 import cluster
from openstack.cluster.v1 import node
from openstack.cluster.v1 import policy
from openstack.cluster.v1 import profile
from openstack import proxy
class Proxy(proxy.BaseProxy):
def create_profile(self, **attrs):
"""Create a new profile from attributes.
:param dict attrs: Keyword arguments that will be used to create a
:class:`~openstack.cluster.v1.profile.Profile`, it is comprised
of the properties on the Profile class.
:returns: The results of profile creation.
:rtype: :class:`~openstack.cluster.v1.profile.Profile`.
"""
return self._create(profile.Profile, **attrs)
def delete_profile(self, value, ignore_missing=True):
"""Delete a profile.
:param value: The value can be either the name or ID of a profile or a
:class:`~openstack.cluster.v1.profile.Profile` instance.
:param bool ignore_missing: When set to ``False``, an exception
:class:`~openstack.exceptions.ResourceNotFound` will be raised when
the profile could not be found. When set to ``True``, no exception
will be raised when attempting to delete a non-existent profile.
:returns: ``None``
"""
self._delete(profile.Profile, value, ignore_missing=ignore_missing)
def find_profile(self, value, ignore_missing=True):
"""Find a single profile.
:param value: The name or ID of a profile.
:param bool ignore_missing: When set to ``False``
:class:`~openstack.exceptions.ResourceNotFound` will be
raised when the resource does not exist.
When set to ``True``, None will be returned when
attempting to find a nonexistent resource.
:returns: One :class:`~openstack.cluster.v1.profile.Profile` object
or None
"""
return profile.Profile.find(self.session, value,
ignore_missing=ignore_missing)
def get_profile(self, value):
"""Get a single profile.
:param value: The value can be the name or ID of a profile or a
:class:`~openstack.cluster.v1.profile.Profile` instance.
:returns: One :class:`~openstack.cluster.v1.profile.Profile`
:raises: :class:`~openstack.exceptions.ResourceNotFound` when no
profile matching the criteria could be found.
"""
return self._get(profile.Profile, value)
def profiles(self, **query):
"""Retrieve a generator of profiles.
:param kwargs \*\*query: Optional query parameters to be sent to
restrict the profiles to be returned. Available parameters include:
* show_deleted: A boolean value indicating whether soft-deleted
profiles should be returned as well.
* filters: A list of key-value pairs for Senlin server to determine
whether a profile should be included in the list result.
* sort_keys: A list of key names for sorting the resulted list.
* sort_dir: Direction for sorting, and its valid values are 'asc'
and 'desc'.
* limit: Requests a specified size of returned items from the
query. Returns a number of items up to the specified limit
value.
* marker: Specifies the ID of the last-seen item. Use the limit
parameter to make an initial limited request and use the ID of
the last-seen item from the response as the marker parameter
value in a subsequent limited request.
:returns: A generator of profile instances.
"""
return self._list(profile.Profile, paginated=True, **query)
def update_profile(self, value, **attrs):
"""Update a profile.
:param value: Either the name or the ID of the profile, or an instance
of :class:`~openstack.cluster.v1.profile.Profile`.
:param attrs: The attributes to update on the profile represented by
the ``value`` parameter.
:returns: The updated profile.
:rtype: :class:`~openstack.cluster.v1.profile.Profile`
"""
return self._update(profile.Profile, value, **attrs)
def create_cluster(self, **attrs):
"""Create a new cluster from attributes.
@@ -306,6 +398,7 @@ class Proxy(proxy.BaseProxy):
actions should be returned as well.
* sort_keys: A list of key names for sorting the resulted list.
* sort_dir: Direction for sorting, and its valid values are 'asc'
and 'desc'.
* limit: Requests a specified size of returned items from the
query. Returns a number of items up to the specified limit
value.

View File

@@ -0,0 +1,49 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from openstack.cluster import cluster_service
from openstack import resource
class Profile(resource.Resource):
resource_key = 'profile'
resources_key = 'profiles'
base_path = '/profiles'
service = cluster_service.ClusterService()
# capabilities
allow_create = True
allow_retrieve = True
allow_update = True
allow_delete = True
allow_list = True
patch_update = True
# properties
#: The name of the profile
name = resource.prop('name')
#: The type of the profile.
type_name = resource.prop('type')
#: The permission string of the profile.
permission = resource.prop('permission')
#: The spec of the profile.
spec = resource.prop('spec', type=dict)
#: A collection of key-value pairs that are attached to the profile.
metadata = resource.prop('metadata', type=dict)
#: Timestamp of when the profile was created.
created_at = resource.prop('created_time')
#: Timestamp of when the profile was last updated.
updated_at = resource.prop('updated_time')
#: Timestamp of when the profile was deleted. This is only used on
#: profiles that were soft-deleted.
deleted_at = resource.prop('deleted_time')

View File

@@ -0,0 +1,65 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import testtools
from openstack.cluster.v1 import profile
FAKE_ID = '9b127538-a675-4271-ab9b-f24f54cfe173'
FAKE_NAME = 'test_profile'
FAKE = {
'metadata': {},
'name': FAKE_NAME,
'id': FAKE_ID,
'permission': '',
'spec': {
'type': 'os.nova.server',
'version': 1.0,
'properties': {
'flavor': 1,
'image': 'cirros-0.3.2-x86_64-uec',
'key_name': 'oskey',
'name': 'cirros_server'
}
},
'type': 'os.nova.server'
}
class TestProfile(testtools.TestCase):
def setUp(self):
super(TestProfile, self).setUp()
def test_basic(self):
sot = profile.Profile()
self.assertEqual('profile', sot.resource_key)
self.assertEqual('profiles', sot.resources_key)
self.assertEqual('/profiles', sot.base_path)
self.assertEqual('clustering', sot.service.service_type)
self.assertTrue(sot.allow_create)
self.assertTrue(sot.allow_retrieve)
self.assertTrue(sot.allow_update)
self.assertTrue(sot.allow_delete)
self.assertTrue(sot.allow_list)
self.assertTrue(sot.patch_update)
def test_instantiate(self):
sot = profile.Profile(FAKE)
self.assertEqual(FAKE['id'], sot.id)
self.assertEqual(FAKE['name'], sot.name)
self.assertEqual(FAKE['metadata'], sot.metadata)
self.assertEqual(FAKE['permission'], sot.permission)
self.assertEqual(FAKE['spec'], sot.spec)
self.assertEqual(FAKE['type'], sot.type_name)

View File

@@ -15,6 +15,7 @@ from openstack.cluster.v1 import action
from openstack.cluster.v1 import cluster
from openstack.cluster.v1 import node
from openstack.cluster.v1 import policy
from openstack.cluster.v1 import profile
from openstack.tests.unit import test_proxy_base
@@ -23,6 +24,31 @@ class TestClusterProxy(test_proxy_base.TestProxyBase):
super(TestClusterProxy, self).setUp()
self.proxy = _proxy.Proxy(self.session)
def test_profile_create(self):
self.verify_create(self.proxy.create_profile, profile.Profile)
def test_profile_delete(self):
self.verify_delete(self.proxy.delete_profile, profile.Profile, False)
def test_profile_delete_ignore(self):
self.verify_delete(self.proxy.delete_profile, profile.Profile, True)
def test_profile_find(self):
self.verify_find('openstack.cluster.v1.profile.Profile.find',
self.proxy.find_profile)
def test_profile_get(self):
self.verify_get(self.proxy.get_profile, profile.Profile)
def test_profiles(self):
self.verify_list(self.proxy.profiles, profile.Profile,
paginated=True,
method_kwargs={'limit': 2},
expected_kwargs={'limit': 2})
def test_profile_update(self):
self.verify_update(self.proxy.update_profile, profile.Profile)
def test_cluster_create(self):
self.verify_create(self.proxy.create_cluster, cluster.Cluster)