Revision a5149fd0

b/pithos/api/functions.py
956 956
        raise RangeNotSatisfiable('Supplied offset is beyond object limits')
957 957
    if src_object:
958 958
        src_container, src_name = split_container_object_string(src_object)
959
        src_container = smart_unicode(src_container, strings_only=True)
960
        src_name = smart_unicode(src_name, strings_only=True)
959 961
        src_version = request.META.get('HTTP_X_SOURCE_VERSION')
960 962
        try:
961 963
            src_size, src_hashmap = backend.get_object_hashmap(request.user, v_account, src_container, src_name, src_version)
b/tools/lib/client.py
791 791
                      content_type=None, content_range=None,
792 792
                      content_encoding=None, content_disposition=None,
793 793
                      x_object_bytes=None, x_object_manifest=None,
794
                      x_object_sharing=None, x_object_public=None, account=None):
794
                      x_object_sharing=None, x_object_public=None,
795
                      x_source_object=None, account=None):
795 796
        """updates an object"""
796 797
        account = account or self.account
797
        spath = '/%s/%s/%s' % (account, container, object)
798 798
        args = locals()
799 799
        for elem in ['self', 'container', 'object']:
800 800
            args.pop(elem)
801
        
802 801
        return OOS_Client.update_object(self, container, object, **args)
803 802
        
804 803
    def update_object_using_chunks(self, container, object, f=stdin,
......
829 828
        return self._chunked_transfer(path, 'POST', f, headers=headers,
830 829
                                      blocksize=blocksize)
831 830
    
831
    def update_from_other_source(self, container, object, source,
832
                      offset=None, meta={}, content_range=None,
833
                      content_encoding=None, content_disposition=None,
834
                      x_object_bytes=None, x_object_manifest=None,
835
                      x_object_sharing=None, x_object_public=None, account=None):
836
        """updates an object"""
837
        account = account or self.account
838
        args = locals()
839
        for elem in ['self', 'container', 'object', 'source']:
840
            args.pop(elem)
841
        
842
        args['x_source_object'] = source
843
        return self.update_object(container, object, f=None, **args)
844
    
832 845
    def delete_object(self, container, object, until=None, account=None):
833 846
        """deletes an object or the object history until the date provided"""
834 847
        account = account or self.account
b/tools/lib/util.py
1
import os
2

  
3
#DEFAULT_HOST = 'pithos.dev.grnet.gr'
4
DEFAULT_HOST = '127.0.0.1:8000'
5
DEFAULT_API = 'v1'
6
DEFAULT_USER = 'test'
7
DEFAULT_AUTH = '0000'
8

  
9
def get_user():
10
    try:
11
        return os.environ['PITHOS_USER']
12
    except KeyError:
13
        return DEFAULT_USER
14

  
15
def get_auth():
16
    try:
17
        return os.environ['PITHOS_AUTH']
18
    except KeyError:
19
        return DEFAULT_AUTH
20

  
21
def get_server():
22
    try:
23
        return os.environ['PITHOS_SERVER']
24
    except KeyError:
25
        return DEFAULT_HOST
26

  
27
def get_api():
28
    try:
29
        return os.environ['PITHOS_API']
30
    except KeyError:
31
        return DEFAULT_API
b/tools/store
37 37
from optparse import OptionParser
38 38
from os import environ
39 39
from sys import argv, exit, stdin, stdout
40
from pithos.lib.client import Pithos_Client, Fault
41 40
from datetime import datetime
41
from lib.client import Pithos_Client, Fault
42
from lib.util import get_user, get_auth, get_server, get_api
42 43

  
43 44
import json
44 45
import logging
......
47 48
import time as _time
48 49
import os
49 50

  
50
DEFAULT_HOST = 'pithos.dev.grnet.gr'
51
#DEFAULT_HOST = '127.0.0.1:8000'
52
DEFAULT_API = 'v1'
53

  
54 51
_cli_commands = {}
55 52

  
56 53
def cli_command(*args):
......
70 67
    def __init__(self, name, argv):
71 68
        parser = OptionParser('%%prog %s [options] %s' % (name, self.syntax))
72 69
        parser.add_option('--host', dest='host', metavar='HOST',
73
                          default=_get_server(), help='use server HOST')
70
                          default=get_server(), help='use server HOST')
74 71
        parser.add_option('--user', dest='user', metavar='USERNAME',
75
                          default=_get_user(),
72
                          default=get_user(),
76 73
                          help='use account USERNAME')
77 74
        parser.add_option('--token', dest='token', metavar='AUTH',
78
                          default=_get_auth(),
75
                          default=get_auth(),
79 76
                          help='use account AUTH')
