Revision 95e92490 pithos/lib/client.py

b/pithos/lib/client.py
71 71
        self.debug = debug
72 72
        self.token = token
73 73
    
74
    def _req(self, method, path, body=None, headers={}, format='text',
75
             params={}, top_level_req=False):
76
        #path = urllib.quote(path)
77
        account = '' if top_level_req else self.account
78
        full_path = '/%s/%s%s?format=%s' % (self.api, account, path, format)
74
    def _req(self, method, path, body=None, headers={}, format='text', params={}):
75
        full_path = '/%s%s?format=%s' % (self.api, path, format)
79 76
        
80 77
        for k,v in params.items():
81 78
            if v:
......
100 97
            kwargs['headers'].setdefault('content-type',
101 98
                                         'application/octet-stream')
102 99
        kwargs['headers'].setdefault('content-length', len(body) if body else 0)
103
        #kwargs['headers'] = _encode_headers(kwargs['headers'])
104 100
        
105 101
        #print '#', method, full_path, kwargs
106 102
        t1 = datetime.datetime.utcnow()
......
132 128
    def delete(self, path, format='text', params={}):
133 129
        return self._req('DELETE', path, format=format, params=params)
134 130
    
135
    def get(self, path, format='text', headers={}, params={},
136
            top_level_req=False):
131
    def get(self, path, format='text', headers={}, params={}):
137 132
        return self._req('GET', path, headers=headers, format=format,
138
                        params=params, top_level_req=top_level_req)
133
                        params=params)
139 134
    
140 135
    def head(self, path, format='text', params={}):
141 136
         return self._req('HEAD', path, format=format, params=params)
......
147 142
    def put(self, path, body=None, format='text', headers=None):
148 143
        return self._req('PUT', path, body, headers=headers, format=format)
149 144
    
150
    def _list(self, path, format='text', params={}, top_level_req=False, 
151
              **headers):
145
    def _list(self, path, format='text', params={}, **headers):
152 146
        status, headers, data = self.get(path, format=format, headers=headers,
153
                                         params=params,
154
                                         top_level_req=top_level_req)
147
                                         params=params)
155 148
        if format == 'json':
156 149
            data = json.loads(data) if data else ''
157 150
        elif format == 'xml':
......
223 216
    
224 217
    # Storage Account Services
225 218
    
226
    def list_containers(self, format='text', limit=None, marker=None, params={},
227
                        **headers):
219
    def list_containers(self, format='text', limit=None,
220
                        marker=None, params={}, account=None, **headers):
228 221
        """lists containers"""
222
        account = account or self.account
223
        path = '/%s' % account
229 224
        params.update({'limit':limit, 'marker':marker})
230
        return self._list('', format, params, **headers)
225
        return self._list(path, format, params, **headers)
231 226
    
232
    def retrieve_account_metadata(self, restricted=False, **params):
227
    def retrieve_account_metadata(self, restricted=False, account=None, **params):
233 228
        """returns the account metadata"""
229
        account = account or self.account
230
        path = '/%s' % account
234 231
        prefix = 'x-account-meta-' if restricted else None
235
        return self._get_metadata('', prefix, params)
232
        return self._get_metadata(path, prefix, params)
236 233
    
237
    def update_account_metadata(self, **meta):
234
    def update_account_metadata(self, account=None, **meta):
238 235
        """updates the account metadata"""
239
        return self._update_metadata('', 'account', **meta)
236
        account = account or self.account
237
        path = '/%s' % account
238
        return self._update_metadata(path, 'account', **meta)
240 239
        
241
    def delete_account_metadata(self, meta=[]):
240
    def delete_account_metadata(self, meta=[], account=None):
242 241
        """deletes the account metadata"""
243
        return self._delete_metadata('', 'account', meta)
242
        account = account or self.account
243
        path = '/%s' % account
244
        return self._delete_metadata(path, 'account', meta)
244 245
    
245
    def reset_account_metadata(self, **meta):
246
    def reset_account_metadata(self, account=None, **meta):
246 247
        """resets account metadata"""
247
        return self._reset_metadata('', 'account', **meta)
248
        account = account or self.account
