import inspect
import json
import os
from datacatalog import settings
from datacatalog.extensible import ExtensibleAttrDict
from .agave import StorageSystem
from .exceptions import ManagedStoreError
from .level import Level
from ..utils import normalize, normpath
[docs]class ManagedStore(ExtensibleAttrDict):
"""Representation of a Data Catalog managed store
"""
BLACKLIST = ['/usr', '/bin', '/var', '/tmp', '/root', '/lib']
def __init__(self,
prefix=None,
level='User',
storage_system=settings.STORAGE_SYSTEM,
agave=None,
**kwargs):
super().__init__()
for b in self.BLACKLIST:
if prefix.startswith(b):
raise ValueError('Prefix not allowed')
setattr(self, 'prefix', prefix)
setattr(self, 'level', Level(level))
setattr(self, 'storage_system', StorageSystem(
storage_system, agave=agave))
[docs]class ManagedStores(object):
"""Representation of all Data Catalog managed stores
"""
STORES = [
{'level': '0', 'prefix': '/uploads',
'storage_system': settings.STORAGE_SYSTEM,
'manager': settings.TACC_MANAGER_ACCOUNT,
'database': settings.MONGODB_DATABASE},
{'level': '1', 'prefix': '/products',
'storage_system': settings.STORAGE_SYSTEM,
'manager': settings.TACC_MANAGER_ACCOUNT,
'database': settings.MONGODB_DATABASE},
{'level': '2', 'prefix': '/products',
'storage_system': settings.STORAGE_SYSTEM,
'manager': settings.TACC_MANAGER_ACCOUNT,
'database': settings.MONGODB_DATABASE},
{'level': '3', 'prefix': '/products',
'storage_system': settings.STORAGE_SYSTEM,
'manager': settings.TACC_MANAGER_ACCOUNT,
'database': settings.MONGODB_DATABASE},
{'level': 'Reference', 'prefix': '/reference',
'storage_system': settings.STORAGE_SYSTEM,
'manager': settings.TACC_MANAGER_ACCOUNT,
'database': settings.MONGODB_DATABASE},
{'level': 'User', 'prefix': '/sample',
'storage_system': settings.STORAGE_SYSTEM,
'manager': settings.TACC_MANAGER_ACCOUNT,
'database': settings.MONGODB_DATABASE}]
[docs] @classmethod
def stores(cls):
return cls.STORES
[docs] @classmethod
def prefixes_for_level(cls, level):
prefixes = list()
for st in cls.stores():
if st.get('level') == Level(level):
prefixes.append(st.get('prefix'))
if len(prefixes) > 0:
return sorted(prefixes)
else:
raise ManagedStoreError('Cannot resolve prefixes from level')
[docs] @classmethod
def store_for_level(cls, level):
for st in cls.stores():
if st.get('level') == Level(level):
return StorageSystem(st.get('storage_system'))
raise ManagedStoreError('Cannot resolve store to level')
[docs] @classmethod
def store_for_prefix(cls, prefix):
for st in cls.stores():
if st.get('prefix') == prefix:
return StorageSystem(st.get('storage_system'))
raise ManagedStoreError('Cannot resolve store to prefix')
[docs] @classmethod
def levels_for_prefix(cls, prefix):
levels = list()
for st in cls.stores():
if st.get('prefix') == prefix:
levels.append(Level(st.get('level')))
if len(levels) > 0:
return sorted(levels)
else:
raise ManagedStoreError('Cannot resolve levels from prefix')
[docs] @classmethod
def levels_for_filepath(cls, filepath):
levels = list()
for st in cls.stores():
if filepath.startswith(st.get('prefix')):
levels.append(Level(st.get('level')))
if len(levels) > 0:
return sorted(levels)
else:
raise ManagedStoreError('Cannot resolve levels from prefix')
[docs] @classmethod
def stores_for_filepath(cls, filepath):
stores = list()
for st in cls.stores():
if filepath.startswith(st.get('prefix')):
stores.append(StorageSystem(st.get('storage_system')))
if len(stores) > 0:
return sorted(stores)
else:
raise ManagedStoreError('Cannot resolve store from prefix')
[docs]def abspath(filepath, validate=False):
"""Absolute path on host filesystem"""
normalized_path = normalize(filepath)
normed_path = normpath(filepath)
if os.environ.get('STORAGE_SYSTEM_PREFIX_OVERRIDE', None):
root_dir = os.environ.get('STORAGE_SYSTEM_PREFIX_OVERRIDE', None)
else:
root_dir = ManagedStores.stores_for_filepath(normed_path)[0].root_dir
return os.path.join(root_dir, normalized_path)