1 # -*- coding: utf-8 -*-
3 # Copyright 2018 Telefonica S.A.
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
21 from http
import HTTPStatus
22 from shutil
import rmtree
23 from osm_common
.fsbase
import FsBase
, FsException
25 __author__
= "Alfonso Tierno <alfonso.tiernosepulveda@telefonica.com>"
28 class FsLocal(FsBase
):
30 def __init__(self
, logger_name
='fs'):
31 self
.logger
= logging
.getLogger(logger_name
)
35 return {"fs": "local", "path": self
.path
}
37 def fs_connect(self
, config
):
39 if "logger_name" in config
:
40 self
.logger
= logging
.getLogger(config
["logger_name"])
41 self
.path
= config
["path"]
42 if not self
.path
.endswith("/"):
44 if not os
.path
.exists(self
.path
):
45 raise FsException("Invalid configuration param at '[storage]': path '{}' does not exist".format(
49 except Exception as e
: # TODO refine
50 raise FsException(str(e
))
52 def fs_disconnect(self
):
55 def mkdir(self
, folder
):
57 Creates a folder or parent object location
59 :return: None or raises and exception
62 os
.mkdir(self
.path
+ folder
)
63 except Exception as e
:
64 raise FsException(str(e
), http_code
=HTTPStatus
.INTERNAL_SERVER_ERROR
)
66 def file_exists(self
, storage
, mode
=None):
68 Indicates if "storage" file exist
69 :param storage: can be a str or a str list
70 :param mode: can be 'file' exist as a regular file; 'dir' exists as a directory or; 'None' just exists
73 if isinstance(storage
, str):
77 if os
.path
.exists(self
.path
+ f
):
78 if mode
== "file" and os
.path
.isfile(self
.path
+ f
):
80 if mode
== "dir" and os
.path
.isdir(self
.path
+ f
):
84 def file_size(self
, storage
):
87 :param storage: can be a str or a str list
90 if isinstance(storage
, str):
94 return os
.path
.getsize(self
.path
+ f
)
96 def file_extract(self
, tar_object
, path
):
99 :param tar_object: object of type tar
100 :param path: can be a str or a str list, or a tar object where to extract the tar_object
103 if isinstance(path
, str):
106 f
= self
.path
+ "/".join(path
)
107 tar_object
.extractall(path
=f
)
109 def file_open(self
, storage
, mode
):
112 :param storage: can be a str or list of str
113 :param mode: file mode
117 if isinstance(storage
, str):
120 f
= "/".join(storage
)
121 return open(self
.path
+ f
, mode
)
122 except FileNotFoundError
:
123 raise FsException("File {} does not exist".format(f
), http_code
=HTTPStatus
.NOT_FOUND
)
125 raise FsException("File {} cannot be opened".format(f
), http_code
=HTTPStatus
.BAD_REQUEST
)
127 def dir_ls(self
, storage
):
129 return folder content
130 :param storage: can be a str or list of str
131 :return: folder content
134 if isinstance(storage
, str):
137 f
= "/".join(storage
)
138 return os
.listdir(self
.path
+ f
)
139 except NotADirectoryError
:
140 raise FsException("File {} does not exist".format(f
), http_code
=HTTPStatus
.NOT_FOUND
)
142 raise FsException("File {} cannot be opened".format(f
), http_code
=HTTPStatus
.BAD_REQUEST
)
144 def file_delete(self
, storage
, ignore_non_exist
=False):
146 Delete storage content recursivelly
147 :param storage: can be a str or list of str
148 :param ignore_non_exist: not raise exception if storage does not exist
152 if isinstance(storage
, str):
153 f
= self
.path
+ storage
155 f
= self
.path
+ "/".join(storage
)
156 if os
.path
.exists(f
):
158 elif not ignore_non_exist
:
159 raise FsException("File {} does not exist".format(storage
), http_code
=HTTPStatus
.NOT_FOUND
)