249
        path = '/%s' % account
250
        return self._reset_metadata(path, 'account', **meta)
248 251
    
249 252
    # Storage Container Services
250 253
    
251 254
    def _filter_trashed(self, l):
252 255
        return self._filter(l, {'trash':'true'})
253 256
    
254
    def list_objects(self, container, format='text', limit=None, marker=None,
255
                     prefix=None, delimiter=None, path=None,
256
                     include_trashed=False, params={}, **headers):
257
    def list_objects(self, container, format='text',
258
                     limit=None, marker=None, prefix=None, delimiter=None,
259
                     path=None, include_trashed=False, params={}, account=None,
260
                     **headers):
257 261
        """returns a list with the container objects"""
262
        account = account or self.account
258 263
        params.update({'limit':limit, 'marker':marker, 'prefix':prefix,
259 264
                       'delimiter':delimiter, 'path':path})
260
        l = self._list('/' + container, format, params, **headers)
265
        l = self._list('/%s/%s' % (account, container), format, params,
266
                       **headers)
261 267
        #TODO support filter trashed with xml also
262 268
        if format != 'xml' and not include_trashed:
263 269
            l = self._filter_trashed(l)
264 270
        return l
265 271
    
266
    def create_container(self, container, **meta):
272
    def create_container(self, container, account=None, **meta):
267 273
        """creates a container"""
274
        account = account or self.account
268 275
        headers = {}
269 276
        for k,v in meta.items():
270 277
            headers['x-container-meta-%s' %k.strip().upper()] = v.strip()
271
        status, header, data = self.put('/' + container, headers=headers)
278
        status, header, data = self.put('/%s/%s' % (account, container),
279
                                        headers=headers)
272 280
        if status == 202:
273 281
            return False
274 282
        elif status != 201:
275 283
            raise Fault(data, int(status))
276 284
        return True
277 285
    
278
    def delete_container(self, container, params={}):
286
    def delete_container(self, container, params={}, account=None):
279 287
        """deletes a container"""
280
        return self.delete('/' + container, params=params)
288
        account = account or self.account
289
        return self.delete('/%s/%s' % (account, container), params=params)
281 290
    
282
    def retrieve_container_metadata(self, container, restricted=False, **params):
291
    def retrieve_container_metadata(self, container, restricted=False,
292
                                    account=None, **params):
283 293
        """returns the container metadata"""
294
        account = account or self.account
284 295
        prefix = 'x-container-meta-' if restricted else None
285
        return self._get_metadata('/%s' % container, prefix, params)
296
        return self._get_metadata('/%s/%s' % (account, container), prefix,
297
                                  params)
286 298
    
287
    def update_container_metadata(self, container, **meta):
299
    def update_container_metadata(self, container, account=None, **meta):
288 300
        """unpdates the container metadata"""
289
        return self._update_metadata('/' + container, 'container', **meta)
301
        account = account or self.account
302
        return self._update_metadata('/%s/%s' % (account, container),
303
                                     'container', **meta)
290 304
        
291
    def delete_container_metadata(self, container, meta=[]):
305
    def delete_container_metadata(self, container, meta=[], account=None):
292 306
        """deletes the container metadata"""
293
        path = '/%s' % (container)
307
        account = account or self.account
308
        path = '/%s/%s' % (account, container)
294 309
        return self._delete_metadata(path, 'container', meta)
295 310
    
296 311
    # Storage Object Services
297 312
    
298 313
    def request_object(self, container, object, format='text', params={},
299
                        **headers):
314
                       account=None, **headers):
300 315
        """returns tuple containing the status, headers and data response for an object request"""
301
        path = '/%s/%s' % (container, object)
316
        account = account or self.account
317
        path = '/%s/%s/%s' % (account, container, object)
302 318
        status, headers, data = self.get(path, format, headers, params)
303 319
        return status, headers, data
304 320
    
305 321
    def retrieve_object(self, container, object, format='text', params={},
306
                             **headers):
322
                        account=None, **headers):
307 323
        """returns an object's data"""
308
        t = self.request_object(container, object, format, params, **headers)
324
        account = account or self.account
