Added reverse sync
[osm/common.git] / osm_common / fslocal.py
index 202872d..3686b36 100644 (file)
@@ -1,3 +1,20 @@
+# -*- coding: utf-8 -*-
+
+# Copyright 2018 Telefonica S.A.
+#
+# 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.
+
 import os
 import logging
 # import tarfile
@@ -10,8 +27,8 @@ __author__ = "Alfonso Tierno <alfonso.tiernosepulveda@telefonica.com>"
 
 class FsLocal(FsBase):
 
-    def __init__(self, logger_name='fs'):
-        self.logger = logging.getLogger(logger_name)
+    def __init__(self, logger_name='fs', lock=False):
+        super().__init__(logger_name, lock)
         self.path = None
 
     def get_params(self):
@@ -43,6 +60,24 @@ class FsLocal(FsBase):
         """
         try:
             os.mkdir(self.path + folder)
+        except FileExistsError:  # make it idempotent
+            pass
+        except Exception as e:
+            raise FsException(str(e), http_code=HTTPStatus.INTERNAL_SERVER_ERROR)
+
+    def dir_rename(self, src, dst):
+        """
+        Rename one directory name. If dst exist, it replaces (deletes) existing directory
+        :param src: source directory
+        :param dst: destination directory
+        :return: None or raises and exception
+        """
+        try:
+            if os.path.exists(self.path + dst):
+                rmtree(self.path + dst)
+
+            os.rename(self.path + src, self.path + dst)
+
         except Exception as e:
             raise FsException(str(e), http_code=HTTPStatus.INTERNAL_SERVER_ERROR)
 
@@ -58,6 +93,8 @@ class FsLocal(FsBase):
         else:
             f = "/".join(storage)
         if os.path.exists(self.path + f):
+            if not mode:
+                return True
             if mode == "file" and os.path.isfile(self.path + f):
                 return True
             if mode == "dir" and os.path.isdir(self.path + f):
@@ -126,17 +163,25 @@ class FsLocal(FsBase):
 
     def file_delete(self, storage, ignore_non_exist=False):
         """
-        Delete storage content recursivelly
+        Delete storage content recursively
         :param storage: can be a str or list of str
         :param ignore_non_exist: not raise exception if storage does not exist
         :return: None
         """
+        try:
+            if isinstance(storage, str):
+                f = self.path + storage
+            else:
+                f = self.path + "/".join(storage)
+            if os.path.exists(f):
+                rmtree(f)
+            elif not ignore_non_exist:
+                raise FsException("File {} does not exist".format(storage), http_code=HTTPStatus.NOT_FOUND)
+        except (IOError, PermissionError) as e:
+            raise FsException("File {} cannot be deleted: {}".format(f, e), http_code=HTTPStatus.INTERNAL_SERVER_ERROR)
 
-        if isinstance(storage, str):
-            f = self.path + storage
-        else:
-            f = self.path + "/".join(storage)
-        if os.path.exists(f):
-            rmtree(f)
-        elif not ignore_non_exist:
-            raise FsException("File {} does not exist".format(storage), http_code=HTTPStatus.NOT_FOUND)
+    def sync(self, from_path=None):
+        pass  # Not needed in fslocal
+
+    def reverse_sync(self, from_path):
+        pass  # Not needed in fslocal