Dean Troyer ad59b03be6 Add object-store show commands
* Add lib.container.show_container() and lib.object.show_object()
* Add container and object show commands

Change-Id: I963d664c55b59739453345f0f353aa2eaf1bf70e
2013-09-26 13:34:11 -05:00

149 lines
4.3 KiB
Python

# Copyright 2010-2012 OpenStack Foundation
# Copyright 2013 Nebula Inc.
#
# 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.
#
"""Object v1 API library"""
import six
try:
from urllib.parse import urlparse
except ImportError:
from urlparse import urlparse
def list_objects(
api,
url,
container,
marker=None,
limit=None,
end_marker=None,
delimiter=None,
prefix=None,
path=None,
full_listing=False,
):
"""Get objects in a container
:param api: a restapi object
:param url: endpoint
:param container: container name to get a listing for
:param marker: marker query
:param limit: limit query
:param end_marker: marker query
:param delimiter: string to delimit the queries on
:param prefix: prefix query
:param path: path query (equivalent: "delimiter=/" and "prefix=path/")
:param full_listing: if True, return a full listing, else returns a max
of 10000 listings
:returns: a tuple of (response headers, a list of objects) The response
headers will be a dict and all header names will be lowercase.
"""
if full_listing:
data = listing = list_objects(
api,
url,
container,
marker,
limit,
end_marker,
delimiter,
prefix,
path,
)
while listing:
if delimiter:
marker = listing[-1].get('name', listing[-1].get('subdir'))
else:
marker = listing[-1]['name']
listing = list_objects(
api,
url,
container,
marker,
limit,
end_marker,
delimiter,
prefix,
path,
)
if listing:
data.extend(listing)
return data
object_url = url
query = "format=json"
if marker:
query += '&marker=%s' % marker
if limit:
query += '&limit=%d' % limit
if end_marker:
query += '&end_marker=%s' % end_marker
if delimiter:
query += '&delimiter=%s' % delimiter
if prefix:
query += '&prefix=%s' % prefix
if path:
query += '&path=%s' % path
url = "%s/%s?%s" % (object_url, container, query)
response = api.request('GET', url)
return response.json()
def show_object(
api,
url,
container,
obj,
):
"""Get object details
:param api: a restapi object
:param url: endpoint
:param container: container name to get a listing for
:returns: dict of object properties
"""
object_url = "%s/%s/%s" % (url, container, obj)
url_parts = urlparse(url)
response = api.request('HEAD', object_url)
data = {
'account': url_parts.path.split('/')[-1],
'container': container,
'object': obj,
}
#print "data: %s" % data
data['content-type'] = response.headers.get('content-type', None)
if 'content-length' in response.headers:
data['content-length'] = response.headers.get('content-length', None)
if 'last-modified' in response.headers:
data['last-modified'] = response.headers.get('last-modified', None)
if 'etag' in response.headers:
data['etag'] = response.headers.get('etag', None)
if 'x-object-manifest' in response.headers:
data['x-object-manifest'] = response.headers.get(
'x-object-manifest', None)
for key, value in six.iteritems(response.headers):
if key.startswith('x-object-meta-'):
data[key[len('x-object-meta-'):].title()] = value
elif key not in (
'content-type', 'content-length', 'last-modified',
'etag', 'date', 'x-object-manifest'):
data[key.title()] = value
return data