diff --git a/glance/api/v2/metadef_tags.py b/glance/api/v2/metadef_tags.py index 2360188da0..7d5a295200 100644 --- a/glance/api/v2/metadef_tags.py +++ b/glance/api/v2/metadef_tags.py @@ -48,13 +48,14 @@ class TagsController(object): policy_enforcer=self.policy) self.tag_schema_link = '/v2/schemas/metadefs/tag' - def create(self, req, metadata_tag, namespace): + def create(self, req, namespace, tag_name): tag_factory = self.gateway.get_metadef_tag_factory(req.context) tag_repo = self.gateway.get_metadef_tag_repo(req.context) + tag_name_as_dict = {'name': tag_name} try: new_meta_tag = tag_factory.new_tag( namespace=namespace, - **metadata_tag.to_dict()) + **tag_name_as_dict) tag_repo.add(new_meta_tag) except exception.Forbidden as e: raise webob.exc.HTTPForbidden(explanation=e.msg) @@ -286,7 +287,7 @@ class RequestDeserializer(wsgi.JSONRequestDeserializer): return limit - def _create_or_update(self, request): + def update(self, request): body = self._get_request_body(request) self._check_allowed(body) try: @@ -316,9 +317,6 @@ class RequestDeserializer(wsgi.JSONRequestDeserializer): return query_params - def create(self, request): - return self._create_or_update(request) - def create_tags(self, request): body = self._get_request_body(request) self._check_allowed(body) @@ -329,9 +327,6 @@ class RequestDeserializer(wsgi.JSONRequestDeserializer): metadata_tags = json.fromjson(MetadefTags, body) return dict(metadata_tags=metadata_tags) - def update(self, request): - return self._create_or_update(request) - @classmethod def _check_allowed(cls, image): for key in cls._disallowed_properties: diff --git a/glance/api/v2/router.py b/glance/api/v2/router.py index a5db75cbfe..ec8812ec9c 100644 --- a/glance/api/v2/router.py +++ b/glance/api/v2/router.py @@ -377,14 +377,10 @@ class API(wsgi.Router): controller=metadef_tags_resource, action='index', conditions={'method': ['GET']}) - mapper.connect('/metadefs/namespaces/{namespace}/tags', - controller=metadef_tags_resource, - action='create', - conditions={'method': ['POST']}) mapper.connect('/metadefs/namespaces/{namespace}/tags', controller=metadef_tags_resource, action='create_tags', - conditions={'method': ['PUT']}) + conditions={'method': ['POST']}) mapper.connect('/metadefs/namespaces/{namespace}/tags', controller=metadef_namespace_resource, action='delete_tags', @@ -392,13 +388,17 @@ class API(wsgi.Router): mapper.connect('/metadefs/namespaces/{namespace}/tags', controller=reject_method_resource, action='reject', - allowed_methods='GET, POST, PUT, DELETE', - conditions={'method': ['PATCH', 'HEAD']}) + allowed_methods='GET, POST, DELETE', + conditions={'method': ['PUT', 'PATCH', 'HEAD']}) mapper.connect('/metadefs/namespaces/{namespace}/tags/{tag_name}', controller=metadef_tags_resource, action='show', conditions={'method': ['GET']}) + mapper.connect('/metadefs/namespaces/{namespace}/tags/{tag_name}', + controller=metadef_tags_resource, + action='create', + conditions={'method': ['POST']}) mapper.connect('/metadefs/namespaces/{namespace}/tags/{tag_name}', controller=metadef_tags_resource, action='update', @@ -410,8 +410,8 @@ class API(wsgi.Router): mapper.connect('/metadefs/namespaces/{namespace}/tags/{tag_name}', controller=reject_method_resource, action='reject', - allowed_methods='GET, PUT, DELETE', - conditions={'method': ['POST', 'PATCH', 'HEAD']}) + allowed_methods='GET, POST, PUT, DELETE', + conditions={'method': ['PATCH', 'HEAD']}) images_resource = images.create_resource(custom_image_properties) mapper.connect('/images', diff --git a/glance/tests/functional/v2/test_metadef_tags.py b/glance/tests/functional/v2/test_metadef_tags.py old mode 100644 new mode 100755 index f51c512717..66f16127a3 --- a/glance/tests/functional/v2/test_metadef_tags.py +++ b/glance/tests/functional/v2/test_metadef_tags.py @@ -66,31 +66,24 @@ class TestMetadefTags(functional.FunctionalTest): response = requests.post(path, headers=headers, data=data) self.assertEqual(201, response.status_code) - # Metadata tags should not exist - path = self._url('/v2/metadefs/namespaces/MyNamespace/tags/tag1') + # Metadata tag should not exist + metadata_tag_name = "tag1" + path = self._url('/v2/metadefs/namespaces/%s/tags/%s' % + (namespace_name, metadata_tag_name)) response = requests.get(path, headers=self._headers()) self.assertEqual(404, response.status_code) - # Create a tag - path = self._url('/v2/metadefs/namespaces/MyNamespace/tags') + # Create the metadata tag headers = self._headers({'content-type': 'application/json'}) - metadata_tag_name = "tag1" - data = jsonutils.dumps( - { - "name": metadata_tag_name - } - ) - response = requests.post(path, headers=headers, data=data) + response = requests.post(path, headers=headers) self.assertEqual(201, response.status_code) # Get the metadata tag created above - path = self._url('/v2/metadefs/namespaces/%s/tags/%s' % - (namespace_name, metadata_tag_name)) response = requests.get(path, headers=self._headers()) self.assertEqual(200, response.status_code) metadata_tag = jsonutils.loads(response.text) - self.assertEqual("tag1", metadata_tag['name']) + self.assertEqual(metadata_tag_name, metadata_tag['name']) # Returned tag should match the created tag metadata_tag = jsonutils.loads(response.text) @@ -156,7 +149,7 @@ class TestMetadefTags(functional.FunctionalTest): data = jsonutils.dumps( {"tags": [{"name": "tag1"}, {"name": "tag2"}, {"name": "tag3"}]} ) - response = requests.put(path, headers=headers, data=data) + response = requests.post(path, headers=headers, data=data) self.assertEqual(201, response.status_code) # List out the three new tags. @@ -169,7 +162,7 @@ class TestMetadefTags(functional.FunctionalTest): data = jsonutils.dumps( {"tags": [{"name": "tag4"}, {"name": "tag5"}, {"name": "tag4"}]} ) - response = requests.put(path, headers=headers, data=data) + response = requests.post(path, headers=headers, data=data) self.assertEqual(409, response.status_code) # Verify the previous 3 still exist diff --git a/glance/tests/unit/v2/test_metadef_resources.py b/glance/tests/unit/v2/test_metadef_resources.py old mode 100644 new mode 100755 index 3fefbffa98..f80980a10b --- a/glance/tests/unit/v2/test_metadef_resources.py +++ b/glance/tests/unit/v2/test_metadef_resources.py @@ -1267,10 +1267,7 @@ class TestMetadefsControllers(base.IsolatedUnitTest): def test_tag_create(self): request = unit_test_utils.get_fake_request() - - tag = glance.api.v2.model.metadef_tag.MetadefTag() - tag.name = TAG2 - tag = self.tag_controller.create(request, tag, NAMESPACE1) + tag = self.tag_controller.create(request, NAMESPACE1, TAG2) self.assertEqual(TAG2, tag.name) tag = self.tag_controller.show(request, NAMESPACE1, TAG2) @@ -1328,42 +1325,26 @@ class TestMetadefsControllers(base.IsolatedUnitTest): def test_tag_create_conflict(self): request = unit_test_utils.get_fake_request() - - tag = glance.api.v2.model.metadef_tag.MetadefTag() - tag.name = TAG1 - self.assertRaises(webob.exc.HTTPConflict, - self.tag_controller.create, request, tag, - NAMESPACE1) + self.tag_controller.create, request, + NAMESPACE1, TAG1) def test_tag_create_non_existing_namespace(self): request = unit_test_utils.get_fake_request() - - tag = glance.api.v2.model.metadef_tag.MetadefTag() - tag.name = TAG1 - self.assertRaises(webob.exc.HTTPNotFound, - self.tag_controller.create, request, tag, - NAMESPACE4) + self.tag_controller.create, request, + NAMESPACE4, TAG1) def test_tag_create_non_visible_namespace(self): request = unit_test_utils.get_fake_request(tenant=TENANT2) - - tag = glance.api.v2.model.metadef_tag.MetadefTag() - tag.name = TAG1 - self.assertRaises(webob.exc.HTTPForbidden, - self.tag_controller.create, request, tag, - NAMESPACE1) + self.tag_controller.create, request, + NAMESPACE1, TAG1) def test_tag_create_non_visible_namespace_admin(self): request = unit_test_utils.get_fake_request(tenant=TENANT2, is_admin=True) - - tag = glance.api.v2.model.metadef_tag.MetadefTag() - tag.name = TAG2 - - tag = self.tag_controller.create(request, tag, NAMESPACE1) + tag = self.tag_controller.create(request, NAMESPACE1, TAG2) self.assertEqual(TAG2, tag.name) tag = self.tag_controller.show(request, NAMESPACE1, TAG2)