325
        t = self.request_object(container, object, format, params, account,
326
                                **headers)
309 327
        return t[2]
310 328
    
311
    def create_directory_marker(self, container, object):
329
    def create_directory_marker(self, container, object, account=None):
312 330
        """creates a dierectory marker"""
331
        account = account or self.account
313 332
        if not object:
314 333
            raise Fault('Directory markers have to be nested in a container')
315 334
        h = {'content_type':'application/directory'}
316
        return self.create_zero_length_object(container, object, **h)
335
        return self.create_zero_length_object(container, object, account=account,
336
                                              **h)
317 337
    
318 338
    def create_object(self, container, object, f=stdin, format='text', meta={},
319 339
                      etag=None, content_type=None, content_encoding=None,
320
                      content_disposition=None, **headers):
340
                      content_disposition=None, account=None, **headers):
321 341
        """creates a zero-length object"""
322
        path = '/%s/%s' % (container, object)
342
        account = account or self.account
343
        path = '/%s/%s/%s' % (account, container, object)
323 344
        for k, v  in headers.items():
324 345
            if not v:
325 346
                headers.pop(k)
......
336 357
    
337 358
    def create_zero_length_object(self, container, object, meta={}, etag=None,
338 359
                                  content_type=None, content_encoding=None,
339
                                  content_disposition=None, **headers):
360
                                  content_disposition=None, account=None,
361
                                  **headers):
362
        account = account or self.account
340 363
        args = locals()
341
        for elem in ['self', 'container', 'headers']:
364
        for elem in ['self', 'container', 'headers', 'account']:
342 365
            args.pop(elem)
343 366
        args.update(headers)
344
        return self.create_object(container, f=None, **args)
345
    
346
    def update_object(self, container, object, f=stdin, offset=None, meta={},
347
                      content_length=None, content_type=None,
348
                      content_encoding=None, content_disposition=None,
349
                      **headers):
350
        path = '/%s/%s' % (container, object)
367
        return self.create_object(container, account=account, f=None, **args)
368
    
369
    def update_object(self, container, object, f=stdin,
370
                      offset=None, meta={}, content_length=None,
371
                      content_type=None, content_encoding=None,
372
                      content_disposition=None,  account=None, **headers):
373
        account = account or self.account
374
        path = '/%s/%s/%s' % (account, container, object)
351 375
        for k, v  in headers.items():
352 376
            if not v:
353 377
                headers.pop(k)
......
370 394
        return self.post(path, data, headers=headers)
371 395
    
372 396
    def _change_obj_location(self, src_container, src_object, dst_container,
373
                             dst_object, remove=False, meta={}, **headers):
374
        path = '/%s/%s' % (dst_container, dst_object)
397
                             dst_object, remove=False, meta={}, account=None,
398
                             **headers):
399
        account = account or self.account
400
        path = '/%s/%s/%s' % (account, dst_container, dst_object)
375 401
        headers = {} if not headers else headers
376 402
        for k, v in meta.items():
377 403
            headers['x-object-meta-%s' % k] = v
......
383 409
        return self.put(path, headers=headers)
384 410
    
385 411
    def copy_object(self, src_container, src_object, dst_container, dst_object,
386
                    meta, **headers):
412
                   meta={}, account=None, **headers):
387 413
        """copies an object"""
414
        account = account or self.account
388 415
        return self._change_obj_location(src_container, src_object,
389
                                   dst_container, dst_object, remove=False,
390
                                   meta=meta, **headers)
416
                                   dst_container, dst_object, account=account,
417
                                   remove=False, meta=meta, **headers)
391 418
    
392 419
    def move_object(self, src_container, src_object, dst_container,
393
                             dst_object, meta={}, **headers):
420
                             dst_object, meta={}, account=None,
421
                             **headers):
394 422
        """moves an object"""
423
        account = account or self.account
395 424
        return self._change_obj_location(src_container, src_object,
396
                                         dst_container, dst_object, remove=True,
425
                                         dst_container, dst_object,
426
                                         account=account, remove=True,
397 427
                                         meta=meta, **headers)
398 428
    
