Revision f0eacc2c pithos/lib/client.py
b/pithos/lib/client.py | ||
---|---|---|
33 | 33 |
|
34 | 34 |
from httplib import HTTPConnection, HTTP |
35 | 35 |
from sys import stdin |
36 |
from xml.dom import minidom |
|
36 | 37 |
|
37 | 38 |
import json |
38 | 39 |
import types |
... | ... | |
93 | 94 |
kwargs['headers']['X-Auth-Token'] = self.token |
94 | 95 |
if body: |
95 | 96 |
kwargs['body'] = body |
96 |
else:
|
|
97 |
elif 'content-type' not in kwargs['headers']:
|
|
97 | 98 |
kwargs['headers']['content-type'] = '' |
98 | 99 |
kwargs['headers'].setdefault('content-length', len(body) if body else 0) |
99 | 100 |
kwargs['headers'].setdefault('content-type', 'application/octet-stream') |
... | ... | |
141 | 142 |
def put(self, path, body=None, format='text', headers=None): |
142 | 143 |
return self._req('PUT', path, body, headers=headers, format=format) |
143 | 144 |
|
144 |
def _list(self, path, detail=False, params={}, **headers): |
|
145 |
format = 'json' if detail else 'text' |
|
145 |
def _list(self, path, format='text', params={}, **headers): |
|
146 | 146 |
status, headers, data = self.get(path, format=format, headers=headers, |
147 | 147 |
params=params) |
148 |
if detail:
|
|
148 |
if format == 'json':
|
|
149 | 149 |
data = json.loads(data) if data else '' |
150 |
elif format == 'xml': |
|
151 |
print '#', data |
|
152 |
data = minidom.parseString(data) |
|
150 | 153 |
else: |
151 | 154 |
data = data.strip().split('\n') if data else '' |
152 | 155 |
return data |
... | ... | |
178 | 181 |
return ll |
179 | 182 |
|
180 | 183 |
class OOS_Client(Client): |
181 |
"""Openstack Objest Storage Client"""
|
|
184 |
"""Openstack Object Storage Client"""
|
|
182 | 185 |
|
183 | 186 |
def _update_metadata(self, path, entity, **meta): |
184 | 187 |
"""adds new and updates the values of previously set metadata""" |
... | ... | |
203 | 206 |
|
204 | 207 |
# Storage Account Services |
205 | 208 |
|
206 |
def list_containers(self, detail=False, limit=10000, marker=None, params={},
|
|
209 |
def list_containers(self, format='text', limit=10000, marker=None, params={},
|
|
207 | 210 |
**headers): |
208 | 211 |
"""lists containers""" |
209 | 212 |
if not params: |
210 | 213 |
params = {} |
211 | 214 |
params.update({'limit':limit, 'marker':marker}) |
212 |
return self._list('', detail, params, **headers)
|
|
215 |
return self._list('', format, params, **headers)
|
|
213 | 216 |
|
214 | 217 |
def retrieve_account_metadata(self, restricted=False, **params): |
215 | 218 |
"""returns the account metadata""" |
... | ... | |
229 | 232 |
def _filter_trashed(self, l): |
230 | 233 |
return self._filter(l, {'trash':'true'}) |
231 | 234 |
|
232 |
def list_objects(self, container, detail=False, limit=10000, marker=None,
|
|
235 |
def list_objects(self, container, format='text', limit=10000, marker=None,
|
|
233 | 236 |
prefix=None, delimiter=None, path=None, |
234 | 237 |
include_trashed=False, params={}, **headers): |
235 | 238 |
"""returns a list with the container objects""" |
236 | 239 |
params.update({'limit':limit, 'marker':marker, 'prefix':prefix, |
237 | 240 |
'delimiter':delimiter, 'path':path}) |
238 |
l = self._list('/' + container, detail, params, **headers) |
|
239 |
if not include_trashed: |
|
241 |
l = self._list('/' + container, format, params, **headers) |
|
242 |
#TODO support filter trashed with xml also |
|
243 |
if format != 'xml' and not include_trashed: |
|
240 | 244 |
l = self._filter_trashed(l) |
241 | 245 |
return l |
242 | 246 |
|
... | ... | |
272 | 276 |
|
273 | 277 |
# Storage Object Services |
274 | 278 |
|
275 |
def request_object(self, container, object, detail=False, params={},
|
|
279 |
def request_object(self, container, object, format='text', params={},
|
|
276 | 280 |
**headers): |
277 | 281 |
"""returns tuple containing the status, headers and data response for an object request""" |
278 | 282 |
path = '/%s/%s' % (container, object) |
279 |
format = 'json' if detail else 'text' |
|
280 | 283 |
status, headers, data = self.get(path, format, headers, params) |
281 | 284 |
return status, headers, data |
282 | 285 |
|
283 |
def retrieve_object(self, container, object, detail=False, params={},
|
|
286 |
def retrieve_object(self, container, object, format='text', params={},
|
|
284 | 287 |
**headers): |
285 | 288 |
"""returns an object's data""" |
286 |
t = self.request_object(container, object, detail, params, **headers)
|
|
289 |
t = self.request_object(container, object, format, params, **headers)
|
|
287 | 290 |
return t[2] |
288 | 291 |
|
289 | 292 |
def create_directory_marker(self, container, object): |
... | ... | |
469 | 472 |
headers = {} |
470 | 473 |
prefix = 'x-%s-meta-' % entity |
471 | 474 |
for m in meta: |
472 |
headers['%s%s' % (prefix, m)] = None
|
|
475 |
headers['%s%s' % (prefix, m)] = ''
|
|
473 | 476 |
return self.post(path, headers=headers, params=params) |
474 | 477 |
|
475 | 478 |
# Storage Account Services |
476 | 479 |
|
477 |
def list_containers(self, detail=False, if_modified_since=None,
|
|
480 |
def list_containers(self, format='text', if_modified_since=None,
|
|
478 | 481 |
if_unmodified_since=None, limit=1000, marker=None, |
479 | 482 |
until=None): |
480 | 483 |
"""returns a list with the account containers""" |
481 | 484 |
params = {'until':until} if until else None |
482 | 485 |
headers = {'if-modified-since':if_modified_since, |
483 | 486 |
'if-unmodified-since':if_unmodified_since} |
484 |
return OOS_Client.list_containers(self, detail=detail, limit=limit,
|
|
487 |
return OOS_Client.list_containers(self, format=format, limit=limit,
|
|
485 | 488 |
marker=marker, params=params, |
486 | 489 |
**headers) |
487 | 490 |
|
... | ... | |
509 | 512 |
|
510 | 513 |
# Storage Container Services |
511 | 514 |
|
512 |
def list_objects(self, container, detail=False, limit=10000, marker=None,
|
|
515 |
def list_objects(self, container, format='text', limit=10000, marker=None,
|
|
513 | 516 |
prefix=None, delimiter=None, path=None, |
514 | 517 |
include_trashed=False, params={}, if_modified_since=None, |
515 | 518 |
if_unmodified_since=None, meta={}, until=None): |
... | ... | |
545 | 548 |
|
546 | 549 |
# Storage Object Services |
547 | 550 |
|
548 |
def retrieve_object(self, container, object, params={}, detail=False, range=None,
|
|
551 |
def retrieve_object(self, container, object, params={}, format='text', range=None,
|
|
549 | 552 |
if_range=None, if_match=None, if_none_match=None, |
550 | 553 |
if_modified_since=None, if_unmodified_since=None, |
551 | 554 |
**headers): |
... | ... | |
556 | 559 |
l = [elem for elem in l if eval(elem)] |
557 | 560 |
for elem in l: |
558 | 561 |
headers.update({elem:eval(elem)}) |
559 |
return OOS_Client.retrieve_object(self, container, object, detail=detail,
|
|
562 |
return OOS_Client.retrieve_object(self, container, object, format=format,
|
|
560 | 563 |
params=params, **headers) |
561 | 564 |
|
562 | 565 |
def retrieve_object_version(self, container, object, version, detail=False, |
Also available in: Unified diff