merged trunk

This commit is contained in:
Vishvananda Ishaya
2011-02-23 10:29:54 -08:00
40 changed files with 24513 additions and 369 deletions

View File

@@ -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()

View File

@@ -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)

View File

@@ -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()

View File

@@ -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()

View File

@@ -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()

View File

@@ -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

View File

@@ -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())

View File

@@ -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:

View File

@@ -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')

View File

@@ -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:

View File

@@ -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()

View File

@@ -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()

View File

@@ -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()

View File

@@ -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)

View File

@@ -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'

View File

@@ -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()

View File

@@ -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'

View File

@@ -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

View File

@@ -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)

View File

@@ -19,7 +19,6 @@
"""Tests for Direct API.""" """Tests for Direct API."""
import json import json
import logging
import webob import webob

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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"""

View File

@@ -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):

View File

@@ -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'])

View File

@@ -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)))

2130
po/ast.po Normal file

File diff suppressed because it is too large Load Diff

2137
po/cs.po Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -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"

2137
po/de.po Normal file

File diff suppressed because it is too large Load Diff

2177
po/es.po Normal file

File diff suppressed because it is too large Load Diff

2141
po/it.po Normal file

File diff suppressed because it is too large Load Diff

2143
po/ja.po Normal file

File diff suppressed because it is too large Load Diff

2847
po/nova.pot Normal file

File diff suppressed because it is too large Load Diff

2148
po/pt_BR.po Normal file

File diff suppressed because it is too large Load Diff

2138
po/ru.po Normal file

File diff suppressed because it is too large Load Diff

2135
po/uk.po Normal file

File diff suppressed because it is too large Load Diff

2135
po/zh_CN.po Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -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,