399
    def delete_object(self, container, object, params={}):
429
    def delete_object(self, container, object, params={}, account=None):
400 430
        """deletes an object"""
401
        return self.delete('/%s/%s' % (container, object), params=params)
431
        account = account or self.account
432
        return self.delete('/%s/%s/%s' % (account, container, object),
433
                           params=params)
402 434
    
403 435
    def retrieve_object_metadata(self, container, object, restricted=False,
404
                                 version=None):
436
                                 version=None, account=None):
405 437
        """
406 438
        set restricted to True to get only user defined metadata
407 439
        """
408
        path = '/%s/%s' % (container, object)
440
        account = account or self.account
441
        path = '/%s/%s/%s' % (account, container, object)
409 442
        prefix = 'x-object-meta-' if restricted else None
410 443
        params = {'version':version} if version else {}
411 444
        return self._get_metadata(path, prefix, params=params)
412 445
    
413
    def update_object_metadata(self, container, object, **meta):
446
    def update_object_metadata(self, container, object, account=None,
447
                               **meta):
414 448
        """
415 449
        updates object's metadata
416 450
        """
417
        path = '/%s/%s' % (container, object)
451
        account = account or self.account
452
        path = '/%s/%s/%s' % (account, container, object)
418 453
        return self._update_metadata(path, 'object', **meta)
419 454
    
420
    def delete_object_metadata(self, container, object, meta=[]):
455
    def delete_object_metadata(self, container, object, meta=[], account=None):
421 456
        """
422 457
        deletes object's metadata
423 458
        """
424
        path = '/%s/%s' % (container, object)
459
        account = account or self.account
460
        path = '/%s/%s' % (account, container, object)
425 461
        return self._delete_metadata(path, 'object', meta)
426 462
    
427 463
class Pithos_Client(OOS_Client):
......
433 469
        http = HTTPConnection(self.host)
434 470
        
435 471
        # write header
436
        path = '/%s/%s%s' % (self.api, self.account, path)
472
        path = '/%s%s' % (self.api, path)
437 473
        http.putrequest(method, path)
438 474
        http.putheader('x-auth-token', self.token)
439 475
        http.putheader('content-type', 'application/octet-stream')
......
514 550
    
515 551
    def list_containers(self, format='text', if_modified_since=None,
516 552
                        if_unmodified_since=None, limit=1000, marker=None,
517
                        until=None):
553
                        until=None, account=None):
518 554
        """returns a list with the account containers"""
555
        account = account or self.account
519 556
        params = {'until':until} if until else {}
520 557
        headers = {'if-modified-since':if_modified_since,
521 558
                   'if-unmodified-since':if_unmodified_since}
522
        return OOS_Client.list_containers(self, format=format, limit=limit,
523
                                          marker=marker, params=params,
524
                                          **headers)
559
        return OOS_Client.list_containers(self, account=account, format=format,
560
                                          limit=limit, marker=marker,
561
                                          params=params, **headers)
525 562
    
526
    def retrieve_account_metadata(self, restricted=False, until=None):
563
    def retrieve_account_metadata(self, restricted=False, until=None,
564
                                  account=None):
527 565
        """returns the account metadata"""
566
        account = account or self.account
528 567
        params = {'until':until} if until else {}
529
        return OOS_Client.retrieve_account_metadata(self, restricted=restricted,
530
                                                   **params)
568
        return OOS_Client.retrieve_account_metadata(self, account=account,
569
                                                    restricted=restricted,
570
                                                    **params)
531 571
    
532
    def set_account_groups(self, **groups):
572
    def set_account_groups(self, account=None, **groups):
533 573
        """create account groups"""
574
        account = account or self.account
575
        path = '/%s' % account
534 576
        headers = {}
535 577
        for k, v in groups.items():
536 578
            headers['x-account-group-%s' % k] = v
537 579
        params = {'update':None}
538
        return self.post('', headers=headers, params=params)
580
        return self.post(path, headers=headers, params=params)
539 581
    
540
    def retrieve_account_groups(self):
582
    def retrieve_account_groups(self, account=None):
541 583
        """returns the account groups"""
542
        meta = self.retrieve_account_metadata()
