allow partial sync for fsmongo 75/8875/4
authortierno <alfonso.tiernosepulveda@telefonica.com>
Wed, 6 May 2020 14:22:48 +0000 (14:22 +0000)
committertierno <alfonso.tiernosepulveda@telefonica.com>
Wed, 1 Jul 2020 13:07:34 +0000 (13:07 +0000)
Change-Id: I8c1d729bcff5a0fa2c58b25d57c5434ac0528668
Signed-off-by: tierno <alfonso.tiernosepulveda@telefonica.com>
osm_common/fsbase.py
osm_common/fslocal.py
osm_common/fsmongo.py

index 7e69613..24eb994 100644 (file)
@@ -83,5 +83,5 @@ class FsBase(object):
     def file_delete(self, storage, ignore_non_exist=False):
         raise FsException("Method 'file_delete' not implemented")
 
-    def sync(self):
+    def sync(self, from_path=None):
         raise FsException("Method 'sync' not implemented")
index b90b25e..45ae828 100644 (file)
@@ -180,5 +180,5 @@ class FsLocal(FsBase):
         except (IOError, PermissionError) as e:
             raise FsException("File {} cannot be deleted: {}".format(f, e), http_code=HTTPStatus.INTERNAL_SERVER_ERROR)
 
-    def sync(self):
+    def sync(self, from_path=None):
         pass  # Not needed in fslocal
index 6a96d44..07d4821 100644 (file)
@@ -195,15 +195,19 @@ class FsMongo(FsBase):
         self.client = None
         self.fs = None
 
-    def __update_local_fs(self):
+    def __update_local_fs(self, from_path=None):
         dir_cursor = self.fs.find({"metadata.type": "dir"}, no_cursor_timeout=True)
 
         for directory in dir_cursor:
+            if from_path and not directory.filename.startswith(from_path):
+                continue
             os.makedirs(self.path + directory.filename, exist_ok=True)
 
         file_cursor = self.fs.find({"metadata.type": {"$in": ["file", "sym"]}}, no_cursor_timeout=True)
 
         for writing_file in file_cursor:
+            if from_path and not writing_file.filename.startswith(from_path):
+                continue
             file_path = self.path + writing_file.filename
 
             if writing_file.metadata["type"] == "sym":
@@ -452,8 +456,10 @@ class FsMongo(FsBase):
         except IOError as e:
             raise FsException("File {} cannot be deleted: {}".format(f, e), http_code=HTTPStatus.INTERNAL_SERVER_ERROR)
 
-    def sync(self):
+    def sync(self, from_path=None):
         """
         Sync from FSMongo to local storage
+        :param from_path: if supplied, only copy content from this path, not all
+        :return: None
         """
-        self.__update_local_fs()
+        self.__update_local_fs(from_path=from_path)