openstacksdk/openstack/object_store/v1/obj.py

94 lines
3.5 KiB
Python

# 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 openstack import exceptions
from openstack.object_store import object_store_service
from openstack import resource
from openstack import utils
class Object(resource.Resource):
base_path = "/%(container)s"
service = object_store_service.ObjectStoreService()
id_attribute = "name"
allow_create = True
allow_retrieve = True
allow_update = True
allow_delete = True
allow_list = True
allow_head = True
# URL parameters
container = resource.prop("container")
name = resource.prop("name")
# Object details
hash = resource.prop("hash")
bytes = resource.prop("bytes")
# Headers for HEAD and GET requests
auth_token = resource.prop("x-auth-token")
newest = resource.prop("x-newest", type=bool)
range = resource.prop("range", type=dict)
if_match = resource.prop("if-match", type=dict)
if_none_match = resource.prop("if-none-match", type=dict)
if_modified_since = resource.prop("if-modified-since", type=dict)
if_unmodified_since = resource.prop("if-unmodified-since", type=dict)
# Query parameters
signature = resource.prop("signature")
expires = resource.prop("expires")
multipart_manifest = resource.prop("multipart-manifest")
# Response headers from HEAD and GET
content_length = resource.prop("content-length")
content_type = resource.prop("content-type")
accept_ranges = resource.prop("accept-ranges")
last_modified = resource.prop("last-modified")
etag = resource.prop("etag")
is_static_large_object = resource.prop("x-static-large-object")
date = resource.prop("date")
content_encoding = resource.prop("content-encoding")
content_disposition = resource.prop("content-disposition")
delete_at = resource.prop("x-delete-at", type=int)
object_manifest = resource.prop("x-object-manifest")
timestamp = resource.prop("x-timestamp")
# Headers for PUT and POST requests
transfer_encoding = resource.prop("transfer-encoding")
detect_content_type = resource.prop("x-detect-content-type", type=bool)
copy_from = resource.prop("x-copy-from")
delete_after = resource.prop("x-delete-after", type=int)
def get(self, session):
if not self.allow_retrieve:
raise exceptions.MethodNotSupported('retrieve')
# When joining the base_path part and the id part, base_path's
# leading slash gets dropped off here. Putting an empty leading value
# in front of it causes it to get joined and replaced.
url = utils.urljoin("", self.base_path % self, self.id)
# Only send actual headers, not potentially set body values and
# query parameters.
headers = self._attrs.copy()
for val in ("container", "name", "hash", "bytes", "signature",
"expires", "multipart_manifest"):
headers.pop(val, None)
resp = session.get(url, service=self.service, accept="bytes",
headers=headers).content
return resp