141 - Support for Package Management in SO
[osm/SO.git] / rwlaunchpad / plugins / rwstagingmgr / rift / tasklets / rwstagingmgr / store / file_store.py
diff --git a/rwlaunchpad/plugins/rwstagingmgr/rift/tasklets/rwstagingmgr/store/file_store.py b/rwlaunchpad/plugins/rwstagingmgr/rift/tasklets/rwstagingmgr/store/file_store.py
new file mode 100644 (file)
index 0000000..aec4180
--- /dev/null
@@ -0,0 +1,146 @@
+"""
+#
+#   Copyright 2016 RIFT.IO Inc
+#
+#   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.
+#
+
+@file file_store.py
+@author Varun Prasad (varun.prasad@riftio.com)
+@date 28-Sep-2016
+
+"""
+
+import logging
+import os
+import shutil
+import tempfile
+import time
+import uuid
+import yaml
+
+import gi
+gi.require_version("RwStagingMgmtYang", "1.0")
+from gi.repository import RwStagingMgmtYang
+import rift.mano.dts as mano_dts
+
+from .. import model
+from ..protocol import StagingStorePublisherProtocol
+
+
+class StagingAreaExists(Exception):
+    pass
+
+class InvalidStagingArea(Exception):
+    pass
+
+class StagingStructureError(Exception):
+    pass
+
+class StagingFileStore(StagingStorePublisherProtocol):
+    """File based store for creating and managing staging areas.
+    """
+    META_YAML = "meta.yaml"
+    DEFAULT_EXPIRY = 60 * 60
+
+    def __init__(self, log=None, root_dir=None):
+        default_path = os.path.join(
+            os.getenv('RIFT_ARTIFACTS'),
+            "launchpad/staging")
+
+        self.root_dir = root_dir or default_path
+
+        if not os.path.isdir(self.root_dir):
+            os.makedirs(self.root_dir)
+
+        self.log = log or logging.getLogger()
+        self.tmp_dir = tempfile.mkdtemp(dir=self.root_dir)
+
+        self._cache = {}
+        self.delegate = None
+
+    def on_recovery(self, staging_areas):
+        for area in staging_areas:
+            staging_area = model.StagingArea(area)
+            self._cache[area.area_id] = staging_area
+
+
+    def get_staging_area(self, area_id):
+        if area_id not in self._cache:
+            raise InvalidStagingArea
+
+        return self._cache[area_id]
+
+
+    def create_staging_area(self, staging_area_config):
+        """Create the staging area
+        Args:
+            staging_area_config (YangInput_RwStagingMgmt_CreateStagingArea): Rpc input
+
+        Returns:
+            model.StagingArea
+
+        Raises:
+            StagingAreaExists: if the staging area already exists
+        """
+        area_id = str(uuid.uuid4())
+
+        container_path = os.path.join(self.root_dir, str(area_id))
+        meta_path = os.path.join(container_path, self.META_YAML)
+
+        if os.path.exists(container_path):
+            raise StagingAreaExists
+
+        # Create the dir
+        os.makedirs(container_path)
+
+        config_dict = staging_area_config.as_dict()
+        config_dict.update({
+            "area_id": area_id,
+            "created_time": time.time(),
+            "status": "LIVE",
+            "path": container_path
+            })
+
+        staging_area = RwStagingMgmtYang.StagingArea.from_dict(config_dict)
+        staging_area = model.StagingArea(staging_area)
+
+        self._cache[area_id] = staging_area
+
+        try:
+            if self.delegate:
+                self.delegate.on_staging_area_create(staging_area.model)
+        except Exception as e:
+            self.log.exception(str(e))
+
+        return staging_area
+
+    def remove_staging_area(self, staging_area):
+        """Delete the staging area
+        Args:
+            staging_area (str or model.StagingArea): Staging ID or the
+                StagingArea object
+        """
+        if type(staging_area) is str:
+            staging_area = self.get_staging_area(staging_area)
+
+        if os.path.isdir(staging_area.model.path):
+            shutil.rmtree(staging_area.model.path)
+
+        staging_area.model.status = "EXPIRED"
+
+        try:
+            if self.delegate:
+                self.delegate.on_staging_area_delete(staging_area.model)
+        except Exception as e:
+            self.log.exception(str(e))