From 23fa8e80c7a24abdfffadded1bc6eda0c5c071d0 Mon Sep 17 00:00:00 2001 From: Flavio Percoco Date: Wed, 16 Apr 2014 16:20:21 +0200 Subject: [PATCH] Disable Metadata write operations on v1.1 This is the first step towards removing metadata completely from the API. This is temporary until we decided whether we will remove read operations too. Partially-Implements: api-v1.1-remove-queue-metadata Change-Id: I18b8b7a9284b37d866dec7ab1f8117dc779431f8 --- .../queues/transport/wsgi/v1_1/metadata.py | 37 ++---------- .../transport/wsgi/test_queue_lifecycle.py | 57 ++++++++++++------- tests/unit/queues/transport/wsgi/test_v1_1.py | 32 +++++++++++ 3 files changed, 73 insertions(+), 53 deletions(-) diff --git a/marconi/queues/transport/wsgi/v1_1/metadata.py b/marconi/queues/transport/wsgi/v1_1/metadata.py index 608edf1b3..15407c30c 100644 --- a/marconi/queues/transport/wsgi/v1_1/metadata.py +++ b/marconi/queues/transport/wsgi/v1_1/metadata.py @@ -14,15 +14,12 @@ # limitations under the License. import falcon -import six from marconi.openstack.common.gettextutils import _ import marconi.openstack.common.log as logging from marconi.queues.storage import errors as storage_errors from marconi.queues.transport import utils -from marconi.queues.transport import validation from marconi.queues.transport.wsgi import errors as wsgi_errors -from marconi.queues.transport.wsgi import utils as wsgi_utils LOG = logging.getLogger(__name__) @@ -63,34 +60,8 @@ class Resource(object): u'project: %(project)s', {'queue': queue_name, 'project': project_id}) - try: - # Place JSON size restriction before parsing - self._validate.queue_metadata_length(req.content_length) - except validation.ValidationFailed as ex: - LOG.debug(ex) - raise wsgi_errors.HTTPBadRequestAPI(six.text_type(ex)) - - # Deserialize queue metadata - metadata, = wsgi_utils.filter_stream(req.stream, - req.content_length, - spec=None) - - try: - self.queue_ctrl.set_metadata(queue_name, - metadata=metadata, - project=project_id) - - except validation.ValidationFailed as ex: - LOG.debug(ex) - raise wsgi_errors.HTTPBadRequestAPI(six.text_type(ex)) - - except storage_errors.QueueDoesNotExist: - raise falcon.HTTPNotFound() - - except Exception as ex: - LOG.exception(ex) - description = _(u'Metadata could not be updated.') - raise wsgi_errors.HTTPServiceUnavailable(description) - - resp.status = falcon.HTTP_204 + resp.status = falcon.HTTP_405 resp.location = req.path + resp.body = ("Queue's metadata has been deprecated. " + "It will be removed completely in the next " + "version of the API.") diff --git a/marconi/tests/queues/transport/wsgi/test_queue_lifecycle.py b/marconi/tests/queues/transport/wsgi/test_queue_lifecycle.py index 0c947d5b1..a2d8855d8 100644 --- a/marconi/tests/queues/transport/wsgi/test_queue_lifecycle.py +++ b/marconi/tests/queues/transport/wsgi/test_queue_lifecycle.py @@ -27,6 +27,15 @@ class QueueLifecycleBaseTest(base.TestBase): config_file = None + # NOTE(flaper87): This is temporary. Ideally, each version + # of the API should have its own lifecycle tests. The v1.1 + # of our API removes the support for the API. Although most of + # the test methods were overwritten in the test definition, there + # are some that need to be disabled in-lieu for other tests to be + # excuted. Also, ddt plays dirty and makes it impossible to override + # a test case. + metadata_support = True + def setUp(self): super(QueueLifecycleBaseTest, self).setUp() @@ -73,17 +82,18 @@ class QueueLifecycleBaseTest(base.TestBase): self.assertEqual(self.srmock.status, falcon.HTTP_204) # Add metadata - doc = '{"messages": {"ttl": 600}}' - self.simulate_put(gumshoe_queue_path_metadata, - project_id, body=doc) - self.assertEqual(self.srmock.status, falcon.HTTP_204) + if self.metadata_support: + doc = '{"messages": {"ttl": 600}}' + self.simulate_put(gumshoe_queue_path_metadata, + project_id, body=doc) + self.assertEqual(self.srmock.status, falcon.HTTP_204) - # Fetch metadata - result = self.simulate_get(gumshoe_queue_path_metadata, - project_id) - result_doc = json.loads(result[0]) - self.assertEqual(self.srmock.status, falcon.HTTP_200) - self.assertEqual(result_doc, json.loads(doc)) + # Fetch metadata + result = self.simulate_get(gumshoe_queue_path_metadata, + project_id) + result_doc = json.loads(result[0]) + self.assertEqual(self.srmock.status, falcon.HTTP_200) + self.assertEqual(result_doc, json.loads(doc)) # Stats empty queue self.simulate_get(gumshoe_queue_path_stats, project_id) @@ -102,8 +112,9 @@ class QueueLifecycleBaseTest(base.TestBase): self.assertEqual(self.srmock.status, falcon.HTTP_404) # Get non-existent metadata - self.simulate_get(gumshoe_queue_path_metadata, project_id) - self.assertEqual(self.srmock.status, falcon.HTTP_404) + if self.metadata_support: + self.simulate_get(gumshoe_queue_path_metadata, project_id) + self.assertEqual(self.srmock.status, falcon.HTTP_404) def test_name_restrictions(self): self.simulate_put(self.queue_path + '/Nice-Boat_2') @@ -158,6 +169,9 @@ class QueueLifecycleBaseTest(base.TestBase): @ddt.data('{', '[]', '.', ' ', '') def test_bad_metadata(self, document): + if not self.metadata_support: + return + self.simulate_put(self.fizbat_queue_path, '7e55e1a7e') self.assertEqual(self.srmock.status, falcon.HTTP_201) @@ -261,7 +275,8 @@ class QueueLifecycleBaseTest(base.TestBase): def create_queue(name, project_id, body): uri = self.queue_path + '/' + name self.simulate_put(uri, project_id) - self.simulate_put(uri + '/metadata', project_id, body=body) + if self.metadata_support: + self.simulate_put(uri + '/metadata', project_id, body=body) create_queue('g1', None, '{"answer": 42}') create_queue('g2', None, '{"answer": 42}') @@ -280,8 +295,9 @@ class QueueLifecycleBaseTest(base.TestBase): queues = result_doc['queues'] self.assertEqual(len(queues), 2) - for queue in queues: - self.assertEqual(queue['metadata'], {'answer': 42}) + if self.metadata_support: + for queue in queues: + self.assertEqual(queue['metadata'], {'answer': 42}) # List (limit) result = self.simulate_get(self.queue_path, project_id, @@ -322,11 +338,12 @@ class QueueLifecycleBaseTest(base.TestBase): result_doc = json.loads(result[0]) [target, params] = result_doc['links'][0]['href'].split('?') - queue = result_doc['queues'][0] - result = self.simulate_get(queue['href'] + '/metadata', project_id) - result_doc = json.loads(result[0]) - self.assertEqual(result_doc, queue['metadata']) - self.assertEqual(result_doc, {'node': 31}) + if self.metadata_support: + queue = result_doc['queues'][0] + result = self.simulate_get(queue['href'] + '/metadata', project_id) + result_doc = json.loads(result[0]) + self.assertEqual(result_doc, queue['metadata']) + self.assertEqual(result_doc, {'node': 31}) # List tail self.simulate_get(target, project_id, query_string=params) diff --git a/tests/unit/queues/transport/wsgi/test_v1_1.py b/tests/unit/queues/transport/wsgi/test_v1_1.py index df8656687..ac49ce60b 100644 --- a/tests/unit/queues/transport/wsgi/test_v1_1.py +++ b/tests/unit/queues/transport/wsgi/test_v1_1.py @@ -76,10 +76,42 @@ class TestQueueFaultyDriver(wsgi.TestQueueFaultyDriver): # sort of a pain; is there a better way? class TestQueueLifecycleMongoDB(wsgi.TestQueueLifecycleMongoDB): url_prefix = URL_PREFIX + metadata_support = False + + def test_no_metadata(self): + """Metadata deprecated.""" + + def test_too_much_metadata(self): + """Metadata deprecated.""" + + def test_way_too_much_metadata(self): + """Metadata deprecated.""" + + def test_custom_metadata(self): + """Metadata deprecated.""" + + def test_update_metadata(self): + """Metadata deprecated.""" class TestQueueLifecycleSqlalchemy(wsgi.TestQueueLifecycleSqlalchemy): url_prefix = URL_PREFIX + metadata_support = False + + def test_no_metadata(self): + """Metadata deprecated.""" + + def test_too_much_metadata(self): + """Metadata deprecated.""" + + def test_way_too_much_metadata(self): + """Metadata deprecated.""" + + def test_custom_metadata(self): + """Metadata deprecated.""" + + def test_update_metadata(self): + """Metadata deprecated.""" class TestShardsMongoDB(wsgi.TestShardsMongoDB):