584
        account = account or self.account
585
        meta = self.retrieve_account_metadata(account=account)
543 586
        prefix = 'x-account-group-'
544 587
        prefixlen = len(prefix)
545 588
        groups = {}
......
551 594
            groups[key] = val
552 595
        return groups
553 596
    
554
    def unset_account_groups(self, groups=[]):
597
    def unset_account_groups(self, groups=[], account=None):
555 598
        """delete account groups"""
599
        account = account or self.account
600
        path = '/%s' % account
556 601
        headers = {}
557 602
        for elem in groups:
558 603
            headers['x-account-group-%s' % elem] = ''
559 604
        params = {'update':None}
560
        return self.post('', headers=headers, params=params)
605
        return self.post(path, headers=headers, params=params)
561 606
    
562
    def reset_account_groups(self, **groups):
607
    def reset_account_groups(self, account=None, **groups):
563 608
        """overrides account groups"""
609
        account = account or self.account
610
        path = '/%s' % account
564 611
        headers = {}
565 612
        for k, v in groups.items():
566 613
            v = v.strip()
......
570 617
        for k,v in meta.items():
571 618
            k = '%s%s' % (prefix, k)
572 619
            headers[k] = v
573
        return self.post('', headers=headers)
620
        return self.post(path, headers=headers)
574 621
    
575 622
    # Storage Container Services
576 623
    
577
    def list_objects(self, container, format='text', limit=None, marker=None,
578
                     prefix=None, delimiter=None, path=None,
579
                     include_trashed=False, params={}, if_modified_since=None,
580
                     if_unmodified_since=None, meta='', until=None):
624
    def list_objects(self, container, format='text',
625
                     limit=None, marker=None, prefix=None, delimiter=None,
626
                     path=None, include_trashed=False, params={},
627
                     if_modified_since=None, if_unmodified_since=None, meta='',
628
                     until=None, account=None):
581 629
        """returns a list with the container objects"""
630
        account = account or self.account
582 631
        params = {'until':until, 'meta':meta}
583 632
        args = locals()
584 633
        for elem in ['self', 'container', 'params', 'until', 'meta']:
585 634
            args.pop(elem)
586
        return OOS_Client.list_objects(self, container, params=params, 
587
                                       **args)
635
        return OOS_Client.list_objects(self, container, params=params, **args)
588 636
    
589 637
    def retrieve_container_metadata(self, container, restricted=False,
590
                                    until=None):
638
                                    until=None, account=None):
591 639
        """returns container's metadata"""
640
        account = account or self.account
592 641
        params = {'until':until} if until else {}
593 642
        return OOS_Client.retrieve_container_metadata(self, container,
643
                                                      account=account,
594 644
                                                      restricted=restricted,
595 645
                                                      **params)
596 646
    
597
    def set_container_policies(self, container, **policies):
647
    def set_container_policies(self, container, account=None,
648
                               **policies):
598 649
        """sets containers policies"""
599
        path = '/%s' % (container)
650
        account = account or self.account
651
        path = '/%s/%s' % (account, container)
600 652
        headers = {}
601
        print ''
602 653
        for key, val in policies.items():
603 654
            headers['x-container-policy-%s' % key] = val
604 655
        return self.post(path, headers=headers)
605 656
    
606
    def delete_container(self, container, until=None):
657
    def delete_container(self, container, until=None, account=None):
607 658
        """deletes a container or the container history until the date provided"""
659
        account = account or self.account
608 660
        params = {'until':until} if until else {}
609
        return OOS_Client.delete_container(self, container, params)
661
        return OOS_Client.delete_container(self, container, account=account,
662
                                           params=params)
610 663
    
611 664
    # Storage Object Services
612 665
    
613
    def retrieve_object(self, container, object, params={}, format='text', range=None,
614
                        if_range=None, if_match=None, if_none_match=None,
666
    def retrieve_object(self, container, object, params={}, format='text',
667
                        range=None, if_range=None,
668
                        if_match=None, if_none_match=None,
615 669
                        if_modified_since=None, if_unmodified_since=None,
616
                        **headers):
670
                        account=None, **headers):
