merged trunk
This commit is contained in:
@@ -25,7 +25,6 @@ from eventlet.green import urllib2
|
|||||||
|
|
||||||
import exceptions
|
import exceptions
|
||||||
import gettext
|
import gettext
|
||||||
import logging
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
@@ -130,6 +129,7 @@ class AjaxConsoleProxy(object):
|
|||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
utils.default_flagfile()
|
utils.default_flagfile()
|
||||||
FLAGS(sys.argv)
|
FLAGS(sys.argv)
|
||||||
|
logging.setup()
|
||||||
server = wsgi.Server()
|
server = wsgi.Server()
|
||||||
acp = AjaxConsoleProxy()
|
acp = AjaxConsoleProxy()
|
||||||
acp.register_listeners()
|
acp.register_listeners()
|
||||||
|
23
bin/nova-api
23
bin/nova-api
@@ -39,11 +39,15 @@ from nova import log as logging
|
|||||||
from nova import version
|
from nova import version
|
||||||
from nova import wsgi
|
from nova import wsgi
|
||||||
|
|
||||||
logging.basicConfig()
|
|
||||||
LOG = logging.getLogger('nova.api')
|
LOG = logging.getLogger('nova.api')
|
||||||
LOG.setLevel(logging.DEBUG)
|
|
||||||
|
|
||||||
FLAGS = flags.FLAGS
|
FLAGS = flags.FLAGS
|
||||||
|
flags.DEFINE_string('ec2_listen', "0.0.0.0",
|
||||||
|
'IP address for EC2 API to listen')
|
||||||
|
flags.DEFINE_integer('ec2_listen_port', 8773, 'port for ec2 api to listen')
|
||||||
|
flags.DEFINE_string('osapi_listen', "0.0.0.0",
|
||||||
|
'IP address for OpenStack API to listen')
|
||||||
|
flags.DEFINE_integer('osapi_listen_port', 8774, 'port for os api to listen')
|
||||||
|
|
||||||
API_ENDPOINTS = ['ec2', 'osapi']
|
API_ENDPOINTS = ['ec2', 'osapi']
|
||||||
|
|
||||||
@@ -57,21 +61,15 @@ def run_app(paste_config_file):
|
|||||||
LOG.debug(_("No paste configuration for app: %s"), api)
|
LOG.debug(_("No paste configuration for app: %s"), api)
|
||||||
continue
|
continue
|
||||||
LOG.debug(_("App Config: %(api)s\n%(config)r") % locals())
|
LOG.debug(_("App Config: %(api)s\n%(config)r") % locals())
|
||||||
wsgi.paste_config_to_flags(config, {
|
|
||||||
"verbose": FLAGS.verbose,
|
|
||||||
"%s_host" % api: config.get('host', '0.0.0.0'),
|
|
||||||
"%s_port" % api: getattr(FLAGS, "%s_port" % api)})
|
|
||||||
LOG.info(_("Running %s API"), api)
|
LOG.info(_("Running %s API"), api)
|
||||||
app = wsgi.load_paste_app(paste_config_file, api)
|
app = wsgi.load_paste_app(paste_config_file, api)
|
||||||
apps.append((app, getattr(FLAGS, "%s_port" % api),
|
apps.append((app, getattr(FLAGS, "%s_listen_port" % api),
|
||||||
getattr(FLAGS, "%s_host" % api)))
|
getattr(FLAGS, "%s_listen" % api)))
|
||||||
if len(apps) == 0:
|
if len(apps) == 0:
|
||||||
LOG.error(_("No known API applications configured in %s."),
|
LOG.error(_("No known API applications configured in %s."),
|
||||||
paste_config_file)
|
paste_config_file)
|
||||||
return
|
return
|
||||||
|
|
||||||
# NOTE(todd): redo logging config, verbose could be set in paste config
|
|
||||||
logging.basicConfig()
|
|
||||||
server = wsgi.Server()
|
server = wsgi.Server()
|
||||||
for app in apps:
|
for app in apps:
|
||||||
server.start(*app)
|
server.start(*app)
|
||||||
@@ -80,8 +78,13 @@ def run_app(paste_config_file):
|
|||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
FLAGS(sys.argv)
|
FLAGS(sys.argv)
|
||||||
|
logging.setup()
|
||||||
LOG.audit(_("Starting nova-api node (version %s)"),
|
LOG.audit(_("Starting nova-api node (version %s)"),
|
||||||
version.version_string_with_vcs())
|
version.version_string_with_vcs())
|
||||||
|
LOG.debug(_("Full set of FLAGS:"))
|
||||||
|
for flag in FLAGS:
|
||||||
|
flag_get = FLAGS.get(flag, None)
|
||||||
|
LOG.debug("%(flag)s : %(flag_get)s" % locals())
|
||||||
conf = wsgi.paste_config_file('nova-api.conf')
|
conf = wsgi.paste_config_file('nova-api.conf')
|
||||||
if conf:
|
if conf:
|
||||||
run_app(conf)
|
run_app(conf)
|
||||||
|
@@ -1,80 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
||||||
|
|
||||||
# Copyright 2010 United States Government as represented by the
|
|
||||||
# Administrator of the National Aeronautics and Space Administration.
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
"""Combined starter script for Nova services."""
|
|
||||||
|
|
||||||
import eventlet
|
|
||||||
eventlet.monkey_patch()
|
|
||||||
|
|
||||||
import gettext
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# If ../nova/__init__.py exists, add ../ to Python search path, so that
|
|
||||||
# it will override what happens to be installed in /usr/(local/)lib/python...
|
|
||||||
possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),
|
|
||||||
os.pardir,
|
|
||||||
os.pardir))
|
|
||||||
if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
|
|
||||||
sys.path.insert(0, possible_topdir)
|
|
||||||
|
|
||||||
gettext.install('nova', unicode=1)
|
|
||||||
|
|
||||||
from nova import flags
|
|
||||||
from nova import log as logging
|
|
||||||
from nova import service
|
|
||||||
from nova import utils
|
|
||||||
from nova import wsgi
|
|
||||||
|
|
||||||
|
|
||||||
FLAGS = flags.FLAGS
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
utils.default_flagfile()
|
|
||||||
FLAGS(sys.argv)
|
|
||||||
logging.basicConfig()
|
|
||||||
|
|
||||||
compute = service.Service.create(binary='nova-compute')
|
|
||||||
network = service.Service.create(binary='nova-network')
|
|
||||||
volume = service.Service.create(binary='nova-volume')
|
|
||||||
scheduler = service.Service.create(binary='nova-scheduler')
|
|
||||||
#objectstore = service.Service.create(binary='nova-objectstore')
|
|
||||||
|
|
||||||
service.serve(compute, network, volume, scheduler)
|
|
||||||
|
|
||||||
apps = []
|
|
||||||
paste_config_file = wsgi.paste_config_file('nova-api.conf')
|
|
||||||
for api in ['osapi', 'ec2']:
|
|
||||||
config = wsgi.load_paste_configuration(paste_config_file, api)
|
|
||||||
if config is None:
|
|
||||||
continue
|
|
||||||
wsgi.paste_config_to_flags(config, {
|
|
||||||
"verbose": FLAGS.verbose,
|
|
||||||
"%s_host" % api: config.get('host', '0.0.0.0'),
|
|
||||||
"%s_port" % api: getattr(FLAGS, "%s_port" % api)})
|
|
||||||
app = wsgi.load_paste_app(paste_config_file, api)
|
|
||||||
apps.append((app, getattr(FLAGS, "%s_port" % api),
|
|
||||||
getattr(FLAGS, "%s_host" % api)))
|
|
||||||
if len(apps) > 0:
|
|
||||||
logging.basicConfig()
|
|
||||||
server = wsgi.Server()
|
|
||||||
for app in apps:
|
|
||||||
server.start(*app)
|
|
||||||
server.wait()
|
|
@@ -36,10 +36,14 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
|
|||||||
|
|
||||||
gettext.install('nova', unicode=1)
|
gettext.install('nova', unicode=1)
|
||||||
|
|
||||||
|
from nova import flags
|
||||||
|
from nova import log as logging
|
||||||
from nova import service
|
from nova import service
|
||||||
from nova import utils
|
from nova import utils
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
utils.default_flagfile()
|
utils.default_flagfile()
|
||||||
|
flags.FLAGS(sys.argv)
|
||||||
|
logging.setup()
|
||||||
service.serve()
|
service.serve()
|
||||||
service.wait()
|
service.wait()
|
||||||
|
@@ -35,10 +35,14 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
|
|||||||
|
|
||||||
gettext.install('nova', unicode=1)
|
gettext.install('nova', unicode=1)
|
||||||
|
|
||||||
|
from nova import flags
|
||||||
|
from nova import log as logging
|
||||||
from nova import service
|
from nova import service
|
||||||
from nova import utils
|
from nova import utils
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
utils.default_flagfile()
|
utils.default_flagfile()
|
||||||
|
flags.FLAGS(sys.argv)
|
||||||
|
logging.setup()
|
||||||
service.serve()
|
service.serve()
|
||||||
service.wait()
|
service.wait()
|
||||||
|
@@ -102,7 +102,7 @@ def main():
|
|||||||
flagfile = os.environ.get('FLAGFILE', FLAGS.dhcpbridge_flagfile)
|
flagfile = os.environ.get('FLAGFILE', FLAGS.dhcpbridge_flagfile)
|
||||||
utils.default_flagfile(flagfile)
|
utils.default_flagfile(flagfile)
|
||||||
argv = FLAGS(sys.argv)
|
argv = FLAGS(sys.argv)
|
||||||
logging.basicConfig()
|
logging.setup()
|
||||||
interface = os.environ.get('DNSMASQ_INTERFACE', 'br0')
|
interface = os.environ.get('DNSMASQ_INTERFACE', 'br0')
|
||||||
if int(os.environ.get('TESTING', '0')):
|
if int(os.environ.get('TESTING', '0')):
|
||||||
FLAGS.fake_rabbit = True
|
FLAGS.fake_rabbit = True
|
||||||
|
@@ -35,6 +35,7 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
|
|||||||
gettext.install('nova', unicode=1)
|
gettext.install('nova', unicode=1)
|
||||||
|
|
||||||
from nova import flags
|
from nova import flags
|
||||||
|
from nova import log as logging
|
||||||
from nova import utils
|
from nova import utils
|
||||||
from nova import wsgi
|
from nova import wsgi
|
||||||
from nova.api import direct
|
from nova.api import direct
|
||||||
@@ -48,6 +49,7 @@ flags.DEFINE_string('direct_host', '0.0.0.0', 'Direct API host')
|
|||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
utils.default_flagfile()
|
utils.default_flagfile()
|
||||||
FLAGS(sys.argv)
|
FLAGS(sys.argv)
|
||||||
|
logging.setup()
|
||||||
|
|
||||||
direct.register_service('compute', compute_api.API())
|
direct.register_service('compute', compute_api.API())
|
||||||
direct.register_service('reflect', direct.Reflection())
|
direct.register_service('reflect', direct.Reflection())
|
||||||
|
@@ -41,6 +41,7 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
|
|||||||
gettext.install('nova', unicode=1)
|
gettext.install('nova', unicode=1)
|
||||||
|
|
||||||
from nova import flags
|
from nova import flags
|
||||||
|
from nova import log as logging
|
||||||
from nova import utils
|
from nova import utils
|
||||||
from nova.objectstore import image
|
from nova.objectstore import image
|
||||||
|
|
||||||
@@ -92,6 +93,7 @@ def main():
|
|||||||
"""Main entry point."""
|
"""Main entry point."""
|
||||||
utils.default_flagfile()
|
utils.default_flagfile()
|
||||||
argv = FLAGS(sys.argv)
|
argv = FLAGS(sys.argv)
|
||||||
|
logging.setup()
|
||||||
images = get_images()
|
images = get_images()
|
||||||
|
|
||||||
if len(argv) == 2:
|
if len(argv) == 2:
|
||||||
|
@@ -41,9 +41,6 @@ from nova import utils
|
|||||||
from nova import twistd
|
from nova import twistd
|
||||||
from nova.compute import monitor
|
from nova.compute import monitor
|
||||||
|
|
||||||
# TODO(todd): shouldn't this be done with flags? And what about verbose?
|
|
||||||
logging.getLogger('boto').setLevel(logging.WARN)
|
|
||||||
|
|
||||||
LOG = logging.getLogger('nova.instancemonitor')
|
LOG = logging.getLogger('nova.instancemonitor')
|
||||||
|
|
||||||
|
|
||||||
|
@@ -86,8 +86,6 @@ from nova.auth import manager
|
|||||||
from nova.cloudpipe import pipelib
|
from nova.cloudpipe import pipelib
|
||||||
from nova.db import migration
|
from nova.db import migration
|
||||||
|
|
||||||
|
|
||||||
logging.basicConfig()
|
|
||||||
FLAGS = flags.FLAGS
|
FLAGS = flags.FLAGS
|
||||||
flags.DECLARE('fixed_range', 'nova.network.manager')
|
flags.DECLARE('fixed_range', 'nova.network.manager')
|
||||||
flags.DECLARE('num_networks', 'nova.network.manager')
|
flags.DECLARE('num_networks', 'nova.network.manager')
|
||||||
@@ -710,6 +708,7 @@ def main():
|
|||||||
"""Parse options and call the appropriate class/method."""
|
"""Parse options and call the appropriate class/method."""
|
||||||
utils.default_flagfile()
|
utils.default_flagfile()
|
||||||
argv = FLAGS(sys.argv)
|
argv = FLAGS(sys.argv)
|
||||||
|
logging.setup()
|
||||||
|
|
||||||
script_name = argv.pop(0)
|
script_name = argv.pop(0)
|
||||||
if len(argv) < 1:
|
if len(argv) < 1:
|
||||||
|
@@ -36,10 +36,14 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
|
|||||||
|
|
||||||
gettext.install('nova', unicode=1)
|
gettext.install('nova', unicode=1)
|
||||||
|
|
||||||
|
from nova import flags
|
||||||
|
from nova import log as logging
|
||||||
from nova import service
|
from nova import service
|
||||||
from nova import utils
|
from nova import utils
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
utils.default_flagfile()
|
utils.default_flagfile()
|
||||||
|
flags.FLAGS(sys.argv)
|
||||||
|
logging.setup()
|
||||||
service.serve()
|
service.serve()
|
||||||
service.wait()
|
service.wait()
|
||||||
|
@@ -36,10 +36,14 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
|
|||||||
|
|
||||||
gettext.install('nova', unicode=1)
|
gettext.install('nova', unicode=1)
|
||||||
|
|
||||||
|
from nova import flags
|
||||||
|
from nova import log as logging
|
||||||
from nova import service
|
from nova import service
|
||||||
from nova import utils
|
from nova import utils
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
utils.default_flagfile()
|
utils.default_flagfile()
|
||||||
|
flags.FLAGS(sys.argv)
|
||||||
|
logging.setup()
|
||||||
service.serve()
|
service.serve()
|
||||||
service.wait()
|
service.wait()
|
||||||
|
@@ -36,10 +36,14 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
|
|||||||
|
|
||||||
gettext.install('nova', unicode=1)
|
gettext.install('nova', unicode=1)
|
||||||
|
|
||||||
|
from nova import flags
|
||||||
|
from nova import log as logging
|
||||||
from nova import service
|
from nova import service
|
||||||
from nova import utils
|
from nova import utils
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
utils.default_flagfile()
|
utils.default_flagfile()
|
||||||
|
flags.FLAGS(sys.argv)
|
||||||
|
logging.setup()
|
||||||
service.serve()
|
service.serve()
|
||||||
service.wait()
|
service.wait()
|
||||||
|
131
nova/log.py
131
nova/log.py
@@ -65,6 +65,7 @@ flags.DEFINE_string('logging_exception_prefix',
|
|||||||
flags.DEFINE_list('default_log_levels',
|
flags.DEFINE_list('default_log_levels',
|
||||||
['amqplib=WARN',
|
['amqplib=WARN',
|
||||||
'sqlalchemy=WARN',
|
'sqlalchemy=WARN',
|
||||||
|
'boto=WARN',
|
||||||
'eventlet.wsgi.server=WARN'],
|
'eventlet.wsgi.server=WARN'],
|
||||||
'list of logger=LEVEL pairs')
|
'list of logger=LEVEL pairs')
|
||||||
|
|
||||||
@@ -117,7 +118,7 @@ def _get_binary_name():
|
|||||||
return os.path.basename(inspect.stack()[-1][1])
|
return os.path.basename(inspect.stack()[-1][1])
|
||||||
|
|
||||||
|
|
||||||
def get_log_file_path(binary=None):
|
def _get_log_file_path(binary=None):
|
||||||
if FLAGS.logfile:
|
if FLAGS.logfile:
|
||||||
return FLAGS.logfile
|
return FLAGS.logfile
|
||||||
if FLAGS.logdir:
|
if FLAGS.logdir:
|
||||||
@@ -125,25 +126,6 @@ def get_log_file_path(binary=None):
|
|||||||
return '%s.log' % (os.path.join(FLAGS.logdir, binary),)
|
return '%s.log' % (os.path.join(FLAGS.logdir, binary),)
|
||||||
|
|
||||||
|
|
||||||
def basicConfig():
|
|
||||||
logging.basicConfig()
|
|
||||||
for handler in logging.root.handlers:
|
|
||||||
handler.setFormatter(_formatter)
|
|
||||||
if FLAGS.verbose:
|
|
||||||
logging.root.setLevel(logging.DEBUG)
|
|
||||||
else:
|
|
||||||
logging.root.setLevel(logging.INFO)
|
|
||||||
if FLAGS.use_syslog:
|
|
||||||
syslog = SysLogHandler(address='/dev/log')
|
|
||||||
syslog.setFormatter(_formatter)
|
|
||||||
logging.root.addHandler(syslog)
|
|
||||||
logpath = get_log_file_path()
|
|
||||||
if logpath:
|
|
||||||
logfile = WatchedFileHandler(logpath)
|
|
||||||
logfile.setFormatter(_formatter)
|
|
||||||
logging.root.addHandler(logfile)
|
|
||||||
|
|
||||||
|
|
||||||
class NovaLogger(logging.Logger):
|
class NovaLogger(logging.Logger):
|
||||||
"""
|
"""
|
||||||
NovaLogger manages request context and formatting.
|
NovaLogger manages request context and formatting.
|
||||||
@@ -151,23 +133,19 @@ class NovaLogger(logging.Logger):
|
|||||||
This becomes the class that is instanciated by logging.getLogger.
|
This becomes the class that is instanciated by logging.getLogger.
|
||||||
"""
|
"""
|
||||||
def __init__(self, name, level=NOTSET):
|
def __init__(self, name, level=NOTSET):
|
||||||
level_name = self._get_level_from_flags(name, FLAGS)
|
|
||||||
level = globals()[level_name]
|
|
||||||
logging.Logger.__init__(self, name, level)
|
logging.Logger.__init__(self, name, level)
|
||||||
|
self.setup_from_flags()
|
||||||
|
|
||||||
def _get_level_from_flags(self, name, FLAGS):
|
def setup_from_flags(self):
|
||||||
# if exactly "nova", or a child logger, honor the verbose flag
|
"""Setup logger from flags"""
|
||||||
if (name == "nova" or name.startswith("nova.")) and FLAGS.verbose:
|
level = NOTSET
|
||||||
return 'DEBUG'
|
|
||||||
for pair in FLAGS.default_log_levels:
|
for pair in FLAGS.default_log_levels:
|
||||||
logger, _sep, level = pair.partition('=')
|
logger, _sep, level_name = pair.partition('=')
|
||||||
# NOTE(todd): if we set a.b, we want a.b.c to have the same level
|
# NOTE(todd): if we set a.b, we want a.b.c to have the same level
|
||||||
# (but not a.bc, so we check the dot)
|
# (but not a.bc, so we check the dot)
|
||||||
if name == logger:
|
if self.name == logger or self.name.startswith("%s." % logger):
|
||||||
return level
|
level = globals()[level_name]
|
||||||
if name.startswith(logger) and name[len(logger)] == '.':
|
self.setLevel(level)
|
||||||
return level
|
|
||||||
return 'INFO'
|
|
||||||
|
|
||||||
def _log(self, level, msg, args, exc_info=None, extra=None, context=None):
|
def _log(self, level, msg, args, exc_info=None, extra=None, context=None):
|
||||||
"""Extract context from any log call"""
|
"""Extract context from any log call"""
|
||||||
@@ -176,12 +154,12 @@ class NovaLogger(logging.Logger):
|
|||||||
if context:
|
if context:
|
||||||
extra.update(_dictify_context(context))
|
extra.update(_dictify_context(context))
|
||||||
extra.update({"nova_version": version.version_string_with_vcs()})
|
extra.update({"nova_version": version.version_string_with_vcs()})
|
||||||
logging.Logger._log(self, level, msg, args, exc_info, extra)
|
return logging.Logger._log(self, level, msg, args, exc_info, extra)
|
||||||
|
|
||||||
def addHandler(self, handler):
|
def addHandler(self, handler):
|
||||||
"""Each handler gets our custom formatter"""
|
"""Each handler gets our custom formatter"""
|
||||||
handler.setFormatter(_formatter)
|
handler.setFormatter(_formatter)
|
||||||
logging.Logger.addHandler(self, handler)
|
return logging.Logger.addHandler(self, handler)
|
||||||
|
|
||||||
def audit(self, msg, *args, **kwargs):
|
def audit(self, msg, *args, **kwargs):
|
||||||
"""Shortcut for our AUDIT level"""
|
"""Shortcut for our AUDIT level"""
|
||||||
@@ -208,23 +186,6 @@ class NovaLogger(logging.Logger):
|
|||||||
self.error(message, **kwargs)
|
self.error(message, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def handle_exception(type, value, tb):
|
|
||||||
logging.root.critical(str(value), exc_info=(type, value, tb))
|
|
||||||
|
|
||||||
|
|
||||||
sys.excepthook = handle_exception
|
|
||||||
logging.setLoggerClass(NovaLogger)
|
|
||||||
|
|
||||||
|
|
||||||
class NovaRootLogger(NovaLogger):
|
|
||||||
pass
|
|
||||||
|
|
||||||
if not isinstance(logging.root, NovaRootLogger):
|
|
||||||
logging.root = NovaRootLogger("nova.root", WARNING)
|
|
||||||
NovaLogger.root = logging.root
|
|
||||||
NovaLogger.manager.root = logging.root
|
|
||||||
|
|
||||||
|
|
||||||
class NovaFormatter(logging.Formatter):
|
class NovaFormatter(logging.Formatter):
|
||||||
"""
|
"""
|
||||||
A nova.context.RequestContext aware formatter configured through flags.
|
A nova.context.RequestContext aware formatter configured through flags.
|
||||||
@@ -271,8 +232,72 @@ class NovaFormatter(logging.Formatter):
|
|||||||
_formatter = NovaFormatter()
|
_formatter = NovaFormatter()
|
||||||
|
|
||||||
|
|
||||||
|
class NovaRootLogger(NovaLogger):
|
||||||
|
def __init__(self, name, level=NOTSET):
|
||||||
|
self.logpath = None
|
||||||
|
self.filelog = None
|
||||||
|
self.syslog = SysLogHandler(address='/dev/log')
|
||||||
|
self.streamlog = StreamHandler()
|
||||||
|
NovaLogger.__init__(self, name, level)
|
||||||
|
|
||||||
|
def setup_from_flags(self):
|
||||||
|
"""Setup logger from flags"""
|
||||||
|
global _filelog
|
||||||
|
if FLAGS.use_syslog:
|
||||||
|
self.addHandler(self.syslog)
|
||||||
|
else:
|
||||||
|
self.removeHandler(self.syslog)
|
||||||
|
logpath = _get_log_file_path()
|
||||||
|
if logpath:
|
||||||
|
self.removeHandler(self.streamlog)
|
||||||
|
if logpath != self.logpath:
|
||||||
|
self.removeHandler(self.filelog)
|
||||||
|
self.filelog = WatchedFileHandler(logpath)
|
||||||
|
self.addHandler(self.filelog)
|
||||||
|
self.logpath = logpath
|
||||||
|
else:
|
||||||
|
self.removeHandler(self.filelog)
|
||||||
|
self.addHandler(self.streamlog)
|
||||||
|
if FLAGS.verbose:
|
||||||
|
self.setLevel(DEBUG)
|
||||||
|
else:
|
||||||
|
self.setLevel(INFO)
|
||||||
|
|
||||||
|
|
||||||
|
def handle_exception(type, value, tb):
|
||||||
|
logging.root.critical(str(value), exc_info=(type, value, tb))
|
||||||
|
|
||||||
|
|
||||||
|
def reset():
|
||||||
|
"""Resets logging handlers. Should be called if FLAGS changes."""
|
||||||
|
for logger in NovaLogger.manager.loggerDict.itervalues():
|
||||||
|
if isinstance(logger, NovaLogger):
|
||||||
|
logger.setup_from_flags()
|
||||||
|
|
||||||
|
|
||||||
|
def setup():
|
||||||
|
"""Setup nova logging."""
|
||||||
|
if not isinstance(logging.root, NovaRootLogger):
|
||||||
|
logging._acquireLock()
|
||||||
|
for handler in logging.root.handlers:
|
||||||
|
logging.root.removeHandler(handler)
|
||||||
|
logging.root = NovaRootLogger("nova")
|
||||||
|
NovaLogger.root = logging.root
|
||||||
|
NovaLogger.manager.root = logging.root
|
||||||
|
for logger in NovaLogger.manager.loggerDict.itervalues():
|
||||||
|
logger.root = logging.root
|
||||||
|
if isinstance(logger, logging.Logger):
|
||||||
|
NovaLogger.manager._fixupParents(logger)
|
||||||
|
NovaLogger.manager.loggerDict["nova"] = logging.root
|
||||||
|
logging._releaseLock()
|
||||||
|
sys.excepthook = handle_exception
|
||||||
|
reset()
|
||||||
|
|
||||||
|
|
||||||
|
root = logging.root
|
||||||
|
logging.setLoggerClass(NovaLogger)
|
||||||
|
|
||||||
|
|
||||||
def audit(msg, *args, **kwargs):
|
def audit(msg, *args, **kwargs):
|
||||||
"""Shortcut for logging to root log with sevrity 'AUDIT'."""
|
"""Shortcut for logging to root log with sevrity 'AUDIT'."""
|
||||||
if len(logging.root.handlers) == 0:
|
|
||||||
basicConfig()
|
|
||||||
logging.root.log(AUDIT, msg, *args, **kwargs)
|
logging.root.log(AUDIT, msg, *args, **kwargs)
|
||||||
|
@@ -41,3 +41,4 @@ FLAGS.iscsi_num_targets = 8
|
|||||||
FLAGS.verbose = True
|
FLAGS.verbose = True
|
||||||
FLAGS.sql_connection = 'sqlite:///nova.sqlite'
|
FLAGS.sql_connection = 'sqlite:///nova.sqlite'
|
||||||
FLAGS.use_ipv6 = True
|
FLAGS.use_ipv6 = True
|
||||||
|
FLAGS.logfile = 'tests.log'
|
||||||
|
@@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
import boto
|
import boto
|
||||||
from boto.ec2 import regioninfo
|
from boto.ec2 import regioninfo
|
||||||
|
import datetime
|
||||||
import httplib
|
import httplib
|
||||||
import random
|
import random
|
||||||
import StringIO
|
import StringIO
|
||||||
@@ -127,6 +128,28 @@ class ApiEc2TestCase(test.TestCase):
|
|||||||
self.ec2.new_http_connection(host, is_secure).AndReturn(self.http)
|
self.ec2.new_http_connection(host, is_secure).AndReturn(self.http)
|
||||||
return self.http
|
return self.http
|
||||||
|
|
||||||
|
def test_return_valid_isoformat(self):
|
||||||
|
"""
|
||||||
|
Ensure that the ec2 api returns datetime in xs:dateTime
|
||||||
|
(which apparently isn't datetime.isoformat())
|
||||||
|
NOTE(ken-pepple): https://bugs.launchpad.net/nova/+bug/721297
|
||||||
|
"""
|
||||||
|
conv = apirequest._database_to_isoformat
|
||||||
|
# sqlite database representation with microseconds
|
||||||
|
time_to_convert = datetime.datetime.strptime(
|
||||||
|
"2011-02-21 20:14:10.634276",
|
||||||
|
"%Y-%m-%d %H:%M:%S.%f")
|
||||||
|
self.assertEqual(
|
||||||
|
conv(time_to_convert),
|
||||||
|
'2011-02-21T20:14:10Z')
|
||||||
|
# mysqlite database representation
|
||||||
|
time_to_convert = datetime.datetime.strptime(
|
||||||
|
"2011-02-21 19:56:18",
|
||||||
|
"%Y-%m-%d %H:%M:%S")
|
||||||
|
self.assertEqual(
|
||||||
|
conv(time_to_convert),
|
||||||
|
'2011-02-21T19:56:18Z')
|
||||||
|
|
||||||
def test_xmlns_version_matches_request_version(self):
|
def test_xmlns_version_matches_request_version(self):
|
||||||
self.expect_http(api_version='2010-10-30')
|
self.expect_http(api_version='2010-10-30')
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
@@ -327,15 +327,6 @@ class AuthManagerTestCase(object):
|
|||||||
class AuthManagerLdapTestCase(AuthManagerTestCase, test.TestCase):
|
class AuthManagerLdapTestCase(AuthManagerTestCase, test.TestCase):
|
||||||
auth_driver = 'nova.auth.ldapdriver.FakeLdapDriver'
|
auth_driver = 'nova.auth.ldapdriver.FakeLdapDriver'
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
AuthManagerTestCase.__init__(self)
|
|
||||||
test.TestCase.__init__(self, *args, **kwargs)
|
|
||||||
import nova.auth.fakeldap as fakeldap
|
|
||||||
if FLAGS.flush_db:
|
|
||||||
LOG.info("Flushing datastore")
|
|
||||||
r = fakeldap.Store.instance()
|
|
||||||
r.flushdb()
|
|
||||||
|
|
||||||
|
|
||||||
class AuthManagerDbTestCase(AuthManagerTestCase, test.TestCase):
|
class AuthManagerDbTestCase(AuthManagerTestCase, test.TestCase):
|
||||||
auth_driver = 'nova.auth.dbdriver.DbDriver'
|
auth_driver = 'nova.auth.dbdriver.DbDriver'
|
||||||
|
@@ -65,18 +65,21 @@ class CloudTestCase(test.TestCase):
|
|||||||
self.cloud = cloud.CloudController()
|
self.cloud = cloud.CloudController()
|
||||||
|
|
||||||
# set up services
|
# set up services
|
||||||
self.compute = service.Service.create(binary='nova-compute')
|
self.compute = self.start_service('compute')
|
||||||
self.compute.start()
|
self.scheduter = self.start_service('scheduler')
|
||||||
self.network = service.Service.create(binary='nova-network')
|
self.network = self.start_service('network')
|
||||||
self.network.start()
|
|
||||||
|
|
||||||
self.manager = manager.AuthManager()
|
self.manager = manager.AuthManager()
|
||||||
self.user = self.manager.create_user('admin', 'admin', 'admin', True)
|
self.user = self.manager.create_user('admin', 'admin', 'admin', True)
|
||||||
self.project = self.manager.create_project('proj', 'admin', 'proj')
|
self.project = self.manager.create_project('proj', 'admin', 'proj')
|
||||||
self.context = context.RequestContext(user=self.user,
|
self.context = context.RequestContext(user=self.user,
|
||||||
project=self.project)
|
project=self.project)
|
||||||
|
host = self.network.get_network_host(self.context.elevated())
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
|
network_ref = db.project_get_network(self.context,
|
||||||
|
self.project.id)
|
||||||
|
db.network_disassociate(self.context, network_ref['id'])
|
||||||
self.manager.delete_project(self.project)
|
self.manager.delete_project(self.project)
|
||||||
self.manager.delete_user(self.user)
|
self.manager.delete_user(self.user)
|
||||||
self.compute.kill()
|
self.compute.kill()
|
||||||
@@ -102,7 +105,7 @@ class CloudTestCase(test.TestCase):
|
|||||||
address = "10.10.10.10"
|
address = "10.10.10.10"
|
||||||
db.floating_ip_create(self.context,
|
db.floating_ip_create(self.context,
|
||||||
{'address': address,
|
{'address': address,
|
||||||
'host': FLAGS.host})
|
'host': self.network.host})
|
||||||
self.cloud.allocate_address(self.context)
|
self.cloud.allocate_address(self.context)
|
||||||
self.cloud.describe_addresses(self.context)
|
self.cloud.describe_addresses(self.context)
|
||||||
self.cloud.release_address(self.context,
|
self.cloud.release_address(self.context,
|
||||||
@@ -115,9 +118,9 @@ class CloudTestCase(test.TestCase):
|
|||||||
address = "10.10.10.10"
|
address = "10.10.10.10"
|
||||||
db.floating_ip_create(self.context,
|
db.floating_ip_create(self.context,
|
||||||
{'address': address,
|
{'address': address,
|
||||||
'host': FLAGS.host})
|
'host': self.network.host})
|
||||||
self.cloud.allocate_address(self.context)
|
self.cloud.allocate_address(self.context)
|
||||||
inst = db.instance_create(self.context, {'host': FLAGS.host})
|
inst = db.instance_create(self.context, {'host': self.compute.host})
|
||||||
fixed = self.network.allocate_fixed_ip(self.context, inst['id'])
|
fixed = self.network.allocate_fixed_ip(self.context, inst['id'])
|
||||||
ec2_id = cloud.id_to_ec2_id(inst['id'])
|
ec2_id = cloud.id_to_ec2_id(inst['id'])
|
||||||
self.cloud.associate_address(self.context,
|
self.cloud.associate_address(self.context,
|
||||||
@@ -219,27 +222,32 @@ class CloudTestCase(test.TestCase):
|
|||||||
'instance_type': instance_type,
|
'instance_type': instance_type,
|
||||||
'max_count': max_count}
|
'max_count': max_count}
|
||||||
rv = self.cloud.run_instances(self.context, **kwargs)
|
rv = self.cloud.run_instances(self.context, **kwargs)
|
||||||
|
greenthread.sleep(0.3)
|
||||||
instance_id = rv['instancesSet'][0]['instanceId']
|
instance_id = rv['instancesSet'][0]['instanceId']
|
||||||
output = self.cloud.get_console_output(context=self.context,
|
output = self.cloud.get_console_output(context=self.context,
|
||||||
instance_id=[instance_id])
|
instance_id=[instance_id])
|
||||||
self.assertEquals(b64decode(output['output']), 'FAKE CONSOLE OUTPUT')
|
self.assertEquals(b64decode(output['output']), 'FAKE CONSOLE OUTPUT')
|
||||||
# TODO(soren): We need this until we can stop polling in the rpc code
|
# TODO(soren): We need this until we can stop polling in the rpc code
|
||||||
# for unit tests.
|
# for unit tests.
|
||||||
greenthread.sleep(0.3)
|
greenthread.sleep(0.3)
|
||||||
rv = self.cloud.terminate_instances(self.context, [instance_id])
|
rv = self.cloud.terminate_instances(self.context, [instance_id])
|
||||||
|
greenthread.sleep(0.3)
|
||||||
|
|
||||||
def test_ajax_console(self):
|
def test_ajax_console(self):
|
||||||
|
image_id = FLAGS.default_image
|
||||||
kwargs = {'image_id': image_id}
|
kwargs = {'image_id': image_id}
|
||||||
rv = yield self.cloud.run_instances(self.context, **kwargs)
|
rv = self.cloud.run_instances(self.context, **kwargs)
|
||||||
instance_id = rv['instancesSet'][0]['instanceId']
|
instance_id = rv['instancesSet'][0]['instanceId']
|
||||||
output = yield self.cloud.get_console_output(context=self.context,
|
greenthread.sleep(0.3)
|
||||||
instance_id=[instance_id])
|
output = self.cloud.get_ajax_console(context=self.context,
|
||||||
self.assertEquals(b64decode(output['output']),
|
instance_id=[instance_id])
|
||||||
'http://fakeajaxconsole.com/?token=FAKETOKEN')
|
self.assertEquals(output['url'],
|
||||||
|
'%s/?token=FAKETOKEN' % FLAGS.ajax_console_proxy_url)
|
||||||
# TODO(soren): We need this until we can stop polling in the rpc code
|
# TODO(soren): We need this until we can stop polling in the rpc code
|
||||||
# for unit tests.
|
# for unit tests.
|
||||||
greenthread.sleep(0.3)
|
greenthread.sleep(0.3)
|
||||||
rv = yield self.cloud.terminate_instances(self.context, [instance_id])
|
rv = self.cloud.terminate_instances(self.context, [instance_id])
|
||||||
|
greenthread.sleep(0.3)
|
||||||
|
|
||||||
def test_key_generation(self):
|
def test_key_generation(self):
|
||||||
result = self._create_key('test')
|
result = self._create_key('test')
|
||||||
@@ -302,57 +310,6 @@ class CloudTestCase(test.TestCase):
|
|||||||
LOG.debug(_("Terminating instance %s"), instance_id)
|
LOG.debug(_("Terminating instance %s"), instance_id)
|
||||||
rv = self.compute.terminate_instance(instance_id)
|
rv = self.compute.terminate_instance(instance_id)
|
||||||
|
|
||||||
def test_instance_update_state(self):
|
|
||||||
# TODO(termie): what is this code even testing?
|
|
||||||
def instance(num):
|
|
||||||
return {
|
|
||||||
'reservation_id': 'r-1',
|
|
||||||
'instance_id': 'i-%s' % num,
|
|
||||||
'image_id': 'ami-%s' % num,
|
|
||||||
'private_dns_name': '10.0.0.%s' % num,
|
|
||||||
'dns_name': '10.0.0%s' % num,
|
|
||||||
'ami_launch_index': str(num),
|
|
||||||
'instance_type': 'fake',
|
|
||||||
'availability_zone': 'fake',
|
|
||||||
'key_name': None,
|
|
||||||
'kernel_id': 'fake',
|
|
||||||
'ramdisk_id': 'fake',
|
|
||||||
'groups': ['default'],
|
|
||||||
'product_codes': None,
|
|
||||||
'state': 0x01,
|
|
||||||
'user_data': ''}
|
|
||||||
rv = self.cloud._format_describe_instances(self.context)
|
|
||||||
logging.error(str(rv))
|
|
||||||
self.assertEqual(len(rv['reservationSet']), 0)
|
|
||||||
|
|
||||||
# simulate launch of 5 instances
|
|
||||||
# self.cloud.instances['pending'] = {}
|
|
||||||
#for i in xrange(5):
|
|
||||||
# inst = instance(i)
|
|
||||||
# self.cloud.instances['pending'][inst['instance_id']] = inst
|
|
||||||
|
|
||||||
#rv = self.cloud._format_instances(self.admin)
|
|
||||||
#self.assert_(len(rv['reservationSet']) == 1)
|
|
||||||
#self.assert_(len(rv['reservationSet'][0]['instances_set']) == 5)
|
|
||||||
# report 4 nodes each having 1 of the instances
|
|
||||||
#for i in xrange(4):
|
|
||||||
# self.cloud.update_state('instances',
|
|
||||||
# {('node-%s' % i): {('i-%s' % i):
|
|
||||||
# instance(i)}})
|
|
||||||
|
|
||||||
# one instance should be pending still
|
|
||||||
#self.assert_(len(self.cloud.instances['pending'].keys()) == 1)
|
|
||||||
|
|
||||||
# check that the reservations collapse
|
|
||||||
#rv = self.cloud._format_instances(self.admin)
|
|
||||||
#self.assert_(len(rv['reservationSet']) == 1)
|
|
||||||
#self.assert_(len(rv['reservationSet'][0]['instances_set']) == 5)
|
|
||||||
|
|
||||||
# check that we can get metadata for each instance
|
|
||||||
#for i in xrange(4):
|
|
||||||
# data = self.cloud.get_metadata(instance(i)['private_dns_name'])
|
|
||||||
# self.assert_(data['meta-data']['ami-id'] == 'ami-%s' % i)
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _fake_set_image_description(ctxt, image_id, description):
|
def _fake_set_image_description(ctxt, image_id, description):
|
||||||
from nova.objectstore import handler
|
from nova.objectstore import handler
|
||||||
|
@@ -21,7 +21,6 @@ Tests For Console proxy.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
import logging
|
|
||||||
|
|
||||||
from nova import context
|
from nova import context
|
||||||
from nova import db
|
from nova import db
|
||||||
@@ -38,7 +37,6 @@ FLAGS = flags.FLAGS
|
|||||||
class ConsoleTestCase(test.TestCase):
|
class ConsoleTestCase(test.TestCase):
|
||||||
"""Test case for console proxy"""
|
"""Test case for console proxy"""
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
logging.getLogger().setLevel(logging.DEBUG)
|
|
||||||
super(ConsoleTestCase, self).setUp()
|
super(ConsoleTestCase, self).setUp()
|
||||||
self.flags(console_driver='nova.console.fake.FakeConsoleProxy',
|
self.flags(console_driver='nova.console.fake.FakeConsoleProxy',
|
||||||
stub_compute=True)
|
stub_compute=True)
|
||||||
|
@@ -19,7 +19,6 @@
|
|||||||
"""Tests for Direct API."""
|
"""Tests for Direct API."""
|
||||||
|
|
||||||
import json
|
import json
|
||||||
import logging
|
|
||||||
|
|
||||||
import webob
|
import webob
|
||||||
|
|
||||||
|
@@ -15,7 +15,6 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import glob
|
import glob
|
||||||
import logging
|
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
@@ -1,9 +1,12 @@
|
|||||||
import cStringIO
|
import cStringIO
|
||||||
|
|
||||||
from nova import context
|
from nova import context
|
||||||
|
from nova import flags
|
||||||
from nova import log
|
from nova import log
|
||||||
from nova import test
|
from nova import test
|
||||||
|
|
||||||
|
FLAGS = flags.FLAGS
|
||||||
|
|
||||||
|
|
||||||
def _fake_context():
|
def _fake_context():
|
||||||
return context.RequestContext(1, 1)
|
return context.RequestContext(1, 1)
|
||||||
@@ -14,15 +17,11 @@ class RootLoggerTestCase(test.TestCase):
|
|||||||
super(RootLoggerTestCase, self).setUp()
|
super(RootLoggerTestCase, self).setUp()
|
||||||
self.log = log.logging.root
|
self.log = log.logging.root
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
super(RootLoggerTestCase, self).tearDown()
|
|
||||||
log.NovaLogger.manager.loggerDict = {}
|
|
||||||
|
|
||||||
def test_is_nova_instance(self):
|
def test_is_nova_instance(self):
|
||||||
self.assert_(isinstance(self.log, log.NovaLogger))
|
self.assert_(isinstance(self.log, log.NovaLogger))
|
||||||
|
|
||||||
def test_name_is_nova_root(self):
|
def test_name_is_nova(self):
|
||||||
self.assertEqual("nova.root", self.log.name)
|
self.assertEqual("nova", self.log.name)
|
||||||
|
|
||||||
def test_handlers_have_nova_formatter(self):
|
def test_handlers_have_nova_formatter(self):
|
||||||
formatters = []
|
formatters = []
|
||||||
@@ -45,25 +44,36 @@ class RootLoggerTestCase(test.TestCase):
|
|||||||
log.audit("foo", context=_fake_context())
|
log.audit("foo", context=_fake_context())
|
||||||
self.assert_(True) # didn't raise exception
|
self.assert_(True) # didn't raise exception
|
||||||
|
|
||||||
|
def test_will_be_verbose_if_verbose_flag_set(self):
|
||||||
|
self.flags(verbose=True)
|
||||||
|
log.reset()
|
||||||
|
self.assertEqual(log.DEBUG, self.log.level)
|
||||||
|
|
||||||
|
def test_will_not_be_verbose_if_verbose_flag_not_set(self):
|
||||||
|
self.flags(verbose=False)
|
||||||
|
log.reset()
|
||||||
|
self.assertEqual(log.INFO, self.log.level)
|
||||||
|
|
||||||
|
|
||||||
class LogHandlerTestCase(test.TestCase):
|
class LogHandlerTestCase(test.TestCase):
|
||||||
def test_log_path_logdir(self):
|
def test_log_path_logdir(self):
|
||||||
self.flags(logdir='/some/path')
|
self.flags(logdir='/some/path', logfile=None)
|
||||||
self.assertEquals(log.get_log_file_path(binary='foo-bar'),
|
self.assertEquals(log._get_log_file_path(binary='foo-bar'),
|
||||||
'/some/path/foo-bar.log')
|
'/some/path/foo-bar.log')
|
||||||
|
|
||||||
def test_log_path_logfile(self):
|
def test_log_path_logfile(self):
|
||||||
self.flags(logfile='/some/path/foo-bar.log')
|
self.flags(logfile='/some/path/foo-bar.log')
|
||||||
self.assertEquals(log.get_log_file_path(binary='foo-bar'),
|
self.assertEquals(log._get_log_file_path(binary='foo-bar'),
|
||||||
'/some/path/foo-bar.log')
|
'/some/path/foo-bar.log')
|
||||||
|
|
||||||
def test_log_path_none(self):
|
def test_log_path_none(self):
|
||||||
self.assertTrue(log.get_log_file_path(binary='foo-bar') is None)
|
self.flags(logdir=None, logfile=None)
|
||||||
|
self.assertTrue(log._get_log_file_path(binary='foo-bar') is None)
|
||||||
|
|
||||||
def test_log_path_logfile_overrides_logdir(self):
|
def test_log_path_logfile_overrides_logdir(self):
|
||||||
self.flags(logdir='/some/other/path',
|
self.flags(logdir='/some/other/path',
|
||||||
logfile='/some/path/foo-bar.log')
|
logfile='/some/path/foo-bar.log')
|
||||||
self.assertEquals(log.get_log_file_path(binary='foo-bar'),
|
self.assertEquals(log._get_log_file_path(binary='foo-bar'),
|
||||||
'/some/path/foo-bar.log')
|
'/some/path/foo-bar.log')
|
||||||
|
|
||||||
|
|
||||||
@@ -76,13 +86,15 @@ class NovaFormatterTestCase(test.TestCase):
|
|||||||
logging_debug_format_suffix="--DBG")
|
logging_debug_format_suffix="--DBG")
|
||||||
self.log = log.logging.root
|
self.log = log.logging.root
|
||||||
self.stream = cStringIO.StringIO()
|
self.stream = cStringIO.StringIO()
|
||||||
handler = log.StreamHandler(self.stream)
|
self.handler = log.StreamHandler(self.stream)
|
||||||
self.log.addHandler(handler)
|
self.log.addHandler(self.handler)
|
||||||
|
self.level = self.log.level
|
||||||
self.log.setLevel(log.DEBUG)
|
self.log.setLevel(log.DEBUG)
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
|
self.log.setLevel(self.level)
|
||||||
|
self.log.removeHandler(self.handler)
|
||||||
super(NovaFormatterTestCase, self).tearDown()
|
super(NovaFormatterTestCase, self).tearDown()
|
||||||
log.NovaLogger.manager.loggerDict = {}
|
|
||||||
|
|
||||||
def test_uncontextualized_log(self):
|
def test_uncontextualized_log(self):
|
||||||
self.log.info("foo")
|
self.log.info("foo")
|
||||||
@@ -102,30 +114,15 @@ class NovaFormatterTestCase(test.TestCase):
|
|||||||
class NovaLoggerTestCase(test.TestCase):
|
class NovaLoggerTestCase(test.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(NovaLoggerTestCase, self).setUp()
|
super(NovaLoggerTestCase, self).setUp()
|
||||||
self.flags(default_log_levels=["nova-test=AUDIT"], verbose=False)
|
levels = FLAGS.default_log_levels
|
||||||
|
levels.append("nova-test=AUDIT")
|
||||||
|
self.flags(default_log_levels=levels,
|
||||||
|
verbose=True)
|
||||||
self.log = log.getLogger('nova-test')
|
self.log = log.getLogger('nova-test')
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
super(NovaLoggerTestCase, self).tearDown()
|
|
||||||
log.NovaLogger.manager.loggerDict = {}
|
|
||||||
|
|
||||||
def test_has_level_from_flags(self):
|
def test_has_level_from_flags(self):
|
||||||
self.assertEqual(log.AUDIT, self.log.level)
|
self.assertEqual(log.AUDIT, self.log.level)
|
||||||
|
|
||||||
def test_child_log_has_level_of_parent_flag(self):
|
def test_child_log_has_level_of_parent_flag(self):
|
||||||
l = log.getLogger('nova-test.foo')
|
l = log.getLogger('nova-test.foo')
|
||||||
self.assertEqual(log.AUDIT, l.level)
|
self.assertEqual(log.AUDIT, l.level)
|
||||||
|
|
||||||
|
|
||||||
class VerboseLoggerTestCase(test.TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
super(VerboseLoggerTestCase, self).setUp()
|
|
||||||
self.flags(default_log_levels=["nova.test=AUDIT"], verbose=True)
|
|
||||||
self.log = log.getLogger('nova.test')
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
super(VerboseLoggerTestCase, self).tearDown()
|
|
||||||
log.NovaLogger.manager.loggerDict = {}
|
|
||||||
|
|
||||||
def test_will_be_verbose_if_named_nova_and_verbose_flag_set(self):
|
|
||||||
self.assertEqual(log.DEBUG, self.log.level)
|
|
||||||
|
@@ -46,6 +46,8 @@ class ProjectTestCase(test.TestCase):
|
|||||||
|
|
||||||
missing = set()
|
missing = set()
|
||||||
for contributor in contributors:
|
for contributor in contributors:
|
||||||
|
if contributor == 'nova-core':
|
||||||
|
continue
|
||||||
if not contributor in authors_file:
|
if not contributor in authors_file:
|
||||||
missing.add(contributor)
|
missing.add(contributor)
|
||||||
|
|
||||||
|
@@ -117,6 +117,9 @@ class NetworkTestCase(test.TestCase):
|
|||||||
utils.to_global_ipv6(
|
utils.to_global_ipv6(
|
||||||
network_ref['cidr_v6'],
|
network_ref['cidr_v6'],
|
||||||
instance_ref['mac_address']))
|
instance_ref['mac_address']))
|
||||||
|
self._deallocate_address(0, address)
|
||||||
|
db.instance_destroy(context.get_admin_context(),
|
||||||
|
instance_ref['id'])
|
||||||
|
|
||||||
def test_public_network_association(self):
|
def test_public_network_association(self):
|
||||||
"""Makes sure that we can allocaate a public ip"""
|
"""Makes sure that we can allocaate a public ip"""
|
||||||
|
@@ -150,6 +150,7 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
self.manager.delete_user(self.user)
|
self.manager.delete_user(self.user)
|
||||||
self.manager.delete_project(self.project)
|
self.manager.delete_project(self.project)
|
||||||
|
super(SimpleDriverTestCase, self).tearDown()
|
||||||
|
|
||||||
def _create_instance(self, **kwargs):
|
def _create_instance(self, **kwargs):
|
||||||
"""Create a test instance"""
|
"""Create a test instance"""
|
||||||
@@ -176,18 +177,8 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
|
|
||||||
def test_doesnt_report_disabled_hosts_as_up(self):
|
def test_doesnt_report_disabled_hosts_as_up(self):
|
||||||
"""Ensures driver doesn't find hosts before they are enabled"""
|
"""Ensures driver doesn't find hosts before they are enabled"""
|
||||||
# NOTE(vish): constructing service without create method
|
compute1 = self.start_service('compute', host='host1')
|
||||||
# because we are going to use it without queue
|
compute2 = self.start_service('compute', host='host2')
|
||||||
compute1 = service.Service('host1',
|
|
||||||
'nova-compute',
|
|
||||||
'compute',
|
|
||||||
FLAGS.compute_manager)
|
|
||||||
compute1.start()
|
|
||||||
compute2 = service.Service('host2',
|
|
||||||
'nova-compute',
|
|
||||||
'compute',
|
|
||||||
FLAGS.compute_manager)
|
|
||||||
compute2.start()
|
|
||||||
s1 = db.service_get_by_args(self.context, 'host1', 'nova-compute')
|
s1 = db.service_get_by_args(self.context, 'host1', 'nova-compute')
|
||||||
s2 = db.service_get_by_args(self.context, 'host2', 'nova-compute')
|
s2 = db.service_get_by_args(self.context, 'host2', 'nova-compute')
|
||||||
db.service_update(self.context, s1['id'], {'disabled': True})
|
db.service_update(self.context, s1['id'], {'disabled': True})
|
||||||
@@ -199,18 +190,8 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
|
|
||||||
def test_reports_enabled_hosts_as_up(self):
|
def test_reports_enabled_hosts_as_up(self):
|
||||||
"""Ensures driver can find the hosts that are up"""
|
"""Ensures driver can find the hosts that are up"""
|
||||||
# NOTE(vish): constructing service without create method
|
compute1 = self.start_service('compute', host='host1')
|
||||||
# because we are going to use it without queue
|
compute2 = self.start_service('compute', host='host2')
|
||||||
compute1 = service.Service('host1',
|
|
||||||
'nova-compute',
|
|
||||||
'compute',
|
|
||||||
FLAGS.compute_manager)
|
|
||||||
compute1.start()
|
|
||||||
compute2 = service.Service('host2',
|
|
||||||
'nova-compute',
|
|
||||||
'compute',
|
|
||||||
FLAGS.compute_manager)
|
|
||||||
compute2.start()
|
|
||||||
hosts = self.scheduler.driver.hosts_up(self.context, 'compute')
|
hosts = self.scheduler.driver.hosts_up(self.context, 'compute')
|
||||||
self.assertEqual(2, len(hosts))
|
self.assertEqual(2, len(hosts))
|
||||||
compute1.kill()
|
compute1.kill()
|
||||||
@@ -218,16 +199,8 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
|
|
||||||
def test_least_busy_host_gets_instance(self):
|
def test_least_busy_host_gets_instance(self):
|
||||||
"""Ensures the host with less cores gets the next one"""
|
"""Ensures the host with less cores gets the next one"""
|
||||||
compute1 = service.Service('host1',
|
compute1 = self.start_service('compute', host='host1')
|
||||||
'nova-compute',
|
compute2 = self.start_service('compute', host='host2')
|
||||||
'compute',
|
|
||||||
FLAGS.compute_manager)
|
|
||||||
compute1.start()
|
|
||||||
compute2 = service.Service('host2',
|
|
||||||
'nova-compute',
|
|
||||||
'compute',
|
|
||||||
FLAGS.compute_manager)
|
|
||||||
compute2.start()
|
|
||||||
instance_id1 = self._create_instance()
|
instance_id1 = self._create_instance()
|
||||||
compute1.run_instance(self.context, instance_id1)
|
compute1.run_instance(self.context, instance_id1)
|
||||||
instance_id2 = self._create_instance()
|
instance_id2 = self._create_instance()
|
||||||
@@ -241,16 +214,8 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
|
|
||||||
def test_specific_host_gets_instance(self):
|
def test_specific_host_gets_instance(self):
|
||||||
"""Ensures if you set availability_zone it launches on that zone"""
|
"""Ensures if you set availability_zone it launches on that zone"""
|
||||||
compute1 = service.Service('host1',
|
compute1 = self.start_service('compute', host='host1')
|
||||||
'nova-compute',
|
compute2 = self.start_service('compute', host='host2')
|
||||||
'compute',
|
|
||||||
FLAGS.compute_manager)
|
|
||||||
compute1.start()
|
|
||||||
compute2 = service.Service('host2',
|
|
||||||
'nova-compute',
|
|
||||||
'compute',
|
|
||||||
FLAGS.compute_manager)
|
|
||||||
compute2.start()
|
|
||||||
instance_id1 = self._create_instance()
|
instance_id1 = self._create_instance()
|
||||||
compute1.run_instance(self.context, instance_id1)
|
compute1.run_instance(self.context, instance_id1)
|
||||||
instance_id2 = self._create_instance(availability_zone='nova:host1')
|
instance_id2 = self._create_instance(availability_zone='nova:host1')
|
||||||
@@ -263,11 +228,7 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
compute2.kill()
|
compute2.kill()
|
||||||
|
|
||||||
def test_wont_sechedule_if_specified_host_is_down(self):
|
def test_wont_sechedule_if_specified_host_is_down(self):
|
||||||
compute1 = service.Service('host1',
|
compute1 = self.start_service('compute', host='host1')
|
||||||
'nova-compute',
|
|
||||||
'compute',
|
|
||||||
FLAGS.compute_manager)
|
|
||||||
compute1.start()
|
|
||||||
s1 = db.service_get_by_args(self.context, 'host1', 'nova-compute')
|
s1 = db.service_get_by_args(self.context, 'host1', 'nova-compute')
|
||||||
now = datetime.datetime.utcnow()
|
now = datetime.datetime.utcnow()
|
||||||
delta = datetime.timedelta(seconds=FLAGS.service_down_time * 2)
|
delta = datetime.timedelta(seconds=FLAGS.service_down_time * 2)
|
||||||
@@ -282,11 +243,7 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
compute1.kill()
|
compute1.kill()
|
||||||
|
|
||||||
def test_will_schedule_on_disabled_host_if_specified(self):
|
def test_will_schedule_on_disabled_host_if_specified(self):
|
||||||
compute1 = service.Service('host1',
|
compute1 = self.start_service('compute', host='host1')
|
||||||
'nova-compute',
|
|
||||||
'compute',
|
|
||||||
FLAGS.compute_manager)
|
|
||||||
compute1.start()
|
|
||||||
s1 = db.service_get_by_args(self.context, 'host1', 'nova-compute')
|
s1 = db.service_get_by_args(self.context, 'host1', 'nova-compute')
|
||||||
db.service_update(self.context, s1['id'], {'disabled': True})
|
db.service_update(self.context, s1['id'], {'disabled': True})
|
||||||
instance_id2 = self._create_instance(availability_zone='nova:host1')
|
instance_id2 = self._create_instance(availability_zone='nova:host1')
|
||||||
@@ -298,16 +255,8 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
|
|
||||||
def test_too_many_cores(self):
|
def test_too_many_cores(self):
|
||||||
"""Ensures we don't go over max cores"""
|
"""Ensures we don't go over max cores"""
|
||||||
compute1 = service.Service('host1',
|
compute1 = self.start_service('compute', host='host1')
|
||||||
'nova-compute',
|
compute2 = self.start_service('compute', host='host2')
|
||||||
'compute',
|
|
||||||
FLAGS.compute_manager)
|
|
||||||
compute1.start()
|
|
||||||
compute2 = service.Service('host2',
|
|
||||||
'nova-compute',
|
|
||||||
'compute',
|
|
||||||
FLAGS.compute_manager)
|
|
||||||
compute2.start()
|
|
||||||
instance_ids1 = []
|
instance_ids1 = []
|
||||||
instance_ids2 = []
|
instance_ids2 = []
|
||||||
for index in xrange(FLAGS.max_cores):
|
for index in xrange(FLAGS.max_cores):
|
||||||
@@ -322,6 +271,7 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
self.scheduler.driver.schedule_run_instance,
|
self.scheduler.driver.schedule_run_instance,
|
||||||
self.context,
|
self.context,
|
||||||
instance_id)
|
instance_id)
|
||||||
|
db.instance_destroy(self.context, instance_id)
|
||||||
for instance_id in instance_ids1:
|
for instance_id in instance_ids1:
|
||||||
compute1.terminate_instance(self.context, instance_id)
|
compute1.terminate_instance(self.context, instance_id)
|
||||||
for instance_id in instance_ids2:
|
for instance_id in instance_ids2:
|
||||||
@@ -331,16 +281,8 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
|
|
||||||
def test_least_busy_host_gets_volume(self):
|
def test_least_busy_host_gets_volume(self):
|
||||||
"""Ensures the host with less gigabytes gets the next one"""
|
"""Ensures the host with less gigabytes gets the next one"""
|
||||||
volume1 = service.Service('host1',
|
volume1 = self.start_service('volume', host='host1')
|
||||||
'nova-volume',
|
volume2 = self.start_service('volume', host='host2')
|
||||||
'volume',
|
|
||||||
FLAGS.volume_manager)
|
|
||||||
volume1.start()
|
|
||||||
volume2 = service.Service('host2',
|
|
||||||
'nova-volume',
|
|
||||||
'volume',
|
|
||||||
FLAGS.volume_manager)
|
|
||||||
volume2.start()
|
|
||||||
volume_id1 = self._create_volume()
|
volume_id1 = self._create_volume()
|
||||||
volume1.create_volume(self.context, volume_id1)
|
volume1.create_volume(self.context, volume_id1)
|
||||||
volume_id2 = self._create_volume()
|
volume_id2 = self._create_volume()
|
||||||
@@ -354,16 +296,8 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
|
|
||||||
def test_too_many_gigabytes(self):
|
def test_too_many_gigabytes(self):
|
||||||
"""Ensures we don't go over max gigabytes"""
|
"""Ensures we don't go over max gigabytes"""
|
||||||
volume1 = service.Service('host1',
|
volume1 = self.start_service('volume', host='host1')
|
||||||
'nova-volume',
|
volume2 = self.start_service('volume', host='host2')
|
||||||
'volume',
|
|
||||||
FLAGS.volume_manager)
|
|
||||||
volume1.start()
|
|
||||||
volume2 = service.Service('host2',
|
|
||||||
'nova-volume',
|
|
||||||
'volume',
|
|
||||||
FLAGS.volume_manager)
|
|
||||||
volume2.start()
|
|
||||||
volume_ids1 = []
|
volume_ids1 = []
|
||||||
volume_ids2 = []
|
volume_ids2 = []
|
||||||
for index in xrange(FLAGS.max_gigabytes):
|
for index in xrange(FLAGS.max_gigabytes):
|
||||||
|
@@ -204,6 +204,7 @@ class LibvirtConnTestCase(test.TestCase):
|
|||||||
conn = libvirt_conn.LibvirtConnection(True)
|
conn = libvirt_conn.LibvirtConnection(True)
|
||||||
uri = conn.get_uri()
|
uri = conn.get_uri()
|
||||||
self.assertEquals(uri, testuri)
|
self.assertEquals(uri, testuri)
|
||||||
|
db.instance_destroy(user_context, instance_ref['id'])
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
super(LibvirtConnTestCase, self).tearDown()
|
super(LibvirtConnTestCase, self).tearDown()
|
||||||
@@ -365,6 +366,7 @@ class IptablesFirewallTestCase(test.TestCase):
|
|||||||
'--dports 80:81 -j ACCEPT' % security_group_chain \
|
'--dports 80:81 -j ACCEPT' % security_group_chain \
|
||||||
in self.out_rules,
|
in self.out_rules,
|
||||||
"TCP port 80/81 acceptance rule wasn't added")
|
"TCP port 80/81 acceptance rule wasn't added")
|
||||||
|
db.instance_destroy(admin_ctxt, instance_ref['id'])
|
||||||
|
|
||||||
|
|
||||||
class NWFilterTestCase(test.TestCase):
|
class NWFilterTestCase(test.TestCase):
|
||||||
@@ -514,3 +516,4 @@ class NWFilterTestCase(test.TestCase):
|
|||||||
self.fw.apply_instance_filter(instance)
|
self.fw.apply_instance_filter(instance)
|
||||||
_ensure_all_called()
|
_ensure_all_called()
|
||||||
self.teardown_security_group()
|
self.teardown_security_group()
|
||||||
|
db.instance_destroy(admin_ctxt, instance_ref['id'])
|
||||||
|
@@ -148,6 +148,7 @@ def WrapTwistedOptions(wrapped):
|
|||||||
options.insert(0, '')
|
options.insert(0, '')
|
||||||
|
|
||||||
args = FLAGS(options)
|
args = FLAGS(options)
|
||||||
|
logging.setup()
|
||||||
argv = args[1:]
|
argv = args[1:]
|
||||||
# ignore subcommands
|
# ignore subcommands
|
||||||
|
|
||||||
@@ -258,7 +259,6 @@ def serve(filename):
|
|||||||
print 'usage: %s [options] [start|stop|restart]' % argv[0]
|
print 'usage: %s [options] [start|stop|restart]' % argv[0]
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
logging.basicConfig()
|
|
||||||
logging.debug(_("Full set of FLAGS:"))
|
logging.debug(_("Full set of FLAGS:"))
|
||||||
for flag in FLAGS:
|
for flag in FLAGS:
|
||||||
logging.debug("%s : %s" % (flag, FLAGS.get(flag, None)))
|
logging.debug("%s : %s" % (flag, FLAGS.get(flag, None)))
|
||||||
|
@@ -1,21 +1,21 @@
|
|||||||
# Translations template for nova.
|
# Danish translation for nova
|
||||||
# Copyright (C) 2011 ORGANIZATION
|
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||||
# This file is distributed under the same license as the nova project.
|
# This file is distributed under the same license as the nova package.
|
||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||||
#
|
#
|
||||||
#, fuzzy
|
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: nova 2011.1\n"
|
"Project-Id-Version: nova\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"POT-Creation-Date: 2011-01-10 11:25-0800\n"
|
"POT-Creation-Date: 2011-01-10 11:25-0800\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: 2011-01-15 21:46+0000\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: Soren Hansen <soren@linux2go.dk>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: Danish <da@li.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=utf-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Generated-By: Babel 0.9.4\n"
|
"X-Launchpad-Export-Date: 2011-02-05 05:36+0000\n"
|
||||||
|
"X-Generator: Launchpad (build 12177)\n"
|
||||||
|
|
||||||
#: nova/crypto.py:46
|
#: nova/crypto.py:46
|
||||||
msgid "Filename of root CA"
|
msgid "Filename of root CA"
|
||||||
@@ -23,7 +23,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: nova/crypto.py:49
|
#: nova/crypto.py:49
|
||||||
msgid "Filename of private key"
|
msgid "Filename of private key"
|
||||||
msgstr ""
|
msgstr "Filnavn for privatnøgle"
|
||||||
|
|
||||||
#: nova/crypto.py:51
|
#: nova/crypto.py:51
|
||||||
msgid "Filename of root Certificate Revokation List"
|
msgid "Filename of root Certificate Revokation List"
|
||||||
@@ -283,8 +283,8 @@ msgstr ""
|
|||||||
#: nova/api/ec2/__init__.py:142
|
#: nova/api/ec2/__init__.py:142
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Access key %s has had %d failed authentications and will be locked out "
|
"Access key %s has had %d failed authentications and will be locked out for "
|
||||||
"for %d minutes."
|
"%d minutes."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: nova/api/ec2/__init__.py:179 nova/objectstore/handler.py:140
|
#: nova/api/ec2/__init__.py:179 nova/objectstore/handler.py:140
|
||||||
@@ -805,7 +805,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: nova/compute/api.py:94
|
#: nova/compute/api.py:94
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Instance quota exceeded. You can only run %s more instances of this type."
|
msgid ""
|
||||||
|
"Instance quota exceeded. You can only run %s more instances of this type."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: nova/compute/api.py:109
|
#: nova/compute/api.py:109
|
||||||
@@ -957,7 +958,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: nova/compute/manager.py:289
|
#: nova/compute/manager.py:289
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "trying to snapshot a non-running instance: %s (state: %s excepted: %s)"
|
msgid ""
|
||||||
|
"trying to snapshot a non-running instance: %s (state: %s excepted: %s)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: nova/compute/manager.py:301
|
#: nova/compute/manager.py:301
|
||||||
@@ -1697,9 +1699,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: nova/virt/xenapi_conn.py:113
|
#: nova/virt/xenapi_conn.py:113
|
||||||
msgid ""
|
msgid ""
|
||||||
"Must specify xenapi_connection_url, xenapi_connection_username "
|
"Must specify xenapi_connection_url, xenapi_connection_username (optionally), "
|
||||||
"(optionally), and xenapi_connection_password to use "
|
"and xenapi_connection_password to use connection_type=xenapi"
|
||||||
"connection_type=xenapi"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: nova/virt/xenapi_conn.py:263
|
#: nova/virt/xenapi_conn.py:263
|
||||||
@@ -1826,7 +1827,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: nova/virt/xenapi/vm_utils.py:290
|
#: nova/virt/xenapi/vm_utils.py:290
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "PV Kernel in VDI:%s"
|
msgid "PV Kernel in VDI:%d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: nova/virt/xenapi/vm_utils.py:318
|
#: nova/virt/xenapi/vm_utils.py:318
|
||||||
@@ -2126,5 +2127,4 @@ msgstr ""
|
|||||||
#: nova/volume/manager.py:129
|
#: nova/volume/manager.py:129
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "volume %s: deleted successfully"
|
msgid "volume %s: deleted successfully"
|
||||||
msgstr ""
|
msgstr "bind %s: slettet"
|
||||||
|
|
2847
po/nova.pot
Normal file
2847
po/nova.pot
Normal file
File diff suppressed because it is too large
Load Diff
2148
po/pt_BR.po
Normal file
2148
po/pt_BR.po
Normal file
File diff suppressed because it is too large
Load Diff
2135
po/zh_CN.po
Normal file
2135
po/zh_CN.po
Normal file
File diff suppressed because it is too large
Load Diff
@@ -27,6 +27,7 @@ from nose import result
|
|||||||
from nose import core
|
from nose import core
|
||||||
|
|
||||||
from nova import log as logging
|
from nova import log as logging
|
||||||
|
from nova.tests import fake_flags
|
||||||
|
|
||||||
|
|
||||||
class NovaTestResult(result.TextTestResult):
|
class NovaTestResult(result.TextTestResult):
|
||||||
@@ -60,7 +61,7 @@ class NovaTestRunner(core.TextTestRunner):
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
logging.basicConfig()
|
logging.setup()
|
||||||
c = config.Config(stream=sys.stdout,
|
c = config.Config(stream=sys.stdout,
|
||||||
env=os.environ,
|
env=os.environ,
|
||||||
verbosity=3,
|
verbosity=3,
|
||||||
|
Reference in New Issue
Block a user