merged trunk
This commit is contained in:
21
bin/nova-api
21
bin/nova-api
@@ -42,6 +42,12 @@ from nova import wsgi
|
|||||||
LOG = logging.getLogger('nova.api')
|
LOG = logging.getLogger('nova.api')
|
||||||
|
|
||||||
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']
|
||||||
|
|
||||||
@@ -55,22 +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.reset()
|
|
||||||
|
|
||||||
server = wsgi.Server()
|
server = wsgi.Server()
|
||||||
for app in apps:
|
for app in apps:
|
||||||
server.start(*app)
|
server.start(*app)
|
||||||
@@ -82,6 +81,10 @@ if __name__ == '__main__':
|
|||||||
logging.setup()
|
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,79 +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.setup()
|
|
||||||
|
|
||||||
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:
|
|
||||||
server = wsgi.Server()
|
|
||||||
for app in apps:
|
|
||||||
server.start(*app)
|
|
||||||
server.wait()
|
|
||||||
@@ -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()
|
||||||
|
|||||||
@@ -65,10 +65,8 @@ 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.network = self.start_service('network')
|
||||||
self.network = service.Service.create(binary='nova-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)
|
||||||
@@ -102,7 +100,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 +113,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,
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -177,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})
|
||||||
@@ -200,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()
|
||||||
@@ -219,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()
|
||||||
@@ -242,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')
|
||||||
@@ -264,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)
|
||||||
@@ -283,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')
|
||||||
@@ -299,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):
|
||||||
@@ -332,16 +280,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()
|
||||||
@@ -355,16 +295,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):
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user