From ff2e826ee2ead832eff974e331aed3994e9b06f9 Mon Sep 17 00:00:00 2001 From: beierlm Date: Wed, 8 Jul 2020 16:32:50 -0400 Subject: [PATCH] Remove symlink if exists On sync, if the symlink already exists, an exception would be thrown. This change removes the file if it already exists. Bug 1132 Change-Id: I151a96adcac5d7cd51b84c2770f498a78d7d68be Signed-off-by: beierlm (cherry picked from commit 6d72d5cfb6f75c62402d493fdc2d81797cd48081) --- osm_common/fsmongo.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/osm_common/fsmongo.py b/osm_common/fsmongo.py index 07d4821..740d540 100644 --- a/osm_common/fsmongo.py +++ b/osm_common/fsmongo.py @@ -16,13 +16,16 @@ # contact: eduardo.sousa@canonical.com ## +import errno +from http import HTTPStatus from io import BytesIO, StringIO -from pymongo import MongoClient -from gridfs import GridFSBucket, errors import logging -from http import HTTPStatus import os + +from gridfs import GridFSBucket, errors from osm_common.fsbase import FsBase, FsException +from pymongo import MongoClient + __author__ = "Eduardo Sousa " @@ -215,6 +218,13 @@ class FsMongo(FsBase): self.fs.download_to_stream(writing_file._id, b) b.seek(0) link = b.read().decode("utf-8") + + try: + os.remove(file_path) + except OSError as e: + if e.errno != errno.ENOENT: + # This is probably permission denied or worse + raise os.symlink(link, file_path) else: with open(file_path, 'wb+') as file_stream: @@ -317,7 +327,7 @@ class FsMongo(FsBase): if requested_file.metadata["type"] == mode: return True - + if requested_file.metadata["type"] == "sym" and mode == "file": return True @@ -452,7 +462,7 @@ class FsMongo(FsBase): else: self.fs.delete(requested_file._id) if not found and not ignore_non_exist: - raise FsException("File {} does not exist".format(storage), http_code=HTTPStatus.NOT_FOUND) + raise FsException("File {} does not exist".format(storage), http_code=HTTPStatus.NOT_FOUND) except IOError as e: raise FsException("File {} cannot be deleted: {}".format(f, e), http_code=HTTPStatus.INTERNAL_SERVER_ERROR) -- 2.17.1