Skip to content

Commit

Permalink
Merge "s3api: Add basic support for ?tagging requests"
Browse files Browse the repository at this point in the history
  • Loading branch information
Zuul authored and openstack-gerrit committed Jun 19, 2020
2 parents 455969c + 6afefe1 commit 5cf5548
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 3 deletions.
3 changes: 3 additions & 0 deletions swift/common/middleware/s3api/controllers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
LoggingStatusController
from swift.common.middleware.s3api.controllers.versioning import \
VersioningController
from swift.common.middleware.s3api.controllers.tagging import \
TaggingController

__all__ = [
'Controller',
Expand All @@ -47,6 +49,7 @@
'LocationController',
'LoggingStatusController',
'VersioningController',
'TaggingController',

'UnsupportedController',
]
57 changes: 57 additions & 0 deletions swift/common/middleware/s3api/controllers/tagging.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Copyright (c) 2014 OpenStack Foundation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from swift.common.utils import public

from swift.common.middleware.s3api.controllers.base import Controller, \
S3NotImplemented
from swift.common.middleware.s3api.s3response import HTTPOk
from swift.common.middleware.s3api.etree import Element, tostring, \
SubElement


class TaggingController(Controller):
"""
Handles the following APIs:
* GET Bucket and Object tagging
* PUT Bucket and Object tagging
* DELETE Bucket and Object tagging
"""
@public
def GET(self, req):
"""
Handles GET Bucket and Object tagging.
"""
elem = Element('Tagging')
SubElement(elem, 'TagSet')
body = tostring(elem)

return HTTPOk(body=body, content_type=None)

@public
def PUT(self, req):
"""
Handles PUT Bucket and Object tagging.
"""
raise S3NotImplemented('The requested resource is not implemented')

@public
def DELETE(self, req):
"""
Handles DELETE Bucket and Object tagging.
"""
raise S3NotImplemented('The requested resource is not implemented')
7 changes: 5 additions & 2 deletions swift/common/middleware/s3api/s3request.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@
ObjectController, AclController, MultiObjectDeleteController, \
LocationController, LoggingStatusController, PartController, \
UploadController, UploadsController, VersioningController, \
UnsupportedController, S3AclController, BucketController
UnsupportedController, S3AclController, BucketController, \
TaggingController
from swift.common.middleware.s3api.s3response import AccessDenied, \
InvalidArgument, InvalidDigest, BucketAlreadyOwnedByYou, \
RequestTimeTooSkewed, S3Response, SignatureDoesNotMatch, \
Expand Down Expand Up @@ -1026,9 +1027,11 @@ def controller(self):
return UploadsController
if 'versioning' in self.params:
return VersioningController
if 'tagging' in self.params:
return TaggingController

unsupported = ('notification', 'policy', 'requestPayment', 'torrent',
'website', 'cors', 'tagging', 'restore')
'website', 'cors', 'restore')
if set(unsupported) & set(self.params):
return UnsupportedController

Expand Down
19 changes: 18 additions & 1 deletion test/unit/common/middleware/s3api/test_s3api.py
Original file line number Diff line number Diff line change
Expand Up @@ -705,7 +705,24 @@ def test_cors(self):
self._test_unsupported_resource('cors')

def test_tagging(self):
self._test_unsupported_resource('tagging')
req = Request.blank('/bucket?tagging',
environ={'REQUEST_METHOD': 'GET'},
headers={'Authorization': 'AWS test:tester:hmac',
'Date': self.get_date_header()})
status, headers, body = self.call_s3api(req)
self.assertEqual(status.split()[0], '200')
req = Request.blank('/bucket?tagging',
environ={'REQUEST_METHOD': 'PUT'},
headers={'Authorization': 'AWS test:tester:hmac',
'Date': self.get_date_header()})
status, headers, body = self.call_s3api(req)
self.assertEqual(self._get_error_code(body), 'NotImplemented')
req = Request.blank('/bucket?tagging',
environ={'REQUEST_METHOD': 'DELETE'},
headers={'Authorization': 'AWS test:tester:hmac',
'Date': self.get_date_header()})
status, headers, body = self.call_s3api(req)
self.assertEqual(self._get_error_code(body), 'NotImplemented')

def test_restore(self):
self._test_unsupported_resource('restore')
Expand Down

0 comments on commit 5cf5548

Please sign in to comment.