617 671
        """returns an object"""
672
        account = account or self.account
618 673
        headers={}
619 674
        l = ['range', 'if_range', 'if_match', 'if_none_match',
620 675
             'if_modified_since', 'if_unmodified_since']
621 676
        l = [elem for elem in l if eval(elem)]
622 677
        for elem in l:
623 678
            headers.update({elem:eval(elem)})
624
        return OOS_Client.retrieve_object(self, container, object, format=format,
679
        return OOS_Client.retrieve_object(self, container, object,
680
                                          account=account, format=format,
625 681
                                          params=params, **headers)
626 682
    
627
    def retrieve_object_version(self, container, object, version, detail=False,
628
                                range=None, if_range=None, if_match=None,
629
                                if_none_match=None, if_modified_since=None,
630
                                if_unmodified_since=None):
683
    def retrieve_object_version(self, container, object, version,
684
                                detail=False, range=None, if_range=None,
685
                                if_match=None, if_none_match=None,
686
                                if_modified_since=None, if_unmodified_since=None,
687
                                account=None):
631 688
        """returns a specific object version"""
689
        account = account or self.account
632 690
        args = locals()
633 691
        l = ['self', 'container', 'object']
634 692
        for elem in l:
635 693
            args.pop(elem)
636 694
        params = {'version':version}
637
        return self.retrieve_object(container, object, params, **args)
695
        return self.retrieve_object(container, object, params=params, **args)
638 696
    
639 697
    def retrieve_object_versionlist(self, container, object, range=None,
640 698
                                    if_range=None, if_match=None,
641 699
                                    if_none_match=None, if_modified_since=None,
642
                                    if_unmodified_since=None):
700
                                    if_unmodified_since=None, account=None):
643 701
        """returns the object version list"""
702
        account = account or self.account
644 703
        args = locals()
645 704
        l = ['self', 'container', 'object']
646 705
        for elem in l:
......
649 708
        return self.retrieve_object_version(container, object, version='list',
650 709
                                            detail=True, **args)
651 710
    
652
    def create_zero_length_object(self, container, object, meta={},
653
                      etag=None, content_type=None, content_encoding=None,
654
                      content_disposition=None, x_object_manifest=None,
655
                      x_object_sharing=None, x_object_public=None):
711
    def create_zero_length_object(self, container, object,
712
                                  meta={}, etag=None, content_type=None,
713
                                  content_encoding=None,
714
                                  content_disposition=None,
715
                                  x_object_manifest=None, x_object_sharing=None,
716
                                  x_object_public=None, account=None):
656 717
        """createas a zero length object"""
718
        account = account or self.account
657 719
        args = locals()
658 720
        for elem in ['self', 'container', 'object']:
659 721
            args.pop(elem)
660 722
        return OOS_Client.create_zero_length_object(self, container, object,
661 723
                                                    **args)
662 724
    
663
    def create_object(self, container, object, f=stdin, meta={},
664
                      etag=None, content_type=None, content_encoding=None,
665
                      content_disposition=None, x_object_manifest=None,
666
                      x_object_sharing=None, x_object_public=None):
725
    def create_object(self, container, object, f=stdin, 
726
                      meta={}, etag=None, content_type=None,
727
                      content_encoding=None, content_disposition=None,
728
                      x_object_manifest=None, x_object_sharing=None,
729
                      x_object_public=None, account=None):
667 730
        """creates an object"""
731
        account = account or self.account
668 732
        args = locals()
669 733
        for elem in ['self', 'container', 'object']:
670 734
            args.pop(elem)
671 735
        return OOS_Client.create_object(self, container, object, **args)
672 736
        
673
    def create_object_using_chunks(self, container, object, f=stdin,
674
                                    blocksize=1024, meta={}, etag=None,
675
                                    content_type=None, content_encoding=None,
676
                                    content_disposition=None, 
677
                                    x_object_sharing=None,
678
                                    x_object_manifest=None, 
679
                                    x_object_public=None):
