X-Git-Url: https://code.grnet.gr/git/pithos/blobdiff_plain/51f905a2b971d2995aa41318891f3411e72e98db..d6b85f51101ca50782ba10a8b44b4a0d8bb5311a:/tools/storefs.py diff --git a/tools/storefs.py b/tools/storefs.py index 2029eb1..c19ac94 100755 --- a/tools/storefs.py +++ b/tools/storefs.py @@ -41,21 +41,21 @@ from stat import S_IFDIR, S_IFREG from sys import argv from time import time +from lib.client import OOS_Client, Fault +from lib.fuse import FUSE, FuseOSError, Operations + from pithos.api.compat import parse_http_date -from pithos.lib.client import Client, Fault -from pithos.lib.fuse import FUSE, FuseOSError, Operations DEFAULT_HOST = 'pithos.dev.grnet.gr' -DEFAULT_API = 'v1' epoch = int(time()) class StoreFS(Operations): - def __init__(self, user, verbose=False): + def __init__(self, user, token, verbose=False): self.verbose = verbose - self.client = Client(DEFAULT_HOST, user, DEFAULT_API) + self.client = OOS_Client(DEFAULT_HOST, token, user) def __call__(self, op, path, *args): container, sep, object = path[1:].partition('/') @@ -66,14 +66,21 @@ class StoreFS(Operations): try: if object: - ret = getattr(self, 'object_' + op)(container, object, *args) + func = getattr(self, 'object_' + op, None) + funcargs = (container, object) + args elif container: - ret = getattr(self, 'container_' + op)(container, *args) + func = getattr(self, 'container_' + op, None) + funcargs = (container,) + args else: - ret = getattr(self, 'account_' + op)(*args) - return ret - except AttributeError: - ret = getattr(self, op)(path, *args) + func = getattr(self, 'account_' + op, None) + funcargs = args + + if not func: + # Fallback to defaults + func = getattr(self, op) + funcargs = (path,) + args + + ret = func(*funcargs) return ret except FuseOSError, e: ret = str(e) @@ -107,15 +114,16 @@ class StoreFS(Operations): # Account Level def account_chmod(self, mode): - self.client.update_account_metadata(mode=mode) + self.client.update_account_metadata(mode=str(mode)) def account_chown(self, uid, gid): self.client.update_account_metadata(uid=uid, gid=gid) def account_getattr(self, fh=None): - meta = self.client.account_metadata() + meta = self.client.retrieve_account_metadata() mode = int(meta.get('x-account-meta-mode', 0755)) - modified = parse_http_date(meta['last-modified']) + last_modified = meta.get('last-modified', None) + modified = parse_http_date(last_modified) if last_modified else epoch count = int(meta['x-account-container-count']) uid = int(meta.get('x-account-meta-uid', 0)) gid = int(meta.get('x-account-meta-gid', 0)) @@ -154,7 +162,7 @@ class StoreFS(Operations): # Container Level def container_chmod(self, container, mode): - self.client.update_container_metadata(container, mode=mode) + self.client.update_container_metadata(container, mode=str(mode)) def container_chown(self, container, uid, gid): self.client.update_container_metadata(container, uid=uid, gid=gid) @@ -186,8 +194,8 @@ class StoreFS(Operations): return [k[len(prefix):] for k in meta if k.startswith(prefix)] def container_mkdir(self, container, mode): - self.client.create_container(container) - self.client.update_container_metadata(container, mode=mode) + mode = str(mode & 0777) + self.client.create_container(container, mode=mode) def container_readdir(self, container, fh): params = {'delimiter': '/', 'prefix': ''} @@ -221,16 +229,18 @@ class StoreFS(Operations): # Object Level def object_chmod(self, container, object, mode): - self.client.update_object_metadata(container, object, mode=mode) + self.client.update_object_metadata(container, object, mode=str(mode)) def object_chown(self, container, uid, gid): - self.client.update_object_metadata(container, object, uid=uid, gid=gid) + self.client.update_object_metadata(container, object, + uid=str(uid), gid=str(gid)) def object_create(self, container, object, mode, fi=None): mode &= 0777 - headers = {'Content-Type': 'application/octet-stream'} - self.client.create_object(container, object, f=None, headers=headers) - self.client.update_object_metadata(container, object, mode=mode) + self.client.create_object(container, object, + f=None, + content_type='application/octet-stream', + mode=str(mode)) return 0 def object_getattr(self, container, object, fh=None): @@ -268,6 +278,7 @@ class StoreFS(Operations): return [k[len(prefix):] for k in meta if k.startswith(prefix)] def object_mkdir(self, container, object, mode): + mode = str(mode & 0777) self.client.create_directory_marker(container, object) self.client.update_object_metadata(container, object, mode=mode) @@ -310,21 +321,15 @@ class StoreFS(Operations): def object_write(self, container, object, data, offset, fh): f = StringIO(data) - headers = {} - if offset: - headers['CONTENT_RANGE'] = 'bytes %d-/*' % offset - else: - headers['CONTENT_RANGE'] = 'bytes */*' - - self.client.update_object(container, object, f, headers=headers) + self.client.update_object(container, object, f, offset=offset) return len(data) if __name__ == "__main__": - if len(argv) != 2: - print 'usage: %s ' % argv[0] + if len(argv) != 4: + print 'usage: %s ' % argv[0] exit(1) user = getuser() - fs = StoreFS(user, verbose=True) - fuse = FUSE(fs, argv[1], foreground=True) + fs = StoreFS(argv[1], argv[2], verbose=True) + fuse = FUSE(fs, argv[3], foreground=True)