Readded changes to bin/swift after merge from trunk
This commit is contained in:
parent
ba4f74d4fe
commit
599aedae95
82
bin/swift
82
bin/swift
@ -150,7 +150,7 @@ class ClientException(Exception):
|
||||
return b and '%s: %s' % (a, b) or a
|
||||
|
||||
|
||||
def http_connection(url):
|
||||
def http_connection(url, proxy=None):
|
||||
"""
|
||||
Make an HTTPConnection or HTTPSConnection
|
||||
|
||||
@ -158,14 +158,16 @@ def http_connection(url):
|
||||
:returns: tuple of (parsed url, connection object)
|
||||
:raises ClientException: Unable to handle protocol scheme
|
||||
"""
|
||||
parsed = urlparse(url)
|
||||
parsed = urlparse(proxy or url)
|
||||
if parsed.scheme == 'http':
|
||||
conn = HTTPConnection(parsed.netloc)
|
||||
elif parsed.scheme == 'https':
|
||||
conn = HTTPSConnection(parsed.netloc)
|
||||
else:
|
||||
raise ClientException('Cannot handle protocol scheme %s for url %s' %
|
||||
(parsed.scheme, repr(url)))
|
||||
(parsed.scheme, repr(proxy or url)))
|
||||
if proxy:
|
||||
parsed = urlparse(url)
|
||||
return parsed, conn
|
||||
|
||||
|
||||
@ -578,9 +580,9 @@ def head_object(url, token, container, name, http_conn=None):
|
||||
return resp_headers
|
||||
|
||||
|
||||
def put_object(url, token, container, name, contents, content_length=None,
|
||||
etag=None, chunk_size=65536, content_type=None, headers=None,
|
||||
http_conn=None):
|
||||
def put_object(url, token=None, container=None, name=None, contents=None,
|
||||
content_length=None, etag=None, chunk_size=65536,
|
||||
content_type=None, headers=None, http_conn=None, proxy=None):
|
||||
"""
|
||||
Put an object
|
||||
|
||||
@ -603,15 +605,28 @@ def put_object(url, token, container, name, contents, content_length=None,
|
||||
if http_conn:
|
||||
parsed, conn = http_conn
|
||||
else:
|
||||
parsed, conn = http_connection(url)
|
||||
path = '%s/%s/%s' % (parsed.path, quote(container), quote(name))
|
||||
if not headers:
|
||||
parsed, conn = http_connection(url, proxy=proxy)
|
||||
path = parsed.path
|
||||
if container:
|
||||
path = '%s/%s' % (path.rstrip('/'), quote(container))
|
||||
if name:
|
||||
path = '%s/%s' % (path.rstrip('/'), quote(name))
|
||||
if proxy:
|
||||
path = parsed.scheme + '://' + parsed.netloc + path
|
||||
if headers:
|
||||
headers = dict(headers)
|
||||
else:
|
||||
headers = {}
|
||||
headers['X-Auth-Token'] = token
|
||||
if token:
|
||||
headers['X-Auth-Token'] = token
|
||||
if etag:
|
||||
headers['ETag'] = etag.strip('"')
|
||||
if content_length is not None:
|
||||
headers['Content-Length'] = str(content_length)
|
||||
else:
|
||||
for n, v in headers.iteritems():
|
||||
if n.lower() == 'content-length':
|
||||
content_length = int(v)
|
||||
if content_type is not None:
|
||||
headers['Content-Type'] = content_type
|
||||
if not contents:
|
||||
@ -646,7 +661,7 @@ def put_object(url, token, container, name, contents, content_length=None,
|
||||
raise ClientException('Object PUT failed', http_scheme=parsed.scheme,
|
||||
http_host=conn.host, http_port=conn.port, http_path=path,
|
||||
http_status=resp.status, http_reason=resp.reason)
|
||||
return resp.getheader('etag').strip('"')
|
||||
return resp.getheader('etag', '').strip('"')
|
||||
|
||||
|
||||
def post_object(url, token, container, name, headers, http_conn=None):
|
||||
@ -677,7 +692,8 @@ def post_object(url, token, container, name, headers, http_conn=None):
|
||||
http_status=resp.status, http_reason=resp.reason)
|
||||
|
||||
|
||||
def delete_object(url, token, container, name, http_conn=None):
|
||||
def delete_object(url, token=None, container=None, name=None, http_conn=None,
|
||||
headers=None, proxy=None):
|
||||
"""
|
||||
Delete object
|
||||
|
||||
@ -692,9 +708,21 @@ def delete_object(url, token, container, name, http_conn=None):
|
||||
if http_conn:
|
||||
parsed, conn = http_conn
|
||||
else:
|
||||
parsed, conn = http_connection(url)
|
||||
path = '%s/%s/%s' % (parsed.path, quote(container), quote(name))
|
||||
conn.request('DELETE', path, '', {'X-Auth-Token': token})
|
||||
parsed, conn = http_connection(url, proxy=proxy)
|
||||
path = parsed.path
|
||||
if container:
|
||||
path = '%s/%s' % (path.rstrip('/'), quote(container))
|
||||
if name:
|
||||
path = '%s/%s' % (path.rstrip('/'), quote(name))
|
||||
if headers:
|
||||
headers = dict(headers)
|
||||
else:
|
||||
headers = {}
|
||||
if token:
|
||||
headers['X-Auth-Token'] = token
|
||||
if proxy:
|
||||
path = parsed.scheme + '://' + parsed.netloc + path
|
||||
conn.request('DELETE', path, '', headers)
|
||||
resp = conn.getresponse()
|
||||
resp.read()
|
||||
if resp.status < 200 or resp.status >= 300:
|
||||
@ -1363,10 +1391,14 @@ Container: %s
|
||||
Objects: %d
|
||||
Bytes: %d
|
||||
Read ACL: %s
|
||||
Write ACL: %s'''.strip('\n') % (conn.url.rsplit('/', 1)[-1], args[0],
|
||||
Write ACL: %s
|
||||
Sync To: %s
|
||||
Sync Key: %s'''.strip('\n') % (conn.url.rsplit('/', 1)[-1], args[0],
|
||||
object_count, bytes_used,
|
||||
headers.get('x-container-read', ''),
|
||||
headers.get('x-container-write', '')))
|
||||
headers.get('x-container-write', ''),
|
||||
headers.get('x-container-sync-to', ''),
|
||||
headers.get('x-container-sync-key', '')))
|
||||
for key, value in headers.items():
|
||||
if key.startswith('x-container-meta-'):
|
||||
print_queue.put('%9s: %s' % ('Meta %s' %
|
||||
@ -1375,7 +1407,8 @@ Write ACL: %s'''.strip('\n') % (conn.url.rsplit('/', 1)[-1], args[0],
|
||||
if not key.startswith('x-container-meta-') and key not in (
|
||||
'content-length', 'date', 'x-container-object-count',
|
||||
'x-container-bytes-used', 'x-container-read',
|
||||
'x-container-write'):
|
||||
'x-container-write', 'x-container-sync-to',
|
||||
'x-container-sync-key'):
|
||||
print_queue.put(
|
||||
'%9s: %s' % (key.title(), value))
|
||||
except ClientException, err:
|
||||
@ -1440,13 +1473,18 @@ def st_post(options, args, print_queue, error_queue):
|
||||
parser.add_option('-w', '--write-acl', dest='write_acl', help='Sets the '
|
||||
'Write ACL for containers. Quick summary of ACL syntax: account1, '
|
||||
'account2:user2')
|
||||
parser.add_option('-t', '--sync-to', dest='sync_to', help='Sets the '
|
||||
'Sync To for containers, for multi-cluster replication.')
|
||||
parser.add_option('-k', '--sync-key', dest='sync_key', help='Sets the '
|
||||
'Sync Key for containers, for multi-cluster replication.')
|
||||
parser.add_option('-m', '--meta', action='append', dest='meta', default=[],
|
||||
help='Sets a meta data item with the syntax name:value. This option '
|
||||
'may be repeated. Example: -m Color:Blue -m Size:Large')
|
||||
(options, args) = parse_args(parser, args)
|
||||
args = args[1:]
|
||||
if (options.read_acl or options.write_acl) and not args:
|
||||
exit('-r and -w options only allowed for containers')
|
||||
if (options.read_acl or options.write_acl or options.sync_to or
|
||||
options.sync_key) and not args:
|
||||
exit('-r, -w, -t, and -k options only allowed for containers')
|
||||
conn = Connection(options.auth, options.user, options.key)
|
||||
if not args:
|
||||
headers = {}
|
||||
@ -1474,6 +1512,10 @@ def st_post(options, args, print_queue, error_queue):
|
||||
headers['X-Container-Read'] = options.read_acl
|
||||
if options.write_acl is not None:
|
||||
headers['X-Container-Write'] = options.write_acl
|
||||
if options.sync_to is not None:
|
||||
headers['X-Container-Sync-To'] = options.sync_to
|
||||
if options.sync_key is not None:
|
||||
headers['X-Container-Sync-Key'] = options.sync_key
|
||||
try:
|
||||
conn.post_container(args[0], headers=headers)
|
||||
except ClientException, err:
|
||||
|
Loading…
Reference in New Issue
Block a user