Merge "Sync harmless changes from oslo-incubator"

This commit is contained in:
Jenkins 2013-07-15 21:53:29 +00:00 committed by Gerrit Code Review
commit aae0cf362a
15 changed files with 87 additions and 53 deletions

View File

@ -33,7 +33,8 @@ def generate_request_id():
class RequestContext(object): class RequestContext(object):
""" """Helper class to represent useful information about a request context.
Stores information about the security context under which the user Stores information about the security context under which the user
accesses the system, as well as additional request information. accesses the system, as well as additional request information.
""" """
@ -60,7 +61,7 @@ class RequestContext(object):
'request_id': self.request_id} 'request_id': self.request_id}
def get_admin_context(show_deleted="no"): def get_admin_context(show_deleted=False):
context = RequestContext(None, context = RequestContext(None,
tenant=None, tenant=None,
is_admin=True, is_admin=True,

View File

@ -24,7 +24,7 @@ import traceback
def import_class(import_str): def import_class(import_str):
"""Returns a class from a string including module and class""" """Returns a class from a string including module and class."""
mod_str, _sep, class_str = import_str.rpartition('.') mod_str, _sep, class_str = import_str.rpartition('.')
try: try:
__import__(mod_str) __import__(mod_str)
@ -41,8 +41,9 @@ def import_object(import_str, *args, **kwargs):
def import_object_ns(name_space, import_str, *args, **kwargs): def import_object_ns(name_space, import_str, *args, **kwargs):
""" """Tries to import object from default namespace.
Import a class and return an instance of it, first by trying
Imports a class and return an instance of it, first by trying
to find the class in a default namespace, then failing back to to find the class in a default namespace, then failing back to
a full path if not found in the default namespace. a full path if not found in the default namespace.
""" """

View File

@ -158,17 +158,18 @@ def synchronized(name, lock_file_prefix, external=False, lock_path=None):
This way only one of either foo or bar can be executing at a time. This way only one of either foo or bar can be executing at a time.
The lock_file_prefix argument is used to provide lock files on disk with a :param lock_file_prefix: The lock_file_prefix argument is used to provide
meaningful prefix. The prefix should end with a hyphen ('-') if specified. lock files on disk with a meaningful prefix. The prefix should end with a
hyphen ('-') if specified.
The external keyword argument denotes whether this lock should work across :param external: The external keyword argument denotes whether this lock
multiple processes. This means that if two different workers both run a should work across multiple processes. This means that if two different
a method decorated with @synchronized('mylock', external=True), only one workers both run a a method decorated with @synchronized('mylock',
of them will execute at a time. external=True), only one of them will execute at a time.
The lock_path keyword argument is used to specify a special location for :param lock_path: The lock_path keyword argument is used to specify a
external lock files to live. If nothing is set, then CONF.lock_path is special location for external lock files to live. If nothing is set, then
used as a default. CONF.lock_path is used as a default.
""" """
def wrap(f): def wrap(f):

View File

@ -74,7 +74,8 @@ logging_cli_opts = [
cfg.StrOpt('log-format', cfg.StrOpt('log-format',
default=None, default=None,
metavar='FORMAT', metavar='FORMAT',
help='A logging.Formatter log message format string which may ' help='DEPRECATED. '
'A logging.Formatter log message format string which may '
'use any of the available logging.LogRecord attributes. ' 'use any of the available logging.LogRecord attributes. '
'This option is deprecated. Please use ' 'This option is deprecated. Please use '
'logging_context_format_string and ' 'logging_context_format_string and '
@ -459,10 +460,11 @@ def getLogger(name='unknown', version='unknown'):
def getLazyLogger(name='unknown', version='unknown'): def getLazyLogger(name='unknown', version='unknown'):
""" """Returns lazy logger.
create a pass-through logger that does not create the real logger
Creates a pass-through logger that does not create the real logger
until it is really needed and delegates all calls to the real logger until it is really needed and delegates all calls to the real logger
once it is created once it is created.
""" """
return LazyAdapter(name, version) return LazyAdapter(name, version)

View File

@ -57,7 +57,8 @@ class Client(object):
def get(self, key): def get(self, key):
"""Retrieves the value for a key or None. """Retrieves the value for a key or None.
this expunges expired keys during each get""" This expunges expired keys during each get.
"""
now = timeutils.utcnow_ts() now = timeutils.utcnow_ts()
for k in self.cache.keys(): for k in self.cache.keys():

View File

@ -19,15 +19,12 @@
Network-related utilities and helper functions. Network-related utilities and helper functions.
""" """
from nova.openstack.common import log as logging import urlparse
LOG = logging.getLogger(__name__)
def parse_host_port(address, default_port=None): def parse_host_port(address, default_port=None):
""" """Interpret a string as a host:port pair.
Interpret a string as a host:port pair.
An IPv6 address MUST be escaped if accompanied by a port, An IPv6 address MUST be escaped if accompanied by a port,
because otherwise ambiguity ensues: 2001:db8:85a3::8a2e:370:7334 because otherwise ambiguity ensues: 2001:db8:85a3::8a2e:370:7334
means both [2001:db8:85a3::8a2e:370:7334] and means both [2001:db8:85a3::8a2e:370:7334] and
@ -67,3 +64,18 @@ def parse_host_port(address, default_port=None):
port = default_port port = default_port
return (host, None if port is None else int(port)) return (host, None if port is None else int(port))
def urlsplit(url, scheme='', allow_fragments=True):
"""Parse a URL using urlparse.urlsplit(), splitting query and fragments.
This function papers over Python issue9374 when needed.
The parameters are the same as urlparse.urlsplit.
"""
scheme, netloc, path, query, fragment = urlparse.urlsplit(
url, scheme, allow_fragments)
if allow_fragments and '#' in path:
path, fragment = path.split('#', 1)
if '?' in path:
path, query = path.split('?', 1)
return urlparse.SplitResult(scheme, netloc, path, query, fragment)

View File

@ -24,7 +24,9 @@ CONF = cfg.CONF
def notify(_context, message): def notify(_context, message):
"""Notifies the recipient of the desired event given the model. """Notifies the recipient of the desired event given the model.
Log notifications using openstack's default logging system"""
Log notifications using openstack's default logging system.
"""
priority = message.get('priority', priority = message.get('priority',
CONF.default_notification_level) CONF.default_notification_level)

View File

@ -15,5 +15,5 @@
def notify(_context, message): def notify(_context, message):
"""Notifies the recipient of the desired event given the model""" """Notifies the recipient of the desired event given the model."""
pass pass

View File

@ -31,7 +31,7 @@ CONF.register_opt(notification_topic_opt)
def notify(context, message): def notify(context, message):
"""Sends a notification via RPC""" """Sends a notification via RPC."""
if not context: if not context:
context = req_context.get_admin_context() context = req_context.get_admin_context()
priority = message.get('priority', priority = message.get('priority',

View File

@ -37,7 +37,7 @@ CONF.register_opt(notification_topic_opt, opt_group)
def notify(context, message): def notify(context, message):
"""Sends a notification via RPC""" """Sends a notification via RPC."""
if not context: if not context:
context = req_context.get_admin_context() context = req_context.get_admin_context()
priority = message.get('priority', priority = message.get('priority',

View File

@ -15,6 +15,7 @@
import datetime import datetime
import time import time
from oslo.config import cfg from oslo.config import cfg
from nova.openstack.common.gettextutils import _ from nova.openstack.common.gettextutils import _

View File

@ -74,9 +74,9 @@ def _subprocess_setup():
def execute(*cmd, **kwargs): def execute(*cmd, **kwargs):
""" """Helper method to shell out and execute a command through subprocess.
Helper method to shell out and execute a command through subprocess with
optional retry. Allows optional retry.
:param cmd: Passed to subprocess.Popen. :param cmd: Passed to subprocess.Popen.
:type cmd: string :type cmd: string
@ -187,8 +187,7 @@ def execute(*cmd, **kwargs):
def trycmd(*args, **kwargs): def trycmd(*args, **kwargs):
""" """A wrapper around execute() to more easily handle warnings and errors.
A wrapper around execute() to more easily handle warnings and errors.
Returns an (out, err) tuple of strings containing the output of Returns an (out, err) tuple of strings containing the output of
the command's stdout and stderr. If 'err' is not empty then the the command's stdout and stderr. If 'err' is not empty then the

View File

@ -26,7 +26,7 @@ LOG = logging.getLogger(__name__)
def _thread_done(gt, *args, **kwargs): def _thread_done(gt, *args, **kwargs):
""" Callback function to be passed to GreenThread.link() when we spawn() """Callback function to be passed to GreenThread.link() when we spawn()
Calls the :class:`ThreadGroup` to notify if. Calls the :class:`ThreadGroup` to notify if.
""" """
@ -34,7 +34,7 @@ def _thread_done(gt, *args, **kwargs):
class Thread(object): class Thread(object):
""" Wrapper around a greenthread, that holds a reference to the """Wrapper around a greenthread, that holds a reference to the
:class:`ThreadGroup`. The Thread will notify the :class:`ThreadGroup` when :class:`ThreadGroup`. The Thread will notify the :class:`ThreadGroup` when
it has done so it can be removed from the threads list. it has done so it can be removed from the threads list.
""" """
@ -50,7 +50,7 @@ class Thread(object):
class ThreadGroup(object): class ThreadGroup(object):
""" The point of the ThreadGroup classis to: """The point of the ThreadGroup classis to:
* keep track of timers and greenthreads (making it easier to stop them * keep track of timers and greenthreads (making it easier to stop them
when need be). when need be).

View File

@ -23,6 +23,7 @@ import calendar
import datetime import datetime
import iso8601 import iso8601
import six
# ISO 8601 extended time format with microseconds # ISO 8601 extended time format with microseconds
@ -32,7 +33,7 @@ PERFECT_TIME_FORMAT = _ISO8601_TIME_FORMAT_SUBSECOND
def isotime(at=None, subsecond=False): def isotime(at=None, subsecond=False):
"""Stringify time in ISO 8601 format""" """Stringify time in ISO 8601 format."""
if not at: if not at:
at = utcnow() at = utcnow()
st = at.strftime(_ISO8601_TIME_FORMAT st = at.strftime(_ISO8601_TIME_FORMAT
@ -44,7 +45,7 @@ def isotime(at=None, subsecond=False):
def parse_isotime(timestr): def parse_isotime(timestr):
"""Parse time from ISO 8601 format""" """Parse time from ISO 8601 format."""
try: try:
return iso8601.parse_date(timestr) return iso8601.parse_date(timestr)
except iso8601.ParseError as e: except iso8601.ParseError as e:
@ -66,7 +67,7 @@ def parse_strtime(timestr, fmt=PERFECT_TIME_FORMAT):
def normalize_time(timestamp): def normalize_time(timestamp):
"""Normalize time in arbitrary timezone to UTC naive object""" """Normalize time in arbitrary timezone to UTC naive object."""
offset = timestamp.utcoffset() offset = timestamp.utcoffset()
if offset is None: if offset is None:
return timestamp return timestamp
@ -75,14 +76,14 @@ def normalize_time(timestamp):
def is_older_than(before, seconds): def is_older_than(before, seconds):
"""Return True if before is older than seconds.""" """Return True if before is older than seconds."""
if isinstance(before, basestring): if isinstance(before, six.string_types):
before = parse_strtime(before).replace(tzinfo=None) before = parse_strtime(before).replace(tzinfo=None)
return utcnow() - before > datetime.timedelta(seconds=seconds) return utcnow() - before > datetime.timedelta(seconds=seconds)
def is_newer_than(after, seconds): def is_newer_than(after, seconds):
"""Return True if after is newer than seconds.""" """Return True if after is newer than seconds."""
if isinstance(after, basestring): if isinstance(after, six.string_types):
after = parse_strtime(after).replace(tzinfo=None) after = parse_strtime(after).replace(tzinfo=None)
return after - utcnow() > datetime.timedelta(seconds=seconds) return after - utcnow() > datetime.timedelta(seconds=seconds)
@ -103,7 +104,7 @@ def utcnow():
def iso8601_from_timestamp(timestamp): def iso8601_from_timestamp(timestamp):
"""Returns a iso8601 formated date from timestamp""" """Returns a iso8601 formated date from timestamp."""
return isotime(datetime.datetime.utcfromtimestamp(timestamp)) return isotime(datetime.datetime.utcfromtimestamp(timestamp))
@ -111,9 +112,9 @@ utcnow.override_time = None
def set_time_override(override_time=datetime.datetime.utcnow()): def set_time_override(override_time=datetime.datetime.utcnow()):
""" """Overrides utils.utcnow.
Override utils.utcnow to return a constant time or a list thereof,
one at a time. Make it return a constant time or a list thereof, one at a time.
""" """
utcnow.override_time = override_time utcnow.override_time = override_time
@ -141,7 +142,8 @@ def clear_time_override():
def marshall_now(now=None): def marshall_now(now=None):
"""Make an rpc-safe datetime with microseconds. """Make an rpc-safe datetime with microseconds.
Note: tzinfo is stripped, but not required for relative times.""" Note: tzinfo is stripped, but not required for relative times.
"""
if not now: if not now:
now = utcnow() now = utcnow()
return dict(day=now.day, month=now.month, year=now.year, hour=now.hour, return dict(day=now.day, month=now.month, year=now.year, hour=now.hour,
@ -161,7 +163,8 @@ def unmarshall_time(tyme):
def delta_seconds(before, after): def delta_seconds(before, after):
""" """Return the difference between two timing objects.
Compute the difference in seconds between two date, time, or Compute the difference in seconds between two date, time, or
datetime objects (as a float, to microsecond resolution). datetime objects (as a float, to microsecond resolution).
""" """
@ -174,8 +177,7 @@ def delta_seconds(before, after):
def is_soon(dt, window): def is_soon(dt, window):
""" """Determines if time is going to happen in the next window seconds.
Determines if time is going to happen in the next window seconds.
:params dt: the time :params dt: the time
:params window: minimum seconds to remain to consider the time not soon :params window: minimum seconds to remain to consider the time not soon

View File

@ -17,7 +17,13 @@
import os import os
import sys import sys
import install_venv_common as install_venv import install_venv_common as install_venv # noqa
def first_file(file_list):
for candidate in file_list:
if os.path.exists(candidate):
return candidate
def main(argv): def main(argv):
@ -25,8 +31,14 @@ def main(argv):
venv = os.environ['VIRTUAL_ENV'] venv = os.environ['VIRTUAL_ENV']
pip_requires = os.path.join(root, 'requirements.txt') pip_requires = first_file([
test_requires = os.path.join(root, 'test-requirements.txt') os.path.join(root, 'requirements.txt'),
os.path.join(root, 'tools', 'pip-requires'),
])
test_requires = first_file([
os.path.join(root, 'test-requirements.txt'),
os.path.join(root, 'tools', 'test-requires'),
])
py_version = "python%s.%s" % (sys.version_info[0], sys.version_info[1]) py_version = "python%s.%s" % (sys.version_info[0], sys.version_info[1])
project = 'nova' project = 'nova'
install = install_venv.InstallVenv(root, venv, pip_requires, test_requires, install = install_venv.InstallVenv(root, venv, pip_requires, test_requires,