737
    def create_object_using_chunks(self, container, object,
738
                                   f=stdin, blocksize=1024, meta={}, etag=None,
739
                                   content_type=None, content_encoding=None,
740
                                   content_disposition=None,
741
                                   x_object_sharing=None, x_object_manifest=None,
742
                                   x_object_public=None, account=None):
680 743
        """creates an object (incremental upload)"""
681
        path = '/%s/%s' % (container, object)
744
        account = account or self.account
745
        path = '/%s/%s/%s' % (account, container, object)
682 746
        headers = {}
683 747
        l = ['etag', 'content_type', 'content_encoding', 'content_disposition', 
684 748
             'x_object_sharing', 'x_object_manifest', 'x_object_public']
......
697 761
                                 meta={}, etag=None, content_encoding=None,
698 762
                                 content_disposition=None, content_type=None,
699 763
                                 x_object_sharing=None, x_object_manifest=None,
700
                                 x_object_public = None):
764
                                 x_object_public = None, account=None):
701 765
        """creates an object by uploading hashes representing data instead of data"""
766
        account = account or self.account
702 767
        args = locals()
703 768
        for elem in ['self', 'container', 'object']:
704 769
            args.pop(elem)
......
714 779
        #TODO check with xml
715 780
        return self.create_object(container, object, **args)
716 781
    
717
    def create_manifestation(self, container, object, manifest):
782
    def create_manifestation(self, container, object, manifest, account=None):
718 783
        """creates a manifestation"""
784
        account = account or self.account
719 785
        headers={'x_object_manifest':manifest}
720
        return self.create_object(container, object, f=None, **headers)
786
        return self.create_object(container, object, f=None, account=account,
787
                                  **headers)
721 788
    
722
    def update_object(self, container, object, f=stdin, offset=None, meta={},
723
                      content_length=None, content_type=None, content_range=None,
789
    def update_object(self, container, object, f=stdin,
790
                      offset=None, meta={}, content_length=None,
791
                      content_type=None, content_range=None,
724 792
                      content_encoding=None, content_disposition=None,
725 793
                      x_object_bytes=None, x_object_manifest=None,
726
                      x_object_sharing=None, x_object_public=None):
794
                      x_object_sharing=None, x_object_public=None, account=None):
727 795
        """updates an object"""
728
        spath = '/%s/%s' % (container, object)
796
        account = account or self.account
797
        spath = '/%s/%s/%s' % (account, container, object)
729 798
        args = locals()
730 799
        for elem in ['self', 'container', 'object']:
731 800
            args.pop(elem)
......
733 802
        return OOS_Client.update_object(self, container, object, **args)
734 803
        
735 804
    def update_object_using_chunks(self, container, object, f=stdin,
736
                                    blocksize=1024, offset=None, meta={},
737
                                    content_type=None, content_encoding=None,
738
                                    content_disposition=None, x_object_bytes=None,
739
                                    x_object_manifest=None, x_object_sharing=None,
740
                                    x_object_public=None):
805
                                   blocksize=1024, offset=None, meta={},
806
                                   content_type=None, content_encoding=None,
807
                                   content_disposition=None, x_object_bytes=None,
808
                                   x_object_manifest=None, x_object_sharing=None,
809
                                   x_object_public=None, account=None):
741 810
        """updates an object (incremental upload)"""
742
        path = '/%s/%s' % (container, object)
811
        account = account or self.account
812
        path = '/%s/%s/%s' % (account, container, object)
743 813
        headers = {}