80 77
        parser.add_option('--api', dest='api', metavar='API',
81
                          default=DEFAULT_API, help='use api API')
78
                          default=get_api(), help='use api API')
82 79
        parser.add_option('-v', action='store_true', dest='verbose',
83 80
                          default=False, help='use verbose output')
84 81
        parser.add_option('-d', action='store_true', dest='debug',
......
716 713
    for id, t in data['versions']:
717 714
        f.write('%s @ %s\n' % (str(id).rjust(30), datetime.fromtimestamp(t)))
718 715

  
719
def _get_user():
720
        try:
721
            return os.environ['PITHOS_USER']
722
        except KeyError:
723
            return getuser()
724

  
725
def _get_auth():
726
        try:
727
            return os.environ['PITHOS_AUTH']
728
        except KeyError:
729
            return '0000'
730

  
731
def _get_server():
732
    try:
733
        return os.environ['PITHOS_SERVER']
734
    except KeyError:
735
        return DEFAULT_HOST
736

  
737 716
def main():
738 717
    try:
739 718
        name = argv[1]
b/tools/test
35 35
# or implied, of GRNET S.A.
36 36

  
37 37
from lib.client import Pithos_Client, Fault
38
from lib.util import get_user, get_auth, get_server, get_api
38 39
from xml.dom import minidom
39 40
from StringIO import StringIO
40 41
import json
......
42 43
import time as _time
43 44
import types
44 45
import hashlib
45
import os
46 46
import mimetypes
47 47
import random
48 48
import datetime
......
53 53
                "%A, %d-%b-%y %H:%M:%S GMT",
54 54
                "%a, %d %b %Y %H:%M:%S GMT"]
55 55

  
56
#DEFAULT_HOST = 'pithos.dev.grnet.gr'
57
DEFAULT_HOST = '127.0.0.1:8000'
58
DEFAULT_API = 'v1'
59
DEFAULT_USER = 'test'
60
DEFAULT_AUTH = '0000'
61

  
62 56
OTHER_ACCOUNTS = {
63 57
    '0001': 'verigak',
64 58
    '0002': 'chazapis',
......
73 67
class BaseTestCase(unittest.TestCase):
74 68
    #TODO unauthorized request
75 69
    def setUp(self):
76
        self.client = Pithos_Client(DEFAULT_HOST,
77
                                    DEFAULT_AUTH,
78
                                    DEFAULT_USER,
79
                                    DEFAULT_API)
80
        self.invalid_client = Pithos_Client(DEFAULT_HOST,
81
                                                  DEFAULT_AUTH,
82
                                                  'invalid',
83
                                                  DEFAULT_API)
70
        self.client = Pithos_Client(get_server(), get_auth(), get_user(),
71
                                    get_api())
72
        self.invalid_client = Pithos_Client(get_server(), get_auth(), 'invalid',
73
                                            get_api())
84 74
        #self.headers = {
85 75
        #    'account': ('x-account-container-count',
86 76
        #                'x-account-bytes-used',
......
666 656
        self.assertEqual(10000, len(self.client.list_objects('pithos')))
667 657
    
668 658
    def test_list_empty_params(self):
669
        objects = self.client.get('/%s/%s' % (DEFAULT_USER, self.container[0]))[2]
659
        objects = self.client.get('/%s/%s' % (get_user(), self.container[0]))[2]
670 660
        if objects:
671 661
            objects = objects.strip().split('\n')
672 662
        self.assertEqual(objects,
......
1501 1491
                                              self.obj['name'])
1502 1492
        self.assertEqual(content[0:dl], data)
1503 1493
        self.assertEqual(content[dl:fl], self.obj['data'][dl:fl])
1494
    
1495
    def test_update_from_other_object(self):
1496
        data = self.upload_random_data(self.containers[0], o_names[1])['data']
1497
        source_object = '/%s/%s' % (self.containers[0], o_names[0])
1498
        self.client.update_from_other_source(self.containers[0], o_names[1],
1499
                                             source_object)
1500
        
1501
        self.assertEqual(
1502
            self.client.retrieve_object(self.containers[0], o_names[0]),
1503
            self.client.retrieve_object(self.containers[0], o_names[1]))
1504
    
1504 1505

  
1505 1506
class ObjectDelete(BaseTestCase):
1506 1507
    def setUp(self):
......
1539 1540
        #self.client.share_object('c', 'o2', self.o2_sharing)
1540 1541
    
1541 1542
    def test_listing(self):
1542
        self.other = Pithos_Client(DEFAULT_HOST,
1543
        self.other = Pithos_Client(get_server(),
1543 1544
                              self.o1_sharing_with[0],
1544 1545
                              self.o1_sharing_with[1],
1545
                              DEFAULT_API)
1546
                              get_api())
1546 1547
        self.assertTrue('test' in self.other.list_shared_by_others())
1547 1548

  
1548 1549
class TestGreek(BaseTestCase):
......
1686 1687
        self.client.create_container('φάκελος')
1687 1688
        o = self.upload_random_data('φάκελος', 'ο1')
1688 1689
        self.client.share_object('φάκελος', 'ο1', ['test:σεφς'])
1689
        chef = Pithos_Client(DEFAULT_HOST,
1690
        chef = Pithos_Client(get_server(),
1690 1691
                            '0009',
1691 1692
                            'διογένης',
1692
                            DEFAULT_API)
1693
                            get_api())
1693 1694
        self.assert_not_raises_fault(401, chef.retrieve_object_metadata,
1694
                                     'φάκελος', 'ο1', account=DEFAULT_USER)
1695
                                     'φάκελος', 'ο1', account=get_user())
