From 2bd784ed46e8f0c198b09370594345460d33a291 Mon Sep 17 00:00:00 2001 From: dynarro Date: Thu, 27 Nov 2014 14:12:15 +0100 Subject: [PATCH] Gets 'flavor' data if the resource exists Flavor instances can be created by just passing the name. it checks at construction time whether the resource exist in the server or not. If the resource doesn't exist, it'll attempt to create one. Zaqarclient does not call anymore the 'flavor_create' directly. It calls 'flavor_get' first, which ensures the resource exists. if not, a 'flavor' will be created. Change-Id: Id78c79b7ead339cc64d57028eb49040fb67eb597 Closes-Bug: #1396063 Closes-Bug: #1394733 --- zaqarclient/queues/v1/api.py | 10 +++++++ zaqarclient/queues/v1/core.py | 19 ++++++++++++ zaqarclient/queues/v1/flavor.py | 16 +++++++--- zaqarclient/queues/v1/pool.py | 6 ++++ zaqarclient/tests/queues/flavor.py | 48 +++++++++++++++++++++++++----- 5 files changed, 87 insertions(+), 12 deletions(-) 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()