744 814
        l = ['content_type', 'content_encoding', 'content_disposition',
745 815
             'x_object_bytes', 'x_object_manifest', 'x_object_sharing',
......
756 826
        for k,v in meta.items():
757 827
            v = v.strip()
758 828
            headers['x-object-meta-%s' %k.strip()] = v
759
        
760 829
        return self._chunked_transfer(path, 'POST', f, headers=headers,
761 830
                                      blocksize=blocksize)
762 831
    
763
    def delete_object(self, container, object, until=None):
832
    def delete_object(self, container, object, until=None, account=None):
764 833
        """deletes an object or the object history until the date provided"""
834
        account = account or self.account
765 835
        params = {'until':until} if until else {}
766
        return OOS_Client.delete_object(self, container, object, params)
836
        return OOS_Client.delete_object(self, container, object, params, account)
767 837
    
768 838
    def trash_object(self, container, object):
769 839
        """trashes an object"""
840
        account = account or self.account
770 841
        path = '/%s/%s' % (container, object)
771 842
        meta = {'trash':'true'}
772 843
        return self._update_metadata(path, 'object', **meta)
773 844
    
774
    def restore_object(self, container, object):
845
    def restore_object(self, container, object, account=None):
775 846
        """restores a trashed object"""
776
        return self.delete_object_metadata(container, object, ['trash'])
847
        account = account or self.account
848
        return self.delete_object_metadata(container, object, account, ['trash'])
777 849
    
778
    def publish_object(self, container, object):
850
    def publish_object(self, container, object, account=None):
779 851
        """sets a previously created object publicly accessible"""
780
        path = '/%s/%s' % (container, object)
852
        account = account or self.account
853
        path = '/%s/%s/%s' % (container, object)
781 854
        headers = {'content_range':'bytes */*'}
782 855
        headers['x_object_public'] = True
783 856
        return self.post(path, headers=headers)
784 857
    
785
    def unpublish_object(self, container, object):
858
    def unpublish_object(self, container, object, account=None):
786 859
        """unpublish an object"""
787
        path = '/%s/%s' % (container, object)
860
        account = account or self.account
861
        path = '/%s/%s/%s' % (account, container, object)
788 862
        headers = {'content_range':'bytes */*'}
789 863
        headers['x_object_public'] = False
790 864
        return self.post(path, headers=headers)
791 865
    
792 866
    def _change_obj_location(self, src_container, src_object, dst_container,
793
                             dst_object, remove=False, meta={}, **headers):
794
        path = '/%s/%s' % (dst_container, dst_object)
867
                             dst_object, remove=False,
868
                             meta={}, account=None, **headers):
869
        account = account or self.account
870
        path = '/%s/%s/%s' % (account, dst_container, dst_object)
795 871
        headers = {} if not headers else headers
796 872
        for k, v in meta.items():
797 873
            headers['x-object-meta-%s' % k] = v
......
803 879
        return self.put(path, headers=headers)
804 880
    
805 881
    def copy_object(self, src_container, src_object, dst_container, dst_object,
806
                    meta={}, public=False, version=None):
882
                    meta={}, public=False, version=None, account=None):
807 883
        """copies an object"""
884
        account = account or self.account
808 885
        headers = {}
809 886
        headers['x_object_public'] = public
810 887
        if version:
811 888
            headers['x_object_version'] = version
812 889
        return OOS_Client.copy_object(self, src_container, src_object,
813 890
                                      dst_container, dst_object, meta=meta,
814
                                      **headers)
891
                                      account=account,**headers)
815 892
    
816 893
    def move_object(self, src_container, src_object, dst_container,
817
                             dst_object, meta={}, public=False, version=None):
894
                             dst_object, meta={}, public=False, version=None,
895
                             account=None):
818 896
        """moves an object"""
819 897
        headers = {}
820 898
        headers['x_object_public'] = public
......
822 900
            headers['x_object_version'] = version
823 901
        return OOS_Client.move_object(self, src_container, src_object,
824 902
                                      dst_container, dst_object, meta=meta,
825
                                      **headers)
903
                                      account=account, **headers)
826 904
    
827 905
    def list_shared_by_others(self, limit=None, marker=None, format='text'):
828
         """lists other accounts that share objects to the user"""
829
         l = ['limit', 'marker']
830
         params = {}
831
         for elem in [elem for elem in l if eval(elem)]:
832
             params[elem] = eval(elem)
833
         return self._list('', format, params, top_level_req=True)
906
        """lists other accounts that share objects to the user"""
907
        l = ['limit', 'marker']
908
        params = {}
909
        for elem in [elem for elem in l if eval(elem)]:
910
            params[elem] = eval(elem)
911
        return self._list('', format, params)
834 912
    
835 913
    def share_object(self, container, object, l, read=True):
836 914
        """gives access(read by default) to an object to a user/group list"""

Also available in: Unified diff