1
2 __docformat__ = 'epytext'
3
4 import os.path
5
6 __all__ = ['init_storage']
7
8 from amplee.loader.utils import get_value, is_present, load_callable
9
11 res = store.xml_xpath('./amplee:storage[@target="%s"]' % target)
12
13 if not res:
14 raise ValueError("Missing '%s' target in one of the storage elements of the configuration" % target)
15
16 storage = res[0]
17 storage_type = storage.type
18
19 if storage_type == 'filesystem':
20 from amplee.storage import storefs
21 root_dir = str(storage.basepath)
22 if base_path and not os.path.isabs(root_dir):
23 root_dir = os.path.join(base_path, root_dir)
24 enable_lock = is_present(storage, 'lock')
25 encoding = get_value(storage, 'encoding', 'utf-8')
26 return storefs.FilesystemStorage(root_dir, enable_lock, encoding=encoding)
27 elif storage_type == 'subversion':
28 from amplee.storage import storesvn
29 repository_uri = str(storage.repository_uri)
30 working_copy_path = str(storage.workingcopy_path)
31 if base_path:
32 working_copy_path = os.path.join(base_path, working_copy_path)
33 username = get_value(storage, 'username', None)
34 password = get_value(storage, 'password', None)
35 return storesvn.SubversionStorage(repository_uri, working_copy_path, username, password)
36 elif storage_type == 'zodb':
37 from ZODB import DB
38 from amplee.storage import storezodb
39 fs_type = get_value(storage, 'fstype', 'filestorage')
40 if fs_type == 'filestorage':
41 from ZODB import FileStorage
42 storage_path = get_value(storage, 'fspath', '')
43 if base_path:
44 storage_path = os.path.join(base_path, storage_path)
45 db = DB(FileStorage.FileStorage(storage_path))
46 elif fs_type == 'clientstorage':
47 from ZEO import Clientorage, Storage
48 db = DB(ClientStorage.ClientStorage(get_value(storage, 'address')))
49 return storezodb.ZODBStorage(db, get_value(storage, 'top-level-node', ''))
50 elif storage_type == 'dejavu':
51 from amplee.storage import storedejavu
52 capitalize = is_present(storage, 'capitalize')
53 dbconf = {}
54 for childname in storage.dbconf.xml_child_elements:
55 value = storage.dbconf.xml_child_elements[childname]
56 if capitalize:
57 childname = childname.capitalize()
58 dbconf[childname] = value
59 return storedejavu.DejavuStorage(get_value(storage, 'dbtype'), dbconf)
60 elif storage_type == 's3':
61 from amplee.storage import stores3
62 aws_access_key_id = get_value(storage, 'public_key')
63 aws_secret_access_key = get_value(storage, 'private_key')
64 unique_prefix = get_value(storage, 'bucket_prefix')
65 encoding = get_value(storage, 'encoding', 'utf-8')
66 aws_key_lookup = is_present(storage, 'aws_key_lookup')
67 if aws_key_lookup:
68 aws_key_lookup = load_callable(get_value(aws_key_lookup, 'module'),
69 get_value(aws_key_lookup, 'callable'),
70 base_path)
71 aws_file_path = get_value(aws_key_lookup, 'aws-keys-path')
72 else:
73 aws_key_lookup = aws_file_path = None
74 return stores3.S3Storage(aws_access_key_id, aws_secret_access_key,
75 unique_prefix, encoding=encoding,
76 separator=separator, aws_key_lookup=aws_key_lookup,
77 aws_file_path=aws_file_path)
78 elif storage_type == 'tar':
79 from amplee.storage import storetar
80 root_dir = get_value(storage, 'basepath')
81 if base_path and not os.path.isabs(root_dir):
82 root_dir = os.path.join(base_path, root_dir)
83 compression = get_value(storage, 'compression', 'gz')
84 encoding = get_value(storage, 'encoding', 'utf-8')
85 return storetar.TarFileStorage(root_dir, compression=compression, encoding=encoding)
86
87 raise ValueError("Unknown storage type '%s'" % storage_type)
88