36d599f477
This was recently removed during graduation since I had stated that only keystone was using the function. I was incorrect. It seems that ceilometer and sahara are also using the function. We should add it back so those projects can remove fileutils from their oslo incubator project. Change-Id: I661dd222da6386a7dbcf854958a63e59b13e9ba4
100 lines
2.8 KiB
Python
100 lines
2.8 KiB
Python
# Copyright 2011 OpenStack Foundation.
|
|
# All Rights Reserved.
|
|
#
|
|
# 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 contextlib
|
|
import errno
|
|
import logging
|
|
import os
|
|
import stat
|
|
import tempfile
|
|
|
|
from oslo_utils import excutils
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
_DEFAULT_MODE = stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO
|
|
|
|
|
|
def ensure_tree(path, mode=_DEFAULT_MODE):
|
|
"""Create a directory (and any ancestor directories required)
|
|
|
|
:param path: Directory to create
|
|
:param mode: Directory creation permissions
|
|
"""
|
|
try:
|
|
os.makedirs(path, mode)
|
|
except OSError as exc:
|
|
if exc.errno == errno.EEXIST:
|
|
if not os.path.isdir(path):
|
|
raise
|
|
else:
|
|
raise
|
|
|
|
|
|
def delete_if_exists(path, remove=os.unlink):
|
|
"""Delete a file, but ignore file not found error.
|
|
|
|
:param path: File to delete
|
|
:param remove: Optional function to remove passed path
|
|
"""
|
|
|
|
try:
|
|
remove(path)
|
|
except OSError as e:
|
|
if e.errno != errno.ENOENT:
|
|
raise
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def remove_path_on_error(path, remove=delete_if_exists):
|
|
"""Protect code that wants to operate on PATH atomically.
|
|
Any exception will cause PATH to be removed.
|
|
|
|
:param path: File to work with
|
|
:param remove: Optional function to remove passed path
|
|
"""
|
|
|
|
try:
|
|
yield
|
|
except Exception:
|
|
with excutils.save_and_reraise_exception():
|
|
remove(path)
|
|
|
|
|
|
def write_to_tempfile(content, path=None, suffix='', prefix='tmp'):
|
|
"""Create temporary file or use existing file.
|
|
|
|
This util is needed for creating temporary file with
|
|
specified content, suffix and prefix. If path is not None,
|
|
it will be used for writing content. If the path doesn't
|
|
exist it'll be created.
|
|
|
|
:param content: content for temporary file.
|
|
:param path: same as parameter 'dir' for mkstemp
|
|
:param suffix: same as parameter 'suffix' for mkstemp
|
|
:param prefix: same as parameter 'prefix' for mkstemp
|
|
|
|
For example: it can be used in database tests for creating
|
|
configuration files.
|
|
"""
|
|
if path:
|
|
ensure_tree(path)
|
|
|
|
(fd, path) = tempfile.mkstemp(suffix=suffix, dir=path, prefix=prefix)
|
|
try:
|
|
os.write(fd, content)
|
|
finally:
|
|
os.close(fd)
|
|
return path
|