diff options
author | Davanum Srinivas <dims@linux.vnet.ibm.com> | 2014-10-24 14:18:30 -0400 |
---|---|---|
committer | Davanum Srinivas (dims) <davanum@gmail.com> | 2014-10-27 16:56:13 +0000 |
commit | 382294762b08abb1921a77b00608ac941478ce05 (patch) | |
tree | 7d9e685a55c208e11080deabfa39ba266fe2523f | |
parent | c699fbdcfa8f5b9e45d1ccdb48f242a01ec930bd (diff) | |
download | nova-382294762b08abb1921a77b00608ac941478ce05.tar.gz |
Switch Nova to use oslo.concurrency
Let's switch to the newly released oslo library for
the processutils and lockutils.
Change-Id: Icf7831261322abd0a6fc5439fe09b1d4cb614cb7
50 files changed, 53 insertions, 667 deletions
diff --git a/nova/cmd/conductor.py b/nova/cmd/conductor.py index 776e368917..9697d9acdf 100644 --- a/nova/cmd/conductor.py +++ b/nova/cmd/conductor.py @@ -16,12 +16,12 @@ import sys +from oslo.concurrency import processutils from oslo.config import cfg from nova import config from nova import objects from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova.openstack.common.report import guru_meditation_report as gmr from nova import service from nova import utils diff --git a/nova/console/xvp.py b/nova/console/xvp.py index 282f008200..5a407a137d 100644 --- a/nova/console/xvp.py +++ b/nova/console/xvp.py @@ -19,6 +19,7 @@ import os import signal import jinja2 +from oslo.concurrency import processutils from oslo.config import cfg from oslo.utils import excutils @@ -26,7 +27,6 @@ from nova import context from nova import db from nova.i18n import _, _LE from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova import paths from nova import utils diff --git a/nova/crypto.py b/nova/crypto.py index c547bcb6e1..36bf43858f 100644 --- a/nova/crypto.py +++ b/nova/crypto.py @@ -28,6 +28,7 @@ import re import string import struct +from oslo.concurrency import processutils from oslo.config import cfg from oslo.utils import excutils from oslo.utils import timeutils @@ -40,7 +41,6 @@ from nova import exception from nova.i18n import _ from nova.openstack.common import fileutils from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova import paths from nova import utils diff --git a/nova/image/s3.py b/nova/image/s3.py index 01629b7083..9ea6f77008 100644 --- a/nova/image/s3.py +++ b/nova/image/s3.py @@ -26,6 +26,7 @@ import tempfile import boto.s3.connection import eventlet from lxml import etree +from oslo.concurrency import processutils from oslo.config import cfg from nova.api.ec2 import ec2utils @@ -35,7 +36,6 @@ from nova import exception from nova.i18n import _, _LE from nova.image import glance from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova import utils diff --git a/nova/network/base_api.py b/nova/network/base_api.py index d8ff36bc46..2d784ae104 100644 --- a/nova/network/base_api.py +++ b/nova/network/base_api.py @@ -16,6 +16,7 @@ import functools import inspect +from oslo.concurrency import lockutils from oslo.utils import excutils from nova.db import base @@ -23,7 +24,6 @@ from nova import hooks from nova.i18n import _ from nova.network import model as network_model from nova import objects -from nova.openstack.common import lockutils from nova.openstack.common import log as logging diff --git a/nova/network/floating_ips.py b/nova/network/floating_ips.py index 5b61935531..f92814d67c 100644 --- a/nova/network/floating_ips.py +++ b/nova/network/floating_ips.py @@ -15,6 +15,7 @@ # License for the specific language governing permissions and limitations # under the License. +from oslo.concurrency import processutils from oslo.config import cfg from oslo import messaging from oslo.utils import excutils @@ -28,7 +29,6 @@ from nova.i18n import _, _LE from nova.network import rpcapi as network_rpcapi from nova import objects from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova.openstack.common import uuidutils from nova import quota from nova import rpc diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py index da52d154c0..89175b0287 100644 --- a/nova/network/linux_net.py +++ b/nova/network/linux_net.py @@ -23,6 +23,7 @@ import os import re import netaddr +from oslo.concurrency import processutils from oslo.config import cfg from oslo.serialization import jsonutils from oslo.utils import excutils @@ -35,7 +36,6 @@ from nova.i18n import _, _LE from nova import objects from nova.openstack.common import fileutils from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova import paths from nova import utils diff --git a/nova/network/neutronv2/__init__.py b/nova/network/neutronv2/__init__.py index e442ae8e44..67b82c832a 100644 --- a/nova/network/neutronv2/__init__.py +++ b/nova/network/neutronv2/__init__.py @@ -15,9 +15,9 @@ from neutronclient.common import exceptions from neutronclient.v2_0 import client as clientv20 +from oslo.concurrency import lockutils from oslo.config import cfg -from nova.openstack.common import lockutils from nova.openstack.common import log as logging CONF = cfg.CONF diff --git a/nova/network/neutronv2/api.py b/nova/network/neutronv2/api.py index 10d65ad43d..b202088ab4 100644 --- a/nova/network/neutronv2/api.py +++ b/nova/network/neutronv2/api.py @@ -19,6 +19,7 @@ import time import uuid from neutronclient.common import exceptions as neutron_client_exc +from oslo.concurrency import lockutils from oslo.config import cfg from oslo.utils import excutils import six @@ -33,7 +34,6 @@ from nova.network import model as network_model from nova.network import neutronv2 from nova.network.neutronv2 import constants from nova import objects -from nova.openstack.common import lockutils from nova.openstack.common import log as logging from nova.openstack.common import uuidutils from nova.pci import manager as pci_manager diff --git a/nova/openstack/common/lockutils.py b/nova/openstack/common/lockutils.py deleted file mode 100644 index 6d5258762d..0000000000 --- a/nova/openstack/common/lockutils.py +++ /dev/null @@ -1,326 +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 functools -import logging -import os -import shutil -import subprocess -import sys -import tempfile -import threading -import time -import weakref - -from oslo.config import cfg - -from nova.openstack.common import fileutils -from nova.openstack.common._i18n import _, _LE, _LI - - -LOG = logging.getLogger(__name__) - - -util_opts = [ - cfg.BoolOpt('disable_process_locking', default=False, - help='Enables or disables inter-process locks.'), - cfg.StrOpt('lock_path', - default=os.environ.get("NOVA_LOCK_PATH"), - help='Directory to use for lock files.') -] - - -CONF = cfg.CONF -CONF.register_opts(util_opts) - - -def set_defaults(lock_path): - cfg.set_defaults(util_opts, lock_path=lock_path) - - -class _FileLock(object): - """Lock implementation which allows multiple locks, working around - issues like bugs.debian.org/cgi-bin/bugreport.cgi?bug=632857 and does - not require any cleanup. Since the lock is always held on a file - descriptor rather than outside of the process, the lock gets dropped - automatically if the process crashes, even if __exit__ is not executed. - - There are no guarantees regarding usage by multiple green threads in a - single process here. This lock works only between processes. Exclusive - access between local threads should be achieved using the semaphores - in the @synchronized decorator. - - Note these locks are released when the descriptor is closed, so it's not - safe to close the file descriptor while another green thread holds the - lock. Just opening and closing the lock file can break synchronisation, - so lock files must be accessed only using this abstraction. - """ - - def __init__(self, name): - self.lockfile = None - self.fname = name - - def acquire(self): - basedir = os.path.dirname(self.fname) - - if not os.path.exists(basedir): - fileutils.ensure_tree(basedir) - LOG.info(_LI('Created lock path: %s'), basedir) - - self.lockfile = open(self.fname, 'w') - - while True: - try: - # Using non-blocking locks since green threads are not - # patched to deal with blocking locking calls. - # Also upon reading the MSDN docs for locking(), it seems - # to have a laughable 10 attempts "blocking" mechanism. - self.trylock() - LOG.debug('Got file lock "%s"', self.fname) - return True - except IOError as e: - if e.errno in (errno.EACCES, errno.EAGAIN): - # external locks synchronise things like iptables - # updates - give it some time to prevent busy spinning - time.sleep(0.01) - else: - raise threading.ThreadError(_("Unable to acquire lock on" - " `%(filename)s` due to" - " %(exception)s") % - {'filename': self.fname, - 'exception': e}) - - def __enter__(self): - self.acquire() - return self - - def release(self): - try: - self.unlock() - self.lockfile.close() - LOG.debug('Released file lock "%s"', self.fname) - except IOError: - LOG.exception(_LE("Could not release the acquired lock `%s`"), - self.fname) - - def __exit__(self, exc_type, exc_val, exc_tb): - self.release() - - def exists(self): - return os.path.exists(self.fname) - - def trylock(self): - raise NotImplementedError() - - def unlock(self): - raise NotImplementedError() - - -class _WindowsLock(_FileLock): - def trylock(self): - msvcrt.locking(self.lockfile.fileno(), msvcrt.LK_NBLCK, 1) - - def unlock(self): - msvcrt.locking(self.lockfile.fileno(), msvcrt.LK_UNLCK, 1) - - -class _FcntlLock(_FileLock): - def trylock(self): - fcntl.lockf(self.lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB) - - def unlock(self): - fcntl.lockf(self.lockfile, fcntl.LOCK_UN) - - -if os.name == 'nt': - import msvcrt - InterProcessLock = _WindowsLock -else: - import fcntl - InterProcessLock = _FcntlLock - -_semaphores = weakref.WeakValueDictionary() -_semaphores_lock = threading.Lock() - - -def _get_lock_path(name, lock_file_prefix, lock_path=None): - # NOTE(mikal): the lock name cannot contain directory - # separators - name = name.replace(os.sep, '_') - if lock_file_prefix: - sep = '' if lock_file_prefix.endswith('-') else '-' - name = '%s%s%s' % (lock_file_prefix, sep, name) - - local_lock_path = lock_path or CONF.lock_path - - if not local_lock_path: - raise cfg.RequiredOptError('lock_path') - - return os.path.join(local_lock_path, name) - - -def external_lock(name, lock_file_prefix=None, lock_path=None): - LOG.debug('Attempting to grab external lock "%(lock)s"', - {'lock': name}) - - lock_file_path = _get_lock_path(name, lock_file_prefix, lock_path) - - return InterProcessLock(lock_file_path) - - -def remove_external_lock_file(name, lock_file_prefix=None): - """Remove an external lock file when it's not used anymore - This will be helpful when we have a lot of lock files - """ - with internal_lock(name): - lock_file_path = _get_lock_path(name, lock_file_prefix) - try: - os.remove(lock_file_path) - except OSError: - LOG.info(_LI('Failed to remove file %(file)s'), - {'file': lock_file_path}) - - -def internal_lock(name): - with _semaphores_lock: - try: - sem = _semaphores[name] - LOG.debug('Using existing semaphore "%s"', name) - except KeyError: - sem = threading.Semaphore() - _semaphores[name] = sem - LOG.debug('Created new semaphore "%s"', name) - - return sem - - -@contextlib.contextmanager -def lock(name, lock_file_prefix=None, external=False, lock_path=None): - """Context based lock - - This function yields a `threading.Semaphore` instance (if we don't use - eventlet.monkey_patch(), else `semaphore.Semaphore`) unless external is - True, in which case, it'll yield an InterProcessLock instance. - - :param lock_file_prefix: The lock_file_prefix argument is used to provide - lock files on disk with a meaningful prefix. - - :param external: The external keyword argument denotes whether this lock - should work across multiple processes. This means that if two different - workers both run a method decorated with @synchronized('mylock', - external=True), only one of them will execute at a time. - """ - int_lock = internal_lock(name) - with int_lock: - LOG.debug('Acquired semaphore "%(lock)s"', {'lock': name}) - try: - if external and not CONF.disable_process_locking: - ext_lock = external_lock(name, lock_file_prefix, lock_path) - with ext_lock: - yield ext_lock - else: - yield int_lock - finally: - LOG.debug('Releasing semaphore "%(lock)s"', {'lock': name}) - - -def synchronized(name, lock_file_prefix=None, external=False, lock_path=None): - """Synchronization decorator. - - Decorating a method like so:: - - @synchronized('mylock') - def foo(self, *args): - ... - - ensures that only one thread will execute the foo method at a time. - - Different methods can share the same lock:: - - @synchronized('mylock') - def foo(self, *args): - ... - - @synchronized('mylock') - def bar(self, *args): - ... - - This way only one of either foo or bar can be executing at a time. - """ - - def wrap(f): - @functools.wraps(f) - def inner(*args, **kwargs): - try: - with lock(name, lock_file_prefix, external, lock_path): - LOG.debug('Got semaphore / lock "%(function)s"', - {'function': f.__name__}) - return f(*args, **kwargs) - finally: - LOG.debug('Semaphore / lock released "%(function)s"', - {'function': f.__name__}) - return inner - return wrap - - -def synchronized_with_prefix(lock_file_prefix): - """Partial object generator for the synchronization decorator. - - Redefine @synchronized in each project like so:: - - (in oslo.utils.py) - from nova.openstack.common import lockutils - - synchronized = lockutils.synchronized_with_prefix('nova-') - - - (in nova/foo.py) - from nova import utils - - @utils.synchronized('mylock') - def bar(self, *args): - ... - - The lock_file_prefix argument is used to provide lock files on disk with a - meaningful prefix. - """ - - return functools.partial(synchronized, lock_file_prefix=lock_file_prefix) - - -def main(argv): - """Create a dir for locks and pass it to command from arguments - - If you run this: - python -m openstack.common.lockutils python setup.py testr <etc> - - a temporary directory will be created for all your locks and passed to all - your tests in an environment variable. The temporary dir will be deleted - afterwards and the return value will be preserved. - """ - - lock_dir = tempfile.mkdtemp() - os.environ["NOVA_LOCK_PATH"] = lock_dir - try: - ret_val = subprocess.call(argv[1:]) - finally: - shutil.rmtree(lock_dir, ignore_errors=True) - return ret_val - - -if __name__ == '__main__': - sys.exit(main(sys.argv)) diff --git a/nova/openstack/common/processutils.py b/nova/openstack/common/processutils.py deleted file mode 100644 index 9de8e90db2..0000000000 --- a/nova/openstack/common/processutils.py +++ /dev/null @@ -1,289 +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. - -""" -System-level utilities and helper functions. -""" - -import errno -import logging -import multiprocessing -import os -import random -import shlex -import signal - -from eventlet.green import subprocess -from eventlet import greenthread -from oslo.utils import strutils -import six - -from nova.openstack.common._i18n import _ - - -LOG = logging.getLogger(__name__) - - -class InvalidArgumentError(Exception): - def __init__(self, message=None): - super(InvalidArgumentError, self).__init__(message) - - -class UnknownArgumentError(Exception): - def __init__(self, message=None): - super(UnknownArgumentError, self).__init__(message) - - -class ProcessExecutionError(Exception): - def __init__(self, stdout=None, stderr=None, exit_code=None, cmd=None, - description=None): - self.exit_code = exit_code - self.stderr = stderr - self.stdout = stdout - self.cmd = cmd - self.description = description - - if description is None: - description = _("Unexpected error while running command.") - if exit_code is None: - exit_code = '-' - message = _('%(description)s\n' - 'Command: %(cmd)s\n' - 'Exit code: %(exit_code)s\n' - 'Stdout: %(stdout)r\n' - 'Stderr: %(stderr)r') % {'description': description, - 'cmd': cmd, - 'exit_code': exit_code, - 'stdout': stdout, - 'stderr': stderr} - super(ProcessExecutionError, self).__init__(message) - - -class NoRootWrapSpecified(Exception): - def __init__(self, message=None): - super(NoRootWrapSpecified, self).__init__(message) - - -def _subprocess_setup(): - # Python installs a SIGPIPE handler by default. This is usually not what - # non-Python subprocesses expect. - signal.signal(signal.SIGPIPE, signal.SIG_DFL) - - -def execute(*cmd, **kwargs): - """Helper method to shell out and execute a command through subprocess. - - Allows optional retry. - - :param cmd: Passed to subprocess.Popen. - :type cmd: string - :param process_input: Send to opened process. - :type process_input: string - :param env_variables: Environment variables and their values that - will be set for the process. - :type env_variables: dict - :param check_exit_code: Single bool, int, or list of allowed exit - codes. Defaults to [0]. Raise - :class:`ProcessExecutionError` unless - program exits with one of these code. - :type check_exit_code: boolean, int, or [int] - :param delay_on_retry: True | False. Defaults to True. If set to True, - wait a short amount of time before retrying. - :type delay_on_retry: boolean - :param attempts: How many times to retry cmd. - :type attempts: int - :param run_as_root: True | False. Defaults to False. If set to True, - the command is prefixed by the command specified - in the root_helper kwarg. - :type run_as_root: boolean - :param root_helper: command to prefix to commands called with - run_as_root=True - :type root_helper: string - :param shell: whether or not there should be a shell used to - execute this command. Defaults to false. - :type shell: boolean - :param loglevel: log level for execute commands. - :type loglevel: int. (Should be logging.DEBUG or logging.INFO) - :returns: (stdout, stderr) from process execution - :raises: :class:`UnknownArgumentError` on - receiving unknown arguments - :raises: :class:`ProcessExecutionError` - """ - - process_input = kwargs.pop('process_input', None) - env_variables = kwargs.pop('env_variables', None) - check_exit_code = kwargs.pop('check_exit_code', [0]) - ignore_exit_code = False - delay_on_retry = kwargs.pop('delay_on_retry', True) - attempts = kwargs.pop('attempts', 1) - run_as_root = kwargs.pop('run_as_root', False) - root_helper = kwargs.pop('root_helper', '') - shell = kwargs.pop('shell', False) - loglevel = kwargs.pop('loglevel', logging.DEBUG) - - if isinstance(check_exit_code, bool): - ignore_exit_code = not check_exit_code - check_exit_code = [0] - elif isinstance(check_exit_code, int): - check_exit_code = [check_exit_code] - - if kwargs: - raise UnknownArgumentError(_('Got unknown keyword args: %r') % kwargs) - - if run_as_root and hasattr(os, 'geteuid') and os.geteuid() != 0: - if not root_helper: - raise NoRootWrapSpecified( - message=_('Command requested root, but did not ' - 'specify a root helper.')) - cmd = shlex.split(root_helper) + list(cmd) - - cmd = map(str, cmd) - sanitized_cmd = strutils.mask_password(' '.join(cmd)) - - while attempts > 0: - attempts -= 1 - try: - LOG.log(loglevel, _('Running cmd (subprocess): %s'), sanitized_cmd) - _PIPE = subprocess.PIPE # pylint: disable=E1101 - - if os.name == 'nt': - preexec_fn = None - close_fds = False - else: - preexec_fn = _subprocess_setup - close_fds = True - - obj = subprocess.Popen(cmd, - stdin=_PIPE, - stdout=_PIPE, - stderr=_PIPE, - close_fds=close_fds, - preexec_fn=preexec_fn, - shell=shell, - env=env_variables) - result = None - for _i in six.moves.range(20): - # NOTE(russellb) 20 is an arbitrary number of retries to - # prevent any chance of looping forever here. - try: - if process_input is not None: - result = obj.communicate(process_input) - else: - result = obj.communicate() - except OSError as e: - if e.errno in (errno.EAGAIN, errno.EINTR): - continue - raise - break - obj.stdin.close() # pylint: disable=E1101 - _returncode = obj.returncode # pylint: disable=E1101 - LOG.log(loglevel, 'Result was %s' % _returncode) - if not ignore_exit_code and _returncode not in check_exit_code: - (stdout, stderr) = result - sanitized_stdout = strutils.mask_password(stdout) - sanitized_stderr = strutils.mask_password(stderr) - raise ProcessExecutionError(exit_code=_returncode, - stdout=sanitized_stdout, - stderr=sanitized_stderr, - cmd=sanitized_cmd) - return result - except ProcessExecutionError: - if not attempts: - raise - else: - LOG.log(loglevel, _('%r failed. Retrying.'), sanitized_cmd) - if delay_on_retry: - greenthread.sleep(random.randint(20, 200) / 100.0) - finally: - # NOTE(termie): this appears to be necessary to let the subprocess - # call clean something up in between calls, without - # it two execute calls in a row hangs the second one - greenthread.sleep(0) - - -def trycmd(*args, **kwargs): - """A wrapper around execute() to more easily handle warnings and errors. - - Returns an (out, err) tuple of strings containing the output of - the command's stdout and stderr. If 'err' is not empty then the - command can be considered to have failed. - - :discard_warnings True | False. Defaults to False. If set to True, - then for succeeding commands, stderr is cleared - - """ - discard_warnings = kwargs.pop('discard_warnings', False) - - try: - out, err = execute(*args, **kwargs) - failed = False - except ProcessExecutionError as exn: - out, err = '', six.text_type(exn) - failed = True - - if not failed and discard_warnings and err: - # Handle commands that output to stderr but otherwise succeed - err = '' - - return out, err - - -def ssh_execute(ssh, cmd, process_input=None, - addl_env=None, check_exit_code=True): - sanitized_cmd = strutils.mask_password(cmd) - LOG.debug('Running cmd (SSH): %s', sanitized_cmd) - if addl_env: - raise InvalidArgumentError(_('Environment not supported over SSH')) - - if process_input: - # This is (probably) fixable if we need it... - raise InvalidArgumentError(_('process_input not supported over SSH')) - - stdin_stream, stdout_stream, stderr_stream = ssh.exec_command(cmd) - channel = stdout_stream.channel - - # NOTE(justinsb): This seems suspicious... - # ...other SSH clients have buffering issues with this approach - stdout = stdout_stream.read() - sanitized_stdout = strutils.mask_password(stdout) - stderr = stderr_stream.read() - sanitized_stderr = strutils.mask_password(stderr) - - stdin_stream.close() - - exit_status = channel.recv_exit_status() - - # exit_status == -1 if no exit code was returned - if exit_status != -1: - LOG.debug('Result was %s' % exit_status) - if check_exit_code and exit_status != 0: - raise ProcessExecutionError(exit_code=exit_status, - stdout=sanitized_stdout, - stderr=sanitized_stderr, - cmd=sanitized_cmd) - - return (sanitized_stdout, sanitized_stderr) - - -def get_worker_count(): - """Utility to get the default worker count. - - @return: The number of CPUs if that can be determined, else a default - worker count of 1 is returned. - """ - try: - return multiprocessing.cpu_count() - except NotImplementedError: - return 1 diff --git a/nova/service.py b/nova/service.py index 2815f1fe28..6f27a3808b 100644 --- a/nova/service.py +++ b/nova/service.py @@ -21,6 +21,7 @@ import os import random import sys +from oslo.concurrency import processutils from oslo.config import cfg from oslo import messaging from oslo.utils import importutils @@ -33,7 +34,6 @@ from nova import exception from nova.i18n import _, _LE from nova.objects import base as objects_base from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova.openstack.common import service from nova import rpc from nova import servicegroup diff --git a/nova/storage/linuxscsi.py b/nova/storage/linuxscsi.py index 08577b0f6d..713a082845 100644 --- a/nova/storage/linuxscsi.py +++ b/nova/storage/linuxscsi.py @@ -14,10 +14,11 @@ """Generic linux scsi subsystem utilities.""" +from oslo.concurrency import processutils + from nova.i18n import _LW from nova.openstack.common import log as logging from nova.openstack.common import loopingcall -from nova.openstack.common import processutils from nova import utils LOG = logging.getLogger(__name__) diff --git a/nova/tests/db/test_migrations.py b/nova/tests/db/test_migrations.py index 666e825a5a..1ebe8ad470 100644 --- a/nova/tests/db/test_migrations.py +++ b/nova/tests/db/test_migrations.py @@ -44,6 +44,7 @@ import glob import os from migrate.versioning import repository +from oslo.concurrency import processutils from oslo.db.sqlalchemy import session from oslo.db.sqlalchemy import utils as oslodbutils import six.moves.urllib.parse as urlparse @@ -54,7 +55,6 @@ import nova.db.sqlalchemy.migrate_repo from nova.db.sqlalchemy import utils as db_utils from nova.i18n import _ from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova import test from nova import utils diff --git a/nova/tests/fake_processutils.py b/nova/tests/fake_processutils.py index 7d7b4c23b4..111540d1d1 100644 --- a/nova/tests/fake_processutils.py +++ b/nova/tests/fake_processutils.py @@ -12,15 +12,15 @@ # License for the specific language governing permissions and limitations # under the License. -"""This modules stubs out functions in openstack.common.processutils.""" +"""This modules stubs out functions in oslo.concurrency.processutils.""" import re from eventlet import greenthread +from oslo.concurrency import processutils import six from nova.openstack.common import log as logging -from nova.openstack.common import processutils LOG = logging.getLogger(__name__) diff --git a/nova/tests/network/test_linux_net.py b/nova/tests/network/test_linux_net.py index 15a20eb7d5..ef4c567af8 100644 --- a/nova/tests/network/test_linux_net.py +++ b/nova/tests/network/test_linux_net.py @@ -20,6 +20,7 @@ import os import mock import mox +from oslo.concurrency import processutils from oslo.config import cfg from oslo.serialization import jsonutils from oslo.utils import timeutils @@ -32,7 +33,6 @@ from nova.network import linux_net from nova import objects from nova.openstack.common import fileutils from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova import test from nova import utils diff --git a/nova/tests/network/test_manager.py b/nova/tests/network/test_manager.py index 0dfa0598cd..8c41164555 100644 --- a/nova/tests/network/test_manager.py +++ b/nova/tests/network/test_manager.py @@ -21,6 +21,7 @@ import fixtures import mock import mox import netaddr +from oslo.concurrency import processutils from oslo.config import cfg from oslo.db import exception as db_exc from oslo import messaging @@ -40,7 +41,6 @@ from nova import objects from nova.objects import quotas as quotas_obj from nova.objects import virtual_interface as vif_obj from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova import quota from nova import test from nova.tests import fake_instance diff --git a/nova/tests/network/test_neutronv2.py b/nova/tests/network/test_neutronv2.py index 05b282365a..1ca7068d6b 100644 --- a/nova/tests/network/test_neutronv2.py +++ b/nova/tests/network/test_neutronv2.py @@ -2655,7 +2655,7 @@ class TestNeutronv2WithMock(test.TestCase): 'fake-user', 'fake-project', auth_token='bff4a5a6b9eb4ea2a6efec6eefb77936') - @mock.patch('nova.openstack.common.lockutils.lock') + @mock.patch('oslo.concurrency.lockutils.lock') def test_get_instance_nw_info_locks_per_instance(self, mock_lock): instance = objects.Instance(uuid=uuid.uuid4()) api = neutronapi.API() diff --git a/nova/tests/test_crypto.py b/nova/tests/test_crypto.py index 392937f864..49634626a3 100644 --- a/nova/tests/test_crypto.py +++ b/nova/tests/test_crypto.py @@ -20,11 +20,11 @@ import os import mock import mox +from oslo.concurrency import processutils from nova import crypto from nova import db from nova import exception -from nova.openstack.common import processutils from nova import test from nova import utils diff --git a/nova/tests/test_service.py b/nova/tests/test_service.py index 4a00aacf7a..4bc7104945 100644 --- a/nova/tests/test_service.py +++ b/nova/tests/test_service.py @@ -22,6 +22,7 @@ import sys import mock import mox +from oslo.concurrency import processutils from oslo.config import cfg import testtools @@ -29,7 +30,6 @@ from nova import context from nova import db from nova import exception from nova import manager -from nova.openstack.common import processutils from nova.openstack.common import service as _service from nova import rpc from nova import service diff --git a/nova/tests/test_utils.py b/nova/tests/test_utils.py index 0c1da9535e..548e973b6a 100644 --- a/nova/tests/test_utils.py +++ b/nova/tests/test_utils.py @@ -24,12 +24,12 @@ import tempfile import mox import netaddr +from oslo.concurrency import processutils from oslo.config import cfg from oslo.utils import timeutils import nova from nova import exception -from nova.openstack.common import processutils from nova import test from nova import utils diff --git a/nova/tests/virt/disk/test_api.py b/nova/tests/virt/disk/test_api.py index c86e8bc0b4..1f62c33b51 100644 --- a/nova/tests/virt/disk/test_api.py +++ b/nova/tests/virt/disk/test_api.py @@ -16,8 +16,8 @@ import tempfile import fixtures +from oslo.concurrency import processutils -from nova.openstack.common import processutils from nova import test from nova import utils from nova.virt.disk import api diff --git a/nova/tests/virt/disk/vfs/test_localfs.py b/nova/tests/virt/disk/vfs/test_localfs.py index 7c88708b94..16935498ac 100644 --- a/nova/tests/virt/disk/vfs/test_localfs.py +++ b/nova/tests/virt/disk/vfs/test_localfs.py @@ -12,10 +12,10 @@ # License for the specific language governing permissions and limitations # under the License. +from oslo.concurrency import processutils from oslo.config import cfg from nova import exception -from nova.openstack.common import processutils from nova import test from nova.tests import utils as tests_utils import nova.utils diff --git a/nova/tests/virt/libvirt/test_driver.py b/nova/tests/virt/libvirt/test_driver.py index d658ee5f3e..3c346f03a4 100644 --- a/nova/tests/virt/libvirt/test_driver.py +++ b/nova/tests/virt/libvirt/test_driver.py @@ -32,6 +32,8 @@ import fixtures from lxml import etree import mock import mox +from oslo.concurrency import lockutils +from oslo.concurrency import processutils from oslo.config import cfg from oslo.serialization import jsonutils from oslo.utils import importutils @@ -53,9 +55,7 @@ from nova import exception from nova.network import model as network_model from nova import objects from nova.openstack.common import fileutils -from nova.openstack.common import lockutils from nova.openstack.common import loopingcall -from nova.openstack.common import processutils from nova.openstack.common import uuidutils from nova.pci import manager as pci_manager from nova import test diff --git a/nova/tests/virt/libvirt/test_firewall.py b/nova/tests/virt/libvirt/test_firewall.py index 3210760c4d..f928825fba 100644 --- a/nova/tests/virt/libvirt/test_firewall.py +++ b/nova/tests/virt/libvirt/test_firewall.py @@ -21,12 +21,12 @@ from xml.dom import minidom from lxml import etree import mock import mox +from oslo.concurrency import lockutils from nova.compute import utils as compute_utils from nova import exception from nova.network import linux_net from nova import objects -from nova.openstack.common import lockutils from nova import test from nova.tests import fake_network from nova.tests.virt.libvirt import fakelibvirt diff --git a/nova/tests/virt/libvirt/test_imagecache.py b/nova/tests/virt/libvirt/test_imagecache.py index 37540d4449..a2eb4a1c67 100644 --- a/nova/tests/virt/libvirt/test_imagecache.py +++ b/nova/tests/virt/libvirt/test_imagecache.py @@ -20,6 +20,7 @@ import hashlib import os import time +from oslo.concurrency import processutils from oslo.config import cfg from oslo.serialization import jsonutils from oslo.utils import importutils @@ -27,7 +28,6 @@ from oslo.utils import importutils from nova import conductor from nova import db from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova import test from nova.tests import fake_instance from nova import utils diff --git a/nova/tests/virt/libvirt/test_lvm.py b/nova/tests/virt/libvirt/test_lvm.py index e51ea9aeef..fdb3e4b9f6 100644 --- a/nova/tests/virt/libvirt/test_lvm.py +++ b/nova/tests/virt/libvirt/test_lvm.py @@ -16,10 +16,10 @@ import contextlib import mock +from oslo.concurrency import processutils from oslo.config import cfg from nova import exception -from nova.openstack.common import processutils from nova import test from nova import utils from nova.virt.libvirt import lvm diff --git a/nova/tests/virt/libvirt/test_utils.py b/nova/tests/virt/libvirt/test_utils.py index bf5663a575..4114c03516 100644 --- a/nova/tests/virt/libvirt/test_utils.py +++ b/nova/tests/virt/libvirt/test_utils.py @@ -18,11 +18,11 @@ import os import tempfile import mock +from oslo.concurrency import processutils from oslo.config import cfg from nova import exception from nova.openstack.common import fileutils -from nova.openstack.common import processutils from nova import test from nova import utils from nova.virt.disk import api as disk diff --git a/nova/tests/virt/libvirt/test_vif.py b/nova/tests/virt/libvirt/test_vif.py index 0e444dd849..256ca58046 100644 --- a/nova/tests/virt/libvirt/test_vif.py +++ b/nova/tests/virt/libvirt/test_vif.py @@ -16,12 +16,12 @@ import contextlib from lxml import etree import mock +from oslo.concurrency import processutils from oslo.config import cfg from nova import exception from nova.network import linux_net from nova.network import model as network_model -from nova.openstack.common import processutils from nova import test from nova.tests.virt.libvirt import fakelibvirt from nova import utils diff --git a/nova/tests/virt/libvirt/test_volume.py b/nova/tests/virt/libvirt/test_volume.py index 8688bb35e7..48437d1c6d 100644 --- a/nova/tests/virt/libvirt/test_volume.py +++ b/nova/tests/virt/libvirt/test_volume.py @@ -19,10 +19,10 @@ import time import fixtures import mock +from oslo.concurrency import processutils from oslo.config import cfg from nova import exception -from nova.openstack.common import processutils from nova.storage import linuxscsi from nova import test from nova.tests.virt.libvirt import fake_libvirt_utils diff --git a/nova/tests/virt/test_images.py b/nova/tests/virt/test_images.py index f7057aba52..be5ea73ef1 100644 --- a/nova/tests/virt/test_images.py +++ b/nova/tests/virt/test_images.py @@ -15,9 +15,9 @@ import os import mock +from oslo.concurrency import processutils from nova import exception -from nova.openstack.common import processutils from nova import test from nova import utils from nova.virt import images diff --git a/nova/tests/virt/xenapi/test_vm_utils.py b/nova/tests/virt/xenapi/test_vm_utils.py index f65891fbec..990c14d744 100644 --- a/nova/tests/virt/xenapi/test_vm_utils.py +++ b/nova/tests/virt/xenapi/test_vm_utils.py @@ -20,6 +20,7 @@ from eventlet import greenthread import fixtures import mock import mox +from oslo.concurrency import processutils from oslo.config import cfg from oslo.utils import timeutils from oslo.utils import units @@ -31,7 +32,6 @@ from nova.compute import vm_mode from nova import context from nova import exception from nova.i18n import _ -from nova.openstack.common import processutils from nova import test from nova.tests.virt.xenapi import stubs from nova.tests.virt.xenapi import test_xenapi diff --git a/nova/utils.py b/nova/utils.py index 60a3668094..90524c2b96 100644 --- a/nova/utils.py +++ b/nova/utils.py @@ -36,6 +36,8 @@ from xml.sax import saxutils import eventlet import netaddr +from oslo.concurrency import lockutils +from oslo.concurrency import processutils from oslo.config import cfg from oslo import messaging from oslo.utils import excutils @@ -45,9 +47,7 @@ import six from nova import exception from nova.i18n import _, _LE -from nova.openstack.common import lockutils from nova.openstack.common import log as logging -from nova.openstack.common import processutils notify_decorator = 'nova.notifications.notify_decorator' diff --git a/nova/virt/disk/api.py b/nova/virt/disk/api.py index b87f2b7d1d..b808ab9eaf 100644 --- a/nova/virt/disk/api.py +++ b/nova/virt/disk/api.py @@ -30,6 +30,7 @@ import tempfile if os.name != 'nt': import crypt +from oslo.concurrency import processutils from oslo.config import cfg from oslo.serialization import jsonutils @@ -38,7 +39,6 @@ from nova.i18n import _ from nova.i18n import _LE from nova.i18n import _LW from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova import utils from nova.virt.disk.mount import api as mount from nova.virt.disk.vfs import api as vfs diff --git a/nova/virt/hyperv/vmops.py b/nova/virt/hyperv/vmops.py index b1b8e01a6f..4f4ac2cce3 100644 --- a/nova/virt/hyperv/vmops.py +++ b/nova/virt/hyperv/vmops.py @@ -22,6 +22,7 @@ import os import time from eventlet import timeout as etimeout +from oslo.concurrency import processutils from oslo.config import cfg from oslo.utils import excutils from oslo.utils import importutils @@ -33,7 +34,6 @@ from nova.i18n import _, _LI, _LE, _LW from nova.openstack.common import fileutils from nova.openstack.common import log as logging from nova.openstack.common import loopingcall -from nova.openstack.common import processutils from nova.openstack.common import uuidutils from nova import utils from nova.virt import configdrive diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 98e9398f3c..5957d7795f 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -48,6 +48,7 @@ from eventlet import patcher from eventlet import tpool from eventlet import util as eventlet_util from lxml import etree +from oslo.concurrency import processutils from oslo.config import cfg from oslo.serialization import jsonutils from oslo.utils import excutils @@ -80,7 +81,6 @@ from nova import objects from nova.openstack.common import fileutils from nova.openstack.common import log as logging from nova.openstack.common import loopingcall -from nova.openstack.common import processutils from nova.pci import manager as pci_manager from nova.pci import utils as pci_utils from nova.pci import whitelist as pci_whitelist diff --git a/nova/virt/libvirt/imagecache.py b/nova/virt/libvirt/imagecache.py index 5c09b79ce6..d264482271 100644 --- a/nova/virt/libvirt/imagecache.py +++ b/nova/virt/libvirt/imagecache.py @@ -25,6 +25,7 @@ import os import re import time +from oslo.concurrency import processutils from oslo.config import cfg from oslo.serialization import jsonutils @@ -33,7 +34,6 @@ from nova.i18n import _LI from nova.i18n import _LW from nova.openstack.common import fileutils from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova import utils from nova.virt import imagecache from nova.virt.libvirt import utils as libvirt_utils diff --git a/nova/virt/libvirt/lvm.py b/nova/virt/libvirt/lvm.py index 76415d598c..c159bffbc8 100644 --- a/nova/virt/libvirt/lvm.py +++ b/nova/virt/libvirt/lvm.py @@ -21,6 +21,7 @@ import functools +from oslo.concurrency import processutils from oslo.config import cfg from oslo.utils import units import six @@ -30,7 +31,6 @@ from nova.i18n import _ from nova.i18n import _LE from nova.i18n import _LW from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova import utils as nova_utils from nova.virt.libvirt import utils diff --git a/nova/virt/libvirt/utils.py b/nova/virt/libvirt/utils.py index c05de9354e..487f45487e 100644 --- a/nova/virt/libvirt/utils.py +++ b/nova/virt/libvirt/utils.py @@ -24,13 +24,13 @@ import platform import re from lxml import etree +from oslo.concurrency import processutils from oslo.config import cfg from nova.i18n import _ from nova.i18n import _LI from nova.i18n import _LW from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova import utils from nova.virt import images from nova.virt.libvirt import config as vconfig diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py index 71404f08ac..a4d3d51f47 100644 --- a/nova/virt/libvirt/vif.py +++ b/nova/virt/libvirt/vif.py @@ -19,6 +19,7 @@ import copy +from oslo.concurrency import processutils from oslo.config import cfg from nova import exception @@ -27,7 +28,6 @@ from nova.i18n import _LE from nova.network import linux_net from nova.network import model as network_model from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova import utils from nova.virt.libvirt import config as vconfig from nova.virt.libvirt import designer diff --git a/nova/virt/libvirt/volume.py b/nova/virt/libvirt/volume.py index 8f118ed078..1ddf4d7a75 100644 --- a/nova/virt/libvirt/volume.py +++ b/nova/virt/libvirt/volume.py @@ -21,6 +21,7 @@ import os import time import urllib2 +from oslo.concurrency import processutils from oslo.config import cfg from oslo.utils import strutils import six @@ -32,7 +33,6 @@ from nova.i18n import _LE from nova.i18n import _LW from nova.openstack.common import log as logging from nova.openstack.common import loopingcall -from nova.openstack.common import processutils from nova import paths from nova.storage import linuxscsi from nova import utils diff --git a/nova/virt/vmwareapi/imagecache.py b/nova/virt/vmwareapi/imagecache.py index 946da3aef4..41b6aeb5d1 100644 --- a/nova/virt/vmwareapi/imagecache.py +++ b/nova/virt/vmwareapi/imagecache.py @@ -35,12 +35,12 @@ the timestamp folder will be locked and the timestamps will be purged. This will ensure that a image is not deleted during the spawn. """ +from oslo.concurrency import lockutils from oslo.config import cfg from oslo.utils import timeutils from oslo.vmware import exceptions as vexc from nova.i18n import _ -from nova.openstack.common import lockutils from nova.openstack.common import log as logging from nova.virt import imagecache from nova.virt.vmwareapi import ds_util diff --git a/nova/virt/vmwareapi/vmops.py b/nova/virt/vmwareapi/vmops.py index b935a20f3c..777e0e1e93 100644 --- a/nova/virt/vmwareapi/vmops.py +++ b/nova/virt/vmwareapi/vmops.py @@ -24,6 +24,7 @@ import os import time import decorator +from oslo.concurrency import lockutils from oslo.config import cfg from oslo.utils import excutils from oslo.utils import strutils @@ -40,7 +41,6 @@ from nova import context as nova_context from nova import exception from nova.i18n import _, _LE, _LW from nova import objects -from nova.openstack.common import lockutils from nova.openstack.common import log as logging from nova.openstack.common import uuidutils from nova import utils diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py index f230a35823..ab91ec5934 100644 --- a/nova/virt/xenapi/vm_utils.py +++ b/nova/virt/xenapi/vm_utils.py @@ -28,6 +28,7 @@ from xml.dom import minidom from xml.parsers import expat from eventlet import greenthread +from oslo.concurrency import processutils from oslo.config import cfg from oslo.utils import excutils from oslo.utils import importutils @@ -46,7 +47,6 @@ from nova import exception from nova.i18n import _, _LE, _LI from nova.network import model as network_model from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova.openstack.common import versionutils from nova import utils from nova.virt import configdrive diff --git a/nova/volume/encryptors/luks.py b/nova/volume/encryptors/luks.py index 63cdf5e080..5fe0f74b26 100644 --- a/nova/volume/encryptors/luks.py +++ b/nova/volume/encryptors/luks.py @@ -16,8 +16,9 @@ import re +from oslo.concurrency import processutils + from nova.openstack.common import log as logging -from nova.openstack.common import processutils from nova import utils from nova.volume.encryptors import cryptsetup diff --git a/openstack-common.conf b/openstack-common.conf index a276846d43..a52f990b9a 100644 --- a/openstack-common.conf +++ b/openstack-common.conf @@ -13,7 +13,6 @@ module=fixture.moxstubout module=imageutils module=install_venv_common module=local -module=lockutils module=log module=loopingcall module=memorycache @@ -21,7 +20,6 @@ module=middleware.base module=middleware.request_id module=periodic_task module=policy -module=processutils module=report module=report.generators module=report.models diff --git a/requirements.txt b/requirements.txt index d707941acd..db54ec1426 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,6 +34,7 @@ six>=1.7.0 stevedore>=1.0.0 # Apache-2.0 websockify>=0.6.0,<0.7 wsgiref>=0.1.2 +oslo.concurrency>=0.1.0 # Apache-2.0 oslo.config>=1.4.0 # Apache-2.0 oslo.serialization>=1.0.0 # Apache-2.0 oslo.utils>=1.0.0 # Apache-2.0 diff --git a/run_tests.sh b/run_tests.sh index abc10fab15..bd3efddd91 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -117,7 +117,7 @@ function run_tests { # provided. testrargs="discover ./nova/tests" fi - ${wrapper} python -m nova.openstack.common.lockutils python -m testtools.run $testropts $testrargs + ${wrapper} python -m oslo.concurrency.lockutils python -m testtools.run $testropts $testrargs # Short circuit because all of the testr and coverage stuff # below does not make sense when running testtools.run for @@ -184,7 +184,7 @@ function run_pep8 { } -TESTRTESTS="python -m nova.openstack.common.lockutils python setup.py testr" +TESTRTESTS="python -m oslo.concurrency.lockutils python setup.py testr" if [ $never_venv -eq 0 ] then diff --git a/tools/pretty_tox.sh b/tools/pretty_tox.sh index 137f7df3f6..ddc160b4fe 100755 --- a/tools/pretty_tox.sh +++ b/tools/pretty_tox.sh @@ -3,4 +3,4 @@ set -o pipefail TESTRARGS=$1 -python -m nova.openstack.common.lockutils python setup.py testr --slowest --testr-args="--subunit $TESTRARGS" | $(dirname $0)/subunit-trace.py -f +python -m oslo.concurrency.lockutils python setup.py testr --slowest --testr-args="--subunit $TESTRARGS" | $(dirname $0)/subunit-trace.py -f @@ -40,7 +40,7 @@ commands = bash tools/lintstack.sh # tests conflict with coverage. commands = coverage erase - python -m nova.openstack.common.lockutils python setup.py testr --coverage \ + python -m oslo.concurrency.lockutils python setup.py testr --coverage \ --testr-args='{posargs}' coverage combine coverage html --include='nova/*' --omit='nova/openstack/common/*' -d covhtml -i |