aboutsummaryrefslogtreecommitdiffstats
path: root/sdv/docker/sdvstate/tools/result_api
diff options
context:
space:
mode:
Diffstat (limited to 'sdv/docker/sdvstate/tools/result_api')
-rw-r--r--sdv/docker/sdvstate/tools/result_api/__init__.py24
-rw-r--r--sdv/docker/sdvstate/tools/result_api/result_api.py73
-rw-r--r--sdv/docker/sdvstate/tools/result_api/rfile.py52
-rw-r--r--sdv/docker/sdvstate/tools/result_api/storage/__init__.py18
-rw-r--r--sdv/docker/sdvstate/tools/result_api/storage/local/__init__.py17
-rw-r--r--sdv/docker/sdvstate/tools/result_api/storage/local/local.py133
-rw-r--r--sdv/docker/sdvstate/tools/result_api/storage/storage_api.py46
7 files changed, 363 insertions, 0 deletions
diff --git a/sdv/docker/sdvstate/tools/result_api/__init__.py b/sdv/docker/sdvstate/tools/result_api/__init__.py
new file mode 100644
index 0000000..0633103
--- /dev/null
+++ b/sdv/docker/sdvstate/tools/result_api/__init__.py
@@ -0,0 +1,24 @@
+# Copyright 2020 University Of Delhi.
+#
+# Licensed 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.
+
+
+
+"""
+Result Manager Package
+"""
+from .result_api import result_api
+from .rfile import rfile
+
+from .storage.storage_api import StorageApi
+from .storage.local.local import Local
diff --git a/sdv/docker/sdvstate/tools/result_api/result_api.py b/sdv/docker/sdvstate/tools/result_api/result_api.py
new file mode 100644
index 0000000..95dfd56
--- /dev/null
+++ b/sdv/docker/sdvstate/tools/result_api/result_api.py
@@ -0,0 +1,73 @@
+# Copyright 2020 University Of Delhi.
+#
+# Licensed 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.
+
+
+"""
+Result API
+Main entry point to use results manager
+"""
+
+import logging
+from .storage.storage_api import StorageApi
+
+class ResultApi():
+ """
+ Result API
+ Provides various storage options to use implemented as
+ plugin to storage api
+ """
+
+ def __init__(self):
+ """
+ Initialization function
+ """
+ self._logger = logging.getLogger(__name__)
+ self._storage_handles = []
+
+ def register_storage(self, storage_api):
+ """
+ Registers ``storage_api`` as an active storage option to use.
+ """
+ self._logger.debug("Loading new Storage API...")
+ if not isinstance(storage_api, StorageApi):
+ raise TypeError("incorrect storage type, Required StorageAPI obj")
+
+ storage_api.load_settings()
+ self._storage_handles.append(storage_api)
+ self._logger.info(f'{storage_api.name} api registered')
+
+ def unregister_storage(self, storage_api):
+ """
+ Removes registered ``storage_api`` if exists
+ """
+ while storage_api in self._storage_handles:
+ self._storage_handles.remove(storage_api)
+
+ def unregister_all(self):
+ """
+ Removes all registered storage endpoints
+ """
+ for storage_api in self._storage_handles:
+ self.unregister_storage(storage_api)
+
+ def store(self, data):
+ """
+ Calls all active storage_api and stores ``data`` in all of them
+ """
+ for api in self._storage_handles:
+ api.store(data)
+
+
+# pylint: disable=invalid-name
+result_api = ResultApi()
diff --git a/sdv/docker/sdvstate/tools/result_api/rfile.py b/sdv/docker/sdvstate/tools/result_api/rfile.py
new file mode 100644
index 0000000..71a0924
--- /dev/null
+++ b/sdv/docker/sdvstate/tools/result_api/rfile.py
@@ -0,0 +1,52 @@
+# Copyright 2020 University Of Delhi.
+#
+# Licensed 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.
+
+
+
+"""rfile is Object representation of a file for Result_api and storage_api
+"""
+
+import logging
+
+# pylint: disable=invalid-name
+
+class rfile():
+ """
+ rfile object to represent files in Result API
+ """
+
+ def __init__(self, data):
+ """
+ Initialisation function
+ """
+ self._logger = logging.getLogger(__name__)
+ self.hold_data(data)
+
+ def get_data(self):
+ """
+ Returns stored data
+ """
+ if self._data == '':
+ self._logger.warning('Reading from a empty \'rfile\'')
+ return self._data
+
+
+ def hold_data(self, data):
+ """
+ Holds data of a file
+ """
+ if data is None:
+ self._logger.warning('Storing an empty \'rfile\'')
+ data = ''
+ self._data = data
diff --git a/sdv/docker/sdvstate/tools/result_api/storage/__init__.py b/sdv/docker/sdvstate/tools/result_api/storage/__init__.py
new file mode 100644
index 0000000..d647f0f
--- /dev/null
+++ b/sdv/docker/sdvstate/tools/result_api/storage/__init__.py
@@ -0,0 +1,18 @@
+# Copyright 2020 University Of Delhi.
+#
+# Licensed 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.
+
+
+"""
+Abstract class for Storage API
+"""
diff --git a/sdv/docker/sdvstate/tools/result_api/storage/local/__init__.py b/sdv/docker/sdvstate/tools/result_api/storage/local/__init__.py
new file mode 100644
index 0000000..185ec01
--- /dev/null
+++ b/sdv/docker/sdvstate/tools/result_api/storage/local/__init__.py
@@ -0,0 +1,17 @@
+# Copyright 2020 University Of Delhi.
+#
+# Licensed 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.
+
+"""
+Local storage api
+"""
diff --git a/sdv/docker/sdvstate/tools/result_api/storage/local/local.py b/sdv/docker/sdvstate/tools/result_api/storage/local/local.py
new file mode 100644
index 0000000..d7dc67b
--- /dev/null
+++ b/sdv/docker/sdvstate/tools/result_api/storage/local/local.py
@@ -0,0 +1,133 @@
+# Copyright 2020 University Of Delhi.
+#
+# Licensed 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.
+
+
+"""
+Local Storage Api
+"""
+
+import logging
+import os
+import random
+import string
+import json
+from tools.conf import settings # pylint: disable=import-error
+
+from ..storage_api import StorageApi
+from ... import rfile
+
+
+
+class Local(StorageApi):
+ """
+ Storage API
+ Provides abstract class for various storage options to implement as
+ plugin to storage api
+ """
+
+ def __init__(self):
+ """
+ Initialization function
+ """
+ super(Local, self).__init__()
+ self.name = 'Local Storage'
+ self._logger = logging.getLogger(__name__)
+ self._path = ''
+ self._filename = ''
+
+ def store(self, data):
+ """
+ stores ``data``, ``data`` should be a dict
+
+ :param data: dict object to store
+ """
+ if not isinstance(data, dict):
+ raise TypeError("incorrect data type to store, dict required")
+
+ if not os.path.isfile(self._filename):
+ with open(self._filename, 'w') as fhandle:
+ json.dump([], fhandle)
+
+ with open(self._filename, 'r') as fhandle:
+ records = json.load(fhandle)
+ temp_data = data.copy()
+ eval_rfile(temp_data)
+ records.append(temp_data)
+
+ with open(self._filename, 'w') as fhandle:
+ self._logger.info(f'{self.name}: New record saved')
+ json.dump(records, fhandle, indent=4, sort_keys=True, default=str)
+
+
+ def load_settings(self):
+ """
+ Load all required settings otherwise set to default
+ Settings to load:
+ * ``result_path`` (default: /tmp/local/)
+ * ``results_filename`` (default: results.json)
+ """
+ try:
+ path = settings.getValue('results_path')
+ except AttributeError:
+ path = '/tmp/local/'
+ settings.setValue('results_path', path)
+
+ try:
+ filename = settings.getValue('results_filename')
+ except AttributeError:
+ filename = 'results.json'
+ settings.setValue('results_filename', filename)
+
+ if not os.path.exists(path):
+ os.makedirs(path)
+
+ self._path = path
+ self._filename = path + filename
+
+
+
+
+
+def eval_rfile(data):
+ """
+ Find all values of a type rfile in data dict/list and evals them into
+ actual file
+ """
+ if isinstance(data, dict):
+ for key, value in data.items():
+ if isinstance(value, rfile):
+ data[key] = rfile_save(value, key)
+ else:
+ eval_rfile(value)
+ if isinstance(data, list):
+ for i, _ in enumerate(data):
+ if isinstance(data[i], rfile):
+ data[i] = rfile_save(data[i])
+ else:
+ eval_rfile(data[i])
+
+
+def rfile_save(rfile_obj, prefix='zz'):
+ """
+ Takes rfile Object and stores it into random file returning filename
+ """
+ letters = string.ascii_lowercase
+ suffix = ''.join(random.choice(letters) for i in range(6))
+ filename = settings.getValue('results_path') + f'{prefix}-{suffix}.txt'
+ if os.path.isfile(filename):
+ return rfile_save(rfile_obj, prefix)
+ else:
+ with open(filename, 'w') as fhandle:
+ fhandle.write(rfile_obj.get_data())
+ return f'{prefix}-{suffix}.txt'
diff --git a/sdv/docker/sdvstate/tools/result_api/storage/storage_api.py b/sdv/docker/sdvstate/tools/result_api/storage/storage_api.py
new file mode 100644
index 0000000..5ff0d8f
--- /dev/null
+++ b/sdv/docker/sdvstate/tools/result_api/storage/storage_api.py
@@ -0,0 +1,46 @@
+# Copyright 2020 University Of Delhi.
+#
+# Licensed 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.
+
+
+"""
+Abstract class for Storage API
+"""
+
+import logging
+
+
+class StorageApi():
+ """
+ Storage API
+ Provides abstract class for various storage options to implement as
+ plugin to storage api
+ """
+
+ def __init__(self):
+ """
+ Initialization function
+ """
+ self._logger = logging.getLogger(__name__)
+
+ def store(self, data):
+ """
+ stores ``data``
+ """
+ raise NotImplementedError()
+
+ def load_settings(self):
+ """
+ Load all required settings
+ """
+ raise NotImplementedError()