diff --git a/zaqarclient/queues/v1/api.py b/zaqarclient/queues/v1/api.py index 314aedf5..7b93f6f2 100644 --- a/zaqarclient/queues/v1/api.py +++ b/zaqarclient/queues/v1/api.py @@ -242,6 +242,7 @@ class V1(api.Api): class V1_1(V1): label = 'v1.1' + schema = V1.schema.copy() V1_1.schema.update({ @@ -255,3 +256,6 @@ V1_1.schema.update({ } }, }) + +del V1_1.schema['queue_get_metadata'] +del V1_1.schema['queue_set_metadata'] diff --git a/zaqarclient/queues/v1/core.py b/zaqarclient/queues/v1/core.py index ab25ea85..05177965 100644 --- a/zaqarclient/queues/v1/core.py +++ b/zaqarclient/queues/v1/core.py @@ -56,10 +56,30 @@ def _common_queue_ops(operation, transport, request, name, callback=None): return resp.deserialized_content -def queue_create(transport, request, name, callback=None): - """Creates a queue.""" - return _common_queue_ops('queue_create', transport, - request, name, callback=callback) +def queue_create(transport, request, name, + metadata=None, callback=None): + """Creates a queue + + :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 name: Queue reference name. + :type name: `six.text_type` + :param metadata: Queue's metadata object. (>=v1.1) + :type metadata: `dict` + :param callback: Optional callable to use as callback. + If specified, this request will be sent asynchronously. + (IGNORED UNTIL ASYNC SUPPORT IS COMPLETE) + :type callback: Callable object. + """ + + request.operation = 'queue_create' + request.params['queue_name'] = name + request.content = metadata and json.dumps(metadata) + + resp = transport.send(request) + return resp.deserialized_content def queue_exists(transport, request, name, callback=None): diff --git a/zaqarclient/queues/v1/queues.py b/zaqarclient/queues/v1/queues.py index 2bb36104..2f7d8753 100644 --- a/zaqarclient/queues/v1/queues.py +++ b/zaqarclient/queues/v1/queues.py @@ -67,7 +67,10 @@ class Queue(object): # NOTE(jeffrey4l): Ensure that metadata is cleared when the new_meta # is a empty dict. if new_meta is not None: - core.queue_set_metadata(trans, req, self._name, new_meta) + if req.api.is_supported('queue_set_metadata'): + core.queue_set_metadata(trans, req, self._name, new_meta) + else: + core.queue_create(trans, req, self._name, metadata=new_meta) self._metadata = new_meta # TODO(flaper87): Cache with timeout diff --git a/zaqarclient/tests/queues/queues.py b/zaqarclient/tests/queues/queues.py index 46102824..e5c91664 100644 --- a/zaqarclient/tests/queues/queues.py +++ b/zaqarclient/tests/queues/queues.py @@ -33,9 +33,25 @@ class QueuesV1QueueUnitTest(base.QueuesTestBase): resp = response.Response(None, json.dumps(test_metadata)) send_method.return_value = resp - metadata = self.queue.metadata() + metadata = self.queue.metadata(test_metadata) self.assertEqual(metadata, test_metadata) + def test_queue_metadata_update(self): + test_metadata = {'type': 'Bank Accounts'} + new_meta = {'flavor': 'test'} + + with mock.patch.object(self.transport, 'send', + autospec=True) as send_method: + + resp = response.Response(None, json.dumps(test_metadata)) + send_method.return_value = resp + + metadata = self.queue.metadata(test_metadata) + self.assertEqual(metadata, test_metadata) + + metadata = self.queue.metadata(new_meta) + self.assertEqual(metadata, new_meta) + def test_queue_create(self): with mock.patch.object(self.transport, 'send', autospec=True) as send_method: diff --git a/zaqarclient/transport/api.py b/zaqarclient/transport/api.py index d03fd7e4..40798d4f 100644 --- a/zaqarclient/transport/api.py +++ b/zaqarclient/transport/api.py @@ -25,6 +25,16 @@ class Api(object): label = None validators = {} + def is_supported(self, operation): + """Returns `True` if `operation` is supported + + :param operation: The operation to check on. + :type operation: `six.text_type` + + :rtype: bool + """ + return operation in self.schema + def get_schema(self, operation): """Returns the schema for an operation