Switch to the oslo_utils.fileutils
fileutils is graduated in the oslo.utils library. Remove the openstack.common package as well. Implements: blueprint graduate-fileutils[1] [1] https://blueprints.launchpad.net/oslo-incubator/+spec/graduate-fileutils Depends-On: I51ba9076e1fbc16145ee2311f47b7768c16dcb20 (requirements) Depends-On: I661dd222da6386a7dbcf854958a63e59b13e9ba4 (oslo.utils) Change-Id: I6ba8f492a257096d27cbe83bfd06e53b7aabfa5d
This commit is contained in:
parent
ef7623e2ac
commit
889e66eb49
@ -1,7 +1,7 @@
|
|||||||
[run]
|
[run]
|
||||||
branch = True
|
branch = True
|
||||||
source = ceilometer
|
source = ceilometer
|
||||||
omit = ceilometer/tests/*, ceilometer/openstack/common/*
|
omit = ceilometer/tests/*
|
||||||
|
|
||||||
[report]
|
[report]
|
||||||
ignore-errors = True
|
ignore-errors = True
|
||||||
|
@ -36,10 +36,6 @@ oslo_namespace_imports = re.compile(
|
|||||||
|
|
||||||
|
|
||||||
def check_oslo_namespace_imports(logical_line, physical_line, filename):
|
def check_oslo_namespace_imports(logical_line, physical_line, filename):
|
||||||
# ignore openstack.common since they are not maintained by us
|
|
||||||
if 'ceilometer/openstack/common/' in filename:
|
|
||||||
return
|
|
||||||
|
|
||||||
if re.match(oslo_namespace_imports, logical_line):
|
if re.match(oslo_namespace_imports, logical_line):
|
||||||
msg = ("C300: '%s' must be used instead of '%s'." % (
|
msg = ("C300: '%s' must be used instead of '%s'." % (
|
||||||
logical_line.replace('oslo.', 'oslo_'),
|
logical_line.replace('oslo.', 'oslo_'),
|
||||||
|
@ -1,45 +0,0 @@
|
|||||||
# 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.
|
|
||||||
|
|
||||||
"""oslo.i18n integration module.
|
|
||||||
|
|
||||||
See http://docs.openstack.org/developer/oslo.i18n/usage.html
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
try:
|
|
||||||
import oslo_i18n
|
|
||||||
|
|
||||||
# NOTE(dhellmann): This reference to o-s-l-o will be replaced by the
|
|
||||||
# application name when this module is synced into the separate
|
|
||||||
# repository. It is OK to have more than one translation function
|
|
||||||
# using the same domain, since there will still only be one message
|
|
||||||
# catalog.
|
|
||||||
_translators = oslo_i18n.TranslatorFactory(domain='ceilometer')
|
|
||||||
|
|
||||||
# The primary translation function using the well-known name "_"
|
|
||||||
_ = _translators.primary
|
|
||||||
|
|
||||||
# Translators for log levels.
|
|
||||||
#
|
|
||||||
# The abbreviated names are meant to reflect the usual use of a short
|
|
||||||
# name like '_'. The "L" is for "log" and the other letter comes from
|
|
||||||
# the level.
|
|
||||||
_LI = _translators.log_info
|
|
||||||
_LW = _translators.log_warning
|
|
||||||
_LE = _translators.log_error
|
|
||||||
_LC = _translators.log_critical
|
|
||||||
except ImportError:
|
|
||||||
# NOTE(dims): Support for cases where a project wants to use
|
|
||||||
# code from oslo-incubator, but is not ready to be internationalized
|
|
||||||
# (like tempest)
|
|
||||||
_ = _LI = _LW = _LE = _LC = lambda x: x
|
|
@ -1,149 +0,0 @@
|
|||||||
# 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__)
|
|
||||||
|
|
||||||
_FILE_CACHE = {}
|
|
||||||
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 read_cached_file(filename, force_reload=False):
|
|
||||||
"""Read from a file if it has been modified.
|
|
||||||
|
|
||||||
:param force_reload: Whether to reload the file.
|
|
||||||
:returns: A tuple with a boolean specifying if the data is fresh
|
|
||||||
or not.
|
|
||||||
"""
|
|
||||||
global _FILE_CACHE
|
|
||||||
|
|
||||||
if force_reload:
|
|
||||||
delete_cached_file(filename)
|
|
||||||
|
|
||||||
reloaded = False
|
|
||||||
mtime = os.path.getmtime(filename)
|
|
||||||
cache_info = _FILE_CACHE.setdefault(filename, {})
|
|
||||||
|
|
||||||
if not cache_info or mtime > cache_info.get('mtime', 0):
|
|
||||||
LOG.debug("Reloading cached file %s" % filename)
|
|
||||||
with open(filename) as fap:
|
|
||||||
cache_info['data'] = fap.read()
|
|
||||||
cache_info['mtime'] = mtime
|
|
||||||
reloaded = True
|
|
||||||
return (reloaded, cache_info['data'])
|
|
||||||
|
|
||||||
|
|
||||||
def delete_cached_file(filename):
|
|
||||||
"""Delete cached file if present.
|
|
||||||
|
|
||||||
:param filename: filename to delete
|
|
||||||
"""
|
|
||||||
global _FILE_CACHE
|
|
||||||
|
|
||||||
if filename in _FILE_CACHE:
|
|
||||||
del _FILE_CACHE[filename]
|
|
||||||
|
|
||||||
|
|
||||||
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 file_open(*args, **kwargs):
|
|
||||||
"""Open file
|
|
||||||
|
|
||||||
see built-in open() documentation for more details
|
|
||||||
|
|
||||||
Note: The reason this is kept in a separate module is to easily
|
|
||||||
be able to provide a stub module that doesn't alter system
|
|
||||||
state at all (for unit tests)
|
|
||||||
"""
|
|
||||||
return open(*args, **kwargs)
|
|
||||||
|
|
||||||
|
|
||||||
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
|
|
@ -30,6 +30,7 @@ import eventlet
|
|||||||
import mock
|
import mock
|
||||||
from oslo_config import fixture as fixture_config
|
from oslo_config import fixture as fixture_config
|
||||||
from oslo_service import service as os_service
|
from oslo_service import service as os_service
|
||||||
|
from oslo_utils import fileutils
|
||||||
from oslo_utils import timeutils
|
from oslo_utils import timeutils
|
||||||
from oslotest import mockpatch
|
from oslotest import mockpatch
|
||||||
import six
|
import six
|
||||||
@ -37,7 +38,6 @@ from stevedore import extension
|
|||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
from ceilometer.agent import plugin_base
|
from ceilometer.agent import plugin_base
|
||||||
from ceilometer.openstack.common import fileutils
|
|
||||||
from ceilometer import pipeline
|
from ceilometer import pipeline
|
||||||
from ceilometer import publisher
|
from ceilometer import publisher
|
||||||
from ceilometer.publisher import test as test_publisher
|
from ceilometer.publisher import test as test_publisher
|
||||||
|
@ -17,9 +17,9 @@ import six
|
|||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
from oslo_config import fixture as fixture_config
|
from oslo_config import fixture as fixture_config
|
||||||
|
from oslo_utils import fileutils
|
||||||
|
|
||||||
from ceilometer.meter import notifications
|
from ceilometer.meter import notifications
|
||||||
from ceilometer.openstack.common import fileutils
|
|
||||||
from ceilometer.tests import base as test
|
from ceilometer.tests import base as test
|
||||||
|
|
||||||
NOTIFICATION = {
|
NOTIFICATION = {
|
||||||
|
@ -22,9 +22,9 @@ import subprocess
|
|||||||
import time
|
import time
|
||||||
|
|
||||||
import httplib2
|
import httplib2
|
||||||
|
from oslo_utils import fileutils
|
||||||
import six
|
import six
|
||||||
|
|
||||||
from ceilometer.openstack.common import fileutils
|
|
||||||
from ceilometer.tests import base
|
from ceilometer.tests import base
|
||||||
|
|
||||||
|
|
||||||
|
@ -85,6 +85,3 @@ class HackingTestCase(testcase.TestCase):
|
|||||||
for code in codes:
|
for code in codes:
|
||||||
self._assert_has_errors(code, checks.check_oslo_namespace_imports,
|
self._assert_has_errors(code, checks.check_oslo_namespace_imports,
|
||||||
expected_errors=[(1, 0, "C300")])
|
expected_errors=[(1, 0, "C300")])
|
||||||
self._assert_has_errors(
|
|
||||||
code, checks.check_oslo_namespace_imports,
|
|
||||||
filename="ceilometer/openstack/common/xyz.py")
|
|
||||||
|
@ -23,6 +23,7 @@ from oslo_context import context
|
|||||||
import oslo_messaging
|
import oslo_messaging
|
||||||
import oslo_messaging.conffixture
|
import oslo_messaging.conffixture
|
||||||
import oslo_service.service
|
import oslo_service.service
|
||||||
|
from oslo_utils import fileutils
|
||||||
from oslo_utils import timeutils
|
from oslo_utils import timeutils
|
||||||
import six
|
import six
|
||||||
from stevedore import extension
|
from stevedore import extension
|
||||||
@ -31,7 +32,6 @@ import yaml
|
|||||||
from ceilometer.compute.notifications import instance
|
from ceilometer.compute.notifications import instance
|
||||||
from ceilometer import messaging
|
from ceilometer import messaging
|
||||||
from ceilometer import notification
|
from ceilometer import notification
|
||||||
from ceilometer.openstack.common import fileutils
|
|
||||||
from ceilometer.publisher import test as test_publisher
|
from ceilometer.publisher import test as test_publisher
|
||||||
from ceilometer.tests import base as tests_base
|
from ceilometer.tests import base as tests_base
|
||||||
|
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
[DEFAULT]
|
|
||||||
|
|
||||||
# The list of modules to copy from oslo-incubator
|
|
||||||
module=fileutils
|
|
||||||
|
|
||||||
# The base module to hold the copy of openstack.common
|
|
||||||
base=ceilometer
|
|
@ -27,7 +27,7 @@ pecan>=0.8.0
|
|||||||
oslo.messaging>=1.16.0 # Apache-2.0
|
oslo.messaging>=1.16.0 # Apache-2.0
|
||||||
oslo.middleware!=2.0.0,>=1.2.0 # Apache-2.0
|
oslo.middleware!=2.0.0,>=1.2.0 # Apache-2.0
|
||||||
oslo.serialization>=1.4.0 # Apache-2.0
|
oslo.serialization>=1.4.0 # Apache-2.0
|
||||||
oslo.utils>=1.6.0 # Apache-2.0
|
oslo.utils>=1.9.0 # Apache-2.0
|
||||||
pysnmp<5.0.0,>=4.2.1
|
pysnmp<5.0.0,>=4.2.1
|
||||||
python-ceilometerclient>=1.0.13
|
python-ceilometerclient>=1.0.13
|
||||||
python-glanceclient>=0.18.0
|
python-glanceclient>=0.18.0
|
||||||
|
@ -29,9 +29,7 @@ from six.moves import cStringIO as StringIO # noqa
|
|||||||
# These variables will be useful if we will need to skip some pylint checks
|
# These variables will be useful if we will need to skip some pylint checks
|
||||||
ignore_codes = []
|
ignore_codes = []
|
||||||
ignore_messages = []
|
ignore_messages = []
|
||||||
# We ignore all errors in openstack.common because it should be checked
|
ignore_modules = []
|
||||||
# elsewhere.
|
|
||||||
ignore_modules = ["ceilometer/openstack/common/"]
|
|
||||||
|
|
||||||
KNOWN_PYLINT_EXCEPTIONS_FILE = "tools/pylint_exceptions"
|
KNOWN_PYLINT_EXCEPTIONS_FILE = "tools/pylint_exceptions"
|
||||||
|
|
||||||
|
2
tox.ini
2
tox.ini
@ -150,7 +150,7 @@ commands = bash -x {toxinidir}/setup-test-env-elastic.sh oslo_debug_helper {posa
|
|||||||
|
|
||||||
[flake8]
|
[flake8]
|
||||||
ignore =
|
ignore =
|
||||||
exclude=.venv,.git,.tox,dist,doc,./ceilometer/openstack/common,*lib/python*,*egg,build
|
exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build
|
||||||
show-source = True
|
show-source = True
|
||||||
|
|
||||||
[hacking]
|
[hacking]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user