1695 1696
        
1696 1697
        #check write access
1697 1698
        self.client.share_object('φάκελος', 'ο1', ['διογένης'], read=False)
1698 1699
        new_data = get_random_data()
1699 1700
        self.assert_not_raises_fault(401, chef.update_object,
1700 1701
                                     'φάκελος', 'ο1', StringIO(new_data),
1701
                                     account=DEFAULT_USER)
1702
                                     account=get_user())
1702 1703
        
1703 1704
        server_data = self.client.retrieve_object('φάκελος', 'ο1')
1704 1705
        self.assertEqual(server_data[:len(o['data'])], o['data'])
......
1726 1727
        self.assertEqual('', self.client.retrieve_object('φάκελος', 'άπαντα'))
1727 1728
    
1728 1729
    def test_update_from_another_object(self):
1729
        pass
1730

  
1731
#class TestUnicode(BaseTestCase):
1732
#    def test_create_container(self):
1733
#        self.client.create_container(u'φάκελος')
1734
#        self.assert_container_exists(u'φάκελος')
1735
#        
1736
#        self.assertTrue(u'φάκελος' in self.client.list_containers())
1730
        self.client.create_container('κουβάς')
1731
        src_data = self.upload_random_data('κουβάς', 'πηγή')['data']
1732
        initial_data = self.upload_random_data('κουβάς', 'νέο')['data']
1733
        source_object = '/%s/%s' % ('κουβάς', 'πηγή')
1734
        self.client.update_from_other_source('κουβάς', 'νέο', source_object)
1735
        
1736
        self.assertEqual(
1737
            self.client.retrieve_object('κουβάς', 'νέο'),
1738
            '%s%s' % (initial_data, self.client.retrieve_object('κουβάς', 'πηγή')))
1737 1739

  
1738 1740
class TestPermissions(BaseTestCase):
1739 1741
    def setUp(self):
......
1770 1772
        o = self.upload_random_data('c', 'o')
1771 1773
        self.client.share_object('c', 'o', ['test:pithosdev'])
1772 1774
        for token, account in OTHER_ACCOUNTS.items():
1773
            cl = Pithos_Client(DEFAULT_HOST, token, account, DEFAULT_API) 
1775
            cl = Pithos_Client(get_server(), token, account, get_api()) 
1774 1776
            if account in self.authorized:
1775 1777
                self.assert_not_raises_fault(401, cl.retrieve_object_metadata,
1776
                                             'c', 'o', account=DEFAULT_USER)
1778
                                             'c', 'o', account=get_user())
1777 1779
            else:
1778 1780
                self.assert_raises_fault(401, cl.retrieve_object_metadata,
1779
                                         'c', 'o', account=DEFAULT_USER)
1781
                                         'c', 'o', account=get_user())
1780 1782
        
1781 1783
    
1782 1784
    #def test_write_access(self):
......
1785 1787
    #    chef.update_object('φάκελος', 'ο1', StringIO(new_data))
1786 1788
    #    self.assert_not_raises_fault(401, chef.update_object,
1787 1789
    #                                 'φάκελος', 'ο1', StringIO(new_data),
1788
    #                                 account=DEFAULT_USER)
1790
    #                                 account=get_user())
1789 1791
    #    
1790 1792
    #    server_data = self.client.retrieve_object('φάκελος', 'ο1')
1791 1793
    #    self.assertEqual(server_data[:len(o['data'])], o['data'])

Also available in: Unified diff