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