X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_common%2Ffslocal.py;h=4a82c4f43cd996732aa7c7e1872e7bc98e6dcecd;hb=refs%2Ftags%2Frelease-v10.0-start;hp=b7dd8396ad1a147e1a57a03a3bd787a182e19a63;hpb=5c012612f1292b012dc12b337c611c6f3c083b18;p=osm%2Fcommon.git diff --git a/osm_common/fslocal.py b/osm_common/fslocal.py index b7dd839..4a82c4f 100644 --- a/osm_common/fslocal.py +++ b/osm_common/fslocal.py @@ -1,17 +1,34 @@ +# -*- 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 + +# import tarfile from http import HTTPStatus from shutil import rmtree -from fsbase import FsBase, FsException +from osm_common.fsbase import FsBase, FsException __author__ = "Alfonso Tierno " 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): @@ -25,8 +42,11 @@ class FsLocal(FsBase): if not self.path.endswith("/"): self.path += "/" if not os.path.exists(self.path): - raise FsException("Invalid configuration param at '[storage]': path '{}' does not exist".format( - config["path"])) + raise FsException( + "Invalid configuration param at '[storage]': path '{}' does not exist".format( + config["path"] + ) + ) except FsException: raise except Exception as e: # TODO refine @@ -43,6 +63,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 +96,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): @@ -103,9 +143,13 @@ class FsLocal(FsBase): f = "/".join(storage) return open(self.path + f, mode) except FileNotFoundError: - raise FsException("File {} does not exist".format(f), http_code=HTTPStatus.NOT_FOUND) + raise FsException( + "File {} does not exist".format(f), http_code=HTTPStatus.NOT_FOUND + ) except IOError: - raise FsException("File {} cannot be opened".format(f), http_code=HTTPStatus.BAD_REQUEST) + raise FsException( + "File {} cannot be opened".format(f), http_code=HTTPStatus.BAD_REQUEST + ) def dir_ls(self, storage): """ @@ -120,23 +164,41 @@ class FsLocal(FsBase): f = "/".join(storage) return os.listdir(self.path + f) except NotADirectoryError: - raise FsException("File {} does not exist".format(f), http_code=HTTPStatus.NOT_FOUND) + raise FsException( + "File {} does not exist".format(f), http_code=HTTPStatus.NOT_FOUND + ) except IOError: - raise FsException("File {} cannot be opened".format(f), http_code=HTTPStatus.BAD_REQUEST) + raise FsException( + "File {} cannot be opened".format(f), http_code=HTTPStatus.BAD_REQUEST + ) 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