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
This commit is contained in:
dynarro
2014-11-27 14:12:15 +01:00
parent f5f35d4bfd
commit 2bd784ed46
5 changed files with 87 additions and 12 deletions

View File

@@ -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': { 'flavor_delete': {
'ref': 'flavors/{flavor_name}', 'ref': 'flavors/{flavor_name}',
'method': 'DELETE', 'method': 'DELETE',

View File

@@ -491,6 +491,25 @@ def flavor_create(transport, request, name, flavor_data):
transport.send(request) 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): def flavor_delete(transport, request, name):
"""Deletes the flavor `name` """Deletes the flavor `name`

View File

@@ -14,12 +14,14 @@
# limitations under the License. # limitations under the License.
from zaqarclient.queues.v1 import core from zaqarclient.queues.v1 import core
from zaqarclient.transport import errors
class Flavor(object): class Flavor(object):
def __init__(self, client, name, def __init__(self, client, name,
pool, auto_create=True, **capabilities): pool=None, auto_create=True,
**capabilities):
self.client = client self.client = client
self.name = name self.name = name
@@ -38,10 +40,16 @@ class Flavor(object):
""" """
req, trans = self.client._request_and_transport() req, trans = self.client._request_and_transport()
data = {'pool': self.pool, try:
'capabilities': self.capabilities} 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): def delete(self):
req, trans = self.client._request_and_transport() req, trans = self.client._request_and_transport()

View File

@@ -21,12 +21,14 @@ class Pool(object):
def __init__(self, client, name, def __init__(self, client, name,
weight=None, uri=None, weight=None, uri=None,
group=None,
auto_create=True, **options): auto_create=True, **options):
self.client = client self.client = client
self.uri = uri self.uri = uri
self.name = name self.name = name
self.weight = weight self.weight = weight
self.group = group
self.options = options self.options = options
if auto_create: if auto_create:
@@ -45,6 +47,7 @@ class Pool(object):
pool = core.pool_get(trans, req, self.name) pool = core.pool_get(trans, req, self.name)
self.uri = pool["uri"] self.uri = pool["uri"]
self.weight = pool["weight"] self.weight = pool["weight"]
self.group = pool.get("group", None)
self.options = pool.get("options", {}) self.options = pool.get("options", {})
except errors.ResourceNotFound: except errors.ResourceNotFound:
@@ -52,6 +55,9 @@ class Pool(object):
'weight': self.weight, 'weight': self.weight,
'options': self.options} 'options': self.options}
if self.client.api_version >= 1.1:
data['group'] = self.group
core.pool_create(trans, req, self.name, data) core.pool_create(trans, req, self.name, data)
def delete(self): def delete(self):

View File

@@ -13,9 +13,11 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import json
import mock import mock
from zaqarclient.tests.queues import base from zaqarclient.tests.queues import base
from zaqarclient.transport import errors
from zaqarclient.transport import response from zaqarclient.transport import response
@@ -31,7 +33,7 @@ class QueuesV1_1FlavorUnitTest(base.QueuesTestBase):
autospec=True) as send_method: autospec=True) as send_method:
resp = response.Response(None, None) resp = response.Response(None, None)
send_method.return_value = resp send_method.side_effect = iter([errors.ResourceNotFound, resp])
# NOTE(flaper87): This will call # NOTE(flaper87): This will call
# ensure exists in the client instance # ensure exists in the client instance
@@ -40,6 +42,22 @@ class QueuesV1_1FlavorUnitTest(base.QueuesTestBase):
self.assertEqual(flavor.name, 'tasty') self.assertEqual(flavor.name, 'tasty')
self.assertEqual(flavor.pool, 'stomach') 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): def test_flavor_delete(self):
flavor_data = {'pool': 'stomach'} flavor_data = {'pool': 'stomach'}
@@ -47,8 +65,8 @@ class QueuesV1_1FlavorUnitTest(base.QueuesTestBase):
autospec=True) as send_method: autospec=True) as send_method:
resp = response.Response(None, None) 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 # NOTE(flaper87): This will call
# ensure exists in the client instance # ensure exists in the client instance
# since auto_create's default is True # since auto_create's default is True
@@ -67,19 +85,33 @@ class QueuesV1_1FlavorFunctionalTest(base.QueuesTestBase):
def test_flavor_create(self): def test_flavor_create(self):
pool_data = {'uri': 'sqlite://', pool_data = {'uri': 'sqlite://',
'weight': 10} 'weight': 10,
'group': 'us'}
self.client.pool('stomach', **pool_data) self.client.pool('stomach', **pool_data)
flavor_data = {'pool': 'stomach'} flavor_data = {'pool': 'us'}
flavor = self.client.flavor('tasty', **flavor_data) flavor = self.client.flavor('tasty', **flavor_data)
self.assertEqual(flavor.name, 'tasty') 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): def test_flavor_delete(self):
pool_data = {'uri': 'sqlite://', pool_data = {'uri': 'sqlite://',
'weight': 10} 'weight': 10,
'group': 'us'}
self.client.pool('stomach', **pool_data) self.client.pool('stomach', **pool_data)
flavor_data = {'pool': 'stomach'} flavor_data = {'pool': 'us'}
flavor = self.client.flavor('tasty', **flavor_data) flavor = self.client.flavor('tasty', **flavor_data)
flavor.delete() flavor.delete()