diff options
Diffstat (limited to 'azure/aria/aria-extension-cloudify/src/aria/aria/storage/api.py')
-rw-r--r-- | azure/aria/aria-extension-cloudify/src/aria/aria/storage/api.py | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/storage/api.py b/azure/aria/aria-extension-cloudify/src/aria/aria/storage/api.py new file mode 100644 index 0000000..a337743 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/storage/api.py @@ -0,0 +1,186 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Storage APIs. +""" + +import threading + + +class StorageAPI(object): + """ + Base class for storage APIs. + """ + def create(self, **kwargs): + """ + Create a storage API. + :param kwargs: + :return: + """ + raise NotImplementedError('Subclass must implement abstract create method') + + +class ModelAPI(StorageAPI): + """ + Base class for model APIs ("MAPI"). + """ + def __init__(self, model_cls, name=None, **kwargs): + """ + :param model_cls: representing class of the model + :param name: name of the model + """ + super(ModelAPI, self).__init__(**kwargs) + self._model_cls = model_cls + self._name = name or model_cls.__modelname__ + self._thread_local = threading.local() + self._thread_local._instrumentation = [] + + @property + def _instrumentation(self): + if not hasattr(self._thread_local, '_instrumentation'): + self._thread_local._instrumentation = [] + return self._thread_local._instrumentation + + + @property + def name(self): + """ + Name of the class. + + :type: :obj:`basestring` + """ + return self._name + + @property + def model_cls(self): + """ + Class representing the model + + :type: :obj:`Type` + """ + return self._model_cls + + def get(self, entry_id, filters=None, **kwargs): + """ + Gets a model from storage. + + :param entry_id: + """ + raise NotImplementedError('Subclass must implement abstract get method') + + def put(self, entry, **kwargs): + """ + Puts a model in storage. + + :param entry: + """ + raise NotImplementedError('Subclass must implement abstract store method') + + def delete(self, entry_id, **kwargs): + """ + Deletes a model from storage. + + :param entry_id: + """ + raise NotImplementedError('Subclass must implement abstract delete method') + + def __iter__(self): + return self.iter() + + def iter(self, **kwargs): + """ + Iterate over all models in storage. + """ + raise NotImplementedError('Subclass must implement abstract iter method') + + def update(self, entry, **kwargs): + """ + Update a model in storage. + + :param entry: + :param kwargs: + """ + raise NotImplementedError('Subclass must implement abstract update method') + + +class ResourceAPI(StorageAPI): + """ + Base class for resource APIs ("RAPI"). + """ + def __init__(self, name, **kwargs): + """ + :param name: resource type + """ + super(ResourceAPI, self).__init__(**kwargs) + self._name = name + + @property + def name(self): + """ + Name of resource. + + :type: :obj:`basestring` + """ + return self._name + + def read(self, entry_id, path, **kwargs): + """ + Get a bytesteam for a resource from storage. + + :param entry_id: + :param path: + """ + raise NotImplementedError('Subclass must implement abstract read method') + + def delete(self, entry_id, path, **kwargs): + """ + Delete a resource from storage. + + :param entry_id: + :param path: + """ + raise NotImplementedError('Subclass must implement abstract delete method') + + def download(self, entry_id, destination, path=None, **kwargs): + """ + Download a resource from storage. + + :param entry_id: + :param destination: + :param path: + """ + raise NotImplementedError('Subclass must implement abstract download method') + + def upload(self, entry_id, source, path=None, **kwargs): + """ + Upload a resource to storage. + + :param entry_id: + :param source: + :param path: + """ + raise NotImplementedError('Subclass must implement abstract upload method') + + +def generate_lower_name(model_cls): + """ + Generates the name of the class from the class object, e.g. ``SomeClass`` -> ``some_class`` + + :param model_cls: class to evaluate + :return: lowercase name + :rtype: basestring + """ + return getattr(model_cls, '__mapiname__', model_cls.__tablename__) |