tempest/tempest/lib/services/object_storage/container_client.py

133 lines
5.0 KiB
Python

# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# 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 urllib import parse as urllib
import debtcollector.moves
from defusedxml import ElementTree as etree
from oslo_serialization import jsonutils as json
from tempest.lib.common import rest_client
from tempest.lib import exceptions
class ContainerClient(rest_client.RestClient):
def is_resource_deleted(self, container):
try:
self.list_container_metadata(container)
except exceptions.NotFound:
return True
return False
def update_container(self, container_name, **headers):
"""Creates or Updates a container
with optional metadata passed in as a dictionary.
Full list of allowed headers or value, please refer to the
official API reference:
https://docs.openstack.org/api-ref/object-store/#create-container
"""
url = str(container_name)
resp, body = self.put(url, body=None, headers=headers)
self.expected_success([201, 202], resp.status)
return resp, body
# NOTE: This alias is for the usability because PUT can be used for both
# updating/creating a resource and this PUT is mainly used for creating
# on Swift container API.
create_container = update_container
def delete_container(self, container_name):
"""Deletes the container (if it's empty)."""
url = str(container_name)
resp, body = self.delete(url)
self.expected_success(204, resp.status)
return resp, body
def create_update_or_delete_container_metadata(
self, container_name,
create_update_metadata=None,
delete_metadata=None,
create_update_metadata_prefix='X-Container-Meta-',
delete_metadata_prefix='X-Remove-Container-Meta-'):
"""Creates, Updates or deletes an containter metadata entry.
Container Metadata can be created, updated or deleted based on
metadata header or value. For detailed info, please refer to the
official API reference:
https://docs.openstack.org/api-ref/object-store/#create-update-or-delete-container-metadata
"""
url = str(container_name)
headers = {}
if create_update_metadata:
for key in create_update_metadata:
metadata_header_name = create_update_metadata_prefix + key
headers[metadata_header_name] = create_update_metadata[key]
if delete_metadata:
for key in delete_metadata:
headers[delete_metadata_prefix + key] = delete_metadata[key]
resp, body = self.post(url, headers=headers, body=None)
self.expected_success(204, resp.status)
return resp, body
update_container_metadata = debtcollector.moves.moved_function(
create_update_or_delete_container_metadata,
'update_container_metadata', __name__,
version='Queens', removal_version='Rocky')
def list_container_metadata(self, container_name):
"""List all container metadata."""
url = str(container_name)
resp, body = self.head(url)
self.expected_success(204, resp.status)
return resp, body
def list_container_objects(self, container_name, params=None):
"""List the objects in a container, given the container name
Returns the container object listing as a plain text list, or as
xml or json if that option is specified via the 'format' argument.
For a full list of available parameters, please refer to the official
API reference:
https://docs.openstack.org/api-ref/object-store/#show-container-details-and-list-objects
"""
url = str(container_name)
if params:
url += '?'
url += '&%s' % urllib.urlencode(params)
resp, body = self.get(url, headers={})
if params and params.get('format') == 'json':
body = json.loads(body)
elif params and params.get('format') == 'xml':
body = etree.fromstring(body)
# Else the content-type is plain/text
else:
body = [
obj_name for obj_name in body.decode().split('\n') if obj_name
]
self.expected_success([200, 204], resp.status)
return resp, body
list_container_contents = debtcollector.moves.moved_function(
list_container_objects, 'list_container_contents', __name__,
version='Queens', removal_version='Rocky')