diff --git a/zaqarclient/queues/v1/api.py b/zaqarclient/queues/v1/api.py index 489a186a..dfff28cd 100644 --- a/zaqarclient/queues/v1/api.py +++ b/zaqarclient/queues/v1/api.py @@ -190,6 +190,16 @@ class V1(api.Api): } }, + 'flavor_get': { + 'ref': 'flavors/{flavor_name}', + 'method': 'GET', + 'required': ['flavor_name'], + 'properties': { + 'flavor_name': {'type': 'string'}, + } + }, + + 'flavor_delete': { 'ref': 'flavors/{flavor_name}', 'method': 'DELETE', diff --git a/zaqarclient/queues/v1/core.py b/zaqarclient/queues/v1/core.py index 2dba328b..cbb6b3e3 100644 --- a/zaqarclient/queues/v1/core.py +++ b/zaqarclient/queues/v1/core.py @@ -491,6 +491,25 @@ def flavor_create(transport, request, name, flavor_data): transport.send(request) +def flavor_get(transport, request, flavor_name, callback=None): + """Gets flavor data + + :param transport: Transport instance to use + :type transport: `transport.base.Transport` + :param request: Request instance ready to be sent. + :type request: `transport.request.Request` + :param flavor_name: Flavor reference name. + :type flavor_name: `six.text_type` + + """ + + request.operation = 'flavor_get' + request.params['flavor_name'] = flavor_name + + resp = transport.send(request) + return resp.deserialized_content + + def flavor_delete(transport, request, name): """Deletes the flavor `name` diff --git a/zaqarclient/queues/v1/flavor.py b/zaqarclient/queues/v1/flavor.py index c7a8ad61..c1386182 100644 --- a/zaqarclient/queues/v1/flavor.py +++ b/zaqarclient/queues/v1/flavor.py @@ -14,12 +14,14 @@ # limitations under the License. from zaqarclient.queues.v1 import core +from zaqarclient.transport import errors class Flavor(object): def __init__(self, client, name, - pool, auto_create=True, **capabilities): + pool=None, auto_create=True, + **capabilities): self.client = client self.name = name @@ -38,10 +40,16 @@ class Flavor(object): """ req, trans = self.client._request_and_transport() - data = {'pool': self.pool, - 'capabilities': self.capabilities} + try: + flavor = core.flavor_get(trans, req, self.name) + self.pool = flavor["pool"] + self.capabilities = flavor.get("capabilities", {}) - core.flavor_create(trans, req, self.name, data) + except errors.ResourceNotFound: + data = {'pool': self.pool, + 'capabilities': self.capabilities} + + core.flavor_create(trans, req, self.name, data) def delete(self): req, trans = self.client._request_and_transport() diff --git a/zaqarclient/queues/v1/pool.py b/zaqarclient/queues/v1/pool.py index 3d687362..ca83f1e6 100644 --- a/zaqarclient/queues/v1/pool.py +++ b/zaqarclient/queues/v1/pool.py @@ -21,12 +21,14 @@ class Pool(object): def __init__(self, client, name, weight=None, uri=None, + group=None, auto_create=True, **options): self.client = client self.uri = uri self.name = name self.weight = weight + self.group = group self.options = options if auto_create: @@ -45,6 +47,7 @@ class Pool(object): pool = core.pool_get(trans, req, self.name) self.uri = pool["uri"] self.weight = pool["weight"] + self.group = pool.get("group", None) self.options = pool.get("options", {}) except errors.ResourceNotFound: @@ -52,6 +55,9 @@ class Pool(object): 'weight': self.weight, 'options': self.options} + if self.client.api_version >= 1.1: + data['group'] = self.group + core.pool_create(trans, req, self.name, data) def delete(self): diff --git a/zaqarclient/tests/queues/flavor.py b/zaqarclient/tests/queues/flavor.py index 18a42015..f5e71f75 100644 --- a/zaqarclient/tests/queues/flavor.py +++ b/zaqarclient/tests/queues/flavor.py @@ -13,9 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. +import json import mock from zaqarclient.tests.queues import base +from zaqarclient.transport import errors from zaqarclient.transport import response @@ -31,7 +33,7 @@ class QueuesV1_1FlavorUnitTest(base.QueuesTestBase): autospec=True) as send_method: resp = response.Response(None, None) - send_method.return_value = resp + send_method.side_effect = iter([errors.ResourceNotFound, resp]) # NOTE(flaper87): This will call # ensure exists in the client instance @@ -40,6 +42,22 @@ class QueuesV1_1FlavorUnitTest(base.QueuesTestBase): self.assertEqual(flavor.name, 'tasty') self.assertEqual(flavor.pool, 'stomach') + def test_flavor_get(self): + flavor_data = {'pool': 'stomach'} + + with mock.patch.object(self.transport, 'send', + autospec=True) as send_method: + + resp = response.Response(None, json.dumps(flavor_data)) + send_method.return_value = resp + + # NOTE(flaper87): This will call + # ensure exists in the client instance + # since auto_create's default is True + flavor = self.client.flavor('test') + self.assertEqual(flavor.name, 'test') + self.assertEqual(flavor.pool, 'stomach') + def test_flavor_delete(self): flavor_data = {'pool': 'stomach'} @@ -47,8 +65,8 @@ class QueuesV1_1FlavorUnitTest(base.QueuesTestBase): autospec=True) as send_method: resp = response.Response(None, None) - send_method.return_value = resp - + resp_data = response.Response(None, json.dumps(flavor_data)) + send_method.side_effect = iter([resp_data, resp]) # NOTE(flaper87): This will call # ensure exists in the client instance # since auto_create's default is True @@ -67,19 +85,33 @@ class QueuesV1_1FlavorFunctionalTest(base.QueuesTestBase): def test_flavor_create(self): pool_data = {'uri': 'sqlite://', - 'weight': 10} + 'weight': 10, + 'group': 'us'} self.client.pool('stomach', **pool_data) - flavor_data = {'pool': 'stomach'} + flavor_data = {'pool': 'us'} flavor = self.client.flavor('tasty', **flavor_data) self.assertEqual(flavor.name, 'tasty') - self.assertEqual(flavor.pool, 'stomach') + self.assertEqual(flavor.pool, 'us') + + def test_flavor_get(self): + pool_data = {'weight': 10, + 'group': 'us', + 'uri': 'sqlite://'} + self.client.pool('stomach', **pool_data) + + flavor_data = {'pool': 'us'} + self.client.flavor('tasty', **flavor_data) + flavor = self.client.flavor('tasty') + self.assertEqual(flavor.name, 'tasty') + self.assertEqual(flavor.pool, 'us') def test_flavor_delete(self): pool_data = {'uri': 'sqlite://', - 'weight': 10} + 'weight': 10, + 'group': 'us'} self.client.pool('stomach', **pool_data) - flavor_data = {'pool': 'stomach'} + flavor_data = {'pool': 'us'} flavor = self.client.flavor('tasty', **flavor_data) flavor.delete()