Merge "Test to GET public-readable container's object"
This commit is contained in:
commit
e7b9be66bc
|
@ -60,6 +60,8 @@ from tempest.services.object_storage.container_client import ContainerClient
|
||||||
from tempest.services.object_storage.object_client import ObjectClient
|
from tempest.services.object_storage.object_client import ObjectClient
|
||||||
from tempest.services.volume.json.volumes_client import VolumesClientJSON
|
from tempest.services.volume.json.volumes_client import VolumesClientJSON
|
||||||
from tempest.services.volume.xml.volumes_client import VolumesClientXML
|
from tempest.services.volume.xml.volumes_client import VolumesClientXML
|
||||||
|
from tempest.services.object_storage.object_client import \
|
||||||
|
ObjectClientCustomizedHeader
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -191,6 +193,7 @@ class Manager(object):
|
||||||
self.object_client = ObjectClient(*client_args)
|
self.object_client = ObjectClient(*client_args)
|
||||||
self.ec2api_client = APIClientEC2(*client_args)
|
self.ec2api_client = APIClientEC2(*client_args)
|
||||||
self.s3_client = ObjectClientS3(*client_args)
|
self.s3_client = ObjectClientS3(*client_args)
|
||||||
|
self.custom_object_client = ObjectClientCustomizedHeader(*client_args)
|
||||||
|
|
||||||
|
|
||||||
class AltManager(Manager):
|
class AltManager(Manager):
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import httplib2
|
||||||
|
import json
|
||||||
import re
|
import re
|
||||||
from tempest.common.rest_client import RestClient
|
from tempest.common.rest_client import RestClient
|
||||||
|
|
||||||
|
@ -116,3 +118,44 @@ class ObjectClient(RestClient):
|
||||||
|
|
||||||
resp, body = self.copy(url, headers=headers)
|
resp, body = self.copy(url, headers=headers)
|
||||||
return resp, body
|
return resp, body
|
||||||
|
|
||||||
|
|
||||||
|
class ObjectClientCustomizedHeader(RestClient):
|
||||||
|
|
||||||
|
def __init__(self, config, username, password, auth_url, tenant_name=None):
|
||||||
|
super(ObjectClientCustomizedHeader, self).__init__(config, username,
|
||||||
|
password, auth_url,
|
||||||
|
tenant_name)
|
||||||
|
#Overwrites json-specific header encoding in RestClient
|
||||||
|
self.service = self.config.object_storage.catalog_type
|
||||||
|
self.format = 'json'
|
||||||
|
|
||||||
|
def request(self, method, url, headers=None, body=None, wait=None):
|
||||||
|
"""A simple HTTP request interface."""
|
||||||
|
self.http_obj = httplib2.Http()
|
||||||
|
if headers is None:
|
||||||
|
headers = {}
|
||||||
|
if self.base_url is None:
|
||||||
|
self._set_auth()
|
||||||
|
|
||||||
|
req_url = "%s/%s" % (self.base_url, url)
|
||||||
|
resp, resp_body = self.http_obj.request(req_url, method,
|
||||||
|
headers=headers, body=body)
|
||||||
|
if resp.status in (401, 403):
|
||||||
|
try:
|
||||||
|
resp_body = json.loads(resp_body)
|
||||||
|
raise exceptions.Unauthorized(resp_body['error']['message'])
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
return resp, resp_body
|
||||||
|
|
||||||
|
def get_object(self, container, object_name, metadata=None):
|
||||||
|
"""Retrieve object's data."""
|
||||||
|
headers = {}
|
||||||
|
if metadata:
|
||||||
|
for key in metadata:
|
||||||
|
headers[str(key)] = metadata[key]
|
||||||
|
|
||||||
|
url = "{0}/{1}".format(container, object_name)
|
||||||
|
resp, body = self.get(url, headers=headers)
|
||||||
|
return resp, body
|
||||||
|
|
|
@ -32,6 +32,7 @@ class BaseObjectTest(unittest.TestCase):
|
||||||
cls.container_client = cls.os.container_client
|
cls.container_client = cls.os.container_client
|
||||||
cls.account_client = cls.os.account_client
|
cls.account_client = cls.os.account_client
|
||||||
cls.config = cls.os.config
|
cls.config = cls.os.config
|
||||||
|
cls.custom_object_client = cls.os.custom_object_client
|
||||||
|
|
||||||
try:
|
try:
|
||||||
cls.account_client.list_account_containers()
|
cls.account_client.list_account_containers()
|
||||||
|
|
|
@ -263,3 +263,36 @@ class ObjectTest(base.BaseObjectTest):
|
||||||
src_container_name)
|
src_container_name)
|
||||||
resp, _ = self.container_client.delete_container(
|
resp, _ = self.container_client.delete_container(
|
||||||
dst_container_name)
|
dst_container_name)
|
||||||
|
|
||||||
|
@attr(type='smoke')
|
||||||
|
def test_access_object_without_using_creds(self):
|
||||||
|
"""Make container public-readable, and access the object
|
||||||
|
anonymously, e.g. without using credentials"""
|
||||||
|
|
||||||
|
# Update Container Metadata to make public readable
|
||||||
|
headers = {'X-Container-Read': '.r:*,.rlistings'}
|
||||||
|
resp, body = \
|
||||||
|
self.container_client.update_container_metadata(
|
||||||
|
self.container_name, metadata=headers, metadata_prefix='')
|
||||||
|
self.assertIn(resp['status'], '204')
|
||||||
|
|
||||||
|
# Create Object
|
||||||
|
object_name = rand_name(name='Object')
|
||||||
|
data = arbitrary_string(size=len(object_name) * 1,
|
||||||
|
base_text=object_name)
|
||||||
|
resp, _ = self.object_client.create_object(self.container_name,
|
||||||
|
object_name, data)
|
||||||
|
self.assertEqual(resp['status'], '201')
|
||||||
|
|
||||||
|
# List container metadata
|
||||||
|
resp, _ = \
|
||||||
|
self.container_client.list_container_metadata(self.container_name)
|
||||||
|
self.assertEqual(resp['status'], '204')
|
||||||
|
self.assertIn('x-container-read', resp)
|
||||||
|
self.assertEqual(resp['x-container-read'], '.r:*,.rlistings')
|
||||||
|
|
||||||
|
# Trying to Get Object with empty Headers as it is public readable
|
||||||
|
resp, body = \
|
||||||
|
self.custom_object_client.get_object(self.container_name,
|
||||||
|
object_name, metadata={})
|
||||||
|
self.assertEqual(body, data)
|
||||||
|
|
Loading…
Reference in New Issue