summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--etc/nova/policy.json1
-rw-r--r--nova/api/openstack/compute/contrib/services.py141
-rw-r--r--nova/compute/manager.py31
-rw-r--r--nova/locale/nova.pot2585
-rw-r--r--nova/network/manager.py2
-rw-r--r--nova/openstack/common/uuidutils.py4
-rw-r--r--nova/test.py83
-rw-r--r--nova/tests/api/ec2/test_cinder_cloud.py28
-rw-r--r--nova/tests/api/ec2/test_cloud.py9
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_aggregates.py4
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_cloudpipe.py3
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_server_start_stop.py4
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_services.py198
-rw-r--r--nova/tests/api/openstack/compute/test_consoles.py5
-rw-r--r--nova/tests/api/openstack/compute/test_extensions.py10
-rw-r--r--nova/tests/api/openstack/compute/test_flavors.py9
-rw-r--r--nova/tests/api/openstack/compute/test_images.py12
-rw-r--r--nova/tests/api/openstack/compute/test_limits.py5
-rw-r--r--nova/tests/api/openstack/compute/test_server_actions.py5
-rw-r--r--nova/tests/api/openstack/compute/test_servers.py46
-rw-r--r--nova/tests/api/openstack/compute/test_versions.py7
-rw-r--r--nova/tests/compute/test_compute.py8
-rw-r--r--nova/tests/image/test_glance.py11
-rw-r--r--nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.json.tpl8
-rw-r--r--nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.xml.tpl3
-rw-r--r--nova/tests/integrated/test_servers.py4
-rw-r--r--nova/tests/matchers.py196
-rw-r--r--nova/tests/network/test_manager.py9
-rw-r--r--nova/tests/policy.json1
-rw-r--r--nova/tests/scheduler/test_host_manager.py9
-rw-r--r--nova/tests/scheduler/test_least_cost.py5
-rw-r--r--nova/tests/scheduler/test_scheduler.py7
-rw-r--r--nova/tests/test_api.py7
-rw-r--r--nova/tests/test_bdm.py3
-rw-r--r--nova/tests/test_db_api.py18
-rw-r--r--nova/tests/test_libvirt.py23
-rw-r--r--nova/tests/test_matchers.py144
-rw-r--r--nova/tests/test_powervm.py26
-rw-r--r--nova/tests/test_xenapi.py11
-rw-r--r--nova/virt/disk/api.py7
-rw-r--r--nova/virt/libvirt/driver.py12
-rw-r--r--nova/virt/libvirt/utils.py2
-rw-r--r--nova/virt/libvirt/vif.py6
-rw-r--r--nova/virt/powervm/operator.py10
-rw-r--r--nova/virt/xenapi/vm_utils.py40
-rw-r--r--nova/virt/xenapi/vmops.py25
-rw-r--r--tox.ini2
47 files changed, 2226 insertions, 1563 deletions
diff --git a/etc/nova/policy.json b/etc/nova/policy.json
index bd015802a..50d55d58d 100644
--- a/etc/nova/policy.json
+++ b/etc/nova/policy.json
@@ -59,6 +59,7 @@
"compute_extension:rescue": "",
"compute_extension:security_groups": "",
"compute_extension:server_diagnostics": "rule:admin_api",
+ "compute_extension:services": "rule:admin_api",
"compute_extension:simple_tenant_usage:show": "rule:admin_or_owner",
"compute_extension:simple_tenant_usage:list": "rule:admin_api",
"compute_extension:users": "rule:admin_api",
diff --git a/nova/api/openstack/compute/contrib/services.py b/nova/api/openstack/compute/contrib/services.py
new file mode 100644
index 000000000..3da00a8c8
--- /dev/null
+++ b/nova/api/openstack/compute/contrib/services.py
@@ -0,0 +1,141 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2012 IBM
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+
+import webob.exc
+
+from nova.api.openstack import extensions
+from nova.api.openstack import wsgi
+from nova.api.openstack import xmlutil
+from nova import db
+from nova import exception
+from nova import flags
+from nova.openstack.common import log as logging
+from nova.openstack.common import timeutils
+from nova import utils
+
+
+LOG = logging.getLogger(__name__)
+authorize = extensions.extension_authorizer('compute', 'services')
+FLAGS = flags.FLAGS
+
+
+class ServicesIndexTemplate(xmlutil.TemplateBuilder):
+ def construct(self):
+ root = xmlutil.TemplateElement('services')
+ elem = xmlutil.SubTemplateElement(root, 'service', selector='services')
+ elem.set('binary')
+ elem.set('host')
+ elem.set('zone')
+ elem.set('status')
+ elem.set('state')
+ elem.set('update_at')
+
+ return xmlutil.MasterTemplate(root, 1)
+
+
+class ServicesUpdateTemplate(xmlutil.TemplateBuilder):
+ def construct(self):
+ root = xmlutil.TemplateElement('host')
+ root.set('host')
+ root.set('service')
+ root.set('disabled')
+
+ return xmlutil.MasterTemplate(root, 1)
+
+
+class ServiceController(object):
+ @wsgi.serializers(xml=ServicesIndexTemplate)
+ def index(self, req):
+ """
+ Return a list of all running services. Filter by host & service name.
+ """
+ context = req.environ['nova.context']
+ authorize(context)
+ now = timeutils.utcnow()
+ services = db.service_get_all(context)
+
+ host = ''
+ if 'host' in req.GET:
+ host = req.GET['host']
+ service = ''
+ if 'service' in req.GET:
+ service = req.GET['service']
+ if host:
+ services = [s for s in services if s['host'] == host]
+ if service:
+ services = [s for s in services if s['binary'] == service]
+
+ svcs = []
+ for svc in services:
+ delta = now - (svc['updated_at'] or svc['created_at'])
+ alive = abs(utils.total_seconds(delta)) <= FLAGS.service_down_time
+ art = (alive and "up") or "down"
+ active = 'enabled'
+ if svc['disabled']:
+ active = 'disabled'
+ svcs.append({"binary": svc['binary'], 'host': svc['host'],
+ 'zone': svc['availability_zone'],
+ 'status': active, 'state': art,
+ 'updated_at': svc['updated_at']})
+ return {'services': svcs}
+
+ @wsgi.serializers(xml=ServicesUpdateTemplate)
+ def update(self, req, id, body):
+ """Enable/Disable scheduling for a service"""
+ context = req.environ['nova.context']
+ authorize(context)
+
+ if id == "enable":
+ disabled = False
+ elif id == "disable":
+ disabled = True
+ else:
+ raise webob.exc.HTTPNotFound("Unknown action")
+
+ try:
+ host = body['host']
+ service = body['service']
+ except (TypeError, KeyError):
+ raise webob.exc.HTTPUnprocessableEntity()
+
+ try:
+ svc = db.service_get_by_args(context, host, service)
+ if not svc:
+ raise webob.exc.HTTPNotFound('Unknown service')
+
+ db.service_update(context, svc['id'], {'disabled': disabled})
+ except exception.ServiceNotFound:
+ raise webob.exc.HTTPNotFound("service not found")
+
+ return {'host': host, 'service': service, 'disabled': disabled}
+
+
+class Services(extensions.ExtensionDescriptor):
+ """Services support"""
+
+ name = "Services"
+ alias = "os-services"
+ namespace = "http://docs.openstack.org/compute/ext/services/api/v2"
+ updated = "2012-10-28T00:00:00-00:00"
+
+ def get_resources(self):
+ resources = []
+ resource = extensions.ResourceExtension('os-services',
+ ServiceController())
+ resources.append(resource)
+ return resources
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index fed8b32d3..9011196b2 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -1484,6 +1484,27 @@ class ComputeManager(manager.SchedulerDependentManager):
instance=instance)
self.driver.inject_file(instance, path, file_contents)
+ def _get_rescue_image_ref(self, context, instance):
+ """Determine what image should be used to boot the rescue VM. """
+ system_meta = self.db.instance_system_metadata_get(
+ context, instance['uuid'])
+
+ rescue_image_ref = system_meta.get('image_base_image_ref')
+
+ # 1. First try to use base image associated with instance's current
+ # image.
+ #
+ # The idea here is to provide the customer with a rescue environment
+ # which they are familiar with. So, if they built their instance off of
+ # a Debian image, their rescue VM wil also be Debian.
+ if rescue_image_ref:
+ return rescue_image_ref
+
+ # 2. As a last resort, use instance's current image
+ LOG.warn(_('Unable to find a different image to use for rescue VM,'
+ ' using instance\'s current image'))
+ return instance['image_ref']
+
@exception.wrap_exception(notifier=notifier, publisher_id=publisher_id())
@reverts_task_state
@wrap_instance_fault
@@ -1499,12 +1520,16 @@ class ComputeManager(manager.SchedulerDependentManager):
utils.generate_password(CONF.password_length))
network_info = self._get_instance_nw_info(context, instance)
- image_meta = _get_image_meta(context, instance['image_ref'])
+
+ # Boot the instance using the 'base' image instead of the user's
+ # current (possibly broken) image
+ rescue_image_ref = self._get_rescue_image_ref(context, instance)
+ rescue_image_meta = _get_image_meta(context, rescue_image_ref)
with self._error_out_instance_on_exception(context, instance['uuid']):
self.driver.rescue(context, instance,
- self._legacy_nw_info(network_info), image_meta,
- admin_password)
+ self._legacy_nw_info(network_info),
+ rescue_image_meta, admin_password)
current_power_state = self._get_power_state(context, instance)
self._instance_update(context,
diff --git a/nova/locale/nova.pot b/nova/locale/nova.pot
index 5301ee2c5..e18e642f0 100644
--- a/nova/locale/nova.pot
+++ b/nova/locale/nova.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: nova 2013.1\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2012-11-07 00:02+0000\n"
+"POT-Creation-Date: 2012-11-13 00:02+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -27,41 +27,41 @@ msgstr ""
msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r"
msgstr ""
-#: nova/crypto.py:47
+#: nova/crypto.py:48
msgid "Filename of root CA"
msgstr ""
-#: nova/crypto.py:50
+#: nova/crypto.py:51
msgid "Filename of private key"
msgstr ""
-#: nova/crypto.py:53
+#: nova/crypto.py:54
msgid "Filename of root Certificate Revocation List"
msgstr ""
-#: nova/crypto.py:56
+#: nova/crypto.py:57
msgid "Where we keep our keys"
msgstr ""
-#: nova/crypto.py:59
+#: nova/crypto.py:60
msgid "Where we keep our root CA"
msgstr ""
-#: nova/crypto.py:62
+#: nova/crypto.py:63
msgid "Should we use a CA for each project?"
msgstr ""
-#: nova/crypto.py:66
+#: nova/crypto.py:67
#, python-format
msgid "Subject for certificate for users, %s for project, user, timestamp"
msgstr ""
-#: nova/crypto.py:71
+#: nova/crypto.py:72
#, python-format
msgid "Subject for certificate for projects, %s for project, timestamp"
msgstr ""
-#: nova/crypto.py:301
+#: nova/crypto.py:302
#, python-format
msgid "Flags path: %s"
msgstr ""
@@ -84,257 +84,257 @@ msgstr ""
msgid "DB exception wrapped."
msgstr ""
-#: nova/exception.py:131
+#: nova/exception.py:129
msgid "An unknown exception occurred."
msgstr ""
-#: nova/exception.py:152 nova/openstack/common/rpc/common.py:46
+#: nova/exception.py:150 nova/openstack/common/rpc/common.py:46
msgid "Exception in string format operation"
msgstr ""
-#: nova/exception.py:162
+#: nova/exception.py:160
msgid "Unknown"
msgstr ""
-#: nova/exception.py:179
+#: nova/exception.py:177
msgid "Failed to decrypt text"
msgstr ""
-#: nova/exception.py:183
+#: nova/exception.py:181
msgid "Virtual Interface creation failed"
msgstr ""
-#: nova/exception.py:187
+#: nova/exception.py:185
msgid "5 attempts to create virtual interfacewith unique mac address failed"
msgstr ""
-#: nova/exception.py:192
+#: nova/exception.py:190
#, python-format
msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s"
msgstr ""
-#: nova/exception.py:197
+#: nova/exception.py:195
msgid "Not authorized."
msgstr ""
-#: nova/exception.py:202
+#: nova/exception.py:200
msgid "User does not have admin privileges"
msgstr ""
-#: nova/exception.py:206
+#: nova/exception.py:204
#, python-format
msgid "Policy doesn't allow %(action)s to be performed."
msgstr ""
-#: nova/exception.py:210
+#: nova/exception.py:208
#, python-format
msgid "Image %(image_id)s is not active."
msgstr ""
-#: nova/exception.py:214
+#: nova/exception.py:212
#, python-format
msgid "Not authorized for image %(image_id)s."
msgstr ""
-#: nova/exception.py:218
+#: nova/exception.py:216
msgid "Unacceptable parameters."
msgstr ""
-#: nova/exception.py:223
+#: nova/exception.py:221
msgid "Invalid snapshot"
msgstr ""
-#: nova/exception.py:227
+#: nova/exception.py:225
#, python-format
msgid "Volume %(volume_id)s is not attached to anything"
msgstr ""
-#: nova/exception.py:231
+#: nova/exception.py:229
#, python-format
msgid "Volume %(volume_id)s is still attached, detach volume first."
msgstr ""
-#: nova/exception.py:235 nova/api/ec2/cloud.py:390 nova/api/ec2/cloud.py:415
-#: nova/api/openstack/compute/contrib/keypairs.py:98 nova/compute/api.py:2238
+#: nova/exception.py:233 nova/api/ec2/cloud.py:390 nova/api/ec2/cloud.py:415
+#: nova/api/openstack/compute/contrib/keypairs.py:98 nova/compute/api.py:2242
msgid "Keypair data is invalid"
msgstr ""
-#: nova/exception.py:239
+#: nova/exception.py:237
msgid "Failed to load data into json format"
msgstr ""
-#: nova/exception.py:243
+#: nova/exception.py:241
msgid "The request is invalid."
msgstr ""
-#: nova/exception.py:247
+#: nova/exception.py:245
msgid "Invalid input received"
msgstr ""
-#: nova/exception.py:251
+#: nova/exception.py:249
msgid "Invalid volume type"
msgstr ""
-#: nova/exception.py:255
+#: nova/exception.py:253
msgid "Invalid volume"
msgstr ""
-#: nova/exception.py:259 nova/api/openstack/compute/servers.py:1285
+#: nova/exception.py:257 nova/api/openstack/compute/servers.py:1285
#: nova/api/openstack/compute/contrib/admin_actions.py:239
msgid "Invalid metadata"
msgstr ""
-#: nova/exception.py:263
+#: nova/exception.py:261
msgid "Invalid metadata size"
msgstr ""
-#: nova/exception.py:267
+#: nova/exception.py:265
#, python-format
msgid "Invalid port range %(from_port)s:%(to_port)s. %(msg)s"
msgstr ""
-#: nova/exception.py:271 nova/api/ec2/cloud.py:572
+#: nova/exception.py:269 nova/api/ec2/cloud.py:572
#, python-format
msgid "Invalid IP protocol %(protocol)s."
msgstr ""
-#: nova/exception.py:275
+#: nova/exception.py:273
#, python-format
msgid "Invalid content type %(content_type)s."
msgstr ""
-#: nova/exception.py:279
+#: nova/exception.py:277
#, python-format
msgid "Invalid cidr %(cidr)s."
msgstr ""
-#: nova/exception.py:283
+#: nova/exception.py:281
msgid "Invalid Parameter: Unicode is not supported by the current database."
msgstr ""
-#: nova/exception.py:290
+#: nova/exception.py:288
#, python-format
msgid "%(err)s"
msgstr ""
-#: nova/exception.py:294
+#: nova/exception.py:292
#, python-format
msgid ""
"Cannot perform action '%(action)s' on aggregate %(aggregate_id)s. Reason:"
" %(reason)s."
msgstr ""
-#: nova/exception.py:299
+#: nova/exception.py:297
#, python-format
msgid "Group not valid. Reason: %(reason)s"
msgstr ""
-#: nova/exception.py:303
+#: nova/exception.py:301
msgid "Sort key supplied was not valid."
msgstr ""
-#: nova/exception.py:307
+#: nova/exception.py:305
#, python-format
msgid ""
"Instance %(instance_uuid)s in %(attr)s %(state)s. Cannot %(method)s while"
" the instance is in this state."
msgstr ""
-#: nova/exception.py:312
+#: nova/exception.py:310
#, python-format
msgid "Instance %(instance_id)s is not running."
msgstr ""
-#: nova/exception.py:316
+#: nova/exception.py:314
#, python-format
msgid "Instance %(instance_id)s is not in rescue mode"
msgstr ""
-#: nova/exception.py:320
+#: nova/exception.py:318
#, python-format
msgid "Instance %(instance_id)s is not ready"
msgstr ""
-#: nova/exception.py:324
+#: nova/exception.py:322
msgid "Failed to suspend instance"
msgstr ""
-#: nova/exception.py:328
+#: nova/exception.py:326
msgid "Failed to resume server"
msgstr ""
-#: nova/exception.py:332
+#: nova/exception.py:330
msgid "Failed to reboot instance"
msgstr ""
-#: nova/exception.py:336
+#: nova/exception.py:334
msgid "Failed to terminate instance"
msgstr ""
-#: nova/exception.py:340
+#: nova/exception.py:338
msgid "Service is unavailable at this time."
msgstr ""
-#: nova/exception.py:344
+#: nova/exception.py:342
msgid "Insufficient compute resources."
msgstr ""
-#: nova/exception.py:348
+#: nova/exception.py:346
msgid "Compute service is unavailable at this time."
msgstr ""
-#: nova/exception.py:352
+#: nova/exception.py:350
#, python-format
msgid "Unable to migrate instance (%(instance_id)s) to current host (%(host)s)."
msgstr ""
-#: nova/exception.py:357
+#: nova/exception.py:355
msgid "The supplied hypervisor type of is invalid."
msgstr ""
-#: nova/exception.py:361
+#: nova/exception.py:359
msgid "The instance requires a newer hypervisor version than has been provided."
msgstr ""
-#: nova/exception.py:366
+#: nova/exception.py:364
#, python-format
msgid ""
"The supplied disk path (%(path)s) already exists, it is expected not to "
"exist."
msgstr ""
-#: nova/exception.py:371
+#: nova/exception.py:369
#, python-format
msgid "The supplied device path (%(path)s) is invalid."
msgstr ""
-#: nova/exception.py:375
+#: nova/exception.py:373
#, python-format
msgid "The supplied device path (%(path)s) is in use."
msgstr ""
-#: nova/exception.py:379
+#: nova/exception.py:377
#, python-format
msgid "The supplied device (%(device)s) is busy."
msgstr ""
-#: nova/exception.py:383
+#: nova/exception.py:381
msgid "Unacceptable CPU info"
msgstr ""
-#: nova/exception.py:387
+#: nova/exception.py:385
#, python-format
msgid "%(address)s is not a valid IP v4/6 address."
msgstr ""
-#: nova/exception.py:391
+#: nova/exception.py:389
#, python-format
msgid ""
"VLAN tag is not appropriate for the port group %(bridge)s. Expected VLAN "
"tag is %(tag)s, but the one associated with the port group is %(pgroup)s."
msgstr ""
-#: nova/exception.py:397
+#: nova/exception.py:395
#, python-format
msgid ""
"vSwitch which contains the port group %(bridge)s is not associated with "
@@ -342,132 +342,132 @@ msgid ""
"one associated is %(actual)s."
msgstr ""
-#: nova/exception.py:404
+#: nova/exception.py:402
#, python-format
msgid "Disk format %(disk_format)s is not acceptable"
msgstr ""
-#: nova/exception.py:408
+#: nova/exception.py:406
#, python-format
msgid "Image %(image_id)s is unacceptable: %(reason)s"
msgstr ""
-#: nova/exception.py:412
+#: nova/exception.py:410
#, python-format
msgid "Instance %(instance_id)s is unacceptable: %(reason)s"
msgstr ""
-#: nova/exception.py:416
+#: nova/exception.py:414
#, python-format
msgid "Ec2 id %(ec2_id)s is unacceptable."
msgstr ""
-#: nova/exception.py:420
+#: nova/exception.py:418
#, python-format
msgid "Expected a uuid but received %(uuid)s."
msgstr ""
-#: nova/exception.py:424
+#: nova/exception.py:422
msgid "Constraint not met."
msgstr ""
-#: nova/exception.py:429
+#: nova/exception.py:427
msgid "Resource could not be found."
msgstr ""
-#: nova/exception.py:434
+#: nova/exception.py:432
#, python-format
msgid "Could not find driver for compute_driver %(name)s"
msgstr ""
-#: nova/exception.py:438
+#: nova/exception.py:436
#, python-format
msgid "Volume %(volume_id)s persistence file could not be found."
msgstr ""
-#: nova/exception.py:442
+#: nova/exception.py:440
#, python-format
msgid "Volume %(volume_id)s could not be found."
msgstr ""
-#: nova/exception.py:446
+#: nova/exception.py:444
#, python-format
msgid "Unable to locate account %(account_name)s on Solidfire device"
msgstr ""
-#: nova/exception.py:451
+#: nova/exception.py:449
#, python-format
msgid "Volume %(volume_id)s has no metadata with key %(metadata_key)s."
msgstr ""
-#: nova/exception.py:456
+#: nova/exception.py:454
#, python-format
msgid "Volume type %(volume_type_id)s could not be found."
msgstr ""
-#: nova/exception.py:460
+#: nova/exception.py:458
#, python-format
msgid "Volume type with name %(volume_type_name)s could not be found."
msgstr ""
-#: nova/exception.py:465
+#: nova/exception.py:463
#, python-format
msgid ""
"Volume Type %(volume_type_id)s has no extra specs with key "
"%(extra_specs_key)s."
msgstr ""
-#: nova/exception.py:470
+#: nova/exception.py:468
#, python-format
msgid "Snapshot %(snapshot_id)s could not be found."
msgstr ""
-#: nova/exception.py:474
+#: nova/exception.py:472
#, python-format
msgid "deleting volume %(volume_name)s that has snapshot"
msgstr ""
-#: nova/exception.py:478
+#: nova/exception.py:476
#, python-format
msgid "deleting snapshot %(snapshot_name)s that has dependent volumes"
msgstr ""
-#: nova/exception.py:483
+#: nova/exception.py:481
#, python-format
msgid "No target id found for volume %(volume_id)s."
msgstr ""
-#: nova/exception.py:487
+#: nova/exception.py:485
#, python-format
msgid "Failed to create iscsi target for volume %(volume_id)s."
msgstr ""
-#: nova/exception.py:491
+#: nova/exception.py:489
#, python-format
msgid "Failed to remove iscsi target for volume %(volume_id)s."
msgstr ""
-#: nova/exception.py:495
+#: nova/exception.py:493
#, python-format
msgid "No disk at %(location)s"
msgstr ""
-#: nova/exception.py:499
+#: nova/exception.py:497
#, python-format
msgid "Could not find a handler for %(driver_type)s volume."
msgstr ""
-#: nova/exception.py:503
+#: nova/exception.py:501
#, python-format
msgid "Invalid image href %(image_href)s."
msgstr ""
-#: nova/exception.py:507
+#: nova/exception.py:505
#, python-format
msgid "Image %(image_id)s could not be found."
msgstr ""
-#: nova/exception.py:511
+#: nova/exception.py:509
#, python-format
msgid ""
"Image %(image_id)s could not be found. The nova EC2 API assigns image ids"
@@ -475,749 +475,754 @@ msgid ""
"image ids since adding this image?"
msgstr ""
-#: nova/exception.py:518
+#: nova/exception.py:516
#, python-format
msgid "Project %(project_id)s could not be found."
msgstr ""
-#: nova/exception.py:522
+#: nova/exception.py:520
msgid "Cannot find SR to read/write VDI."
msgstr ""
-#: nova/exception.py:526
+#: nova/exception.py:524
+#, python-format
+msgid "Network %(network_id)s is duplicated."
+msgstr ""
+
+#: nova/exception.py:528
#, python-format
msgid "Network %(network_id)s is still in use."
msgstr ""
-#: nova/exception.py:530
+#: nova/exception.py:532
#, python-format
msgid "%(req)s is required to create a network."
msgstr ""
-#: nova/exception.py:534
+#: nova/exception.py:536
#, python-format
msgid "Network %(network_id)s could not be found."
msgstr ""
-#: nova/exception.py:538
+#: nova/exception.py:540
#, python-format
msgid "Network could not be found for bridge %(bridge)s"
msgstr ""
-#: nova/exception.py:542
+#: nova/exception.py:544
#, python-format
msgid "Network could not be found for uuid %(uuid)s"
msgstr ""
-#: nova/exception.py:546
+#: nova/exception.py:548
#, python-format
msgid "Network could not be found with cidr %(cidr)s."
msgstr ""
-#: nova/exception.py:550
+#: nova/exception.py:552
#, python-format
msgid "Network could not be found for instance %(instance_id)s."
msgstr ""
-#: nova/exception.py:554
+#: nova/exception.py:556
msgid "No networks defined."
msgstr ""
-#: nova/exception.py:558
+#: nova/exception.py:560
#, python-format
msgid ""
"Either Network uuid %(network_uuid)s is not present or is not assigned to"
" the project %(project_id)s."
msgstr ""
-#: nova/exception.py:563
+#: nova/exception.py:565
#, python-format
msgid "Host is not set to the network (%(network_id)s)."
msgstr ""
-#: nova/exception.py:567
+#: nova/exception.py:569
msgid "Could not find the datastore reference(s) which the VM uses."
msgstr ""
-#: nova/exception.py:571
+#: nova/exception.py:573
#, python-format
msgid "Port %(port_id)s is still in use."
msgstr ""
-#: nova/exception.py:575
+#: nova/exception.py:577
#, python-format
msgid "Port %(port_id)s could not be found."
msgstr ""
-#: nova/exception.py:579
+#: nova/exception.py:581
#, python-format
msgid "No fixed IP associated with id %(id)s."
msgstr ""
-#: nova/exception.py:583
+#: nova/exception.py:585
#, python-format
msgid "Fixed ip not found for address %(address)s."
msgstr ""
-#: nova/exception.py:587
+#: nova/exception.py:589
#, python-format
msgid "Instance %(instance_uuid)s has zero fixed ips."
msgstr ""
-#: nova/exception.py:591
+#: nova/exception.py:593
#, python-format
msgid "Network host %(host)s has zero fixed ips in network %(network_id)s."
msgstr ""
-#: nova/exception.py:596
+#: nova/exception.py:598
#, python-format
msgid "Instance %(instance_uuid)s doesn't have fixed ip '%(ip)s'."
msgstr ""
-#: nova/exception.py:600
+#: nova/exception.py:602
#, python-format
msgid ""
"Fixed IP address (%(address)s) does not exist in network "
"(%(network_uuid)s)."
msgstr ""
-#: nova/exception.py:605
+#: nova/exception.py:607
#, python-format
msgid ""
"Fixed IP address %(address)s is already in use on instance "
"%(instance_uuid)s."
msgstr ""
-#: nova/exception.py:610
+#: nova/exception.py:612
#, python-format
msgid "More than one instance is associated with fixed ip address '%(address)s'."
msgstr ""
-#: nova/exception.py:615
+#: nova/exception.py:617
#, python-format
msgid "Fixed IP address %(address)s is invalid."
msgstr ""
-#: nova/exception.py:619
+#: nova/exception.py:621
msgid "Zero fixed ips available."
msgstr ""
-#: nova/exception.py:623
+#: nova/exception.py:625
msgid "Zero fixed ips could be found."
msgstr ""
-#: nova/exception.py:632
+#: nova/exception.py:634
#, python-format
msgid "Floating ip %(address)s already exists."
msgstr ""
-#: nova/exception.py:636
+#: nova/exception.py:638
#, python-format
msgid "Floating ip not found for id %(id)s."
msgstr ""
-#: nova/exception.py:640
+#: nova/exception.py:642
#, python-format
msgid "The DNS entry %(name)s already exists in domain %(domain)s."
msgstr ""
-#: nova/exception.py:644
+#: nova/exception.py:646
#, python-format
msgid "Floating ip not found for address %(address)s."
msgstr ""
-#: nova/exception.py:648
+#: nova/exception.py:650
#, python-format
msgid "Floating ip not found for host %(host)s."
msgstr ""
-#: nova/exception.py:652
+#: nova/exception.py:654
#, python-format
msgid "Multiple floating ips are found for address %(address)s."
msgstr ""
-#: nova/exception.py:656
+#: nova/exception.py:658
msgid "Floating ip pool not found."
msgstr ""
-#: nova/exception.py:661
+#: nova/exception.py:663
msgid "Zero floating ips available."
msgstr ""
-#: nova/exception.py:666
+#: nova/exception.py:668
#, python-format
msgid "Floating ip %(address)s is associated."
msgstr ""
-#: nova/exception.py:670
+#: nova/exception.py:672
#, python-format
msgid "Floating ip %(address)s is not associated."
msgstr ""
-#: nova/exception.py:674
+#: nova/exception.py:676
msgid "Zero floating ips exist."
msgstr ""
-#: nova/exception.py:678
+#: nova/exception.py:680
#, python-format
msgid "Interface %(interface)s not found."
msgstr ""
-#: nova/exception.py:682
+#: nova/exception.py:684
msgid "Cannot disassociate auto assigined floating ip"
msgstr ""
-#: nova/exception.py:686
+#: nova/exception.py:688
#, python-format
msgid "Keypair %(name)s not found for user %(user_id)s"
msgstr ""
-#: nova/exception.py:690
+#: nova/exception.py:692
#, python-format
msgid "Certificate %(certificate_id)s not found."
msgstr ""
-#: nova/exception.py:694
+#: nova/exception.py:696
#, python-format
msgid "Service %(service_id)s could not be found."
msgstr ""
-#: nova/exception.py:698
+#: nova/exception.py:700
#, python-format
msgid "Host %(host)s could not be found."
msgstr ""
-#: nova/exception.py:702
+#: nova/exception.py:704
#, python-format
msgid "Compute host %(host)s could not be found."
msgstr ""
-#: nova/exception.py:706
+#: nova/exception.py:708
#, python-format
msgid "Could not find binary %(binary)s on host %(host)s."
msgstr ""
-#: nova/exception.py:710
+#: nova/exception.py:712
#, python-format
msgid "Invalid reservation expiration %(expire)s."
msgstr ""
-#: nova/exception.py:714
+#: nova/exception.py:716
#, python-format
msgid ""
"Change would make usage less than 0 for the following resources: "
"%(unders)s"
msgstr ""
-#: nova/exception.py:719
+#: nova/exception.py:721
msgid "Quota could not be found"
msgstr ""
-#: nova/exception.py:723
+#: nova/exception.py:725
#, python-format
msgid "Unknown quota resources %(unknown)s."
msgstr ""
-#: nova/exception.py:727
+#: nova/exception.py:729
#, python-format
msgid "Quota for project %(project_id)s could not be found."
msgstr ""
-#: nova/exception.py:731
+#: nova/exception.py:733
#, python-format
msgid "Quota class %(class_name)s could not be found."
msgstr ""
-#: nova/exception.py:735
+#: nova/exception.py:737
#, python-format
msgid "Quota usage for project %(project_id)s could not be found."
msgstr ""
-#: nova/exception.py:739
+#: nova/exception.py:741
#, python-format
msgid "Quota reservation %(uuid)s could not be found."
msgstr ""
-#: nova/exception.py:743
+#: nova/exception.py:745
#, python-format
msgid "Quota exceeded for resources: %(overs)s"
msgstr ""
-#: nova/exception.py:747
+#: nova/exception.py:749
#, python-format
msgid "Security group %(security_group_id)s not found."
msgstr ""
-#: nova/exception.py:751
+#: nova/exception.py:753
#, python-format
msgid "Security group %(security_group_id)s not found for project %(project_id)s."
msgstr ""
-#: nova/exception.py:756
+#: nova/exception.py:758
#, python-format
msgid "Security group with rule %(rule_id)s not found."
msgstr ""
-#: nova/exception.py:760
+#: nova/exception.py:762
#, python-format
msgid ""
"Security group %(security_group_id)s is already associated with the "
"instance %(instance_id)s"
msgstr ""
-#: nova/exception.py:765
+#: nova/exception.py:767
#, python-format
msgid ""
"Security group %(security_group_id)s is not associated with the instance "
"%(instance_id)s"
msgstr ""
-#: nova/exception.py:770
+#: nova/exception.py:772
#, python-format
msgid "Migration %(migration_id)s could not be found."
msgstr ""
-#: nova/exception.py:774
+#: nova/exception.py:776
#, python-format
msgid "Migration not found for instance %(instance_id)s with status %(status)s."
msgstr ""
-#: nova/exception.py:779
+#: nova/exception.py:781
#, python-format
msgid "Console pool %(pool_id)s could not be found."
msgstr ""
-#: nova/exception.py:783
+#: nova/exception.py:785
#, python-format
msgid ""
"Console pool of type %(console_type)s for compute host %(compute_host)s "
"on proxy host %(host)s not found."
msgstr ""
-#: nova/exception.py:789
+#: nova/exception.py:791
#, python-format
msgid "Console %(console_id)s could not be found."
msgstr ""
-#: nova/exception.py:793
+#: nova/exception.py:795
#, python-format
msgid "Console for instance %(instance_uuid)s could not be found."
msgstr ""
-#: nova/exception.py:797
+#: nova/exception.py:799
#, python-format
msgid ""
"Console for instance %(instance_uuid)s in pool %(pool_id)s could not be "
"found."
msgstr ""
-#: nova/exception.py:802
+#: nova/exception.py:804
#, python-format
msgid "Invalid console type %(console_type)s "
msgstr ""
-#: nova/exception.py:806
+#: nova/exception.py:808
#, python-format
msgid "Instance type %(instance_type_id)s could not be found."
msgstr ""
-#: nova/exception.py:810
+#: nova/exception.py:812
#, python-format
msgid "Instance type with name %(instance_type_name)s could not be found."
msgstr ""
-#: nova/exception.py:815
+#: nova/exception.py:817
#, python-format
msgid "Flavor %(flavor_id)s could not be found."
msgstr ""
-#: nova/exception.py:819
+#: nova/exception.py:821
#, python-format
msgid "Flavor access not found for %(flavor_id) / %(project_id) combination."
msgstr ""
-#: nova/exception.py:824
+#: nova/exception.py:826
#, python-format
msgid "Scheduler Host Filter %(filter_name)s could not be found."
msgstr ""
-#: nova/exception.py:828
+#: nova/exception.py:830
#, python-format
msgid "Scheduler cost function %(cost_fn_str)s could not be found."
msgstr ""
-#: nova/exception.py:833
+#: nova/exception.py:835
#, python-format
msgid "Scheduler weight flag not found: %(flag_name)s"
msgstr ""
-#: nova/exception.py:837
+#: nova/exception.py:839
#, python-format
msgid "Instance %(instance_uuid)s has no metadata with key %(metadata_key)s."
msgstr ""
-#: nova/exception.py:842
+#: nova/exception.py:844
#, python-format
msgid ""
"Instance %(instance_uuid)s has no system metadata with key "
"%(metadata_key)s."
msgstr ""
-#: nova/exception.py:847
+#: nova/exception.py:849
#, python-format
msgid ""
"Instance Type %(instance_type_id)s has no extra specs with key "
"%(extra_specs_key)s."
msgstr ""
-#: nova/exception.py:852
+#: nova/exception.py:854
#, python-format
msgid "File %(file_path)s could not be found."
msgstr ""
-#: nova/exception.py:856
+#: nova/exception.py:858
msgid "Zero files could be found."
msgstr ""
-#: nova/exception.py:860
+#: nova/exception.py:862
#, python-format
msgid "Virtual switch associated with the network adapter %(adapter)s not found."
msgstr ""
-#: nova/exception.py:865
+#: nova/exception.py:867
#, python-format
msgid "Network adapter %(adapter)s could not be found."
msgstr ""
-#: nova/exception.py:869
+#: nova/exception.py:871
#, python-format
msgid "Class %(class_name)s could not be found: %(exception)s"
msgstr ""
-#: nova/exception.py:873
+#: nova/exception.py:875
msgid "Action not allowed."
msgstr ""
-#: nova/exception.py:877
+#: nova/exception.py:879
msgid "Rotation is not allowed for snapshots"
msgstr ""
-#: nova/exception.py:881
+#: nova/exception.py:883
msgid "Rotation param is required for backup image_type"
msgstr ""
-#: nova/exception.py:885
+#: nova/exception.py:887
#, python-format
msgid "Key pair %(key_name)s already exists."
msgstr ""
-#: nova/exception.py:889
+#: nova/exception.py:891
#, python-format
msgid "Instance %(name)s already exists."
msgstr ""
-#: nova/exception.py:893
+#: nova/exception.py:895
#, python-format
msgid "Instance Type with name %(name)s already exists."
msgstr ""
-#: nova/exception.py:897
+#: nova/exception.py:899
#, python-format
msgid "Instance Type with ID %(flavor_id)s already exists."
msgstr ""
-#: nova/exception.py:901
+#: nova/exception.py:903
#, python-format
msgid ""
"Flavor access alreay exists for flavor %(flavor_id)s and project "
"%(project_id)s combination."
msgstr ""
-#: nova/exception.py:906
+#: nova/exception.py:908
#, python-format
msgid "Volume Type %(name)s already exists."
msgstr ""
-#: nova/exception.py:910
+#: nova/exception.py:912
#, python-format
msgid "%(path)s is not on shared storage: %(reason)s"
msgstr ""
-#: nova/exception.py:914
+#: nova/exception.py:916
#, python-format
msgid "%(path)s is not on local storage: %(reason)s"
msgstr ""
-#: nova/exception.py:918
+#: nova/exception.py:920
msgid "Migration error"
msgstr ""
-#: nova/exception.py:922
+#: nova/exception.py:924
#, python-format
msgid "Malformed message body: %(reason)s"
msgstr ""
-#: nova/exception.py:928
+#: nova/exception.py:930
#, python-format
msgid "Could not find config at %(path)s"
msgstr ""
-#: nova/exception.py:932
+#: nova/exception.py:934
#, python-format
msgid "Could not load paste app '%(name)s' from %(path)s"
msgstr ""
-#: nova/exception.py:936
+#: nova/exception.py:938
msgid "When resizing, instances must change flavor!"
msgstr ""
-#: nova/exception.py:940
+#: nova/exception.py:942
msgid "Image is larger than instance type allows"
msgstr ""
-#: nova/exception.py:944
+#: nova/exception.py:946
msgid "Instance type's memory is too small for requested image."
msgstr ""
-#: nova/exception.py:948
+#: nova/exception.py:950
msgid "Instance type's disk is too small for requested image."
msgstr ""
-#: nova/exception.py:952
+#: nova/exception.py:954
#, python-format
msgid "Insufficient free memory on compute node to start %(uuid)s."
msgstr ""
-#: nova/exception.py:956
+#: nova/exception.py:958
msgid "Could not fetch bandwidth/cpu/disk metrics for this host."
msgstr ""
-#: nova/exception.py:960
+#: nova/exception.py:962
#, python-format
msgid "No valid host was found. %(reason)s"
msgstr ""
-#: nova/exception.py:964
+#: nova/exception.py:966
#, python-format
msgid "Host %(host)s is not up or doesn't exist."
msgstr ""
-#: nova/exception.py:968
+#: nova/exception.py:970
msgid "Quota exceeded"
msgstr ""
-#: nova/exception.py:975
+#: nova/exception.py:977
#, python-format
msgid ""
"Quota exceeded for %(overs)s: Requested %(req)s, but already used "
"%(used)d of %(allowed)d %(resource)s"
msgstr ""
-#: nova/exception.py:980
+#: nova/exception.py:982
msgid "Maximum volume size exceeded"
msgstr ""
-#: nova/exception.py:984
+#: nova/exception.py:986
#, python-format
msgid "Maximum number of volumes allowed (%(allowed)d) exceeded"
msgstr ""
-#: nova/exception.py:988
+#: nova/exception.py:990
msgid "Maximum number of floating ips exceeded"
msgstr ""
-#: nova/exception.py:992
+#: nova/exception.py:994
#, python-format
msgid "Maximum number of metadata items exceeds %(allowed)d"
msgstr ""
-#: nova/exception.py:996
+#: nova/exception.py:998
msgid "Personality file limit exceeded"
msgstr ""
-#: nova/exception.py:1000
+#: nova/exception.py:1002
msgid "Personality file path too long"
msgstr ""
-#: nova/exception.py:1004
+#: nova/exception.py:1006
msgid "Personality file content too long"
msgstr ""
-#: nova/exception.py:1008
+#: nova/exception.py:1010
msgid "Maximum number of key pairs exceeded"
msgstr ""
-#: nova/exception.py:1012
+#: nova/exception.py:1014
msgid "Maximum number of security groups or rules exceeded"
msgstr ""
-#: nova/exception.py:1016
+#: nova/exception.py:1018
#, python-format
msgid ""
"Aggregate %(aggregate_id)s: action '%(action)s' caused an error: "
"%(reason)s."
msgstr ""
-#: nova/exception.py:1021
+#: nova/exception.py:1023
#, python-format
msgid "Aggregate %(aggregate_id)s could not be found."
msgstr ""
-#: nova/exception.py:1025
+#: nova/exception.py:1027
#, python-format
msgid "Aggregate %(aggregate_name)s already exists."
msgstr ""
-#: nova/exception.py:1029
+#: nova/exception.py:1031
#, python-format
msgid "Aggregate %(aggregate_id)s has no host %(host)s."
msgstr ""
-#: nova/exception.py:1033
+#: nova/exception.py:1035
#, python-format
msgid "Aggregate %(aggregate_id)s has no metadata with key %(metadata_key)s."
msgstr ""
-#: nova/exception.py:1038
+#: nova/exception.py:1040
#, python-format
msgid "Aggregate %(aggregate_id)s already has host %(host)s."
msgstr ""
-#: nova/exception.py:1042
+#: nova/exception.py:1044
#, python-format
msgid "Detected more than one volume with name %(vol_name)s"
msgstr ""
-#: nova/exception.py:1046
+#: nova/exception.py:1048
#, python-format
msgid "Cannot create volume_type with name %(name)s and specs %(extra_specs)s"
msgstr ""
-#: nova/exception.py:1051
+#: nova/exception.py:1053
#, python-format
msgid "Bad or unexpected response from the storage volume backend API: %(data)s"
msgstr ""
-#: nova/exception.py:1056
+#: nova/exception.py:1058
msgid "Unknown NFS exception"
msgstr ""
-#: nova/exception.py:1060
+#: nova/exception.py:1062
msgid "No mounted NFS shares found"
msgstr ""
-#: nova/exception.py:1064
+#: nova/exception.py:1066
#, python-format
msgid "There is no share which can host %(volume_size)sG"
msgstr ""
-#: nova/exception.py:1068
+#: nova/exception.py:1070
msgid "Unable to create instance type"
msgstr ""
-#: nova/exception.py:1072
+#: nova/exception.py:1074
#, python-format
msgid "Failed to set admin password on %(instance)s because %(reason)s"
msgstr ""
-#: nova/exception.py:1078
+#: nova/exception.py:1080
msgid "Bad response from SolidFire API"
msgstr ""
-#: nova/exception.py:1082
+#: nova/exception.py:1084
#, python-format
msgid "Error in SolidFire API response: data=%(data)s"
msgstr ""
-#: nova/exception.py:1086
+#: nova/exception.py:1088
#, python-format
msgid "Detected existing vlan with id %(vlan)d"
msgstr ""
-#: nova/exception.py:1090
+#: nova/exception.py:1092
#, python-format
msgid "Instance %(instance_id)s could not be found."
msgstr ""
-#: nova/exception.py:1094
+#: nova/exception.py:1096
#, python-format
msgid "Marker %(marker)s could not be found."
msgstr ""
-#: nova/exception.py:1098
+#: nova/exception.py:1100
#, python-format
msgid "Invalid id: %(val)s (expecting \"i-...\")."
msgstr ""
-#: nova/exception.py:1102
+#: nova/exception.py:1104
#, python-format
msgid "Could not fetch image %(image_id)s"
msgstr ""
-#: nova/exception.py:1106
+#: nova/exception.py:1108
#, python-format
msgid "Task %(task_name)s is already running on host %(host)s"
msgstr ""
-#: nova/exception.py:1110
+#: nova/exception.py:1112
#, python-format
msgid "Task %(task_name)s is not running on host %(host)s"
msgstr ""
-#: nova/exception.py:1114
+#: nova/exception.py:1116
#, python-format
msgid "Instance %(instance_uuid)s is locked"
msgstr ""
-#: nova/exception.py:1118
+#: nova/exception.py:1120
#, python-format
msgid "Could not mount vfat config drive. %(operation)s failed. Error: %(error)s"
msgstr ""
-#: nova/exception.py:1123
+#: nova/exception.py:1125
#, python-format
msgid "Unknown config drive format %(format)s. Select one of iso9660 or vfat."
msgstr ""
-#: nova/exception.py:1128
+#: nova/exception.py:1130
#, python-format
msgid ""
"User data too large. User data must be no larger than %(maxsize)s bytes "
"once base64 encoded. Your data is %(length)d bytes"
msgstr ""
-#: nova/exception.py:1134
+#: nova/exception.py:1136
msgid "User data needs to be valid base 64."
msgstr ""
-#: nova/exception.py:1138
+#: nova/exception.py:1140
#, python-format
msgid ""
"unexpected task state: expecting %(expected)s but the actual state is "
"%(actual)s"
msgstr ""
-#: nova/exception.py:1143
+#: nova/exception.py:1145
#, python-format
msgid "The CA file for %(project)s could not be found"
msgstr ""
-#: nova/exception.py:1147
+#: nova/exception.py:1149
#, python-format
msgid "The CRL file for %(project)s could not be found"
msgstr ""
-#: nova/manager.py:166
+#: nova/manager.py:164
#, python-format
msgid "Skipping %(full_task_name)s, %(ticks_to_skip)s ticks left until next run"
msgstr ""
-#: nova/manager.py:172
+#: nova/manager.py:170
#, python-format
msgid "Running periodic task %(full_task_name)s"
msgstr ""
-#: nova/manager.py:182
+#: nova/manager.py:180
#, python-format
msgid "Error during %(full_task_name)s: %(e)s"
msgstr ""
@@ -1226,121 +1231,121 @@ msgstr ""
msgid "Notifying Schedulers of capabilities ..."
msgstr ""
-#: nova/notifications.py:112 nova/notifications.py:152
+#: nova/notifications.py:113 nova/notifications.py:153
msgid "Failed to send state update notification"
msgstr ""
-#: nova/policy.py:32
+#: nova/policy.py:33
msgid "JSON file representing policy"
msgstr ""
-#: nova/policy.py:35
+#: nova/policy.py:36
msgid "Rule checked when requested rule is not found"
msgstr ""
-#: nova/quota.py:726
+#: nova/quota.py:721
#, python-format
msgid "Created reservations %(reservations)s"
msgstr ""
-#: nova/quota.py:745
+#: nova/quota.py:740
#, python-format
msgid "Failed to commit reservations %(reservations)s"
msgstr ""
-#: nova/quota.py:763
+#: nova/quota.py:758
#, python-format
msgid "Failed to roll back reservations %(reservations)s"
msgstr ""
-#: nova/service.py:170
-msgid "Full set of FLAGS:"
+#: nova/service.py:171
+msgid "Full set of CONF:"
msgstr ""
-#: nova/service.py:177
+#: nova/service.py:178
#, python-format
msgid "%(flag)s : FLAG SET "
msgstr ""
-#: nova/service.py:187 nova/service.py:285
+#: nova/service.py:188 nova/service.py:286
#, python-format
msgid "Caught %s, exiting"
msgstr ""
-#: nova/service.py:231
+#: nova/service.py:232
msgid "Parent process has died unexpectedly, exiting"
msgstr ""
-#: nova/service.py:267
+#: nova/service.py:268
msgid "Forking too fast, sleeping"
msgstr ""
-#: nova/service.py:290
+#: nova/service.py:291
msgid "Unhandled exception"
msgstr ""
-#: nova/service.py:297
+#: nova/service.py:298
#, python-format
msgid "Started child %d"
msgstr ""
-#: nova/service.py:307
+#: nova/service.py:308
#, python-format
msgid "Starting %d workers"
msgstr ""
-#: nova/service.py:321
+#: nova/service.py:322
#, python-format
msgid "Child %(pid)d killed by signal %(sig)d"
msgstr ""
-#: nova/service.py:324
+#: nova/service.py:325
#, python-format
msgid "Child %(pid)d exited with status %(code)d"
msgstr ""
-#: nova/service.py:327
+#: nova/service.py:328
#, python-format
msgid "pid %d not in child list"
msgstr ""
-#: nova/service.py:347
+#: nova/service.py:348
#, python-format
msgid "Caught %s, stopping children"
msgstr ""
-#: nova/service.py:358
+#: nova/service.py:359
#, python-format
msgid "Waiting on %d children to exit"
msgstr ""
-#: nova/service.py:387
+#: nova/service.py:388
#, python-format
msgid "Starting %(topic)s node (version %(vcs_string)s)"
msgstr ""
-#: nova/service.py:403
+#: nova/service.py:404
#, python-format
msgid "Creating Consumer connection for Service %s"
msgstr ""
-#: nova/service.py:495
+#: nova/service.py:496
msgid "Service killed that has no database entry"
msgstr ""
-#: nova/service.py:532
+#: nova/service.py:533
msgid "The service database object disappeared, Recreating it."
msgstr ""
-#: nova/service.py:547
+#: nova/service.py:548
msgid "Recovered model server connection!"
msgstr ""
-#: nova/service.py:553
+#: nova/service.py:554
msgid "model server went away"
msgstr ""
-#: nova/service.py:644
+#: nova/service.py:645
msgid "serve() can only be called once"
msgstr ""
@@ -1354,101 +1359,101 @@ msgstr ""
msgid "Running cmd (subprocess): %s"
msgstr ""
-#: nova/utils.py:197 nova/utils.py:275 nova/virt/powervm/common.py:82
+#: nova/utils.py:205 nova/utils.py:283 nova/virt/powervm/common.py:82
#, python-format
msgid "Result was %s"
msgstr ""
-#: nova/utils.py:210
+#: nova/utils.py:218
#, python-format
msgid "%r failed. Retrying."
msgstr ""
-#: nova/utils.py:250
+#: nova/utils.py:258
#, python-format
msgid "Running cmd (SSH): %s"
msgstr ""
-#: nova/utils.py:252
+#: nova/utils.py:260
msgid "Environment not supported over SSH"
msgstr ""
-#: nova/utils.py:256
+#: nova/utils.py:264
msgid "process_input not supported over SSH"
msgstr ""
-#: nova/utils.py:291
+#: nova/utils.py:299
#, python-format
msgid "debug in callback: %s"
msgstr ""
-#: nova/utils.py:450
+#: nova/utils.py:458
#, python-format
msgid "Link Local address is not found.:%s"
msgstr ""
-#: nova/utils.py:453
+#: nova/utils.py:461
#, python-format
msgid "Couldn't get Link Local IP of %(interface)s :%(ex)s"
msgstr ""
-#: nova/utils.py:488
+#: nova/utils.py:496
#, python-format
msgid "Invalid backend: %s"
msgstr ""
-#: nova/utils.py:549
+#: nova/utils.py:557
msgid "in looping call"
msgstr ""
-#: nova/utils.py:609
+#: nova/utils.py:617
#, python-format
msgid "Unknown byte multiplier: %s"
msgstr ""
-#: nova/utils.py:738
+#: nova/utils.py:746
#, python-format
msgid "Expected object of type: %s"
msgstr ""
-#: nova/utils.py:767
+#: nova/utils.py:775
#, python-format
msgid "Invalid server_string: %s"
msgstr ""
-#: nova/utils.py:895
+#: nova/utils.py:903
#, python-format
msgid "timefunc: '%(name)s' took %(total_time).2f secs"
msgstr ""
-#: nova/utils.py:973
+#: nova/utils.py:981
#, python-format
msgid "Reloading cached file %s"
msgstr ""
-#: nova/utils.py:1091 nova/virt/configdrive.py:151
+#: nova/utils.py:1099 nova/virt/configdrive.py:152
#, python-format
msgid "Could not remove tmpdir: %s"
msgstr ""
-#: nova/wsgi.py:85
+#: nova/wsgi.py:86
#, python-format
msgid "%(name)s listening on %(host)s:%(port)s"
msgstr ""
-#: nova/wsgi.py:109
+#: nova/wsgi.py:110
msgid "Stopping WSGI server."
msgstr ""
-#: nova/wsgi.py:127
+#: nova/wsgi.py:128
msgid "WSGI server has stopped."
msgstr ""
-#: nova/wsgi.py:196
+#: nova/wsgi.py:197
msgid "You must implement __call__"
msgstr ""
-#: nova/wsgi.py:382
+#: nova/wsgi.py:383
#, python-format
msgid "Loading app %(name)s from %(path)s"
msgstr ""
@@ -1693,149 +1698,149 @@ msgid "Detach Volume Failed."
msgstr ""
#: nova/api/ec2/cloud.py:865 nova/api/ec2/cloud.py:922
-#: nova/api/ec2/cloud.py:1459 nova/api/ec2/cloud.py:1474
+#: nova/api/ec2/cloud.py:1458 nova/api/ec2/cloud.py:1473
#, python-format
msgid "attribute not supported: %s"
msgstr ""
-#: nova/api/ec2/cloud.py:988
+#: nova/api/ec2/cloud.py:987
#, python-format
msgid "vol = %s\n"
msgstr ""
-#: nova/api/ec2/cloud.py:1139
+#: nova/api/ec2/cloud.py:1138
msgid "Allocate address"
msgstr ""
-#: nova/api/ec2/cloud.py:1143
+#: nova/api/ec2/cloud.py:1142
msgid "No more floating IPs available"
msgstr ""
-#: nova/api/ec2/cloud.py:1147
+#: nova/api/ec2/cloud.py:1146
#, python-format
msgid "Release address %s"
msgstr ""
-#: nova/api/ec2/cloud.py:1152
+#: nova/api/ec2/cloud.py:1151
msgid "Unable to release IP Address."
msgstr ""
-#: nova/api/ec2/cloud.py:1155
+#: nova/api/ec2/cloud.py:1154
#, python-format
msgid "Associate address %(public_ip)s to instance %(instance_id)s"
msgstr ""
-#: nova/api/ec2/cloud.py:1163
+#: nova/api/ec2/cloud.py:1162
msgid "Unable to associate IP Address, no fixed_ips."
msgstr ""
-#: nova/api/ec2/cloud.py:1171
+#: nova/api/ec2/cloud.py:1170
#: nova/api/openstack/compute/contrib/floating_ips.py:257
#, python-format
msgid "multiple fixed_ips exist, using the first: %s"
msgstr ""
-#: nova/api/ec2/cloud.py:1180
+#: nova/api/ec2/cloud.py:1179
msgid "Floating ip is already associated."
msgstr ""
-#: nova/api/ec2/cloud.py:1183
+#: nova/api/ec2/cloud.py:1182
msgid "l3driver call to add floating ip failed."
msgstr ""
-#: nova/api/ec2/cloud.py:1186
+#: nova/api/ec2/cloud.py:1185
msgid "Error, unable to associate floating ip."
msgstr ""
-#: nova/api/ec2/cloud.py:1194
+#: nova/api/ec2/cloud.py:1193
#, python-format
msgid "Disassociate address %s"
msgstr ""
-#: nova/api/ec2/cloud.py:1199
+#: nova/api/ec2/cloud.py:1198
msgid "Floating ip is not associated."
msgstr ""
-#: nova/api/ec2/cloud.py:1202
+#: nova/api/ec2/cloud.py:1201
#: nova/api/openstack/compute/contrib/floating_ips.py:100
msgid "Cannot disassociate auto assigned floating ip"
msgstr ""
-#: nova/api/ec2/cloud.py:1229
+#: nova/api/ec2/cloud.py:1228
msgid "Image must be available"
msgstr ""
-#: nova/api/ec2/cloud.py:1261
+#: nova/api/ec2/cloud.py:1260
msgid "Going to start terminating instances"
msgstr ""
-#: nova/api/ec2/cloud.py:1271
+#: nova/api/ec2/cloud.py:1270
#, python-format
msgid "Reboot instance %r"
msgstr ""
-#: nova/api/ec2/cloud.py:1280
+#: nova/api/ec2/cloud.py:1279
msgid "Going to stop instances"
msgstr ""
-#: nova/api/ec2/cloud.py:1289
+#: nova/api/ec2/cloud.py:1288
msgid "Going to start instances"
msgstr ""
-#: nova/api/ec2/cloud.py:1380
+#: nova/api/ec2/cloud.py:1379
#, python-format
msgid "De-registering image %s"
msgstr ""
-#: nova/api/ec2/cloud.py:1396
+#: nova/api/ec2/cloud.py:1395
msgid "imageLocation is required"
msgstr ""
-#: nova/api/ec2/cloud.py:1415
+#: nova/api/ec2/cloud.py:1414
#, python-format
msgid "Registered image %(image_location)s with id %(image_id)s"
msgstr ""
-#: nova/api/ec2/cloud.py:1477
+#: nova/api/ec2/cloud.py:1476
msgid "user or group not specified"
msgstr ""
-#: nova/api/ec2/cloud.py:1479
+#: nova/api/ec2/cloud.py:1478
msgid "only group \"all\" is supported"
msgstr ""
-#: nova/api/ec2/cloud.py:1481
+#: nova/api/ec2/cloud.py:1480
msgid "operation_type must be add or remove"
msgstr ""
-#: nova/api/ec2/cloud.py:1483
+#: nova/api/ec2/cloud.py:1482
#, python-format
msgid "Updating image %s publicity"
msgstr ""
-#: nova/api/ec2/cloud.py:1496
+#: nova/api/ec2/cloud.py:1495
#, python-format
msgid "Not allowed to modify attributes for image %s"
msgstr ""
-#: nova/api/ec2/cloud.py:1525
+#: nova/api/ec2/cloud.py:1524
#, python-format
msgid ""
"Invalid value '%(ec2_instance_id)s' for instanceId. Instance does not "
"have a volume attached at root (%(root)s)"
msgstr ""
-#: nova/api/ec2/cloud.py:1555
+#: nova/api/ec2/cloud.py:1554
#, python-format
msgid "Couldn't stop instance with in %d sec"
msgstr ""
-#: nova/api/ec2/cloud.py:1573
+#: nova/api/ec2/cloud.py:1572
#, python-format
msgid "image of %(instance)s at %(now)s"
msgstr ""
-#: nova/api/ec2/cloud.py:1606
+#: nova/api/ec2/cloud.py:1605
msgid "Invalid CIDR"
msgstr ""
@@ -1862,23 +1867,23 @@ msgstr ""
msgid "%(url)s returned with HTTP %(status)d"
msgstr ""
-#: nova/api/openstack/__init__.py:126
+#: nova/api/openstack/__init__.py:135
msgid "Must specify an ExtensionManager class"
msgstr ""
-#: nova/api/openstack/__init__.py:137
+#: nova/api/openstack/__init__.py:146
#, python-format
msgid "Extended resource: %s"
msgstr ""
-#: nova/api/openstack/__init__.py:171
+#: nova/api/openstack/__init__.py:180
#, python-format
msgid ""
"Extension %(ext_name)s: Cannot extend resource %(collection)s: No such "
"resource"
msgstr ""
-#: nova/api/openstack/__init__.py:176
+#: nova/api/openstack/__init__.py:185
#, python-format
msgid "Extension %(ext_name)s extending resource: %(collection)s"
msgstr ""
@@ -2850,7 +2855,7 @@ msgstr ""
msgid "Netmask to push into openvpn config"
msgstr ""
-#: nova/cloudpipe/pipelib.py:109
+#: nova/cloudpipe/pipelib.py:106
#, python-format
msgid "Launching VPN for %s"
msgstr ""
@@ -2863,879 +2868,853 @@ msgstr ""
msgid "Unknown sort direction, must be 'desc' or 'asc'"
msgstr ""
-#: nova/compute/api.py:224
+#: nova/compute/api.py:223
msgid "Cannot run any more instances of this type."
msgstr ""
-#: nova/compute/api.py:231
+#: nova/compute/api.py:230
#, python-format
msgid "Can only run %s more instances of this type."
msgstr ""
-#: nova/compute/api.py:240
+#: nova/compute/api.py:239
#, python-format
msgid ""
"%(overs)s quota exceeded for %(pid)s, tried to run %(min_count)s "
"instances. %(msg)s"
msgstr ""
-#: nova/compute/api.py:260
+#: nova/compute/api.py:259
#, python-format
msgid ""
"Quota exceeded for %(pid)s, tried to set %(num_metadata)s metadata "
"properties"
msgstr ""
-#: nova/compute/api.py:270
+#: nova/compute/api.py:269
msgid "Metadata property key blank"
msgstr ""
-#: nova/compute/api.py:274
+#: nova/compute/api.py:273
msgid "Metadata property key greater than 255 characters"
msgstr ""
-#: nova/compute/api.py:278
+#: nova/compute/api.py:277
msgid "Metadata property value greater than 255 characters"
msgstr ""
-#: nova/compute/api.py:502
+#: nova/compute/api.py:501
#, python-format
msgid "Going to run %s instances..."
msgstr ""
-#: nova/compute/api.py:574
+#: nova/compute/api.py:573
#, python-format
msgid "bdm %s"
msgstr ""
-#: nova/compute/api.py:601
+#: nova/compute/api.py:600
#, python-format
msgid "block_device_mapping %s"
msgstr ""
-#: nova/compute/api.py:833
-msgid "Going to try to soft delete instance"
+#: nova/compute/api.py:829
+msgid "instance termination disabled"
msgstr ""
-#: nova/compute/api.py:850
-msgid "No host for instance, deleting immediately"
+#: nova/compute/api.py:924
+msgid "host for instance is down, deleting from database"
msgstr ""
-#: nova/compute/api.py:950
-msgid "host for instance is down, deleting from database"
+#: nova/compute/api.py:968
+msgid "Going to try to soft delete instance"
msgstr ""
-#: nova/compute/api.py:994
+#: nova/compute/api.py:990
msgid "Going to try to terminate instance"
msgstr ""
-#: nova/compute/api.py:1034
+#: nova/compute/api.py:1037
msgid "Going to try to stop instance"
msgstr ""
-#: nova/compute/api.py:1048
+#: nova/compute/api.py:1051
msgid "Going to try to start instance"
msgstr ""
-#: nova/compute/api.py:1112
+#: nova/compute/api.py:1115
#, python-format
msgid "Searching by: %s"
msgstr ""
-#: nova/compute/api.py:1247
+#: nova/compute/api.py:1250
#, python-format
msgid "Image type not recognized %s"
msgstr ""
-#: nova/compute/api.py:1356
+#: nova/compute/api.py:1359
#, python-format
msgid "snapshot for %s"
msgstr ""
-#: nova/compute/api.py:1678
+#: nova/compute/api.py:1681
msgid "flavor_id is None. Assuming migration."
msgstr ""
-#: nova/compute/api.py:1687
+#: nova/compute/api.py:1690
#, python-format
msgid ""
"Old instance type %(current_instance_type_name)s, new instance type "
"%(new_instance_type_name)s"
msgstr ""
-#: nova/compute/api.py:1729
+#: nova/compute/api.py:1732
#, python-format
msgid "%(overs)s quota exceeded for %(pid)s, tried to resize instance. %(msg)s"
msgstr ""
-#: nova/compute/api.py:1901
+#: nova/compute/api.py:1904
msgid "Locking"
msgstr ""
-#: nova/compute/api.py:1909
+#: nova/compute/api.py:1912
msgid "Unlocking"
msgstr ""
-#: nova/compute/api.py:1977
+#: nova/compute/api.py:1980
msgid "Volume must be attached in order to detach."
msgstr ""
-#: nova/compute/api.py:2062
+#: nova/compute/api.py:2065
#, python-format
msgid "Going to try to live migrate instance to %s"
msgstr ""
-#: nova/compute/api.py:2211
+#: nova/compute/api.py:2215
msgid "Keypair name contains unsafe characters"
msgstr ""
-#: nova/compute/api.py:2215
+#: nova/compute/api.py:2219
msgid "Keypair name must be between 1 and 255 characters long"
msgstr ""
-#: nova/compute/api.py:2316
+#: nova/compute/api.py:2320
#, python-format
msgid "Security group %s is not a string or unicode"
msgstr ""
-#: nova/compute/api.py:2319
+#: nova/compute/api.py:2323
#, python-format
msgid "Security group %s cannot be empty."
msgstr ""
-#: nova/compute/api.py:2327
+#: nova/compute/api.py:2331
#, python-format
msgid ""
"Value (%(value)s) for parameter Group%(property)s is invalid. Content "
"limited to '%(allowed)'."
msgstr ""
-#: nova/compute/api.py:2333
+#: nova/compute/api.py:2337
#, python-format
msgid "Security group %s should not be greater than 255 characters."
msgstr ""
-#: nova/compute/api.py:2353
+#: nova/compute/api.py:2357
msgid "Quota exceeded, too many security groups."
msgstr ""
-#: nova/compute/api.py:2356
+#: nova/compute/api.py:2360
#, python-format
msgid "Create Security Group %s"
msgstr ""
-#: nova/compute/api.py:2363
+#: nova/compute/api.py:2367
#, python-format
msgid "Security group %s already exists"
msgstr ""
-#: nova/compute/api.py:2428
+#: nova/compute/api.py:2432
msgid "Security group is still in use"
msgstr ""
-#: nova/compute/api.py:2436
+#: nova/compute/api.py:2440
msgid "Failed to update usages deallocating security group"
msgstr ""
-#: nova/compute/api.py:2439
+#: nova/compute/api.py:2443
#, python-format
msgid "Delete security group %s"
msgstr ""
-#: nova/compute/api.py:2696
+#: nova/compute/api.py:2700
#, python-format
msgid "Rule (%s) not found"
msgstr ""
-#: nova/compute/api.py:2705
+#: nova/compute/api.py:2709
msgid "Quota exceeded, too many security group rules."
msgstr ""
-#: nova/compute/api.py:2708
+#: nova/compute/api.py:2712
#, python-format
msgid "Authorize security group ingress %s"
msgstr ""
-#: nova/compute/api.py:2719
+#: nova/compute/api.py:2723
#, python-format
msgid "Revoke security group ingress %s"
msgstr ""
-#: nova/compute/instance_types.py:63
+#: nova/compute/claims.py:92
+#, python-format
+msgid "Aborting claim: %s"
+msgstr ""
+
+#: nova/compute/claims.py:114
+#, python-format
+msgid ""
+"Attempting claim: memory %(memory_mb)d MB, disk %(disk_gb)d GB, VCPUs "
+"%(vcpus)d"
+msgstr ""
+
+#: nova/compute/claims.py:126
+msgid "Claim successful"
+msgstr ""
+
+#: nova/compute/claims.py:128
+msgid "Claim failed"
+msgstr ""
+
+#: nova/compute/claims.py:133
+msgid "Memory"
+msgstr ""
+
+#: nova/compute/claims.py:142
+msgid "Disk"
+msgstr ""
+
+#: nova/compute/claims.py:151
+msgid "CPU"
+msgstr ""
+
+#: nova/compute/claims.py:163
+#, python-format
+msgid "Total %(type_)s: %(total)d %(unit)s, used: %(used)d %(unit)s"
+msgstr ""
+
+#: nova/compute/claims.py:168
+#, python-format
+msgid "%(type_)s limit not specified, defaulting to unlimited"
+msgstr ""
+
+#: nova/compute/claims.py:175
+#, python-format
+msgid "%(type_)s limit: %(limit)d %(unit)s, free: %(free)d %(unit)s"
+msgstr ""
+
+#: nova/compute/claims.py:182
+#, python-format
+msgid ""
+"Unable to claim resources. Free %(type_)s %(free)d %(unit)s < requested "
+"%(requested)d %(unit)s"
+msgstr ""
+
+#: nova/compute/instance_types.py:64
msgid "names can only contain [a-zA-Z0-9_.- ]"
msgstr ""
-#: nova/compute/instance_types.py:72 nova/compute/instance_types.py:80
+#: nova/compute/instance_types.py:73 nova/compute/instance_types.py:81
msgid "create arguments must be positive integers"
msgstr ""
-#: nova/compute/instance_types.py:94
+#: nova/compute/instance_types.py:91
+msgid "is_public must be a boolean"
+msgstr ""
+
+#: nova/compute/instance_types.py:98
#, python-format
msgid "DB error: %s"
msgstr ""
-#: nova/compute/instance_types.py:104
+#: nova/compute/instance_types.py:108
#, python-format
msgid "Instance type %s not found for deletion"
msgstr ""
-#: nova/compute/manager.py:163
+#: nova/compute/manager.py:164
msgid "Possibly task preempted."
msgstr ""
-#: nova/compute/manager.py:243
+#: nova/compute/manager.py:278
msgid "Compute driver option required, but not specified"
msgstr ""
-#: nova/compute/manager.py:248
+#: nova/compute/manager.py:283
#, python-format
msgid "Loading compute driver '%s'"
msgstr ""
-#: nova/compute/manager.py:255
+#: nova/compute/manager.py:290
#, python-format
msgid "Unable to load the virtualization driver: %s"
msgstr ""
-#: nova/compute/manager.py:290
+#: nova/compute/manager.py:334
msgid "Instance has been destroyed from under us while trying to set it to ERROR"
msgstr ""
-#: nova/compute/manager.py:318
+#: nova/compute/manager.py:362
#, python-format
msgid "Current state is %(drv_state)s, state in DB is %(db_state)s."
msgstr ""
-#: nova/compute/manager.py:332
+#: nova/compute/manager.py:376
msgid "Rebooting instance after nova-compute restart."
msgstr ""
-#: nova/compute/manager.py:346
+#: nova/compute/manager.py:390
msgid "Hypervisor driver does not support resume guests"
msgstr ""
-#: nova/compute/manager.py:356
+#: nova/compute/manager.py:400
msgid "Hypervisor driver does not support firewall rules"
msgstr ""
-#: nova/compute/manager.py:375
+#: nova/compute/manager.py:419
msgid "Checking state"
msgstr ""
-#: nova/compute/manager.py:448
+#: nova/compute/manager.py:492
#, python-format
msgid "Setting up bdm %s"
msgstr ""
-#: nova/compute/manager.py:541
+#: nova/compute/manager.py:585
msgid "Failed to dealloc network for deleted instance"
msgstr ""
-#: nova/compute/manager.py:564
+#: nova/compute/manager.py:608
#, python-format
msgid "Error: %s"
msgstr ""
-#: nova/compute/manager.py:597 nova/compute/manager.py:1743
+#: nova/compute/manager.py:641 nova/compute/manager.py:1782
msgid "Error trying to reschedule"
msgstr ""
-#: nova/compute/manager.py:614
+#: nova/compute/manager.py:658
msgid "Retry info not present, will not reschedule"
msgstr ""
-#: nova/compute/manager.py:619
+#: nova/compute/manager.py:663
msgid "No request spec, will not reschedule"
msgstr ""
-#: nova/compute/manager.py:625
+#: nova/compute/manager.py:669
#, python-format
msgid "Re-scheduling %(method)s: attempt %(num)d"
msgstr ""
-#: nova/compute/manager.py:648
+#: nova/compute/manager.py:692
msgid "Instance build timed out. Set to error state."
msgstr ""
-#: nova/compute/manager.py:679
+#: nova/compute/manager.py:723
msgid "Instance has already been created"
msgstr ""
-#: nova/compute/manager.py:722
+#: nova/compute/manager.py:766
#, python-format
msgid ""
"image_id=%(image_id)s, image_size_bytes=%(size_bytes)d, "
"allowed_size_bytes=%(allowed_size_bytes)d"
msgstr ""
-#: nova/compute/manager.py:728
+#: nova/compute/manager.py:772
#, python-format
msgid ""
"Image '%(image_id)s' size %(size_bytes)d exceeded instance_type allowed "
"size %(allowed_size_bytes)d"
msgstr ""
-#: nova/compute/manager.py:738
+#: nova/compute/manager.py:782
msgid "Starting instance..."
msgstr ""
-#: nova/compute/manager.py:759
+#: nova/compute/manager.py:803
msgid "Instance failed network setup"
msgstr ""
-#: nova/compute/manager.py:763
+#: nova/compute/manager.py:807
#, python-format
msgid "Instance network_info: |%s|"
msgstr ""
-#: nova/compute/manager.py:776
+#: nova/compute/manager.py:820
msgid "Instance failed block device setup"
msgstr ""
-#: nova/compute/manager.py:794
+#: nova/compute/manager.py:838
msgid "Instance failed to spawn"
msgstr ""
-#: nova/compute/manager.py:818
+#: nova/compute/manager.py:862
msgid "Deallocating network for instance"
msgstr ""
-#: nova/compute/manager.py:890
+#: nova/compute/manager.py:934
#, python-format
msgid "%(action_str)s instance"
msgstr ""
-#: nova/compute/manager.py:921
+#: nova/compute/manager.py:965
#, python-format
msgid "Ignoring DiskNotFound: %s"
msgstr ""
-#: nova/compute/manager.py:924
+#: nova/compute/manager.py:968
#, python-format
msgid "Ignoring VolumeNotFound: %s"
msgstr ""
-#: nova/compute/manager.py:931
+#: nova/compute/manager.py:975
#, python-format
msgid "terminating bdm %s"
msgstr ""
-#: nova/compute/manager.py:955
+#: nova/compute/manager.py:999
#, python-format
msgid "Ignoring volume cleanup failure due to %s"
msgstr ""
-#: nova/compute/manager.py:995 nova/compute/manager.py:1912
-#: nova/compute/manager.py:3112
+#: nova/compute/manager.py:1039 nova/compute/manager.py:1953
+#: nova/compute/manager.py:3162
#, python-format
msgid "%s. Setting instance vm_state to ERROR"
msgstr ""
-#: nova/compute/manager.py:1128
+#: nova/compute/manager.py:1172
msgid "Rebuilding instance"
msgstr ""
-#: nova/compute/manager.py:1207
+#: nova/compute/manager.py:1251
msgid "Rebooting instance"
msgstr ""
-#: nova/compute/manager.py:1231
+#: nova/compute/manager.py:1275
#, python-format
msgid ""
"trying to reboot a non-running instance: (state: %(state)s expected: "
"%(running)s)"
msgstr ""
-#: nova/compute/manager.py:1240
+#: nova/compute/manager.py:1284
#, python-format
msgid "Cannot reboot instance: %(exc)s"
msgstr ""
-#: nova/compute/manager.py:1277
+#: nova/compute/manager.py:1321
msgid "instance snapshotting"
msgstr ""
-#: nova/compute/manager.py:1283
+#: nova/compute/manager.py:1327
#, python-format
msgid ""
"trying to snapshot a non-running instance: (state: %(state)s expected: "
"%(running)s)"
msgstr ""
-#: nova/compute/manager.py:1336
+#: nova/compute/manager.py:1380
#, python-format
msgid "Found %(num_images)d images (rotation: %(rotation)d)"
msgstr ""
-#: nova/compute/manager.py:1343
+#: nova/compute/manager.py:1387
#, python-format
msgid "Rotating out %d backups"
msgstr ""
-#: nova/compute/manager.py:1348
+#: nova/compute/manager.py:1392
#, python-format
msgid "Deleting image %s"
msgstr ""
-#: nova/compute/manager.py:1379
+#: nova/compute/manager.py:1423
#, python-format
msgid "Failed to set admin password. Instance %s is not running"
msgstr ""
-#: nova/compute/manager.py:1386
+#: nova/compute/manager.py:1430
msgid "Root password set"
msgstr ""
-#: nova/compute/manager.py:1396
+#: nova/compute/manager.py:1440
msgid "set_admin_password is not implemented by this driver."
msgstr ""
-#: nova/compute/manager.py:1412
+#: nova/compute/manager.py:1456
#, python-format
msgid "set_admin_password failed: %s"
msgstr ""
-#: nova/compute/manager.py:1420
+#: nova/compute/manager.py:1464
msgid "error setting admin password"
msgstr ""
-#: nova/compute/manager.py:1435
+#: nova/compute/manager.py:1479
#, python-format
msgid ""
"trying to inject a file into a non-running (state: "
"%(current_power_state)s expected: %(expected_state)s)"
msgstr ""
-#: nova/compute/manager.py:1439
+#: nova/compute/manager.py:1483
#, python-format
msgid "injecting file to %(path)s"
msgstr ""
-#: nova/compute/manager.py:1452
+#: nova/compute/manager.py:1496
msgid "Rescuing"
msgstr ""
-#: nova/compute/manager.py:1479
+#: nova/compute/manager.py:1523
msgid "Unrescuing"
msgstr ""
-#: nova/compute/manager.py:1500
+#: nova/compute/manager.py:1544
#, python-format
msgid "Changing instance metadata according to %(diff)r"
msgstr ""
-#: nova/compute/manager.py:1680
+#: nova/compute/manager.py:1724
msgid "destination same as source!"
msgstr ""
-#: nova/compute/manager.py:1699
+#: nova/compute/manager.py:1738
msgid "Migrating"
msgstr ""
-#: nova/compute/manager.py:1909
+#: nova/compute/manager.py:1950
#, python-format
msgid "Failed to rollback quota for failed finish_resize: %(qr_error)s"
msgstr ""
-#: nova/compute/manager.py:1965
+#: nova/compute/manager.py:2006
msgid "Pausing"
msgstr ""
-#: nova/compute/manager.py:1982
+#: nova/compute/manager.py:2023
msgid "Unpausing"
msgstr ""
-#: nova/compute/manager.py:2020
+#: nova/compute/manager.py:2061
msgid "Retrieving diagnostics"
msgstr ""
-#: nova/compute/manager.py:2050
+#: nova/compute/manager.py:2091
msgid "Resuming"
msgstr ""
-#: nova/compute/manager.py:2066
+#: nova/compute/manager.py:2107
msgid "Reset network"
msgstr ""
-#: nova/compute/manager.py:2071
+#: nova/compute/manager.py:2112
msgid "Inject network info"
msgstr ""
-#: nova/compute/manager.py:2074
+#: nova/compute/manager.py:2115
#, python-format
msgid "network_info to inject: |%s|"
msgstr ""
-#: nova/compute/manager.py:2091
+#: nova/compute/manager.py:2132
msgid "Get console output"
msgstr ""
-#: nova/compute/manager.py:2116
+#: nova/compute/manager.py:2157
msgid "Getting vnc console"
msgstr ""
-#: nova/compute/manager.py:2144
+#: nova/compute/manager.py:2185
#, python-format
msgid "Booting with volume %(volume_id)s at %(mountpoint)s"
msgstr ""
-#: nova/compute/manager.py:2188
+#: nova/compute/manager.py:2229
#, python-format
msgid "Attaching volume %(volume_id)s to %(mountpoint)s"
msgstr ""
-#: nova/compute/manager.py:2197
+#: nova/compute/manager.py:2238
#, python-format
msgid ""
"Failed to connect to volume %(volume_id)s while attaching at "
"%(mountpoint)s"
msgstr ""
-#: nova/compute/manager.py:2212
+#: nova/compute/manager.py:2253
#, python-format
msgid "Failed to attach volume %(volume_id)s at %(mountpoint)s"
msgstr ""
-#: nova/compute/manager.py:2241
+#: nova/compute/manager.py:2282
#, python-format
msgid "Detach volume %(volume_id)s from mountpoint %(mp)s"
msgstr ""
-#: nova/compute/manager.py:2245
+#: nova/compute/manager.py:2286
msgid "Detaching volume from unknown instance"
msgstr ""
-#: nova/compute/manager.py:2258
+#: nova/compute/manager.py:2299
#, python-format
msgid "Faild to detach volume %(volume_id)s from %(mp)s"
msgstr ""
-#: nova/compute/manager.py:2302
+#: nova/compute/manager.py:2343
#, python-format
msgid "Host %(host)s not found"
msgstr ""
-#: nova/compute/manager.py:2362
+#: nova/compute/manager.py:2403
msgid "Instance has no volume."
msgstr ""
-#: nova/compute/manager.py:2422
+#: nova/compute/manager.py:2463
#, python-format
msgid "Pre live migration failed at %(dest)s"
msgstr ""
-#: nova/compute/manager.py:2448
+#: nova/compute/manager.py:2489
msgid "_post_live_migration() is started.."
msgstr ""
-#: nova/compute/manager.py:2481
+#: nova/compute/manager.py:2522
msgid "No floating_ip found"
msgstr ""
-#: nova/compute/manager.py:2489
+#: nova/compute/manager.py:2530
msgid "No floating_ip found."
msgstr ""
-#: nova/compute/manager.py:2491
+#: nova/compute/manager.py:2532
#, python-format
msgid ""
"Live migration: Unexpected error: cannot inherit floating ip.\n"
"%(e)s"
msgstr ""
-#: nova/compute/manager.py:2517
+#: nova/compute/manager.py:2558
#, python-format
msgid "Migrating instance to %(dest)s finished successfully."
msgstr ""
-#: nova/compute/manager.py:2519
+#: nova/compute/manager.py:2560
msgid ""
"You may see the error \"libvirt: QEMU error: Domain not found: no domain "
"with matching name.\" This error can be safely ignored."
msgstr ""
-#: nova/compute/manager.py:2533
+#: nova/compute/manager.py:2574
msgid "Post operation of migration started"
msgstr ""
-#: nova/compute/manager.py:2664
+#: nova/compute/manager.py:2705
msgid "Updated the info_cache for instance"
msgstr ""
-#: nova/compute/manager.py:2693
+#: nova/compute/manager.py:2734
#, python-format
msgid ""
"Found %(migration_count)d unconfirmed migrations older than "
"%(confirm_window)d seconds"
msgstr ""
-#: nova/compute/manager.py:2698
+#: nova/compute/manager.py:2739
#, python-format
msgid "Setting migration %(migration_id)s to error: %(reason)s"
msgstr ""
-#: nova/compute/manager.py:2707
+#: nova/compute/manager.py:2748
#, python-format
msgid ""
"Automatically confirming migration %(migration_id)s for instance "
"%(instance_uuid)s"
msgstr ""
-#: nova/compute/manager.py:2714
+#: nova/compute/manager.py:2755
#, python-format
msgid "Instance %(instance_uuid)s not found"
msgstr ""
-#: nova/compute/manager.py:2718
+#: nova/compute/manager.py:2759
msgid "In ERROR state"
msgstr ""
-#: nova/compute/manager.py:2725
+#: nova/compute/manager.py:2766
#, python-format
msgid "In states %(vm_state)s/%(task_state)s, notRESIZED/None"
msgstr ""
-#: nova/compute/manager.py:2733
+#: nova/compute/manager.py:2774
#, python-format
msgid "Error auto-confirming resize: %(e)s. Will retry later."
msgstr ""
-#: nova/compute/manager.py:2750
+#: nova/compute/manager.py:2791
#, python-format
msgid ""
"Running instance usage audit for host %(host)s from %(begin_time)s to "
"%(end_time)s. %(number_instances)s instances."
msgstr ""
-#: nova/compute/manager.py:2768
+#: nova/compute/manager.py:2809
#, python-format
msgid "Failed to generate usage audit for instance on host %s"
msgstr ""
-#: nova/compute/manager.py:2791
+#: nova/compute/manager.py:2832
msgid "Updating bandwidth usage cache"
msgstr ""
-#: nova/compute/manager.py:2856
+#: nova/compute/manager.py:2898
msgid "Updating host status"
msgstr ""
-#: nova/compute/manager.py:2882
+#: nova/compute/manager.py:2926
#, python-format
msgid ""
"Found %(num_db_instances)s in the database and %(num_vm_instances)s on "
"the hypervisor."
msgstr ""
-#: nova/compute/manager.py:2888 nova/compute/manager.py:2926
+#: nova/compute/manager.py:2932 nova/compute/manager.py:2970
msgid "During sync_power_state the instance has a pending task. Skip."
msgstr ""
-#: nova/compute/manager.py:2913
+#: nova/compute/manager.py:2957
#, python-format
msgid ""
"During the sync_power process the instance has moved from host %(src)s to"
" host %(dst)s"
msgstr ""
-#: nova/compute/manager.py:2950
+#: nova/compute/manager.py:2994
msgid "Instance shutdown by itself. Calling the stop API."
msgstr ""
-#: nova/compute/manager.py:2962 nova/compute/manager.py:2973
-#: nova/compute/manager.py:2987
+#: nova/compute/manager.py:3006 nova/compute/manager.py:3017
+#: nova/compute/manager.py:3031
msgid "error during stop() in sync_power_state."
msgstr ""
-#: nova/compute/manager.py:2967
+#: nova/compute/manager.py:3011
msgid "Instance is paused or suspended unexpectedly. Calling the stop API."
msgstr ""
-#: nova/compute/manager.py:2980
+#: nova/compute/manager.py:3024
msgid "Instance is not stopped. Calling the stop API."
msgstr ""
-#: nova/compute/manager.py:2996
+#: nova/compute/manager.py:3040
msgid "Instance is not (soft-)deleted."
msgstr ""
-#: nova/compute/manager.py:3004
-msgid "FLAGS.reclaim_instance_interval <= 0, skipping..."
+#: nova/compute/manager.py:3048
+msgid "CONF.reclaim_instance_interval <= 0, skipping..."
msgstr ""
-#: nova/compute/manager.py:3017
+#: nova/compute/manager.py:3061
msgid "Reclaiming deleted instance"
msgstr ""
-#: nova/compute/manager.py:3066
+#: nova/compute/manager.py:3116
#, python-format
msgid ""
"Detected instance with name label '%(name)s' which is marked as DELETED "
"but still present on host."
msgstr ""
-#: nova/compute/manager.py:3073
+#: nova/compute/manager.py:3123
#, python-format
msgid ""
"Destroying instance with name label '%(name)s' which is marked as DELETED"
" but still present on host."
msgstr ""
-#: nova/compute/manager.py:3080
+#: nova/compute/manager.py:3130
#, python-format
-msgid "Unrecognized value '%(action)s' for FLAGS.running_deleted_instance_action"
+msgid "Unrecognized value '%(action)s' for CONF.running_deleted_instance_action"
msgstr ""
-#: nova/compute/resource_tracker.py:151
+#: nova/compute/resource_tracker.py:91
msgid ""
"Host field should be not be set on the instance until resources have been"
" claimed."
msgstr ""
-#: nova/compute/resource_tracker.py:168
-#, python-format
-msgid ""
-"Attempting claim: memory %(memory_mb)d MB, disk %(disk_gb)d GB, VCPUs "
-"%(vcpus)d"
-msgstr ""
-
-#: nova/compute/resource_tracker.py:210
-#, python-format
-msgid ""
-"Total memory: %(total_mem)d MB, used: %(used_mem)d MB, free: %(free_mem)d"
-" MB"
-msgstr ""
-
-#: nova/compute/resource_tracker.py:219
-msgid "Memory limit not specified, defaulting to unlimited"
-msgstr ""
-
-#: nova/compute/resource_tracker.py:225
-#, python-format
-msgid "Memory limit: %(memory_mb_limit)d MB, free: %(free_ram_mb)d MB"
-msgstr ""
-
-#: nova/compute/resource_tracker.py:232
-#, python-format
-msgid ""
-"Unable to claim resources. Free memory %(free_ram_mb)d MB < requested "
-"memory %(memory_mb)d MB"
-msgstr ""
-
-#: nova/compute/resource_tracker.py:241
-#, python-format
-msgid ""
-"Total disk: %(total_disk)d GB, used: %(used_disk)d GB, free: "
-"%(free_disk)d GB"
-msgstr ""
-
-#: nova/compute/resource_tracker.py:250
-msgid "Disk limit not specified, defaulting to unlimited"
-msgstr ""
-
-#: nova/compute/resource_tracker.py:256
-#, python-format
-msgid "Disk limit: %(disk_gb_limit)d GB, free: %(free_disk_gb)d GB"
-msgstr ""
-
-#: nova/compute/resource_tracker.py:262
-#, python-format
-msgid ""
-"Unable to claim resources. Free disk %(free_disk_gb)d GB < requested "
-"disk %(disk_gb)d GB"
-msgstr ""
-
-#: nova/compute/resource_tracker.py:273
-#, python-format
-msgid "Total VCPUs: %(total_vcpus)d, used: %(used_vcpus)d"
-msgstr ""
-
-#: nova/compute/resource_tracker.py:280
-msgid "VCPU limit not specified, defaulting to unlimited"
-msgstr ""
-
-#: nova/compute/resource_tracker.py:284
-#, python-format
-msgid "CPU limit: %(vcpu_limit)d"
-msgstr ""
-
-#: nova/compute/resource_tracker.py:291
-#, python-format
-msgid ""
-"Unable to claim resources. Free CPU %(free_vcpus)d < requested CPU "
-"%(vcpus)d"
-msgstr ""
-
-#: nova/compute/resource_tracker.py:310
-#, python-format
-msgid "Finishing claim: %s"
-msgstr ""
-
-#: nova/compute/resource_tracker.py:325
-#, python-format
-msgid "Aborting claim: %s"
-msgstr ""
-
-#: nova/compute/resource_tracker.py:363
+#: nova/compute/resource_tracker.py:165
msgid ""
"Virt driver does not support 'get_available_resource' Compute tracking "
"is disabled."
msgstr ""
-#: nova/compute/resource_tracker.py:401
+#: nova/compute/resource_tracker.py:204
#, python-format
msgid "Compute_service record created for %s "
msgstr ""
-#: nova/compute/resource_tracker.py:406
+#: nova/compute/resource_tracker.py:209
#, python-format
msgid "Compute_service record updated for %s "
msgstr ""
-#: nova/compute/resource_tracker.py:425
+#: nova/compute/resource_tracker.py:222
#, python-format
msgid "No service record for host %s"
msgstr ""
-#: nova/compute/resource_tracker.py:435
+#: nova/compute/resource_tracker.py:232
#, python-format
msgid "Hypervisor: free ram (MB): %s"
msgstr ""
-#: nova/compute/resource_tracker.py:436
+#: nova/compute/resource_tracker.py:233
#, python-format
msgid "Hypervisor: free disk (GB): %s"
msgstr ""
-#: nova/compute/resource_tracker.py:441
+#: nova/compute/resource_tracker.py:238
#, python-format
msgid "Hypervisor: free VCPUs: %s"
msgstr ""
-#: nova/compute/resource_tracker.py:443
+#: nova/compute/resource_tracker.py:240
msgid "Hypervisor: VCPU information unavailable"
msgstr ""
-#: nova/compute/resource_tracker.py:450
+#: nova/compute/resource_tracker.py:247
#, python-format
msgid "Free ram (MB): %s"
msgstr ""
-#: nova/compute/resource_tracker.py:451
+#: nova/compute/resource_tracker.py:248
#, python-format
msgid "Free disk (GB): %s"
msgstr ""
-#: nova/compute/resource_tracker.py:456
+#: nova/compute/resource_tracker.py:253
#, python-format
msgid "Free VCPUS: %s"
msgstr ""
-#: nova/compute/resource_tracker.py:458
+#: nova/compute/resource_tracker.py:255
msgid "Free VCPU information unavailable"
msgstr ""
-#: nova/compute/resource_tracker.py:533
+#: nova/compute/resource_tracker.py:330
#, python-format
msgid "Missing keys: %s"
msgstr ""
@@ -3749,122 +3728,84 @@ msgstr ""
msgid "Unable to find host for Instance %s"
msgstr ""
-#: nova/compute/utils.py:87
+#: nova/compute/utils.py:93
#, python-format
msgid "Using %(prefix)s instead of %(req_prefix)s"
msgstr ""
-#: nova/console/manager.py:81 nova/console/vmrc_manager.py:63
+#: nova/console/manager.py:82 nova/console/vmrc_manager.py:64
msgid "Adding console"
msgstr ""
-#: nova/console/manager.py:102 nova/console/vmrc_manager.py:115
+#: nova/console/manager.py:103 nova/console/vmrc_manager.py:116
#, python-format
msgid "Tried to remove non-existent console %(console_id)s."
msgstr ""
-#: nova/console/vmrc_manager.py:118
+#: nova/console/vmrc_manager.py:119
#, python-format
msgid "Removing console %(console_id)s."
msgstr ""
-#: nova/console/xvp.py:98
+#: nova/console/xvp.py:99
msgid "Rebuilding xvp conf"
msgstr ""
-#: nova/console/xvp.py:116
+#: nova/console/xvp.py:117
#, python-format
msgid "Re-wrote %s"
msgstr ""
-#: nova/console/xvp.py:121
+#: nova/console/xvp.py:122
msgid "Stopping xvp"
msgstr ""
-#: nova/console/xvp.py:134
+#: nova/console/xvp.py:135
msgid "Starting xvp"
msgstr ""
-#: nova/console/xvp.py:141
+#: nova/console/xvp.py:142
#, python-format
msgid "Error starting xvp: %s"
msgstr ""
-#: nova/console/xvp.py:144
+#: nova/console/xvp.py:145
msgid "Restarting xvp"
msgstr ""
-#: nova/console/xvp.py:146
+#: nova/console/xvp.py:147
msgid "xvp not running..."
msgstr ""
-#: nova/consoleauth/manager.py:70
+#: nova/consoleauth/manager.py:71
#, python-format
msgid "Received Token: %(token)s, %(token_dict)s)"
msgstr ""
-#: nova/consoleauth/manager.py:75
+#: nova/consoleauth/manager.py:76
#, python-format
msgid "Checking Token: %(token)s, %(token_valid)s)"
msgstr ""
-#: nova/db/sqlalchemy/api.py:208
+#: nova/db/sqlalchemy/api.py:181
#, python-format
msgid "Unrecognized read_deleted value '%s'"
msgstr ""
-#: nova/db/sqlalchemy/api.py:2792
+#: nova/db/sqlalchemy/api.py:2679
#, python-format
msgid "Change will make usage less than 0 for the following resources: %(unders)s"
msgstr ""
-#: nova/db/sqlalchemy/api.py:4693
-msgid "Backend exists"
-msgstr ""
-
-#: nova/db/sqlalchemy/api.py:4713 nova/db/sqlalchemy/api.py:4739
-#, python-format
-msgid "No backend config with id %(sm_backend_id)s"
-msgstr ""
-
-#: nova/db/sqlalchemy/api.py:4751
-#, python-format
-msgid "No backend config with sr uuid %(sr_uuid)s"
-msgstr ""
-
-#: nova/db/sqlalchemy/api.py:4785
-msgid "Flavor exists"
-msgstr ""
-
-#: nova/db/sqlalchemy/api.py:4800
-#, python-format
-msgid "%(sm_flavor_id) flavor not found"
-msgstr ""
-
-#: nova/db/sqlalchemy/api.py:4819
-#, python-format
-msgid "No sm_flavor called %(sm_flavor_id)s"
-msgstr ""
-
-#: nova/db/sqlalchemy/api.py:4836
-#, python-format
-msgid "No sm_flavor called %(sm_flavor_label)s"
-msgstr ""
-
-#: nova/db/sqlalchemy/api.py:4874
-#, python-format
-msgid "No sm_volume with id %(volume_id)s"
-msgstr ""
-
-#: nova/db/sqlalchemy/migration.py:74
+#: nova/db/sqlalchemy/migration.py:72
msgid "version should be an integer"
msgstr ""
-#: nova/db/sqlalchemy/migration.py:101
+#: nova/db/sqlalchemy/migration.py:99
msgid "Upgrade DB using Essex release first."
msgstr ""
-#: nova/db/sqlalchemy/session.py:316
+#: nova/db/sqlalchemy/session.py:317
#, python-format
msgid "SQL connection failed. %s attempts left."
msgstr ""
@@ -3938,49 +3879,49 @@ msgstr ""
msgid "user_quotas table not dropped"
msgstr ""
-#: nova/image/glance.py:143
+#: nova/image/glance.py:144
#, python-format
msgid ""
"Error contacting glance server '%(host)s:%(port)s' for '%(method)s', "
"%(extra)s."
msgstr ""
-#: nova/image/s3.py:311
+#: nova/image/s3.py:312
#, python-format
msgid "Failed to download %(image_location)s to %(image_path)s"
msgstr ""
-#: nova/image/s3.py:328
+#: nova/image/s3.py:329
#, python-format
msgid "Failed to decrypt %(image_location)s to %(image_path)s"
msgstr ""
-#: nova/image/s3.py:338
+#: nova/image/s3.py:339
#, python-format
msgid "Failed to untar %(image_location)s to %(image_path)s"
msgstr ""
-#: nova/image/s3.py:348
+#: nova/image/s3.py:349
#, python-format
msgid "Failed to upload %(image_location)s to %(image_path)s"
msgstr ""
-#: nova/image/s3.py:372
+#: nova/image/s3.py:373
#, python-format
msgid "Failed to decrypt private key: %s"
msgstr ""
-#: nova/image/s3.py:379
+#: nova/image/s3.py:380
#, python-format
msgid "Failed to decrypt initialization vector: %s"
msgstr ""
-#: nova/image/s3.py:390
+#: nova/image/s3.py:391
#, python-format
msgid "Failed to decrypt image file %(image_file)s: %(err)s"
msgstr ""
-#: nova/image/s3.py:402
+#: nova/image/s3.py:403
msgid "Unsafe filenames in image"
msgstr ""
@@ -3999,111 +3940,111 @@ msgstr ""
msgid "Bad project_id for to_global_ipv6: %s"
msgstr ""
-#: nova/network/api.py:54
+#: nova/network/api.py:52
msgid "instance is a required argument to use @refresh_cache"
msgstr ""
-#: nova/network/api.py:81
+#: nova/network/api.py:79
#, python-format
msgid "args: %s"
msgstr ""
-#: nova/network/api.py:82
+#: nova/network/api.py:80
#, python-format
msgid "kwargs: %s"
msgstr ""
-#: nova/network/api.py:170
+#: nova/network/api.py:168
#, python-format
msgid "re-assign floating IP %(address)s from instance %(instance_id)s"
msgstr ""
-#: nova/network/ldapdns.py:317
+#: nova/network/ldapdns.py:318
msgid "This driver only supports type 'a' entries."
msgstr ""
-#: nova/network/linux_net.py:179
+#: nova/network/linux_net.py:180
#, python-format
msgid "Attempted to remove chain %s which does not exist"
msgstr ""
-#: nova/network/linux_net.py:214
+#: nova/network/linux_net.py:215
#, python-format
msgid "Unknown chain: %r"
msgstr ""
-#: nova/network/linux_net.py:239
+#: nova/network/linux_net.py:240
#, python-format
msgid ""
"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r "
"%(top)r"
msgstr ""
-#: nova/network/linux_net.py:374
+#: nova/network/linux_net.py:375
msgid "IPTablesManager.apply completed with success"
msgstr ""
-#: nova/network/linux_net.py:580
+#: nova/network/linux_net.py:581
#, python-format
msgid "arping error for ip %s"
msgstr ""
-#: nova/network/linux_net.py:790
+#: nova/network/linux_net.py:791
#, python-format
msgid "Pid %d is stale, skip killing dnsmasq"
msgstr ""
-#: nova/network/linux_net.py:830
+#: nova/network/linux_net.py:831
#, python-format
msgid "Hupping dnsmasq threw %s"
msgstr ""
-#: nova/network/linux_net.py:832
+#: nova/network/linux_net.py:833
#, python-format
msgid "Pid %d is stale, relaunching dnsmasq"
msgstr ""
-#: nova/network/linux_net.py:895
+#: nova/network/linux_net.py:896
#, python-format
msgid "killing radvd threw %s"
msgstr ""
-#: nova/network/linux_net.py:897
+#: nova/network/linux_net.py:898
#, python-format
msgid "Pid %d is stale, relaunching radvd"
msgstr ""
-#: nova/network/linux_net.py:1127
+#: nova/network/linux_net.py:1128
#, python-format
msgid "Starting VLAN inteface %s"
msgstr ""
-#: nova/network/linux_net.py:1163
+#: nova/network/linux_net.py:1164
#, python-format
msgid "Starting Bridge interface for %s"
msgstr ""
-#: nova/network/linux_net.py:1206
+#: nova/network/linux_net.py:1207
#, python-format
msgid "Failed to add interface: %s"
msgstr ""
-#: nova/network/linux_net.py:1307
+#: nova/network/linux_net.py:1308
#, python-format
msgid "Starting bridge %s "
msgstr ""
-#: nova/network/linux_net.py:1315
+#: nova/network/linux_net.py:1316
#, python-format
msgid "Done starting bridge %s"
msgstr ""
-#: nova/network/linux_net.py:1334
+#: nova/network/linux_net.py:1335
#, python-format
msgid "Failed unplugging gateway interface '%s'"
msgstr ""
-#: nova/network/linux_net.py:1336
+#: nova/network/linux_net.py:1337
#, python-format
msgid "Unplugged gateway interface '%s'"
msgstr ""
@@ -4307,7 +4248,7 @@ msgid ""
" is %(network_size)s"
msgstr ""
-#: nova/network/minidns.py:65
+#: nova/network/minidns.py:68
msgid "This driver only supports type 'a'"
msgstr ""
@@ -4315,60 +4256,60 @@ msgstr ""
msgid "v4 subnets are required for legacy nw_info"
msgstr ""
-#: nova/network/quantum/nova_ipam_lib.py:75
+#: nova/network/quantum/nova_ipam_lib.py:72
msgid "Error creating network entry"
msgstr ""
-#: nova/network/quantum/nova_ipam_lib.py:90
+#: nova/network/quantum/nova_ipam_lib.py:87
#, python-format
msgid "No network with net_id = %s"
msgstr ""
-#: nova/network/quantum/nova_ipam_lib.py:256
+#: nova/network/quantum/nova_ipam_lib.py:253
#, python-format
msgid "No fixed IPs to deallocate for vif %s"
msgstr ""
-#: nova/network/quantumv2/__init__.py:41
+#: nova/network/quantumv2/__init__.py:42
msgid "_get_auth_token() failed"
msgstr ""
-#: nova/network/quantumv2/api.py:105
+#: nova/network/quantumv2/api.py:103
#, python-format
msgid "allocate_for_instance() for %s"
msgstr ""
-#: nova/network/quantumv2/api.py:108
+#: nova/network/quantumv2/api.py:106
#, python-format
msgid "empty project id for instance %s"
msgstr ""
-#: nova/network/quantumv2/api.py:161
+#: nova/network/quantumv2/api.py:159
#, python-format
msgid "Fail to delete port %(portid)s with failure: %(exception)s"
msgstr ""
-#: nova/network/quantumv2/api.py:173
+#: nova/network/quantumv2/api.py:171
#, python-format
msgid "deallocate_for_instance() for %s"
msgstr ""
-#: nova/network/quantumv2/api.py:182
+#: nova/network/quantumv2/api.py:180
#, python-format
msgid "Failed to delete quantum port %(portid)s "
msgstr ""
-#: nova/network/quantumv2/api.py:192
+#: nova/network/quantumv2/api.py:190
#, python-format
msgid "get_instance_nw_info() for %s"
msgstr ""
-#: nova/network/quantumv2/api.py:207
+#: nova/network/quantumv2/api.py:205
#, python-format
msgid "validate_networks() for %s"
msgstr ""
-#: nova/network/quantumv2/api.py:459
+#: nova/network/quantumv2/api.py:457
#, python-format
msgid "Multiple floating IP pools matches found for name '%s'"
msgstr ""
@@ -4528,49 +4469,49 @@ msgstr ""
msgid "Failed to process message... skipping it."
msgstr ""
-#: nova/openstack/common/rpc/impl_kombu.py:468
+#: nova/openstack/common/rpc/impl_kombu.py:469
#, python-format
msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d"
msgstr ""
-#: nova/openstack/common/rpc/impl_kombu.py:490
+#: nova/openstack/common/rpc/impl_kombu.py:491
#, python-format
msgid "Connected to AMQP server on %(hostname)s:%(port)d"
msgstr ""
-#: nova/openstack/common/rpc/impl_kombu.py:527
+#: nova/openstack/common/rpc/impl_kombu.py:528
#, python-format
msgid ""
"Unable to connect to AMQP server on %(hostname)s:%(port)d after "
"%(max_retries)d tries: %(err_str)s"
msgstr ""
-#: nova/openstack/common/rpc/impl_kombu.py:543
+#: nova/openstack/common/rpc/impl_kombu.py:544
#, python-format
msgid ""
"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying "
"again in %(sleep_time)d seconds."
msgstr ""
-#: nova/openstack/common/rpc/impl_kombu.py:595
+#: nova/openstack/common/rpc/impl_kombu.py:596
#: nova/openstack/common/rpc/impl_qpid.py:403
#, python-format
msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s"
msgstr ""
-#: nova/openstack/common/rpc/impl_kombu.py:613
+#: nova/openstack/common/rpc/impl_kombu.py:614
#: nova/openstack/common/rpc/impl_qpid.py:418
#, python-format
msgid "Timed out waiting for RPC response: %s"
msgstr ""
-#: nova/openstack/common/rpc/impl_kombu.py:617
+#: nova/openstack/common/rpc/impl_kombu.py:618
#: nova/openstack/common/rpc/impl_qpid.py:422
#, python-format
msgid "Failed to consume message from queue: %s"
msgstr ""
-#: nova/openstack/common/rpc/impl_kombu.py:651
+#: nova/openstack/common/rpc/impl_kombu.py:652
#: nova/openstack/common/rpc/impl_qpid.py:452
#, python-format
msgid "Failed to publish message to topic '%(topic)s': %(err_str)s"
@@ -4781,25 +4722,25 @@ msgstr ""
msgid "Setting instance to %(state)s state."
msgstr ""
-#: nova/scheduler/driver.py:112
+#: nova/scheduler/driver.py:121
#, python-format
msgid "Casted '%(method)s' to compute '%(host)s'"
msgstr ""
-#: nova/scheduler/driver.py:127
+#: nova/scheduler/driver.py:136
#, python-format
msgid "Casted '%(method)s' to %(topic)s '%(host)s'"
msgstr ""
-#: nova/scheduler/driver.py:175
+#: nova/scheduler/driver.py:184
msgid "Driver must implement schedule_prep_resize"
msgstr ""
-#: nova/scheduler/driver.py:183
+#: nova/scheduler/driver.py:192
msgid "Driver must implement schedule_run_instance"
msgstr ""
-#: nova/scheduler/driver.py:315
+#: nova/scheduler/driver.py:324
#, python-format
msgid ""
"Unable to migrate %(instance_uuid)s to %(dest)s: Lack of "
@@ -4811,61 +4752,58 @@ msgstr ""
msgid "Attempting to build %(num_instances)d instance(s)"
msgstr ""
-#: nova/scheduler/filter_scheduler.py:192
+#: nova/scheduler/filter_scheduler.py:195
msgid "Invalid value for 'scheduler_max_attempts', must be >= 1"
msgstr ""
-#: nova/scheduler/filter_scheduler.py:219
+#: nova/scheduler/filter_scheduler.py:222
#, python-format
msgid ""
"Exceeded max scheduling attempts %(max_attempts)d for instance "
"%(instance_uuid)s"
msgstr ""
-#: nova/scheduler/filter_scheduler.py:230
-msgid "Scheduler only understands Compute nodes (for now)"
-msgstr ""
-
-#: nova/scheduler/filter_scheduler.py:282
+#: nova/scheduler/filter_scheduler.py:277
#, python-format
msgid "Filtered %(hosts)s"
msgstr ""
-#: nova/scheduler/filter_scheduler.py:292
+#: nova/scheduler/filter_scheduler.py:287
#, python-format
msgid "Weighted %(weighted_host)s"
msgstr ""
-#: nova/scheduler/host_manager.py:247
+#: nova/scheduler/host_manager.py:246
#, python-format
msgid "Host filter fails for ignored host %(host)s"
msgstr ""
-#: nova/scheduler/host_manager.py:254
+#: nova/scheduler/host_manager.py:253
#, python-format
msgid "Host filter fails for non-forced host %(host)s"
msgstr ""
-#: nova/scheduler/host_manager.py:260
+#: nova/scheduler/host_manager.py:259
#, python-format
msgid "Host filter function %(func)s failed for %(host)s"
msgstr ""
-#: nova/scheduler/host_manager.py:266
+#: nova/scheduler/host_manager.py:265
#, python-format
msgid "Host filter passes for %(host)s"
msgstr ""
-#: nova/scheduler/host_manager.py:329
+#: nova/scheduler/host_manager.py:331
#, python-format
-msgid "Received %(service_name)s service update from %(host)s."
+msgid "Ignoring %(service_name)s service update from %(host)s"
msgstr ""
-#: nova/scheduler/host_manager.py:352
-msgid "host_manager only implemented for 'compute'"
+#: nova/scheduler/host_manager.py:336
+#, python-format
+msgid "Received %(service_name)s service update from %(state_key)s."
msgstr ""
-#: nova/scheduler/host_manager.py:360
+#: nova/scheduler/host_manager.py:354
#, python-format
msgid "No service for compute ID %s"
msgstr ""
@@ -4892,17 +4830,17 @@ msgstr ""
msgid "%(host_state)s fails instance_type extra_specs requirements"
msgstr ""
-#: nova/scheduler/filters/compute_filter.py:39
+#: nova/scheduler/filters/compute_filter.py:38
#, python-format
msgid "%(host_state)s is disabled or has not been heard from in a while"
msgstr ""
-#: nova/scheduler/filters/compute_filter.py:43
+#: nova/scheduler/filters/compute_filter.py:42
#, python-format
msgid "%(host_state)s is disabled via capabilities"
msgstr ""
-#: nova/scheduler/filters/core_filter.py:46
+#: nova/scheduler/filters/core_filter.py:45
msgid "VCPUs not set; assuming CPU collection broken"
msgstr ""
@@ -4994,15 +4932,15 @@ msgstr ""
msgid "Reply to faked command is stdout='%(stdout)s' stderr='%(stderr)s'"
msgstr ""
-#: nova/tests/fake_volume.py:180 nova/volume/cinder.py:159
+#: nova/tests/fake_volume.py:180 nova/volume/cinder.py:160
msgid "status must be available"
msgstr ""
-#: nova/tests/fake_volume.py:184 nova/volume/cinder.py:162
+#: nova/tests/fake_volume.py:184 nova/volume/cinder.py:163
msgid "already attached"
msgstr ""
-#: nova/tests/fake_volume.py:189 nova/volume/cinder.py:168
+#: nova/tests/fake_volume.py:189 nova/volume/cinder.py:169
msgid "already detached"
msgstr ""
@@ -5065,12 +5003,12 @@ msgstr ""
msgid "uuid"
msgstr ""
-#: nova/tests/test_xenapi.py:724
+#: nova/tests/test_xenapi.py:726
#, python-format
msgid "Creating files in %s to simulate guest agent"
msgstr ""
-#: nova/tests/test_xenapi.py:735
+#: nova/tests/test_xenapi.py:737
#, python-format
msgid "Removing simulated guest agent files in %s"
msgstr ""
@@ -5087,93 +5025,93 @@ msgstr ""
msgid "unexpected role header"
msgstr ""
-#: nova/tests/api/openstack/compute/test_servers.py:2996
+#: nova/tests/api/openstack/compute/test_servers.py:2997
msgid ""
"Quota exceeded for instances: Requested 1, but already used 10 of 10 "
"instances"
msgstr ""
-#: nova/tests/api/openstack/compute/test_servers.py:3001
+#: nova/tests/api/openstack/compute/test_servers.py:3002
msgid "Quota exceeded for ram: Requested 4096, but already used 8192 of 10240 ram"
msgstr ""
-#: nova/tests/api/openstack/compute/test_servers.py:3006
+#: nova/tests/api/openstack/compute/test_servers.py:3007
msgid "Quota exceeded for cores: Requested 2, but already used 9 of 10 cores"
msgstr ""
-#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:56
+#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:54
#, python-format
msgid "_create: %s"
msgstr ""
-#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:65
+#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:63
#, python-format
msgid "_delete: %s"
msgstr ""
-#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:74
+#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:72
#, python-format
msgid "_get: %s"
msgstr ""
-#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:84
+#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:82
#, python-format
msgid "_get_all: %s"
msgstr ""
-#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:128
+#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:126
#, python-format
msgid "test_snapshot_create: param=%s"
msgstr ""
-#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:137
+#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:135
#, python-format
msgid "test_snapshot_create: resp_dict=%s"
msgstr ""
-#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:159
-#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:185
+#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:157
+#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:183
#, python-format
msgid "test_snapshot_create_force: param=%s"
msgstr ""
-#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:168
+#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:166
#, python-format
msgid "test_snapshot_create_force: resp_dict=%s"
msgstr ""
-#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:221
+#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:219
#, python-format
msgid "test_snapshot_show: resp=%s"
msgstr ""
-#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:247
+#: nova/tests/api/openstack/compute/contrib/test_snapshots.py:245
#, python-format
msgid "test_snapshot_detail: resp_dict=%s"
msgstr ""
-#: nova/tests/compute/test_compute.py:619
-#: nova/tests/compute/test_compute.py:637
-#: nova/tests/compute/test_compute.py:673
-#: nova/tests/compute/test_compute.py:698
-#: nova/tests/compute/test_compute.py:2373
+#: nova/tests/compute/test_compute.py:624
+#: nova/tests/compute/test_compute.py:642
+#: nova/tests/compute/test_compute.py:678
+#: nova/tests/compute/test_compute.py:703
+#: nova/tests/compute/test_compute.py:2382
#, python-format
msgid "Running instances: %s"
msgstr ""
-#: nova/tests/compute/test_compute.py:625
-#: nova/tests/compute/test_compute.py:660
-#: nova/tests/compute/test_compute.py:686
-#: nova/tests/compute/test_compute.py:716
+#: nova/tests/compute/test_compute.py:630
+#: nova/tests/compute/test_compute.py:665
+#: nova/tests/compute/test_compute.py:691
+#: nova/tests/compute/test_compute.py:721
#, python-format
msgid "After terminating instances: %s"
msgstr ""
-#: nova/tests/compute/test_compute.py:1093
+#: nova/tests/compute/test_compute.py:1098
msgid "Internal error"
msgstr ""
-#: nova/tests/compute/test_compute.py:2384
+#: nova/tests/compute/test_compute.py:2393
#, python-format
msgid "After force-killing instances: %s"
msgstr ""
@@ -5188,17 +5126,17 @@ msgstr ""
msgid "Failed to destroy vm %s"
msgstr ""
-#: nova/tests/hyperv/hypervutils.py:235 nova/virt/hyperv/snapshotops.py:92
+#: nova/tests/hyperv/hypervutils.py:235 nova/virt/hyperv/snapshotops.py:93
#, python-format
msgid "Failed to get info for disk %s"
msgstr ""
-#: nova/tests/integrated/test_api_samples.py:140
+#: nova/tests/integrated/test_api_samples.py:141
#, python-format
msgid "Result: %(result)s is not a dict."
msgstr ""
-#: nova/tests/integrated/test_api_samples.py:144
+#: nova/tests/integrated/test_api_samples.py:145
#, python-format
msgid ""
"Key mismatch:\n"
@@ -5206,25 +5144,25 @@ msgid ""
"%(res_keys)s"
msgstr ""
-#: nova/tests/integrated/test_api_samples.py:152
+#: nova/tests/integrated/test_api_samples.py:153
#, python-format
msgid "Result: %(result)s is not a list."
msgstr ""
-#: nova/tests/integrated/test_api_samples.py:155
+#: nova/tests/integrated/test_api_samples.py:156
#, python-format
msgid ""
"Length mismatch: %(result)s\n"
"%(expected)s."
msgstr ""
-#: nova/tests/integrated/test_api_samples.py:166
+#: nova/tests/integrated/test_api_samples.py:167
#, python-format
msgid "Result: %(res_obj)s not in %(expected)s."
msgstr ""
-#: nova/tests/integrated/test_api_samples.py:183
-#: nova/tests/integrated/test_api_samples.py:196
+#: nova/tests/integrated/test_api_samples.py:185
+#: nova/tests/integrated/test_api_samples.py:198
#, python-format
msgid ""
"Values do not match:\n"
@@ -5286,259 +5224,259 @@ msgstr ""
msgid "Decoding JSON: %s"
msgstr ""
-#: nova/virt/configdrive.py:77
+#: nova/virt/configdrive.py:78
#, python-format
msgid "Added %(filepath)s to config drive"
msgstr ""
-#: nova/virt/firewall.py:176 nova/virt/libvirt/firewall.py:249
+#: nova/virt/firewall.py:180 nova/virt/libvirt/firewall.py:250
msgid "Attempted to unfilter instance which is not filtered"
msgstr ""
-#: nova/virt/firewall.py:187
+#: nova/virt/firewall.py:191
msgid "Filters added to instance"
msgstr ""
-#: nova/virt/firewall.py:189
+#: nova/virt/firewall.py:193
msgid "Provider Firewall Rules refreshed"
msgstr ""
-#: nova/virt/firewall.py:357
+#: nova/virt/firewall.py:361
#, python-format
msgid "Adding security group rule: %r"
msgstr ""
-#: nova/virt/firewall.py:489 nova/virt/xenapi/firewall.py:80
+#: nova/virt/firewall.py:492 nova/virt/xenapi/firewall.py:76
#, python-format
msgid "Adding provider rule: %s"
msgstr ""
-#: nova/virt/images.py:114
+#: nova/virt/images.py:115
msgid "Snapshot list encountered but no header found!"
msgstr ""
-#: nova/virt/images.py:213
+#: nova/virt/images.py:214
msgid "'qemu-img info' parsing failed."
msgstr ""
-#: nova/virt/images.py:219
+#: nova/virt/images.py:220
#, python-format
msgid "fmt=%(fmt)s backed by: %(backing_file)s"
msgstr ""
-#: nova/virt/images.py:230
+#: nova/virt/images.py:231
#, python-format
msgid "Converted to raw, but format is now %s"
msgstr ""
-#: nova/virt/baremetal/dom.py:93
+#: nova/virt/baremetal/dom.py:91
msgid "No domains exist."
msgstr ""
-#: nova/virt/baremetal/dom.py:95
+#: nova/virt/baremetal/dom.py:93
#, python-format
msgid "============= initial domains =========== : %s"
msgstr ""
-#: nova/virt/baremetal/dom.py:99
+#: nova/virt/baremetal/dom.py:97
msgid "Building domain: to be removed"
msgstr ""
-#: nova/virt/baremetal/dom.py:103
+#: nova/virt/baremetal/dom.py:101
msgid "Not running domain: remove"
msgstr ""
-#: nova/virt/baremetal/dom.py:111
+#: nova/virt/baremetal/dom.py:109
msgid "domain running on an unknown node: discarded"
msgstr ""
-#: nova/virt/baremetal/dom.py:127
+#: nova/virt/baremetal/dom.py:125
#, python-format
msgid "No such domain (%s)"
msgstr ""
-#: nova/virt/baremetal/dom.py:134
+#: nova/virt/baremetal/dom.py:132
#, python-format
msgid "Failed power down Bare-metal node %s"
msgstr ""
-#: nova/virt/baremetal/dom.py:143
+#: nova/virt/baremetal/dom.py:141
msgid "deactivate -> activate fails"
msgstr ""
-#: nova/virt/baremetal/dom.py:153
+#: nova/virt/baremetal/dom.py:151
msgid "destroy_domain: no such domain"
msgstr ""
-#: nova/virt/baremetal/dom.py:154
+#: nova/virt/baremetal/dom.py:152
#, python-format
msgid "No such domain %s"
msgstr ""
-#: nova/virt/baremetal/dom.py:161
+#: nova/virt/baremetal/dom.py:159
#, python-format
msgid "Domains: %s"
msgstr ""
-#: nova/virt/baremetal/dom.py:164
+#: nova/virt/baremetal/dom.py:162
#, python-format
msgid "After storing domains: %s"
msgstr ""
-#: nova/virt/baremetal/dom.py:167
+#: nova/virt/baremetal/dom.py:165
msgid "deactivation/removing domain failed"
msgstr ""
-#: nova/virt/baremetal/dom.py:174
+#: nova/virt/baremetal/dom.py:172
msgid "===== Domain is being created ====="
msgstr ""
-#: nova/virt/baremetal/dom.py:177
+#: nova/virt/baremetal/dom.py:175
msgid "Same domain name already exists"
msgstr ""
-#: nova/virt/baremetal/dom.py:179
+#: nova/virt/baremetal/dom.py:177
msgid "create_domain: before get_idle_node"
msgstr ""
-#: nova/virt/baremetal/dom.py:196
+#: nova/virt/baremetal/dom.py:194
#, python-format
msgid "Created new domain: %s"
msgstr ""
-#: nova/virt/baremetal/dom.py:211
+#: nova/virt/baremetal/dom.py:209
#, python-format
msgid "Failed to boot Bare-metal node %s"
msgstr ""
-#: nova/virt/baremetal/dom.py:220
+#: nova/virt/baremetal/dom.py:218
msgid "No such domain exists"
msgstr ""
-#: nova/virt/baremetal/dom.py:224
+#: nova/virt/baremetal/dom.py:222
#, python-format
msgid "change_domain_state: to new state %s"
msgstr ""
-#: nova/virt/baremetal/dom.py:231
+#: nova/virt/baremetal/dom.py:229
#, python-format
msgid "Stored fake domains to the file: %s"
msgstr ""
-#: nova/virt/baremetal/dom.py:242
+#: nova/virt/baremetal/dom.py:240
msgid "domain does not exist"
msgstr ""
-#: nova/virt/baremetal/driver.py:116
+#: nova/virt/baremetal/driver.py:117
#, python-format
msgid "Error encountered when destroying instance '%(name)s': %(ex)s"
msgstr ""
-#: nova/virt/baremetal/driver.py:130
+#: nova/virt/baremetal/driver.py:131
#, python-format
msgid "instance %(instance_name)s: deleting instance files %(target)s"
msgstr ""
-#: nova/virt/baremetal/driver.py:157
+#: nova/virt/baremetal/driver.py:158
#, python-format
msgid "instance %s: rebooted"
msgstr ""
-#: nova/virt/baremetal/driver.py:161
+#: nova/virt/baremetal/driver.py:162
msgid "_wait_for_reboot failed"
msgstr ""
-#: nova/virt/baremetal/driver.py:190
+#: nova/virt/baremetal/driver.py:191
#, python-format
msgid "instance %s: rescued"
msgstr ""
-#: nova/virt/baremetal/driver.py:194
+#: nova/virt/baremetal/driver.py:195
msgid "_wait_for_rescue failed"
msgstr ""
-#: nova/virt/baremetal/driver.py:211
+#: nova/virt/baremetal/driver.py:212
msgid "<============= spawn of baremetal =============>"
msgstr ""
-#: nova/virt/baremetal/driver.py:224
+#: nova/virt/baremetal/driver.py:225
#, python-format
msgid "instance %s: is building"
msgstr ""
-#: nova/virt/baremetal/driver.py:230
+#: nova/virt/baremetal/driver.py:231
msgid "Key is injected but instance is not running yet"
msgstr ""
-#: nova/virt/baremetal/driver.py:239
+#: nova/virt/baremetal/driver.py:240
#, python-format
msgid "instance %s: booted"
msgstr ""
-#: nova/virt/baremetal/driver.py:246
+#: nova/virt/baremetal/driver.py:247
#, python-format
msgid "~~~~~~ current state = %s ~~~~~~"
msgstr ""
-#: nova/virt/baremetal/driver.py:248
+#: nova/virt/baremetal/driver.py:249
#, python-format
msgid "instance %s spawned successfully"
msgstr ""
-#: nova/virt/baremetal/driver.py:251
+#: nova/virt/baremetal/driver.py:252
#, python-format
msgid "instance %s:not booted"
msgstr ""
-#: nova/virt/baremetal/driver.py:254
+#: nova/virt/baremetal/driver.py:255
msgid "Baremetal assignment is overcommitted."
msgstr ""
-#: nova/virt/baremetal/driver.py:338
+#: nova/virt/baremetal/driver.py:339
#, python-format
msgid "instance %s: Creating image"
msgstr ""
-#: nova/virt/baremetal/driver.py:456
+#: nova/virt/baremetal/driver.py:457
#, python-format
msgid "instance %(inst_name)s: injecting %(injection)s into image %(img_id)s"
msgstr ""
-#: nova/virt/baremetal/driver.py:466
+#: nova/virt/baremetal/driver.py:467
#, python-format
msgid ""
"instance %(inst_name)s: ignoring error injecting data into image "
"%(img_id)s (%(e)s)"
msgstr ""
-#: nova/virt/baremetal/driver.py:512
+#: nova/virt/baremetal/driver.py:513
#, python-format
msgid "instance %s: starting toXML method"
msgstr ""
-#: nova/virt/baremetal/driver.py:515
+#: nova/virt/baremetal/driver.py:516
#, python-format
msgid "instance %s: finished toXML method"
msgstr ""
-#: nova/virt/baremetal/driver.py:559 nova/virt/hyperv/hostops.py:43
-#: nova/virt/libvirt/driver.py:1988
+#: nova/virt/baremetal/driver.py:560 nova/virt/hyperv/hostops.py:43
+#: nova/virt/libvirt/driver.py:1982
msgid ""
"Cannot get the number of cpu, because this function is not implemented "
"for this platform. This error can be safely ignored for now."
msgstr ""
-#: nova/virt/baremetal/driver.py:682
+#: nova/virt/baremetal/driver.py:684
#, python-format
msgid "#### RLK: cpu_arch = %s "
msgstr ""
-#: nova/virt/baremetal/driver.py:699
+#: nova/virt/baremetal/driver.py:701
msgid "Updating!"
msgstr ""
-#: nova/virt/baremetal/driver.py:726 nova/virt/hyperv/hostops.py:141
-#: nova/virt/libvirt/driver.py:3030 nova/virt/xenapi/host.py:149
+#: nova/virt/baremetal/driver.py:728 nova/virt/hyperv/hostops.py:141
+#: nova/virt/libvirt/driver.py:3025 nova/virt/xenapi/host.py:156
msgid "Updating host stats"
msgstr ""
@@ -5547,88 +5485,88 @@ msgstr ""
msgid "Unknown baremetal driver %(d)s"
msgstr ""
-#: nova/virt/baremetal/tilera.py:184
+#: nova/virt/baremetal/tilera.py:185
msgid "free_node...."
msgstr ""
-#: nova/virt/baremetal/tilera.py:215
+#: nova/virt/baremetal/tilera.py:216
#, python-format
msgid "deactivate_node is called for node_id = %(id)s node_ip = %(ip)s"
msgstr ""
-#: nova/virt/baremetal/tilera.py:220
+#: nova/virt/baremetal/tilera.py:221
msgid "status of node is set to 0"
msgstr ""
-#: nova/virt/baremetal/tilera.py:231
+#: nova/virt/baremetal/tilera.py:232
msgid "rootfs is already removed"
msgstr ""
-#: nova/virt/baremetal/tilera.py:263
+#: nova/virt/baremetal/tilera.py:264
msgid "Before ping to the bare-metal node"
msgstr ""
-#: nova/virt/baremetal/tilera.py:274
+#: nova/virt/baremetal/tilera.py:275
#, python-format
msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is ready"
msgstr ""
-#: nova/virt/baremetal/tilera.py:278
+#: nova/virt/baremetal/tilera.py:279
#, python-format
msgid "TILERA_BOARD_#%(node_id)s %(node_ip)s is not ready, out_msg=%(out_msg)s"
msgstr ""
-#: nova/virt/baremetal/tilera.py:290
+#: nova/virt/baremetal/tilera.py:291
msgid "Noting to do for tilera nodes: vmlinux is in CF"
msgstr ""
-#: nova/virt/baremetal/tilera.py:313
+#: nova/virt/baremetal/tilera.py:314
msgid "activate_node"
msgstr ""
-#: nova/virt/baremetal/tilera.py:327
+#: nova/virt/baremetal/tilera.py:328
msgid "Node is unknown error state."
msgstr ""
-#: nova/virt/disk/api.py:196
+#: nova/virt/disk/api.py:197
msgid "no capable image handler configured"
msgstr ""
-#: nova/virt/disk/api.py:243
+#: nova/virt/disk/api.py:244
#, python-format
msgid "no disk image handler for: %s"
msgstr ""
-#: nova/virt/disk/api.py:255
+#: nova/virt/disk/api.py:256
msgid "image already mounted"
msgstr ""
-#: nova/virt/disk/api.py:321
+#: nova/virt/disk/api.py:322
#, python-format
msgid ""
"Failed to mount container filesystem '%(image)s' on '%(target)s': "
"%(errors)s"
msgstr ""
-#: nova/virt/disk/api.py:338
+#: nova/virt/disk/api.py:339
#, python-format
msgid "Failed to unmount container filesystem: %s"
msgstr ""
-#: nova/virt/disk/api.py:371
+#: nova/virt/disk/api.py:372
msgid "injected file path not valid"
msgstr ""
-#: nova/virt/disk/api.py:516
+#: nova/virt/disk/api.py:517
msgid "Not implemented on Windows"
msgstr ""
-#: nova/virt/disk/api.py:550
+#: nova/virt/disk/api.py:551
#, python-format
msgid "User %(username)s not found in password file."
msgstr ""
-#: nova/virt/disk/api.py:566
+#: nova/virt/disk/api.py:567
#, python-format
msgid "User %(username)s not found in shadow file."
msgstr ""
@@ -5673,20 +5611,20 @@ msgstr ""
msgid "Failed to map partitions: %s"
msgstr ""
-#: nova/virt/disk/nbd.py:59
+#: nova/virt/disk/nbd.py:60
msgid "nbd unavailable: module not loaded"
msgstr ""
-#: nova/virt/disk/nbd.py:64
+#: nova/virt/disk/nbd.py:65
msgid "No free nbd devices"
msgstr ""
-#: nova/virt/disk/nbd.py:86
+#: nova/virt/disk/nbd.py:87
#, python-format
msgid "qemu-nbd error: %s"
msgstr ""
-#: nova/virt/disk/nbd.py:98
+#: nova/virt/disk/nbd.py:99
#, python-format
msgid "nbd device %s did not show up"
msgstr ""
@@ -5728,140 +5666,140 @@ msgstr ""
msgid "get_available_resource called"
msgstr ""
-#: nova/virt/hyperv/hostops.py:161
+#: nova/virt/hyperv/hostops.py:162
msgid "get_host_stats called"
msgstr ""
-#: nova/virt/hyperv/livemigrationops.py:52
+#: nova/virt/hyperv/livemigrationops.py:53
msgid ""
"Live migration is not supported \" \"by this version "
"of Hyper-V"
msgstr ""
-#: nova/virt/hyperv/livemigrationops.py:61
+#: nova/virt/hyperv/livemigrationops.py:62
msgid "Live migration is not enabled on this host"
msgstr ""
-#: nova/virt/hyperv/livemigrationops.py:64
+#: nova/virt/hyperv/livemigrationops.py:65
msgid "Live migration networks are not configured on this host"
msgstr ""
-#: nova/virt/hyperv/livemigrationops.py:68
+#: nova/virt/hyperv/livemigrationops.py:69
msgid "live_migration called"
msgstr ""
-#: nova/virt/hyperv/livemigrationops.py:94
+#: nova/virt/hyperv/livemigrationops.py:95
#, python-format
msgid "Getting live migration networks for remote host: %s"
msgstr ""
-#: nova/virt/hyperv/livemigrationops.py:113
+#: nova/virt/hyperv/livemigrationops.py:114
#, python-format
msgid "Starting live migration for instance: %s"
msgstr ""
-#: nova/virt/hyperv/livemigrationops.py:126
+#: nova/virt/hyperv/livemigrationops.py:127
#, python-format
msgid "Failed to live migrate VM %s"
msgstr ""
-#: nova/virt/hyperv/livemigrationops.py:129
+#: nova/virt/hyperv/livemigrationops.py:130
#, python-format
msgid "Calling live migration recover_method for instance: %s"
msgstr ""
-#: nova/virt/hyperv/livemigrationops.py:133
+#: nova/virt/hyperv/livemigrationops.py:134
#, python-format
msgid "Calling live migration post_method for instance: %s"
msgstr ""
-#: nova/virt/hyperv/livemigrationops.py:139
+#: nova/virt/hyperv/livemigrationops.py:140
msgid "pre_live_migration called"
msgstr ""
-#: nova/virt/hyperv/livemigrationops.py:157
+#: nova/virt/hyperv/livemigrationops.py:158
msgid "post_live_migration_at_destination called"
msgstr ""
-#: nova/virt/hyperv/livemigrationops.py:161
+#: nova/virt/hyperv/livemigrationops.py:162
#, python-format
msgid "compare_cpu called %s"
msgstr ""
-#: nova/virt/hyperv/snapshotops.py:57
+#: nova/virt/hyperv/snapshotops.py:58
#, python-format
msgid "Creating snapshot for instance %s"
msgstr ""
-#: nova/virt/hyperv/snapshotops.py:71
+#: nova/virt/hyperv/snapshotops.py:72
#, python-format
msgid "Failed to create snapshot for VM %s"
msgstr ""
-#: nova/virt/hyperv/snapshotops.py:83
+#: nova/virt/hyperv/snapshotops.py:84
#, python-format
msgid "Getting info for VHD %s"
msgstr ""
-#: nova/virt/hyperv/snapshotops.py:106
+#: nova/virt/hyperv/snapshotops.py:107
#, python-format
msgid "Copying VHD %(src_vhd_path)s to %(dest_vhd_path)s"
msgstr ""
-#: nova/virt/hyperv/snapshotops.py:116
+#: nova/virt/hyperv/snapshotops.py:117
#, python-format
msgid "Copying base disk %(src_vhd_path)s to %(dest_base_disk_path)s"
msgstr ""
-#: nova/virt/hyperv/snapshotops.py:120
+#: nova/virt/hyperv/snapshotops.py:121
#, python-format
msgid ""
"Reconnecting copied base VHD %(dest_base_disk_path)s and diff VHD "
"%(dest_vhd_path)s"
msgstr ""
-#: nova/virt/hyperv/snapshotops.py:134
+#: nova/virt/hyperv/snapshotops.py:135
#, python-format
msgid ""
"Failed to reconnect base disk %(dest_base_disk_path)s and diff disk "
"%(dest_vhd_path)s"
msgstr ""
-#: nova/virt/hyperv/snapshotops.py:139
+#: nova/virt/hyperv/snapshotops.py:140
#, python-format
msgid "Merging base disk %(dest_base_disk_path)s and diff disk %(dest_vhd_path)s"
msgstr ""
-#: nova/virt/hyperv/snapshotops.py:151
+#: nova/virt/hyperv/snapshotops.py:152
#, python-format
msgid ""
"Failed to merge base disk %(dest_base_disk_path)s and diff disk "
"%(dest_vhd_path)s"
msgstr ""
-#: nova/virt/hyperv/snapshotops.py:164
+#: nova/virt/hyperv/snapshotops.py:165
#, python-format
msgid ""
"Updating Glance image %(image_id)s with content from merged disk "
"%(image_vhd_path)s"
msgstr ""
-#: nova/virt/hyperv/snapshotops.py:169
+#: nova/virt/hyperv/snapshotops.py:170
#, python-format
msgid "Snapshot image %(image_id)s updated for VM %(instance_name)s"
msgstr ""
-#: nova/virt/hyperv/snapshotops.py:172
+#: nova/virt/hyperv/snapshotops.py:173
#, python-format
msgid "Removing snapshot %s"
msgstr ""
-#: nova/virt/hyperv/snapshotops.py:181
+#: nova/virt/hyperv/snapshotops.py:182
#, python-format
msgid "Failed to remove snapshot for VM %s"
msgstr ""
-#: nova/virt/hyperv/snapshotops.py:186
+#: nova/virt/hyperv/snapshotops.py:187
#, python-format
msgid "Removing folder %s "
msgstr ""
@@ -6052,424 +5990,424 @@ msgstr ""
msgid "Failed to create Difference Disk from %(base)s to %(target)s"
msgstr ""
-#: nova/virt/hyperv/vmutils.py:54
+#: nova/virt/hyperv/vmutils.py:55
#, python-format
msgid "duplicate name found: %s"
msgstr ""
-#: nova/virt/hyperv/vmutils.py:68
+#: nova/virt/hyperv/vmutils.py:69
#, python-format
msgid ""
"WMI job failed: %(ErrorSummaryDescription)s - %(ErrorDescription)s - "
"%(ErrorCode)s"
msgstr ""
-#: nova/virt/hyperv/vmutils.py:73
+#: nova/virt/hyperv/vmutils.py:74
#, python-format
msgid "WMI job succeeded: %(desc)s, Elapsed=%(elap)s "
msgstr ""
-#: nova/virt/hyperv/vmutils.py:80 nova/virt/hyperv/vmutils.py:96
+#: nova/virt/hyperv/vmutils.py:81 nova/virt/hyperv/vmutils.py:97
#, python-format
msgid "Creating folder %s "
msgstr ""
-#: nova/virt/hyperv/vmutils.py:94
+#: nova/virt/hyperv/vmutils.py:95
#, python-format
msgid "Removing existing folder %s "
msgstr ""
-#: nova/virt/hyperv/volumeops.py:69 nova/virt/xenapi/vm_utils.py:483
+#: nova/virt/hyperv/volumeops.py:70 nova/virt/xenapi/vm_utils.py:490
#, python-format
msgid "block device info: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:97
+#: nova/virt/hyperv/volumeops.py:98
#, python-format
msgid "Attach boot from volume failed: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:100
+#: nova/virt/hyperv/volumeops.py:101
#, python-format
msgid "Unable to attach boot volume to instance %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:109 nova/virt/xenapi/volumeops.py:114
+#: nova/virt/hyperv/volumeops.py:110 nova/virt/xenapi/volumeops.py:114
#, python-format
msgid "Attach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:134
+#: nova/virt/hyperv/volumeops.py:135
#, python-format
msgid "Attach volume failed: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:137 nova/virt/xenapi/volumeops.py:190
+#: nova/virt/hyperv/volumeops.py:138 nova/virt/xenapi/volumeops.py:190
#, python-format
msgid "Unable to attach volume to instance %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:156
+#: nova/virt/hyperv/volumeops.py:157
#, python-format
msgid "Failed to add volume to VM %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:170
+#: nova/virt/hyperv/volumeops.py:171
#, python-format
msgid "Detach_volume: %(connection_info)s, %(instance_name)s, %(mountpoint)s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:187
+#: nova/virt/hyperv/volumeops.py:188
#, python-format
msgid "Mounted disk to detach is: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:188
+#: nova/virt/hyperv/volumeops.py:189
#, python-format
msgid "host_resource disk detached is: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:191
+#: nova/virt/hyperv/volumeops.py:192
#, python-format
msgid "Physical disk detached is: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:198
+#: nova/virt/hyperv/volumeops.py:199
#, python-format
msgid "Failed to remove volume from VM %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:207 nova/virt/libvirt/driver.py:605
+#: nova/virt/hyperv/volumeops.py:208 nova/virt/libvirt/driver.py:603
msgid "Could not determine iscsi initiator name"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:224
+#: nova/virt/hyperv/volumeops.py:225
#, python-format
msgid "device.InitiatorName: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:225
+#: nova/virt/hyperv/volumeops.py:226
#, python-format
msgid "device.TargetName: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:226
+#: nova/virt/hyperv/volumeops.py:227
#, python-format
msgid "device.ScsiPortNumber: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:227
+#: nova/virt/hyperv/volumeops.py:228
#, python-format
msgid "device.ScsiPathId: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:228
+#: nova/virt/hyperv/volumeops.py:229
#, python-format
msgid "device.ScsiTargetId): %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:229
+#: nova/virt/hyperv/volumeops.py:230
#, python-format
msgid "device.ScsiLun: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:230
+#: nova/virt/hyperv/volumeops.py:231
#, python-format
msgid "device.DeviceInterfaceGuid :%s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:232
+#: nova/virt/hyperv/volumeops.py:233
#, python-format
msgid "device.DeviceInterfaceName: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:234
+#: nova/virt/hyperv/volumeops.py:235
#, python-format
msgid "device.LegacyName: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:235
+#: nova/virt/hyperv/volumeops.py:236
#, python-format
msgid "device.DeviceType: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:236
+#: nova/virt/hyperv/volumeops.py:237
#, python-format
msgid "device.DeviceNumber %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:237
+#: nova/virt/hyperv/volumeops.py:238
#, python-format
msgid "device.PartitionNumber :%s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:243 nova/virt/hyperv/volumeops.py:262
+#: nova/virt/hyperv/volumeops.py:244 nova/virt/hyperv/volumeops.py:263
#, python-format
msgid "Unable to find a mounted disk for target_iqn: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:245
+#: nova/virt/hyperv/volumeops.py:246
#, python-format
msgid "Device number : %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:246
+#: nova/virt/hyperv/volumeops.py:247
#, python-format
msgid "Target lun : %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:252 nova/virt/hyperv/volumeops.py:259
+#: nova/virt/hyperv/volumeops.py:253 nova/virt/hyperv/volumeops.py:260
#, python-format
msgid "Mounted disk is: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:276
+#: nova/virt/hyperv/volumeops.py:277
#, python-format
msgid "Drive number to disconnect is: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:283
+#: nova/virt/hyperv/volumeops.py:284
#, python-format
msgid "DeviceNumber : %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:288
+#: nova/virt/hyperv/volumeops.py:289
#, python-format
msgid "Disk path to parse: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:290
+#: nova/virt/hyperv/volumeops.py:291
#, python-format
msgid "start_device_id: %s"
msgstr ""
-#: nova/virt/hyperv/volumeops.py:292
+#: nova/virt/hyperv/volumeops.py:293
#, python-format
msgid "end_device_id: %s"
msgstr ""
-#: nova/virt/hyperv/volumeutils.py:51
+#: nova/virt/hyperv/volumeutils.py:52
#, python-format
msgid "An error has occurred when calling the iscsi initiator: %s"
msgstr ""
-#: nova/virt/hyperv/volumeutils.py:68
+#: nova/virt/hyperv/volumeutils.py:69
msgid "The ISCSI initiator name can't be found. Choosing the default one"
msgstr ""
-#: nova/virt/hyperv/volumeutils.py:121 nova/virt/libvirt/driver.py:1464
-#: nova/virt/xenapi/vm_utils.py:476
+#: nova/virt/hyperv/volumeutils.py:122 nova/virt/libvirt/driver.py:1460
+#: nova/virt/xenapi/vm_utils.py:483
#, python-format
msgid "block_device_list %s"
msgstr ""
-#: nova/virt/libvirt/driver.py:334
+#: nova/virt/libvirt/driver.py:332
#, python-format
msgid "Nova requires libvirt version %(major)i.%(minor)i.%(micro)i or greater."
msgstr ""
-#: nova/virt/libvirt/driver.py:340
+#: nova/virt/libvirt/driver.py:338
#, python-format
msgid "Connecting to libvirt: %s"
msgstr ""
-#: nova/virt/libvirt/driver.py:361
+#: nova/virt/libvirt/driver.py:359
msgid "Connection to libvirt broke"
msgstr ""
-#: nova/virt/libvirt/driver.py:383 nova/virt/libvirt/driver.py:386
+#: nova/virt/libvirt/driver.py:381 nova/virt/libvirt/driver.py:384
#, python-format
msgid "Can not handle authentication request for %d credentials"
msgstr ""
-#: nova/virt/libvirt/driver.py:468
+#: nova/virt/libvirt/driver.py:466
#, python-format
msgid "Error from libvirt during destroy. Code=%(errcode)s Error=%(e)s"
msgstr ""
-#: nova/virt/libvirt/driver.py:482
+#: nova/virt/libvirt/driver.py:480
msgid "During wait destroy, instance disappeared."
msgstr ""
-#: nova/virt/libvirt/driver.py:487
+#: nova/virt/libvirt/driver.py:485
msgid "Instance destroyed successfully."
msgstr ""
-#: nova/virt/libvirt/driver.py:509
+#: nova/virt/libvirt/driver.py:507
msgid "Error from libvirt during undefineFlags. Retrying with undefine"
msgstr ""
-#: nova/virt/libvirt/driver.py:524
+#: nova/virt/libvirt/driver.py:522
#, python-format
msgid "Error from libvirt during undefine. Code=%(errcode)s Error=%(e)s"
msgstr ""
-#: nova/virt/libvirt/driver.py:537
+#: nova/virt/libvirt/driver.py:535
#, python-format
msgid "Error from libvirt during unfilter. Code=%(errcode)s Error=%(e)s"
msgstr ""
-#: nova/virt/libvirt/driver.py:554
+#: nova/virt/libvirt/driver.py:552
#, python-format
msgid "Deleting instance files %(target)s"
msgstr ""
-#: nova/virt/libvirt/driver.py:568
+#: nova/virt/libvirt/driver.py:566
#, python-format
msgid "Failed to cleanup directory %(target)s: %(e)s"
msgstr ""
-#: nova/virt/libvirt/driver.py:730
+#: nova/virt/libvirt/driver.py:726
msgid "During detach_volume, instance disappeared."
msgstr ""
-#: nova/virt/libvirt/driver.py:740
+#: nova/virt/libvirt/driver.py:736
msgid "attaching LXC block device"
msgstr ""
-#: nova/virt/libvirt/driver.py:753
+#: nova/virt/libvirt/driver.py:749
msgid "detaching LXC block device"
msgstr ""
-#: nova/virt/libvirt/driver.py:885
+#: nova/virt/libvirt/driver.py:881
msgid "Instance soft rebooted successfully."
msgstr ""
-#: nova/virt/libvirt/driver.py:889
+#: nova/virt/libvirt/driver.py:885
msgid "Failed to soft reboot instance."
msgstr ""
-#: nova/virt/libvirt/driver.py:921
+#: nova/virt/libvirt/driver.py:917
msgid "Instance shutdown successfully."
msgstr ""
-#: nova/virt/libvirt/driver.py:956
+#: nova/virt/libvirt/driver.py:953
msgid "Instance rebooted successfully."
msgstr ""
-#: nova/virt/libvirt/driver.py:1086
+#: nova/virt/libvirt/driver.py:1083
msgid "Instance is running"
msgstr ""
-#: nova/virt/libvirt/driver.py:1093 nova/virt/powervm/operator.py:253
+#: nova/virt/libvirt/driver.py:1090 nova/virt/powervm/operator.py:255
msgid "Instance spawned successfully."
msgstr ""
-#: nova/virt/libvirt/driver.py:1109
+#: nova/virt/libvirt/driver.py:1106
#, python-format
msgid "data: %(data)r, fpath: %(fpath)r"
msgstr ""
-#: nova/virt/libvirt/driver.py:1155
+#: nova/virt/libvirt/driver.py:1152
msgid "Guest does not have a console available"
msgstr ""
-#: nova/virt/libvirt/driver.py:1199
+#: nova/virt/libvirt/driver.py:1196
#, python-format
msgid "Path '%(path)s' supports direct I/O"
msgstr ""
-#: nova/virt/libvirt/driver.py:1203
+#: nova/virt/libvirt/driver.py:1200
#, python-format
msgid "Path '%(path)s' does not support direct I/O: '%(ex)s'"
msgstr ""
-#: nova/virt/libvirt/driver.py:1207 nova/virt/libvirt/driver.py:1211
+#: nova/virt/libvirt/driver.py:1204 nova/virt/libvirt/driver.py:1208
#, python-format
msgid "Error on '%(path)s' while checking direct I/O: '%(ex)s'"
msgstr ""
-#: nova/virt/libvirt/driver.py:1277
+#: nova/virt/libvirt/driver.py:1274
msgid "Creating image"
msgstr ""
-#: nova/virt/libvirt/driver.py:1403
+#: nova/virt/libvirt/driver.py:1399
msgid "Using config drive"
msgstr ""
-#: nova/virt/libvirt/driver.py:1413
+#: nova/virt/libvirt/driver.py:1409
#, python-format
msgid "Creating config drive at %(path)s"
msgstr ""
-#: nova/virt/libvirt/driver.py:1427
+#: nova/virt/libvirt/driver.py:1423
#, python-format
msgid "Injecting %(injection)s into image %(img_id)s"
msgstr ""
-#: nova/virt/libvirt/driver.py:1437
+#: nova/virt/libvirt/driver.py:1433
#, python-format
msgid "Ignoring error injecting data into image %(img_id)s (%(e)s)"
msgstr ""
-#: nova/virt/libvirt/driver.py:1511
+#: nova/virt/libvirt/driver.py:1507
#, python-format
msgid ""
"Config requested an explicit CPU model, but the current libvirt "
"hypervisor '%s' does not support selecting CPU models"
msgstr ""
-#: nova/virt/libvirt/driver.py:1517
+#: nova/virt/libvirt/driver.py:1513
msgid "Config requested a custom CPU model, but no model name was provided"
msgstr ""
-#: nova/virt/libvirt/driver.py:1521
+#: nova/virt/libvirt/driver.py:1517
msgid "A CPU model name should not be set when a host CPU model is requested"
msgstr ""
-#: nova/virt/libvirt/driver.py:1525
+#: nova/virt/libvirt/driver.py:1521
#, python-format
msgid "CPU mode '%(mode)s' model '%(model)s' was chosen"
msgstr ""
-#: nova/virt/libvirt/driver.py:1541
+#: nova/virt/libvirt/driver.py:1537
msgid ""
"Passthrough of the host CPU was requested but this libvirt version does "
"not support this feature"
msgstr ""
-#: nova/virt/libvirt/driver.py:1833
+#: nova/virt/libvirt/driver.py:1827
msgid "Starting toXML method"
msgstr ""
-#: nova/virt/libvirt/driver.py:1837
+#: nova/virt/libvirt/driver.py:1831
msgid "Finished toXML method"
msgstr ""
-#: nova/virt/libvirt/driver.py:1854
+#: nova/virt/libvirt/driver.py:1848
#, python-format
msgid ""
"Error from libvirt while looking up %(instance_name)s: [Error Code "
"%(error_code)s] %(ex)s"
msgstr ""
-#: nova/virt/libvirt/driver.py:2106
+#: nova/virt/libvirt/driver.py:2100
msgid "libvirt version is too old (does not support getVersion)"
msgstr ""
-#: nova/virt/libvirt/driver.py:2293
+#: nova/virt/libvirt/driver.py:2288
msgid "Block migration can not be used with shared storage."
msgstr ""
-#: nova/virt/libvirt/driver.py:2301
+#: nova/virt/libvirt/driver.py:2296
msgid "Live migration can not be used without shared storage."
msgstr ""
-#: nova/virt/libvirt/driver.py:2336
+#: nova/virt/libvirt/driver.py:2331
#, python-format
msgid ""
"Unable to migrate %(instance_uuid)s: Disk of instance is too "
"large(available on destination host:%(available)s < need:%(necessary)s)"
msgstr ""
-#: nova/virt/libvirt/driver.py:2356
+#: nova/virt/libvirt/driver.py:2351
#, python-format
msgid ""
"Instance launched has CPU info:\n"
"%s"
msgstr ""
-#: nova/virt/libvirt/driver.py:2368
+#: nova/virt/libvirt/driver.py:2363
#, python-format
msgid ""
"CPU doesn't have compatibility.\n"
@@ -6479,51 +6417,51 @@ msgid ""
"Refer to %(u)s"
msgstr ""
-#: nova/virt/libvirt/driver.py:2385
+#: nova/virt/libvirt/driver.py:2380
#, python-format
msgid ""
"Creating tmpfile %s to notify to other compute nodes that they should "
"mount the same storage."
msgstr ""
-#: nova/virt/libvirt/driver.py:2433
+#: nova/virt/libvirt/driver.py:2428
#, python-format
msgid "The firewall filter for %s does not exist"
msgstr ""
-#: nova/virt/libvirt/driver.py:2503
+#: nova/virt/libvirt/driver.py:2498
#, python-format
msgid "Live Migration failure: %(e)s"
msgstr ""
-#: nova/virt/libvirt/driver.py:2547
+#: nova/virt/libvirt/driver.py:2542
#, python-format
msgid "plug_vifs() failed %(cnt)d.Retry up to %(max_retry)d for %(hostname)s."
msgstr ""
-#: nova/virt/libvirt/driver.py:2674
+#: nova/virt/libvirt/driver.py:2669
#, python-format
msgid "skipping %(path)s since it looks like volume"
msgstr ""
-#: nova/virt/libvirt/driver.py:2723
+#: nova/virt/libvirt/driver.py:2718
#, python-format
msgid "Getting disk size of %(i_name)s: %(e)s"
msgstr ""
-#: nova/virt/libvirt/driver.py:2785
+#: nova/virt/libvirt/driver.py:2780
msgid "Starting migrate_disk_and_power_off"
msgstr ""
-#: nova/virt/libvirt/driver.py:2844
+#: nova/virt/libvirt/driver.py:2839
msgid "Instance running successfully."
msgstr ""
-#: nova/virt/libvirt/driver.py:2851
+#: nova/virt/libvirt/driver.py:2846
msgid "Starting finish_migration"
msgstr ""
-#: nova/virt/libvirt/driver.py:2902
+#: nova/virt/libvirt/driver.py:2897
msgid "Starting finish_revert_migration"
msgstr ""
@@ -6533,158 +6471,158 @@ msgid ""
"correctly."
msgstr ""
-#: nova/virt/libvirt/firewall.py:102
+#: nova/virt/libvirt/firewall.py:103
msgid "Called setup_basic_filtering in nwfilter"
msgstr ""
-#: nova/virt/libvirt/firewall.py:110
+#: nova/virt/libvirt/firewall.py:111
msgid "Ensuring static filters"
msgstr ""
-#: nova/virt/libvirt/firewall.py:191
+#: nova/virt/libvirt/firewall.py:192
#, python-format
msgid "The nwfilter(%(instance_filter_name)s) is not found."
msgstr ""
-#: nova/virt/libvirt/firewall.py:214
+#: nova/virt/libvirt/firewall.py:215
#, python-format
msgid "The nwfilter(%(instance_filter_name)s) for%(name)s is not found."
msgstr ""
-#: nova/virt/libvirt/firewall.py:230
+#: nova/virt/libvirt/firewall.py:231
msgid "iptables firewall: Setup Basic Filtering"
msgstr ""
-#: nova/virt/libvirt/imagebackend.py:213
+#: nova/virt/libvirt/imagebackend.py:214
msgid "You should specify libvirt_images_volume_group flag to use LVM images."
msgstr ""
-#: nova/virt/libvirt/imagebackend.py:276
+#: nova/virt/libvirt/imagebackend.py:277
#, python-format
msgid "Unknown image_type=%s"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:166
+#: nova/virt/libvirt/imagecache.py:165
#, python-format
msgid "%s is a valid instance name"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:169
+#: nova/virt/libvirt/imagecache.py:168
#, python-format
msgid "%s has a disk file"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:171
+#: nova/virt/libvirt/imagecache.py:170
#, python-format
msgid "Instance %(instance)s is backed by %(backing)s"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:184
+#: nova/virt/libvirt/imagecache.py:183
#, python-format
msgid ""
"Instance %(instance)s is using a backing file %(backing)s which does not "
"appear in the image service"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:239
+#: nova/virt/libvirt/imagecache.py:238
#, python-format
msgid "%(id)s (%(base_file)s): image verification failed"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:249
+#: nova/virt/libvirt/imagecache.py:248
#, python-format
msgid "%(id)s (%(base_file)s): image verification skipped, no hash stored"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:268
+#: nova/virt/libvirt/imagecache.py:267
#, python-format
msgid "Cannot remove %(base_file)s, it does not exist"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:280
+#: nova/virt/libvirt/imagecache.py:279
#, python-format
msgid "Base file too young to remove: %s"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:283
+#: nova/virt/libvirt/imagecache.py:282
#, python-format
msgid "Removing base file: %s"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:290
+#: nova/virt/libvirt/imagecache.py:289
#, python-format
msgid "Failed to remove %(base_file)s, error was %(error)s"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:301
+#: nova/virt/libvirt/imagecache.py:300
#, python-format
msgid "%(id)s (%(base_file)s): checking"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:320
+#: nova/virt/libvirt/imagecache.py:319
#, python-format
msgid ""
"%(id)s (%(base_file)s): in use: on this node %(local)d local, %(remote)d "
"on other nodes"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:332
+#: nova/virt/libvirt/imagecache.py:331
#, python-format
msgid ""
"%(id)s (%(base_file)s): warning -- an absent base file is in use! "
"instances: %(instance_list)s"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:340
+#: nova/virt/libvirt/imagecache.py:339
#, python-format
msgid "%(id)s (%(base_file)s): in use on (%(remote)d on other nodes)"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:350
+#: nova/virt/libvirt/imagecache.py:349
#, python-format
msgid "%(id)s (%(base_file)s): image is not in use"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:356
+#: nova/virt/libvirt/imagecache.py:355
#, python-format
msgid "%(id)s (%(base_file)s): image is in use"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:379
+#: nova/virt/libvirt/imagecache.py:378
#, python-format
msgid "Skipping verification, no base directory at %s"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:383
+#: nova/virt/libvirt/imagecache.py:382
msgid "Verify base images"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:390
+#: nova/virt/libvirt/imagecache.py:389
#, python-format
msgid "Image id %(id)s yields fingerprint %(fingerprint)s"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:408
+#: nova/virt/libvirt/imagecache.py:407
#, python-format
msgid "Unknown base file: %s"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:413
+#: nova/virt/libvirt/imagecache.py:412
#, python-format
msgid "Active base files: %s"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:416
+#: nova/virt/libvirt/imagecache.py:415
#, python-format
msgid "Corrupt base files: %s"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:420
+#: nova/virt/libvirt/imagecache.py:419
#, python-format
msgid "Removable base files: %s"
msgstr ""
-#: nova/virt/libvirt/imagecache.py:428
+#: nova/virt/libvirt/imagecache.py:427
msgid "Verification complete"
msgstr ""
@@ -6693,14 +6631,14 @@ msgstr ""
msgid "LVM snapshots not implemented"
msgstr ""
-#: nova/virt/libvirt/utils.py:134
+#: nova/virt/libvirt/utils.py:133
#, python-format
msgid ""
"Insufficient Space on Volume Group %(vg)s. Only %(free_space)db "
"available, but %(size)db required by volume %(lv)s."
msgstr ""
-#: nova/virt/libvirt/utils.py:143
+#: nova/virt/libvirt/utils.py:142
#, python-format
msgid ""
"Volume group %(vg)s will not be able to hold sparse volume %(lv)s. "
@@ -6708,73 +6646,73 @@ msgid ""
"%(free_space)db."
msgstr ""
-#: nova/virt/libvirt/utils.py:190
+#: nova/virt/libvirt/utils.py:189
#, python-format
msgid "Path %s must be LVM logical volume"
msgstr ""
-#: nova/virt/libvirt/utils.py:409
+#: nova/virt/libvirt/utils.py:408
msgid "Can't retrieve root device path from instance libvirt configuration"
msgstr ""
-#: nova/virt/libvirt/utils.py:498
+#: nova/virt/libvirt/utils.py:497
#, python-format
msgid "Reading image info file: %s"
msgstr ""
-#: nova/virt/libvirt/utils.py:502
+#: nova/virt/libvirt/utils.py:501
#, python-format
msgid "Read: %s"
msgstr ""
-#: nova/virt/libvirt/utils.py:508
+#: nova/virt/libvirt/utils.py:507
#, python-format
msgid "Error reading image info file %(filename)s: %(error)s"
msgstr ""
-#: nova/virt/libvirt/utils.py:532
+#: nova/virt/libvirt/utils.py:531
#, python-format
msgid "Writing image info file: %s"
msgstr ""
-#: nova/virt/libvirt/utils.py:533
+#: nova/virt/libvirt/utils.py:532
#, python-format
msgid "Wrote: %s"
msgstr ""
-#: nova/virt/libvirt/vif.py:97
+#: nova/virt/libvirt/vif.py:96
#, python-format
msgid "Ensuring vlan %(vlan)s and bridge %(bridge)s"
msgstr ""
-#: nova/virt/libvirt/vif.py:107
+#: nova/virt/libvirt/vif.py:106
#, python-format
msgid "Ensuring bridge %s"
msgstr ""
-#: nova/virt/libvirt/vif.py:183 nova/virt/libvirt/vif.py:249
-#: nova/virt/libvirt/vif.py:309
+#: nova/virt/libvirt/vif.py:182 nova/virt/libvirt/vif.py:248
+#: nova/virt/libvirt/vif.py:308
msgid "Failed while unplugging vif"
msgstr ""
-#: nova/virt/libvirt/volume.py:176
+#: nova/virt/libvirt/volume.py:175
#, python-format
msgid "iSCSI device not found at %s"
msgstr ""
-#: nova/virt/libvirt/volume.py:179
+#: nova/virt/libvirt/volume.py:178
#, python-format
msgid ""
"ISCSI volume not yet found at: %(mount_device)s. Will rescan & retry. "
"Try number: %(tries)s"
msgstr ""
-#: nova/virt/libvirt/volume.py:191
+#: nova/virt/libvirt/volume.py:190
#, python-format
msgid "Found iSCSI node %(mount_device)s (after %(tries)s rescans)"
msgstr ""
-#: nova/virt/libvirt/volume_nfs.py:81
+#: nova/virt/libvirt/volume_nfs.py:82
#, python-format
msgid "%s is already mounted"
msgstr ""
@@ -6837,130 +6775,130 @@ msgstr ""
msgid "PowerVM LPAR instance '%(instance_name)s' cleanup failed"
msgstr ""
-#: nova/virt/powervm/operator.py:91
+#: nova/virt/powervm/operator.py:92
#, python-format
msgid "LPAR instance '%s' not found"
msgstr ""
-#: nova/virt/powervm/operator.py:174
+#: nova/virt/powervm/operator.py:176
msgid "Not enough free memory in the host"
msgstr ""
-#: nova/virt/powervm/operator.py:184
+#: nova/virt/powervm/operator.py:186
msgid "Insufficient available CPU on PowerVM"
msgstr ""
-#: nova/virt/powervm/operator.py:208
+#: nova/virt/powervm/operator.py:210
#, python-format
msgid "Creating LPAR instance '%s'"
msgstr ""
-#: nova/virt/powervm/operator.py:211
+#: nova/virt/powervm/operator.py:213
#, python-format
msgid "LPAR instance '%s' creation failed"
msgstr ""
-#: nova/virt/powervm/operator.py:221
+#: nova/virt/powervm/operator.py:223
#, python-format
msgid "Fetching image '%s' from glance"
msgstr ""
-#: nova/virt/powervm/operator.py:225
+#: nova/virt/powervm/operator.py:227
#, python-format
msgid "Copying image '%s' to IVM"
msgstr ""
-#: nova/virt/powervm/operator.py:230
+#: nova/virt/powervm/operator.py:232
msgid "Creating logical volume"
msgstr ""
-#: nova/virt/powervm/operator.py:235
+#: nova/virt/powervm/operator.py:237
#, python-format
msgid "Copying image to the device '%s'"
msgstr ""
-#: nova/virt/powervm/operator.py:238
+#: nova/virt/powervm/operator.py:240
#, python-format
msgid "PowerVM image creation failed: %s"
msgstr ""
-#: nova/virt/powervm/operator.py:244
+#: nova/virt/powervm/operator.py:246
#, python-format
msgid "Activating the LPAR instance '%s'"
msgstr ""
-#: nova/virt/powervm/operator.py:258
+#: nova/virt/powervm/operator.py:260
#, python-format
msgid "Instance '%s' failed to boot"
msgstr ""
-#: nova/virt/powervm/operator.py:275
+#: nova/virt/powervm/operator.py:277
#, python-format
msgid "During destroy, LPAR instance '%s' was not found on PowerVM system."
msgstr ""
-#: nova/virt/powervm/operator.py:284
+#: nova/virt/powervm/operator.py:286
#, python-format
msgid "Shutting down the instance '%s'"
msgstr ""
-#: nova/virt/powervm/operator.py:288
+#: nova/virt/powervm/operator.py:290
#, python-format
msgid "Removing the logical volume '%s'"
msgstr ""
-#: nova/virt/powervm/operator.py:291
+#: nova/virt/powervm/operator.py:293
#, python-format
msgid "Deleting the LPAR instance '%s'"
msgstr ""
-#: nova/virt/powervm/operator.py:294
+#: nova/virt/powervm/operator.py:296
msgid "PowerVM instance cleanup failed"
msgstr ""
-#: nova/virt/powervm/operator.py:495
+#: nova/virt/powervm/operator.py:497
msgid "Could not create logical volume. No space left on any volume group."
msgstr ""
-#: nova/virt/powervm/operator.py:554
+#: nova/virt/powervm/operator.py:556
msgid "Unable to get checksum"
msgstr ""
-#: nova/virt/powervm/operator.py:557
+#: nova/virt/powervm/operator.py:559
msgid "Image checksums do not match"
msgstr ""
-#: nova/virt/powervm/operator.py:582
+#: nova/virt/powervm/operator.py:584
msgid "Uncompressed image file not found"
msgstr ""
-#: nova/virt/vmwareapi/driver.py:111
+#: nova/virt/vmwareapi/driver.py:112
msgid ""
"Must specify vmwareapi_host_ip,vmwareapi_host_username and "
"vmwareapi_host_password to usecompute_driver=vmwareapi.VMWareESXDriver"
msgstr ""
-#: nova/virt/vmwareapi/driver.py:275
+#: nova/virt/vmwareapi/driver.py:276
#, python-format
msgid "In vmwareapi:_create_session, got this exception: %s"
msgstr ""
-#: nova/virt/vmwareapi/driver.py:358
+#: nova/virt/vmwareapi/driver.py:359
#, python-format
msgid "In vmwareapi:_call_method, got this exception: %s"
msgstr ""
-#: nova/virt/vmwareapi/driver.py:393
+#: nova/virt/vmwareapi/driver.py:394
#, python-format
msgid "Task [%(task_name)s] %(task_ref)s status: success"
msgstr ""
-#: nova/virt/vmwareapi/driver.py:398
+#: nova/virt/vmwareapi/driver.py:399
#, python-format
msgid "Task [%(task_name)s] %(task_ref)s status: error %(error_info)s"
msgstr ""
-#: nova/virt/vmwareapi/driver.py:402
+#: nova/virt/vmwareapi/driver.py:403
#, python-format
msgid "In vmwareapi:_poll_task, Got this error %s"
msgstr ""
@@ -7032,279 +6970,279 @@ msgstr ""
msgid "Created Port Group with name %s on the ESX host"
msgstr ""
-#: nova/virt/vmwareapi/read_write_util.py:145
+#: nova/virt/vmwareapi/read_write_util.py:143
#, python-format
msgid "Exception during HTTP connection close in VMWareHTTpWrite. Exception is %s"
msgstr ""
-#: nova/virt/vmwareapi/vim.py:84
+#: nova/virt/vmwareapi/vim.py:85
msgid "Unable to import suds."
msgstr ""
-#: nova/virt/vmwareapi/vim.py:90
+#: nova/virt/vmwareapi/vim.py:91
msgid "Must specify vmwareapi_wsdl_loc"
msgstr ""
-#: nova/virt/vmwareapi/vim.py:145
+#: nova/virt/vmwareapi/vim.py:146
#, python-format
msgid "No such SOAP method '%s' provided by VI SDK"
msgstr ""
-#: nova/virt/vmwareapi/vim.py:150
+#: nova/virt/vmwareapi/vim.py:151
#, python-format
msgid "httplib error in %s: "
msgstr ""
-#: nova/virt/vmwareapi/vim.py:157
+#: nova/virt/vmwareapi/vim.py:158
#, python-format
msgid "Socket error in %s: "
msgstr ""
-#: nova/virt/vmwareapi/vim.py:162
+#: nova/virt/vmwareapi/vim.py:163
#, python-format
msgid "Type error in %s: "
msgstr ""
-#: nova/virt/vmwareapi/vim.py:166
+#: nova/virt/vmwareapi/vim.py:167
#, python-format
msgid "Exception in %s "
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:66
+#: nova/virt/vmwareapi/vmops.py:67
msgid "Getting list of instances"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:82
+#: nova/virt/vmwareapi/vmops.py:83
#, python-format
msgid "Got total of %s instances"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:126
+#: nova/virt/vmwareapi/vmops.py:127
msgid "Couldn't get a local Datastore reference"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:196
+#: nova/virt/vmwareapi/vmops.py:197
msgid "Creating VM on the ESX host"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:204
+#: nova/virt/vmwareapi/vmops.py:205
msgid "Created VM on the ESX host"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:232
+#: nova/virt/vmwareapi/vmops.py:233
#, python-format
msgid ""
"Creating Virtual Disk of size %(vmdk_file_size_in_kb)s KB and adapter "
"type %(adapter_type)s on the ESX host local store %(data_store_name)s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:250
+#: nova/virt/vmwareapi/vmops.py:251
#, python-format
msgid ""
"Created Virtual Disk of size %(vmdk_file_size_in_kb)s KB on the ESX host "
"local store %(data_store_name)s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:260
+#: nova/virt/vmwareapi/vmops.py:261
#, python-format
msgid ""
"Deleting the file %(flat_uploaded_vmdk_path)s on the ESX host localstore "
"%(data_store_name)s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:273
+#: nova/virt/vmwareapi/vmops.py:274
#, python-format
msgid ""
"Deleted the file %(flat_uploaded_vmdk_path)s on the ESX host local store "
"%(data_store_name)s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:285
+#: nova/virt/vmwareapi/vmops.py:286
#, python-format
msgid ""
"Downloading image file data %(image_ref)s to the ESX data store "
"%(data_store_name)s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:301
+#: nova/virt/vmwareapi/vmops.py:302
#, python-format
msgid ""
"Downloaded image file data %(image_ref)s to the ESX data store "
"%(data_store_name)s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:319
+#: nova/virt/vmwareapi/vmops.py:320
msgid "Reconfiguring VM instance to attach the image disk"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:326
+#: nova/virt/vmwareapi/vmops.py:327
msgid "Reconfigured VM instance to attach the image disk"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:333
+#: nova/virt/vmwareapi/vmops.py:334
msgid "Powering on the VM instance"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:339
+#: nova/virt/vmwareapi/vmops.py:340
msgid "Powered on the VM instance"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:385
+#: nova/virt/vmwareapi/vmops.py:386
msgid "Creating Snapshot of the VM instance"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:395
+#: nova/virt/vmwareapi/vmops.py:396
msgid "Created Snapshot of the VM instance"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:438
+#: nova/virt/vmwareapi/vmops.py:439
msgid "Copying disk data before snapshot of the VM"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:451
+#: nova/virt/vmwareapi/vmops.py:452
msgid "Copied disk data before snapshot of the VM"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:460
+#: nova/virt/vmwareapi/vmops.py:461
#, python-format
msgid "Uploading image %s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:474
+#: nova/virt/vmwareapi/vmops.py:475
#, python-format
msgid "Uploaded image %s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:485
+#: nova/virt/vmwareapi/vmops.py:486
#, python-format
msgid "Deleting temporary vmdk file %s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:494
+#: nova/virt/vmwareapi/vmops.py:495
#, python-format
msgid "Deleted temporary vmdk file %s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:526
+#: nova/virt/vmwareapi/vmops.py:527
msgid "instance is not powered on"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:533
+#: nova/virt/vmwareapi/vmops.py:534
msgid "Rebooting guest OS of VM"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:536
+#: nova/virt/vmwareapi/vmops.py:537
msgid "Rebooted guest OS of VM"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:538
+#: nova/virt/vmwareapi/vmops.py:539
msgid "Doing hard reboot of VM"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:542
+#: nova/virt/vmwareapi/vmops.py:543
msgid "Did hard reboot of VM"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:554
+#: nova/virt/vmwareapi/vmops.py:555
msgid "instance not present"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:573
+#: nova/virt/vmwareapi/vmops.py:574
msgid "Powering off the VM"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:578
+#: nova/virt/vmwareapi/vmops.py:579
msgid "Powered off the VM"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:582
+#: nova/virt/vmwareapi/vmops.py:583
msgid "Unregistering the VM"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:585
+#: nova/virt/vmwareapi/vmops.py:586
msgid "Unregistered the VM"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:587
+#: nova/virt/vmwareapi/vmops.py:588
#, python-format
msgid ""
"In vmwareapi:vmops:destroy, got this exception while un-registering the "
"VM: %s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:599
+#: nova/virt/vmwareapi/vmops.py:600
#, python-format
msgid "Deleting contents of the VM from datastore %(datastore_name)s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:609
+#: nova/virt/vmwareapi/vmops.py:610
#, python-format
msgid "Deleted contents of the VM from datastore %(datastore_name)s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:614
+#: nova/virt/vmwareapi/vmops.py:615
#, python-format
msgid ""
"In vmwareapi:vmops:destroy, got this exception while deleting the VM "
"contents from the disk: %s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:623
+#: nova/virt/vmwareapi/vmops.py:624
msgid "pause not supported for vmwareapi"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:627
+#: nova/virt/vmwareapi/vmops.py:628
msgid "unpause not supported for vmwareapi"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:641
+#: nova/virt/vmwareapi/vmops.py:642
msgid "Suspending the VM"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:645
+#: nova/virt/vmwareapi/vmops.py:646
msgid "Suspended the VM"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:648
+#: nova/virt/vmwareapi/vmops.py:649
msgid "instance is powered off and can not be suspended."
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:651
+#: nova/virt/vmwareapi/vmops.py:652
msgid "VM was already in suspended state. So returning without doing anything"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:664
+#: nova/virt/vmwareapi/vmops.py:665
msgid "Resuming the VM"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:669
+#: nova/virt/vmwareapi/vmops.py:670
msgid "Resumed the VM"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:671
+#: nova/virt/vmwareapi/vmops.py:672
msgid "instance is not in a suspended state"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:707
+#: nova/virt/vmwareapi/vmops.py:708
msgid "get_diagnostics not implemented for vmwareapi"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:765
+#: nova/virt/vmwareapi/vmops.py:766
#, python-format
msgid "Reconfiguring VM instance to set the machine id with ip - %(ip_addr)s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:773
+#: nova/virt/vmwareapi/vmops.py:774
#, python-format
msgid "Reconfigured VM instance to set the machine id with ip - %(ip_addr)s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:810
+#: nova/virt/vmwareapi/vmops.py:811
#, python-format
msgid "Creating directory with path %s"
msgstr ""
-#: nova/virt/vmwareapi/vmops.py:814
+#: nova/virt/vmwareapi/vmops.py:815
#, python-format
msgid "Created directory with path %s"
msgstr ""
@@ -7339,103 +7277,103 @@ msgstr ""
msgid "Got image size of %(size)s for the image %(image)s"
msgstr ""
-#: nova/virt/xenapi/agent.py:85 nova/virt/xenapi/vmops.py:1491
+#: nova/virt/xenapi/agent.py:86 nova/virt/xenapi/vmops.py:1489
#, python-format
msgid "TIMEOUT: The call to %(method)s timed out. args=%(args)r"
msgstr ""
-#: nova/virt/xenapi/agent.py:89 nova/virt/xenapi/vmops.py:1495
+#: nova/virt/xenapi/agent.py:90 nova/virt/xenapi/vmops.py:1493
#, python-format
msgid ""
"NOT IMPLEMENTED: The call to %(method)s is not supported by the agent. "
"args=%(args)r"
msgstr ""
-#: nova/virt/xenapi/agent.py:94 nova/virt/xenapi/vmops.py:1500
+#: nova/virt/xenapi/agent.py:95 nova/virt/xenapi/vmops.py:1498
#, python-format
msgid "The call to %(method)s returned an error: %(e)s. args=%(args)r"
msgstr ""
-#: nova/virt/xenapi/agent.py:104
+#: nova/virt/xenapi/agent.py:105
#, python-format
msgid ""
"The agent call to %(method)s returned an invalid response: %(ret)r. "
"path=%(path)s; args=%(args)r"
msgstr ""
-#: nova/virt/xenapi/agent.py:114
+#: nova/virt/xenapi/agent.py:115
#, python-format
msgid "Failed to query agent version: %(resp)r"
msgstr ""
-#: nova/virt/xenapi/agent.py:132
+#: nova/virt/xenapi/agent.py:133
msgid "Querying agent version"
msgstr ""
-#: nova/virt/xenapi/agent.py:146
+#: nova/virt/xenapi/agent.py:147
msgid "Reached maximum time attempting to query agent version"
msgstr ""
-#: nova/virt/xenapi/agent.py:154
+#: nova/virt/xenapi/agent.py:155
#, python-format
msgid "Updating agent to %s"
msgstr ""
-#: nova/virt/xenapi/agent.py:162
+#: nova/virt/xenapi/agent.py:163
#, python-format
msgid "Failed to update agent: %(resp)r"
msgstr ""
-#: nova/virt/xenapi/agent.py:176
+#: nova/virt/xenapi/agent.py:177
msgid "Setting admin password"
msgstr ""
-#: nova/virt/xenapi/agent.py:187
+#: nova/virt/xenapi/agent.py:188
#, python-format
msgid "Failed to exchange keys: %(resp)r"
msgstr ""
-#: nova/virt/xenapi/agent.py:207
+#: nova/virt/xenapi/agent.py:208
#, python-format
msgid "Failed to update password: %(resp)r"
msgstr ""
-#: nova/virt/xenapi/agent.py:214
+#: nova/virt/xenapi/agent.py:215
#, python-format
msgid "Injecting file path: %r"
msgstr ""
-#: nova/virt/xenapi/agent.py:227
+#: nova/virt/xenapi/agent.py:228
#, python-format
msgid "Failed to inject file: %(resp)r"
msgstr ""
-#: nova/virt/xenapi/agent.py:234
+#: nova/virt/xenapi/agent.py:235
msgid "Resetting network"
msgstr ""
-#: nova/virt/xenapi/agent.py:240
+#: nova/virt/xenapi/agent.py:241
#, python-format
msgid "Failed to reset network: %(resp)r"
msgstr ""
-#: nova/virt/xenapi/agent.py:263
+#: nova/virt/xenapi/agent.py:264
msgid ""
"XenServer tools installed in this image are capable of network injection."
" Networking files will not bemanipulated"
msgstr ""
-#: nova/virt/xenapi/agent.py:271
+#: nova/virt/xenapi/agent.py:272
msgid ""
"XenServer tools are present in this image but are not capable of network "
"injection"
msgstr ""
-#: nova/virt/xenapi/agent.py:275
+#: nova/virt/xenapi/agent.py:276
msgid "XenServer tools are not installed in this image"
msgstr ""
-#: nova/virt/xenapi/agent.py:327
+#: nova/virt/xenapi/agent.py:328
#, python-format
msgid "OpenSSL error: %s"
msgstr ""
@@ -7456,77 +7394,82 @@ msgstr ""
msgid "Could not determine key: %s"
msgstr ""
-#: nova/virt/xenapi/driver.py:571
+#: nova/virt/xenapi/driver.py:572
msgid "Host startup on XenServer is not supported."
msgstr ""
-#: nova/virt/xenapi/driver.py:623
+#: nova/virt/xenapi/driver.py:624
msgid "Unable to log in to XenAPI (is the Dom0 disk full?)"
msgstr ""
-#: nova/virt/xenapi/driver.py:661
+#: nova/virt/xenapi/driver.py:664
msgid "Host is member of a pool, but DB says otherwise"
msgstr ""
-#: nova/virt/xenapi/driver.py:745 nova/virt/xenapi/driver.py:759
+#: nova/virt/xenapi/driver.py:748 nova/virt/xenapi/driver.py:762
#, python-format
msgid "Got exception: %s"
msgstr ""
-#: nova/virt/xenapi/fake.py:670 nova/virt/xenapi/fake.py:772
-#: nova/virt/xenapi/fake.py:791 nova/virt/xenapi/fake.py:859
+#: nova/virt/xenapi/fake.py:672 nova/virt/xenapi/fake.py:774
+#: nova/virt/xenapi/fake.py:793 nova/virt/xenapi/fake.py:861
msgid "Raising NotImplemented"
msgstr ""
-#: nova/virt/xenapi/fake.py:672
+#: nova/virt/xenapi/fake.py:674
#, python-format
msgid "xenapi.fake does not have an implementation for %s"
msgstr ""
-#: nova/virt/xenapi/fake.py:706
+#: nova/virt/xenapi/fake.py:708
#, python-format
msgid "Calling %(localname)s %(impl)s"
msgstr ""
-#: nova/virt/xenapi/fake.py:711
+#: nova/virt/xenapi/fake.py:713
#, python-format
msgid "Calling getter %s"
msgstr ""
-#: nova/virt/xenapi/fake.py:714
+#: nova/virt/xenapi/fake.py:716
#, python-format
msgid "Calling setter %s"
msgstr ""
-#: nova/virt/xenapi/fake.py:774
+#: nova/virt/xenapi/fake.py:776
#, python-format
msgid ""
"xenapi.fake does not have an implementation for %s or it has been called "
"with the wrong number of arguments"
msgstr ""
-#: nova/virt/xenapi/host.py:71
+#: nova/virt/xenapi/host.py:70
#, python-format
msgid ""
"Instance %(name)s running on %(host)s could not be found in the database:"
" assuming it is a worker VM and skip ping migration to a new host"
msgstr ""
-#: nova/virt/xenapi/host.py:157
+#: nova/virt/xenapi/host.py:82
+#, python-format
+msgid "Aggregate for host %(host)s count not be found."
+msgstr ""
+
+#: nova/virt/xenapi/host.py:164
#, python-format
msgid "Unable to get SR for this host: %s"
msgstr ""
-#: nova/virt/xenapi/host.py:191
+#: nova/virt/xenapi/host.py:199
#, python-format
msgid "Failed to extract instance support from %s"
msgstr ""
-#: nova/virt/xenapi/host.py:208
+#: nova/virt/xenapi/host.py:216
msgid "Unable to get updated status"
msgstr ""
-#: nova/virt/xenapi/host.py:211
+#: nova/virt/xenapi/host.py:219
#, python-format
msgid "The call to %(method)s returned an error: %(e)s."
msgstr ""
@@ -7546,768 +7489,768 @@ msgstr ""
msgid "Found no network for bridge %s"
msgstr ""
-#: nova/virt/xenapi/pool.py:75
+#: nova/virt/xenapi/pool.py:78
#, python-format
msgid ""
"Aggregate %(aggregate_id)s: unrecoverable state during operation on "
"%(host)s"
msgstr ""
-#: nova/virt/xenapi/pool.py:166
+#: nova/virt/xenapi/pool.py:173
#, python-format
msgid "Unable to eject %(host)s from the pool; pool not empty"
msgstr ""
-#: nova/virt/xenapi/pool.py:182
+#: nova/virt/xenapi/pool.py:190
#, python-format
msgid "Unable to eject %(host)s from the pool; No master found"
msgstr ""
-#: nova/virt/xenapi/pool.py:199
+#: nova/virt/xenapi/pool.py:207
#, python-format
msgid "Pool-Join failed: %(e)s"
msgstr ""
-#: nova/virt/xenapi/pool.py:202
+#: nova/virt/xenapi/pool.py:210
#, python-format
msgid "Unable to join %(host)s in the pool"
msgstr ""
-#: nova/virt/xenapi/pool.py:218
+#: nova/virt/xenapi/pool.py:226
#, python-format
msgid "Pool-eject failed: %(e)s"
msgstr ""
-#: nova/virt/xenapi/pool.py:230
+#: nova/virt/xenapi/pool.py:238
#, python-format
msgid "Unable to set up pool: %(e)s."
msgstr ""
-#: nova/virt/xenapi/pool.py:241
+#: nova/virt/xenapi/pool.py:249
#, python-format
msgid "Pool-set_name_label failed: %(e)s"
msgstr ""
-#: nova/virt/xenapi/vif.py:104
+#: nova/virt/xenapi/vif.py:105
#, python-format
msgid "Found no PIF for device %s"
msgstr ""
-#: nova/virt/xenapi/vif.py:123
+#: nova/virt/xenapi/vif.py:124
#, python-format
msgid ""
"PIF %(pif_rec['uuid'])s for network %(bridge)s has VLAN id %(pif_vlan)d. "
"Expected %(vlan_num)d"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:257
+#: nova/virt/xenapi/vm_utils.py:264
msgid "Created VM"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:269
+#: nova/virt/xenapi/vm_utils.py:276
msgid "VM destroyed"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:276
+#: nova/virt/xenapi/vm_utils.py:283
msgid "VM already halted, skipping shutdown..."
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:280
+#: nova/virt/xenapi/vm_utils.py:287
msgid "Shutting down VM"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:312
+#: nova/virt/xenapi/vm_utils.py:319
#, python-format
msgid "VBD not found in instance %s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:329
+#: nova/virt/xenapi/vm_utils.py:336
#, python-format
msgid "VBD %s already detached"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:332
+#: nova/virt/xenapi/vm_utils.py:339
#, python-format
msgid "VBD %(vbd_ref)s detach rejected, attempt %(num_attempt)d/%(max_attempts)d"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:337
+#: nova/virt/xenapi/vm_utils.py:344
#, python-format
msgid "Unable to unplug VBD %s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:342
+#: nova/virt/xenapi/vm_utils.py:349
#, python-format
msgid "Reached maximum number of retries trying to unplug VBD %s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:353
+#: nova/virt/xenapi/vm_utils.py:360
#, python-format
msgid "Unable to destroy VBD %s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:372
+#: nova/virt/xenapi/vm_utils.py:379
#, python-format
msgid "Creating %(vbd_type)s-type VBD for VM %(vm_ref)s, VDI %(vdi_ref)s ... "
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:375
+#: nova/virt/xenapi/vm_utils.py:382
#, python-format
msgid "Created VBD %(vbd_ref)s for VM %(vm_ref)s, VDI %(vdi_ref)s."
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:391
+#: nova/virt/xenapi/vm_utils.py:398
#, python-format
msgid "Unable to destroy VDI %s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:423
+#: nova/virt/xenapi/vm_utils.py:430
#, python-format
msgid ""
"Created VDI %(vdi_ref)s (%(name_label)s, %(virtual_size)s, %(read_only)s)"
" on %(sr_ref)s."
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:454
+#: nova/virt/xenapi/vm_utils.py:461
msgid "SR not present and could not be introduced"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:555
+#: nova/virt/xenapi/vm_utils.py:562
#, python-format
msgid "Cloned VDI %(vdi_ref)s from VDI %(vdi_to_clone_ref)s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:575
+#: nova/virt/xenapi/vm_utils.py:582
#, python-format
msgid "No primary VDI found for %(vm_ref)s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:584
+#: nova/virt/xenapi/vm_utils.py:591
msgid "Starting snapshot for VM"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:632
+#: nova/virt/xenapi/vm_utils.py:639
#, python-format
msgid "Destroying cached VDI '%(vdi_uuid)s'"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:690
+#: nova/virt/xenapi/vm_utils.py:697
#, python-format
msgid "Asking xapi to upload %(vdi_uuids)s as ID %(image_id)s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:876
+#: nova/virt/xenapi/vm_utils.py:883
#, python-format
msgid ""
"Fast cloning is only supported on default local SR of type ext. SR on "
"this system was found to be of type %(sr_type)s. Ignoring the cow flag."
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:934
+#: nova/virt/xenapi/vm_utils.py:939
#, python-format
msgid "Unrecognized cache_images value '%s', defaulting to True"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:968
+#: nova/virt/xenapi/vm_utils.py:973
#, python-format
msgid "Fetched VDIs of type '%(vdi_type)s' with UUID '%(vdi_uuid)s'"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:980
+#: nova/virt/xenapi/vm_utils.py:985
#, python-format
msgid ""
"download_vhd %(image_id)s, attempt %(attempt_num)d/%(max_attempts)d, "
"params: %(params)s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:993
+#: nova/virt/xenapi/vm_utils.py:998
#, python-format
msgid "download_vhd failed: %r"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1029
+#: nova/virt/xenapi/vm_utils.py:1032
#, python-format
msgid "Invalid value '%s' for xenapi_torrent_images"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1040
+#: nova/virt/xenapi/vm_utils.py:1043
#, python-format
msgid "Asking xapi to fetch vhd image %(image_id)s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1104
+#: nova/virt/xenapi/vm_utils.py:1107
#, python-format
msgid "vdi_uuid=%(cur_vdi_uuid)s vdi_size_bytes=%(vdi_size_bytes)d"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1120
+#: nova/virt/xenapi/vm_utils.py:1123
#, python-format
msgid "image_size_bytes=%(size_bytes)d, allowed_size_bytes=%(allowed_size_bytes)d"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1124
+#: nova/virt/xenapi/vm_utils.py:1127
#, python-format
msgid ""
"Image size %(size_bytes)d exceeded instance_type allowed size "
"%(allowed_size_bytes)d"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1146
+#: nova/virt/xenapi/vm_utils.py:1149
#, python-format
msgid "Fetching image %(image_id)s, type %(image_type_str)s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1159
+#: nova/virt/xenapi/vm_utils.py:1162
#, python-format
msgid "Size for image %(image_id)s: %(virtual_size)d"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1168
+#: nova/virt/xenapi/vm_utils.py:1171
#, python-format
msgid ""
"Kernel/Ramdisk image is too large: %(vdi_size)d bytes, max %(max_size)d "
"bytes"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1187
+#: nova/virt/xenapi/vm_utils.py:1190
#, python-format
msgid "Copying VDI %s to /boot/guest on dom0"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1201
+#: nova/virt/xenapi/vm_utils.py:1204
#, python-format
msgid "Kernel/Ramdisk VDI %s destroyed"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1210
+#: nova/virt/xenapi/vm_utils.py:1213
msgid "Failed to fetch glance image"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1248
+#: nova/virt/xenapi/vm_utils.py:1251
#, python-format
msgid "Detected %(image_type_str)s format for image %(image_ref)s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1269
+#: nova/virt/xenapi/vm_utils.py:1272
#, python-format
msgid "Looking up vdi %s for PV kernel"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1287
+#: nova/virt/xenapi/vm_utils.py:1290
#, python-format
msgid "Unknown image format %(disk_image_type)s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1318
+#: nova/virt/xenapi/vm_utils.py:1321
#, python-format
msgid "VDI %s is still available"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1414
+#: nova/virt/xenapi/vm_utils.py:1417
#, python-format
msgid "Unable to parse rrd of %(vm_uuid)s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1441
+#: nova/virt/xenapi/vm_utils.py:1444
#, python-format
msgid "Re-scanning SR %s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1469
+#: nova/virt/xenapi/vm_utils.py:1472
#, python-format
msgid "Flag sr_matching_filter '%s' does not respect formatting convention"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1487
+#: nova/virt/xenapi/vm_utils.py:1490
msgid ""
"XenAPI is unable to find a Storage Repository to install guest instances "
"on. Please check your configuration and/or configure the flag "
"'sr_matching_filter'"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1500
+#: nova/virt/xenapi/vm_utils.py:1503
msgid "Cannot find SR of content-type ISO"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1508
+#: nova/virt/xenapi/vm_utils.py:1511
#, python-format
msgid "ISO: looking at SR %(sr_rec)s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1510
+#: nova/virt/xenapi/vm_utils.py:1513
msgid "ISO: not iso content"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1513
+#: nova/virt/xenapi/vm_utils.py:1516
msgid "ISO: iso content_type, no 'i18n-key' key"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1516
+#: nova/virt/xenapi/vm_utils.py:1519
msgid "ISO: iso content_type, i18n-key value not 'local-storage-iso'"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1520
+#: nova/virt/xenapi/vm_utils.py:1523
msgid "ISO: SR MATCHing our criteria"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1522
+#: nova/virt/xenapi/vm_utils.py:1525
msgid "ISO: ISO, looking to see if it is host local"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1525
+#: nova/virt/xenapi/vm_utils.py:1528
#, python-format
msgid "ISO: PBD %(pbd_ref)s disappeared"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1528
+#: nova/virt/xenapi/vm_utils.py:1531
#, python-format
msgid "ISO: PBD matching, want %(pbd_rec)s, have %(host)s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1531
+#: nova/virt/xenapi/vm_utils.py:1534
msgid "ISO: SR with local PBD"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1553
+#: nova/virt/xenapi/vm_utils.py:1556
#, python-format
msgid ""
"Unable to obtain RRD XML for VM %(vm_uuid)s with server details: "
"%(server)s."
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1569
+#: nova/virt/xenapi/vm_utils.py:1572
#, python-format
msgid "Unable to obtain RRD XML updates with server details: %(server)s."
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1623
+#: nova/virt/xenapi/vm_utils.py:1626
#, python-format
msgid "Invalid statistics data from Xenserver: %s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1683
+#: nova/virt/xenapi/vm_utils.py:1686
#, python-format
msgid "VHD %(vdi_uuid)s has parent %(parent_uuid)s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1770
+#: nova/virt/xenapi/vm_utils.py:1773
#, python-format
msgid ""
"Parent %(parent_uuid)s doesn't match original parent "
"%(original_parent_uuid)s, waiting for coalesce..."
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1780
+#: nova/virt/xenapi/vm_utils.py:1783
#, python-format
msgid "VHD coalesce attempts exceeded (%(max_attempts)d), giving up..."
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1815
+#: nova/virt/xenapi/vm_utils.py:1818
#, python-format
msgid "Timeout waiting for device %s to be created"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1835
+#: nova/virt/xenapi/vm_utils.py:1838
#, python-format
msgid "Disconnecting stale VDI %s from compute domU"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1848
+#: nova/virt/xenapi/vm_utils.py:1851
#, python-format
msgid "Plugging VBD %s ... "
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1851
+#: nova/virt/xenapi/vm_utils.py:1854
#, python-format
msgid "Plugging VBD %s done."
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1853
+#: nova/virt/xenapi/vm_utils.py:1856
#, python-format
msgid "VBD %(vbd_ref)s plugged as %(orig_dev)s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1856
+#: nova/virt/xenapi/vm_utils.py:1859
#, python-format
msgid "VBD %(vbd_ref)s plugged into wrong dev, remapping to %(dev)s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1861
+#: nova/virt/xenapi/vm_utils.py:1864
#, python-format
msgid "Destroying VBD for VDI %s ... "
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1869
+#: nova/virt/xenapi/vm_utils.py:1872
#, python-format
msgid "Destroying VBD for VDI %s done."
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1882
+#: nova/virt/xenapi/vm_utils.py:1885
#, python-format
msgid "Running pygrub against %s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1889
+#: nova/virt/xenapi/vm_utils.py:1892
#, python-format
msgid "Found Xen kernel %s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1891
+#: nova/virt/xenapi/vm_utils.py:1894
msgid "No Xen kernel found. Booting HVM."
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1904
+#: nova/virt/xenapi/vm_utils.py:1907
msgid "Partitions:"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1910
+#: nova/virt/xenapi/vm_utils.py:1913
#, python-format
msgid " %(num)s: %(ptype)s %(size)d sectors"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1935
+#: nova/virt/xenapi/vm_utils.py:1938
#, python-format
msgid ""
"Writing partition table %(primary_first)d %(primary_last)d to "
"%(dev_path)s..."
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:1948
+#: nova/virt/xenapi/vm_utils.py:1951
#, python-format
msgid "Writing partition table %s done."
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:2002
+#: nova/virt/xenapi/vm_utils.py:2005
#, python-format
msgid ""
"Starting sparse_copy src=%(src_path)s dst=%(dst_path)s "
"virtual_size=%(virtual_size)d block_size=%(block_size)d"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:2034
+#: nova/virt/xenapi/vm_utils.py:2037
#, python-format
msgid ""
"Finished sparse_copy in %(duration).2f secs, %(compression_pct).2f%% "
"reduction in size"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:2083
+#: nova/virt/xenapi/vm_utils.py:2086
msgid "Manipulating interface files directly"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:2092
+#: nova/virt/xenapi/vm_utils.py:2095
#, python-format
msgid "Failed to mount filesystem (expected for non-linux instances): %s"
msgstr ""
-#: nova/virt/xenapi/vm_utils.py:2204
+#: nova/virt/xenapi/vm_utils.py:2207
msgid "This domU must be running on the host specified by xenapi_connection_url"
msgstr ""
-#: nova/virt/xenapi/vmops.py:128 nova/virt/xenapi/vmops.py:674
+#: nova/virt/xenapi/vmops.py:125 nova/virt/xenapi/vmops.py:672
#, python-format
msgid "Updating progress to %(progress)d"
msgstr ""
-#: nova/virt/xenapi/vmops.py:169
+#: nova/virt/xenapi/vmops.py:167
msgid "Error: Agent is disabled"
msgstr ""
-#: nova/virt/xenapi/vmops.py:237
+#: nova/virt/xenapi/vmops.py:235
msgid "Starting instance"
msgstr ""
-#: nova/virt/xenapi/vmops.py:305
+#: nova/virt/xenapi/vmops.py:303
msgid "Removing kernel/ramdisk files from dom0"
msgstr ""
-#: nova/virt/xenapi/vmops.py:377
+#: nova/virt/xenapi/vmops.py:375
#, python-format
msgid "Block device information present: %s"
msgstr ""
-#: nova/virt/xenapi/vmops.py:408
+#: nova/virt/xenapi/vmops.py:406
msgid "Failed to spawn, rolling back"
msgstr ""
-#: nova/virt/xenapi/vmops.py:481
+#: nova/virt/xenapi/vmops.py:479
msgid "Detected ISO image type, creating blank VM for install"
msgstr ""
-#: nova/virt/xenapi/vmops.py:498
+#: nova/virt/xenapi/vmops.py:496
msgid "Auto configuring disk, attempting to resize partition..."
msgstr ""
-#: nova/virt/xenapi/vmops.py:524
+#: nova/virt/xenapi/vmops.py:522
msgid "Starting VM"
msgstr ""
-#: nova/virt/xenapi/vmops.py:530
+#: nova/virt/xenapi/vmops.py:528
msgid "Waiting for instance state to become running"
msgstr ""
-#: nova/virt/xenapi/vmops.py:544
+#: nova/virt/xenapi/vmops.py:542
#, python-format
msgid ""
"Latest agent build for %(hypervisor)s/%(os)s/%(architecture)s is "
"%(version)s"
msgstr ""
-#: nova/virt/xenapi/vmops.py:547
+#: nova/virt/xenapi/vmops.py:545
#, python-format
msgid "No agent build found for %(hypervisor)s/%(os)s/%(architecture)s"
msgstr ""
-#: nova/virt/xenapi/vmops.py:558
+#: nova/virt/xenapi/vmops.py:556
#, python-format
msgid "Instance agent version: %s"
msgstr ""
-#: nova/virt/xenapi/vmops.py:585
+#: nova/virt/xenapi/vmops.py:583
msgid "Setting VCPU weight"
msgstr ""
-#: nova/virt/xenapi/vmops.py:593
+#: nova/virt/xenapi/vmops.py:591
#, python-format
msgid "Could not find VM with name %s"
msgstr ""
-#: nova/virt/xenapi/vmops.py:643
+#: nova/virt/xenapi/vmops.py:641
msgid "Finished snapshot and upload for VM"
msgstr ""
-#: nova/virt/xenapi/vmops.py:647
+#: nova/virt/xenapi/vmops.py:645
#, python-format
msgid "Migrating VHD '%(vdi_uuid)s' with seq_num %(seq_num)d"
msgstr ""
-#: nova/virt/xenapi/vmops.py:655
+#: nova/virt/xenapi/vmops.py:653
msgid "Failed to transfer vhd to new host"
msgstr ""
-#: nova/virt/xenapi/vmops.py:692
+#: nova/virt/xenapi/vmops.py:690
#, python-format
msgid "Resizing down VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB"
msgstr ""
-#: nova/virt/xenapi/vmops.py:816
+#: nova/virt/xenapi/vmops.py:814
#, python-format
msgid "Resizing up VDI %(vdi_uuid)s from %(old_gb)dGB to %(new_gb)dGB"
msgstr ""
-#: nova/virt/xenapi/vmops.py:821
+#: nova/virt/xenapi/vmops.py:819
msgid "Resize complete"
msgstr ""
-#: nova/virt/xenapi/vmops.py:865
+#: nova/virt/xenapi/vmops.py:863
msgid "Starting halted instance found during reboot"
msgstr ""
-#: nova/virt/xenapi/vmops.py:956
+#: nova/virt/xenapi/vmops.py:954
msgid "Unable to find root VBD/VDI for VM"
msgstr ""
-#: nova/virt/xenapi/vmops.py:982
+#: nova/virt/xenapi/vmops.py:980
msgid "Destroying VDIs"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1009
+#: nova/virt/xenapi/vmops.py:1007
msgid "Using RAW or VHD, skipping kernel and ramdisk deletion"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1016
+#: nova/virt/xenapi/vmops.py:1014
msgid "instance has a kernel or ramdisk but not both"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1023
+#: nova/virt/xenapi/vmops.py:1021
msgid "kernel/ramdisk files removed"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1049
+#: nova/virt/xenapi/vmops.py:1047
msgid "Destroying VM"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1075
+#: nova/virt/xenapi/vmops.py:1073
msgid "VM is not present, skipping destroy..."
msgstr ""
-#: nova/virt/xenapi/vmops.py:1126
+#: nova/virt/xenapi/vmops.py:1124
#, python-format
msgid "Instance is already in Rescue Mode: %s"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1160
+#: nova/virt/xenapi/vmops.py:1158
msgid "VM is not present, skipping soft delete..."
msgstr ""
-#: nova/virt/xenapi/vmops.py:1209
+#: nova/virt/xenapi/vmops.py:1207
#, python-format
msgid "Found %(instance_count)d hung reboots older than %(timeout)d seconds"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1213
+#: nova/virt/xenapi/vmops.py:1211
msgid "Automatically hard rebooting"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1312
+#: nova/virt/xenapi/vmops.py:1310
msgid "Fetching VM ref while BUILDING failed"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1395
+#: nova/virt/xenapi/vmops.py:1393
msgid "Injecting network info to xenstore"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1414
+#: nova/virt/xenapi/vmops.py:1412
msgid "Creating vifs"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1423
+#: nova/virt/xenapi/vmops.py:1421
#, python-format
msgid "Creating VIF for network %(network_ref)s"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1426
+#: nova/virt/xenapi/vmops.py:1424
#, python-format
msgid "Created VIF %(vif_ref)s, network %(network_ref)s"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1454
+#: nova/virt/xenapi/vmops.py:1452
msgid "Injecting hostname to xenstore"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1550
+#: nova/virt/xenapi/vmops.py:1548
#, python-format
msgid ""
"Destination host:%(hostname)s must be in the same aggregate as the source"
" server"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1582
+#: nova/virt/xenapi/vmops.py:1580
msgid "Migrate Receive failed"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1630
+#: nova/virt/xenapi/vmops.py:1628
msgid "VM.assert_can_migratefailed"
msgstr ""
-#: nova/virt/xenapi/vmops.py:1666
+#: nova/virt/xenapi/vmops.py:1664
msgid "Migrate Send failed"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:41
+#: nova/virt/xenapi/volume_utils.py:42
msgid "creating sr within volume_utils"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:44 nova/virt/xenapi/volume_utils.py:72
+#: nova/virt/xenapi/volume_utils.py:45 nova/virt/xenapi/volume_utils.py:73
#, python-format
msgid "type is = %s"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:47 nova/virt/xenapi/volume_utils.py:75
+#: nova/virt/xenapi/volume_utils.py:48 nova/virt/xenapi/volume_utils.py:76
#, python-format
msgid "name = %s"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:60
+#: nova/virt/xenapi/volume_utils.py:61
#, python-format
msgid "Created %(label)s as %(sr_ref)s."
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:65 nova/virt/xenapi/volume_utils.py:163
+#: nova/virt/xenapi/volume_utils.py:66 nova/virt/xenapi/volume_utils.py:164
msgid "Unable to create Storage Repository"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:69
+#: nova/virt/xenapi/volume_utils.py:70
msgid "introducing sr within volume_utils"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:92 nova/virt/xenapi/volume_utils.py:159
+#: nova/virt/xenapi/volume_utils.py:93 nova/virt/xenapi/volume_utils.py:160
#: nova/virt/xenapi/volumeops.py:150
#, python-format
msgid "Introduced %(label)s as %(sr_ref)s."
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:95
+#: nova/virt/xenapi/volume_utils.py:96
msgid "Creating pbd for SR"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:97
+#: nova/virt/xenapi/volume_utils.py:98
msgid "Plugging SR"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:105 nova/virt/xenapi/volumeops.py:154
+#: nova/virt/xenapi/volume_utils.py:106 nova/virt/xenapi/volumeops.py:154
msgid "Unable to introduce Storage Repository"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:116 nova/virt/xenapi/volumeops.py:46
+#: nova/virt/xenapi/volume_utils.py:117 nova/virt/xenapi/volumeops.py:46
msgid "Unable to get SR using uuid"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:118
+#: nova/virt/xenapi/volume_utils.py:119
#, python-format
msgid "Forgetting SR %s..."
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:126
+#: nova/virt/xenapi/volume_utils.py:127
msgid "Unable to forget Storage Repository"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:146
+#: nova/virt/xenapi/volume_utils.py:147
#, python-format
msgid "Introducing %s..."
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:175
+#: nova/virt/xenapi/volume_utils.py:176
#, python-format
msgid "Unable to find SR from VBD %s"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:193
+#: nova/virt/xenapi/volume_utils.py:194
#, python-format
msgid "Ignoring exception %(exc)s when getting PBDs for %(sr_ref)s"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:199
+#: nova/virt/xenapi/volume_utils.py:200
#, python-format
msgid "Ignoring exception %(exc)s when unplugging PBD %(pbd)s"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:223
+#: nova/virt/xenapi/volume_utils.py:224
#, python-format
msgid "Unable to introduce VDI on SR %s"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:231
+#: nova/virt/xenapi/volume_utils.py:232
#, python-format
msgid "Unable to get record of VDI %s on"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:253
+#: nova/virt/xenapi/volume_utils.py:254
#, python-format
msgid "Unable to introduce VDI for SR %s"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:263
+#: nova/virt/xenapi/volume_utils.py:264
#, python-format
msgid "Error finding vdis in SR %s"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:270
+#: nova/virt/xenapi/volume_utils.py:271
#, python-format
msgid "Unable to find vbd for vdi %s"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:281
+#: nova/virt/xenapi/volume_utils.py:282
#, python-format
msgid "Unable to obtain target information %(mountpoint)s"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:309
+#: nova/virt/xenapi/volume_utils.py:310
#, python-format
msgid "Unable to obtain target information %(connection_data)s"
msgstr ""
-#: nova/virt/xenapi/volume_utils.py:335
+#: nova/virt/xenapi/volume_utils.py:336
#, python-format
msgid "Mountpoint cannot be translated: %s"
msgstr ""
@@ -8401,169 +8344,169 @@ msgstr ""
msgid "Mountpoint %(mountpoint)s detached from instance %(instance_name)s"
msgstr ""
-#: nova/vnc/xvp_proxy.py:96 nova/vnc/xvp_proxy.py:101
+#: nova/vnc/xvp_proxy.py:97 nova/vnc/xvp_proxy.py:102
#, python-format
msgid "Error in handshake: %s"
msgstr ""
-#: nova/vnc/xvp_proxy.py:117
+#: nova/vnc/xvp_proxy.py:118
#, python-format
msgid "Invalid request: %s"
msgstr ""
-#: nova/vnc/xvp_proxy.py:137
+#: nova/vnc/xvp_proxy.py:138
#, python-format
msgid "Request: %s"
msgstr ""
-#: nova/vnc/xvp_proxy.py:140
+#: nova/vnc/xvp_proxy.py:141
#, python-format
msgid "Request made with missing token: %s"
msgstr ""
-#: nova/vnc/xvp_proxy.py:150
+#: nova/vnc/xvp_proxy.py:151
#, python-format
msgid "Request made with invalid token: %s"
msgstr ""
-#: nova/vnc/xvp_proxy.py:157
+#: nova/vnc/xvp_proxy.py:158
#, python-format
msgid "Unexpected error: %s"
msgstr ""
-#: nova/vnc/xvp_proxy.py:177
+#: nova/vnc/xvp_proxy.py:178
#, python-format
msgid "Starting nova-xvpvncproxy node (version %s)"
msgstr ""
-#: nova/volume/cinder.py:68
+#: nova/volume/cinder.py:69
#, python-format
msgid "Cinderclient connection created using URL: %s"
msgstr ""
-#: nova/volume/driver.py:103
+#: nova/volume/driver.py:104
#, python-format
msgid "Recovering from a failed execute. Try number %s"
msgstr ""
-#: nova/volume/driver.py:113
+#: nova/volume/driver.py:114
#, python-format
msgid "volume group %s doesn't exist"
msgstr ""
-#: nova/volume/driver.py:324
+#: nova/volume/driver.py:325
#, python-format
msgid "Skipping ensure_export. No iscsi_target provisioned for volume: %s"
msgstr ""
-#: nova/volume/driver.py:397
+#: nova/volume/driver.py:398
#, python-format
msgid "Skipping remove_export. No iscsi_target provisioned for volume: %s"
msgstr ""
-#: nova/volume/driver.py:414
+#: nova/volume/driver.py:415
#, python-format
msgid ""
"Skipping remove_export. No iscsi_target is presently exported for volume:"
" %s"
msgstr ""
-#: nova/volume/driver.py:423
+#: nova/volume/driver.py:424
msgid "ISCSI provider_location not stored, using discovery"
msgstr ""
-#: nova/volume/driver.py:470
+#: nova/volume/driver.py:471
#, python-format
msgid "Could not find iSCSI export for volume %s"
msgstr ""
-#: nova/volume/driver.py:474
+#: nova/volume/driver.py:475
#, python-format
msgid "ISCSI Discovery: Found %s"
msgstr ""
-#: nova/volume/driver.py:565
+#: nova/volume/driver.py:566
#, python-format
msgid "Cannot confirm exported volume id:%(volume_id)s."
msgstr ""
-#: nova/volume/driver.py:606
+#: nova/volume/driver.py:607
#, python-format
msgid "FAKE ISCSI: %s"
msgstr ""
-#: nova/volume/driver.py:618
+#: nova/volume/driver.py:619
#, python-format
msgid "rbd has no pool %s"
msgstr ""
-#: nova/volume/driver.py:740
+#: nova/volume/driver.py:741
#, python-format
msgid "Image %s is not stored in rbd"
msgstr ""
-#: nova/volume/driver.py:744
+#: nova/volume/driver.py:745
#, python-format
msgid "Image %s has blank components"
msgstr ""
-#: nova/volume/driver.py:747
+#: nova/volume/driver.py:748
#, python-format
msgid "Image %s is not an rbd snapshot"
msgstr ""
-#: nova/volume/driver.py:762
+#: nova/volume/driver.py:763
#, python-format
msgid "%s is in a different ceph cluster"
msgstr ""
-#: nova/volume/driver.py:773
+#: nova/volume/driver.py:774
#, python-format
msgid "Unable to read image %s"
msgstr ""
-#: nova/volume/driver.py:815
+#: nova/volume/driver.py:816
#, python-format
msgid "Sheepdog is not working: %s"
msgstr ""
-#: nova/volume/driver.py:820
+#: nova/volume/driver.py:821
msgid "Sheepdog is not working"
msgstr ""
-#: nova/volume/driver.py:924 nova/volume/driver.py:929
+#: nova/volume/driver.py:925 nova/volume/driver.py:930
#, python-format
msgid "LoggingVolumeDriver: %s"
msgstr ""
-#: nova/volume/iscsi.py:122
+#: nova/volume/iscsi.py:123
#, python-format
msgid "Creating volume: %s"
msgstr ""
-#: nova/volume/iscsi.py:136
+#: nova/volume/iscsi.py:137
#, python-format
msgid "Failed to create iscsi target for volume id:%(vol_id)s."
msgstr ""
-#: nova/volume/iscsi.py:146
+#: nova/volume/iscsi.py:147
#, python-format
msgid ""
"Failed to create iscsi target for volume id:%(vol_id)s. Please ensure "
"your tgtd config file contains 'include %(volumes_dir)s/*'"
msgstr ""
-#: nova/volume/iscsi.py:154 nova/volume/iscsi.py:196
+#: nova/volume/iscsi.py:155 nova/volume/iscsi.py:197
#, python-format
msgid "Removing volume: %s"
msgstr ""
-#: nova/volume/iscsi.py:168
+#: nova/volume/iscsi.py:169
#, python-format
msgid "Failed to create iscsi target for volume id:%(volume_id)s."
msgstr ""
-#: nova/volume/iscsi.py:177
+#: nova/volume/iscsi.py:178
msgid "valid iqn needed for show_target"
msgstr ""
diff --git a/nova/network/manager.py b/nova/network/manager.py
index d032fe159..cf7b6109d 100644
--- a/nova/network/manager.py
+++ b/nova/network/manager.py
@@ -1632,8 +1632,6 @@ class NetworkManager(manager.SchedulerDependentManager):
if kwargs.get('vpn', False):
# this bit here is for vlan-manager
- del net['dns1']
- del net['dns2']
vlan = kwargs['vlan_start'] + index
net['vpn_private_address'] = str(subnet_v4[2])
net['dhcp_start'] = str(subnet_v4[3])
diff --git a/nova/openstack/common/uuidutils.py b/nova/openstack/common/uuidutils.py
index 51042a798..7608acb94 100644
--- a/nova/openstack/common/uuidutils.py
+++ b/nova/openstack/common/uuidutils.py
@@ -22,6 +22,10 @@ UUID related utilities and helper functions.
import uuid
+def generate_uuid():
+ return str(uuid.uuid4())
+
+
def is_uuid_like(val):
"""Returns validation of a value as a UUID.
diff --git a/nova/test.py b/nova/test.py
index 52f63d64b..73956a35c 100644
--- a/nova/test.py
+++ b/nova/test.py
@@ -141,86 +141,3 @@ class TestCase(testtools.TestCase):
svc.start()
self._services.append(svc)
return svc
-
- # Useful assertions
- def assertDictMatch(self, d1, d2, approx_equal=False, tolerance=0.001):
- """Assert two dicts are equivalent.
-
- This is a 'deep' match in the sense that it handles nested
- dictionaries appropriately.
-
- NOTE:
-
- If you don't care (or don't know) a given value, you can specify
- the string DONTCARE as the value. This will cause that dict-item
- to be skipped.
-
- """
- def raise_assertion(msg):
- d1str = str(d1)
- d2str = str(d2)
- base_msg = ('Dictionaries do not match. %(msg)s d1: %(d1str)s '
- 'd2: %(d2str)s' % locals())
- raise AssertionError(base_msg)
-
- d1keys = set(d1.keys())
- d2keys = set(d2.keys())
- if d1keys != d2keys:
- d1only = d1keys - d2keys
- d2only = d2keys - d1keys
- raise_assertion('Keys in d1 and not d2: %(d1only)s. '
- 'Keys in d2 and not d1: %(d2only)s' % locals())
-
- for key in d1keys:
- d1value = d1[key]
- d2value = d2[key]
- try:
- error = abs(float(d1value) - float(d2value))
- within_tolerance = error <= tolerance
- except (ValueError, TypeError):
- # If both values aren't convertible to float, just ignore
- # ValueError if arg is a str, TypeError if it's something else
- # (like None)
- within_tolerance = False
-
- if hasattr(d1value, 'keys') and hasattr(d2value, 'keys'):
- self.assertDictMatch(d1value, d2value)
- elif 'DONTCARE' in (d1value, d2value):
- continue
- elif approx_equal and within_tolerance:
- continue
- elif d1value != d2value:
- raise_assertion("d1['%(key)s']=%(d1value)s != "
- "d2['%(key)s']=%(d2value)s" % locals())
-
- def assertDictListMatch(self, L1, L2, approx_equal=False, tolerance=0.001):
- """Assert a list of dicts are equivalent."""
- def raise_assertion(msg):
- L1str = str(L1)
- L2str = str(L2)
- base_msg = ('List of dictionaries do not match: %(msg)s '
- 'L1: %(L1str)s L2: %(L2str)s' % locals())
- raise AssertionError(base_msg)
-
- L1count = len(L1)
- L2count = len(L2)
- if L1count != L2count:
- raise_assertion('Length mismatch: len(L1)=%(L1count)d != '
- 'len(L2)=%(L2count)d' % locals())
-
- for d1, d2 in zip(L1, L2):
- self.assertDictMatch(d1, d2, approx_equal=approx_equal,
- tolerance=tolerance)
-
- def assertSubDictMatch(self, sub_dict, super_dict):
- """Assert a sub_dict is subset of super_dict."""
- self.assertEqual(True,
- set(sub_dict.keys()).issubset(set(super_dict.keys())))
- for k, sub_value in sub_dict.items():
- super_value = super_dict[k]
- if isinstance(sub_value, dict):
- self.assertSubDictMatch(sub_value, super_value)
- elif 'DONTCARE' in (sub_value, super_value):
- continue
- else:
- self.assertEqual(sub_value, super_value)
diff --git a/nova/tests/api/ec2/test_cinder_cloud.py b/nova/tests/api/ec2/test_cinder_cloud.py
index a858d6f2e..a9f4f742f 100644
--- a/nova/tests/api/ec2/test_cinder_cloud.py
+++ b/nova/tests/api/ec2/test_cinder_cloud.py
@@ -34,6 +34,7 @@ from nova.openstack.common import rpc
from nova import test
from nova.tests import fake_network
from nova.tests.image import fake
+from nova.tests import matchers
from nova import volume
CONF = config.CONF
@@ -434,18 +435,18 @@ class CinderCloudTestCase(test.TestCase):
result = {}
self.cloud._format_instance_bdm(self.context, inst1['uuid'],
'/dev/sdb1', result)
- self.assertSubDictMatch(
+ self.assertThat(
{'rootDeviceType': self._expected_instance_bdm1['rootDeviceType']},
- result)
+ matchers.IsSubDictOf(result))
self._assertEqualBlockDeviceMapping(
self._expected_block_device_mapping0, result['blockDeviceMapping'])
result = {}
self.cloud._format_instance_bdm(self.context, inst2['uuid'],
'/dev/sdc1', result)
- self.assertSubDictMatch(
+ self.assertThat(
{'rootDeviceType': self._expected_instance_bdm2['rootDeviceType']},
- result)
+ matchers.IsSubDictOf(result))
self._tearDownBlockDeviceMapping(inst1, inst2, volumes)
@@ -465,7 +466,7 @@ class CinderCloudTestCase(test.TestCase):
found = False
for y in result:
if x['deviceName'] == y['deviceName']:
- self.assertSubDictMatch(x, y)
+ self.assertThat(x, matchers.IsSubDictOf(y))
found = True
break
self.assertTrue(found)
@@ -477,24 +478,19 @@ class CinderCloudTestCase(test.TestCase):
(inst1, inst2, volumes) = self._setUpBlockDeviceMapping()
result = self._assertInstance(inst1['id'])
- self.assertSubDictMatch(self._expected_instance_bdm1, result)
+ self.assertThat(
+ self._expected_instance_bdm1,
+ matchers.IsSubDictOf(result))
self._assertEqualBlockDeviceMapping(
self._expected_block_device_mapping0, result['blockDeviceMapping'])
result = self._assertInstance(inst2['id'])
- self.assertSubDictMatch(self._expected_instance_bdm2, result)
+ self.assertThat(
+ self._expected_instance_bdm2,
+ matchers.IsSubDictOf(result))
self._tearDownBlockDeviceMapping(inst1, inst2, volumes)
- def assertDictListUnorderedMatch(self, L1, L2, key):
- self.assertEqual(len(L1), len(L2))
- for d1 in L1:
- self.assertTrue(key in d1)
- for d2 in L2:
- self.assertTrue(key in d2)
- if d1[key] == d2[key]:
- self.assertDictMatch(d1, d2)
-
def _setUpImageSet(self, create_volumes_and_snapshots=False):
mappings1 = [
{'device': '/dev/sda1', 'virtual': 'root'},
diff --git a/nova/tests/api/ec2/test_cloud.py b/nova/tests/api/ec2/test_cloud.py
index 23b7cc4dc..017466ff0 100644
--- a/nova/tests/api/ec2/test_cloud.py
+++ b/nova/tests/api/ec2/test_cloud.py
@@ -44,6 +44,7 @@ from nova.openstack.common import rpc
from nova import test
from nova.tests import fake_network
from nova.tests.image import fake
+from nova.tests import matchers
from nova import utils
from nova.virt import fake as fake_virt
from nova import volume
@@ -961,7 +962,7 @@ class CloudTestCase(test.TestCase):
for d2 in L2:
self.assertTrue(key in d2)
if d1[key] == d2[key]:
- self.assertDictMatch(d1, d2)
+ self.assertThat(d1, matchers.DictMatches(d2))
def _setUpImageSet(self, create_volumes_and_snapshots=False):
mappings1 = [
@@ -1281,17 +1282,17 @@ class CloudTestCase(test.TestCase):
'imageType': 'machine',
'description': None}
result = self.cloud._format_image(image)
- self.assertDictMatch(result, expected)
+ self.assertThat(result, matchers.DictMatches(expected))
image['properties']['image_location'] = None
expected['imageLocation'] = 'None (name)'
result = self.cloud._format_image(image)
- self.assertDictMatch(result, expected)
+ self.assertThat(result, matchers.DictMatches(expected))
image['name'] = None
image['properties']['image_location'] = 'location'
expected['imageLocation'] = 'location'
expected['name'] = 'location'
result = self.cloud._format_image(image)
- self.assertDictMatch(result, expected)
+ self.assertThat(result, matchers.DictMatches(expected))
def test_deregister_image(self):
deregister_image = self.cloud.deregister_image
diff --git a/nova/tests/api/openstack/compute/contrib/test_aggregates.py b/nova/tests/api/openstack/compute/contrib/test_aggregates.py
index 4fa68bd7d..a209fdce8 100644
--- a/nova/tests/api/openstack/compute/contrib/test_aggregates.py
+++ b/nova/tests/api/openstack/compute/contrib/test_aggregates.py
@@ -22,6 +22,7 @@ from nova import context
from nova import exception
from nova.openstack.common import log as logging
from nova import test
+from nova.tests import matchers
LOG = logging.getLogger(__name__)
AGGREGATE_LIST = [
@@ -319,7 +320,8 @@ class AggregateTestCase(test.TestCase):
def stub_update_aggregate(context, aggregate, values):
self.assertEqual(context, self.context, "context")
self.assertEqual("1", aggregate, "aggregate")
- self.assertDictMatch(body["set_metadata"]['metadata'], values)
+ self.assertThat(body["set_metadata"]['metadata'],
+ matchers.DictMatches(values))
return AGGREGATE
self.stubs.Set(self.controller.api,
"update_aggregate_metadata",
diff --git a/nova/tests/api/openstack/compute/contrib/test_cloudpipe.py b/nova/tests/api/openstack/compute/contrib/test_cloudpipe.py
index 12a6c508d..0be17e47a 100644
--- a/nova/tests/api/openstack/compute/contrib/test_cloudpipe.py
+++ b/nova/tests/api/openstack/compute/contrib/test_cloudpipe.py
@@ -25,6 +25,7 @@ from nova.openstack.common import timeutils
from nova import test
from nova.tests.api.openstack import fakes
from nova.tests import fake_network
+from nova.tests import matchers
from nova import utils
CONF = config.CONF
@@ -108,7 +109,7 @@ class CloudpipeTest(test.TestCase):
'state': 'running',
'instance_id': 7777,
'created_at': '1981-10-20T00:00:00Z'}]}
- self.assertDictMatch(res_dict, response)
+ self.assertThat(res_dict, matchers.DictMatches(response))
def test_cloudpipe_create(self):
def launch_vpn_instance(context):
diff --git a/nova/tests/api/openstack/compute/contrib/test_server_start_stop.py b/nova/tests/api/openstack/compute/contrib/test_server_start_stop.py
index e0d3cbb0f..fb912d0c4 100644
--- a/nova/tests/api/openstack/compute/contrib/test_server_start_stop.py
+++ b/nova/tests/api/openstack/compute/contrib/test_server_start_stop.py
@@ -64,7 +64,3 @@ class ServerStartStopTest(test.TestCase):
body = dict(start="")
self.assertRaises(webob.exc.HTTPNotFound,
self.controller._stop_server, req, 'test_inst', body)
-
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/nova/tests/api/openstack/compute/contrib/test_services.py b/nova/tests/api/openstack/compute/contrib/test_services.py
new file mode 100644
index 000000000..24f169d98
--- /dev/null
+++ b/nova/tests/api/openstack/compute/contrib/test_services.py
@@ -0,0 +1,198 @@
+# Copyright 2012 IBM
+# 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.
+
+
+from datetime import datetime
+from nova.api.openstack.compute.contrib import services
+from nova import context
+from nova import db
+from nova import exception
+from nova.openstack.common import timeutils
+from nova import test
+from nova.tests.api.openstack import fakes
+
+
+fake_services_list = [{'binary': 'nova-scheduler',
+ 'host': 'host1',
+ 'availability_zone': 'nova',
+ 'id': 1,
+ 'disabled': True,
+ 'updated_at': datetime(2012, 10, 29, 13, 42, 2),
+ 'created_at': datetime(2012, 9, 18, 2, 46, 27)},
+ {'binary': 'nova-compute',
+ 'host': 'host1',
+ 'availability_zone': 'nova',
+ 'id': 2,
+ 'disabled': True,
+ 'updated_at': datetime(2012, 10, 29, 13, 42, 5),
+ 'created_at': datetime(2012, 9, 18, 2, 46, 27)},
+ {'binary': 'nova-scheduler',
+ 'host': 'host2',
+ 'availability_zone': 'nova',
+ 'id': 3,
+ 'disabled': False,
+ 'updated_at': datetime(2012, 9, 19, 6, 55, 34),
+ 'created_at': datetime(2012, 9, 18, 2, 46, 28)},
+ {'binary': 'nova-compute',
+ 'host': 'host2',
+ 'availability_zone': 'nova',
+ 'id': 4,
+ 'disabled': True,
+ 'updated_at': datetime(2012, 9, 18, 8, 3, 38),
+ 'created_at': datetime(2012, 9, 18, 2, 46, 28)},
+ ]
+
+
+class FakeRequest(object):
+ environ = {"nova.context": context.get_admin_context()}
+ GET = {}
+
+
+class FakeRequestWithSevice(object):
+ environ = {"nova.context": context.get_admin_context()}
+ GET = {"service": "nova-compute"}
+
+
+class FakeRequestWithHost(object):
+ environ = {"nova.context": context.get_admin_context()}
+ GET = {"host": "host1"}
+
+
+class FakeRequestWithHostService(object):
+ environ = {"nova.context": context.get_admin_context()}
+ GET = {"host": "host1", "service": "nova-compute"}
+
+
+def fake_servcie_get_all(context):
+ return fake_services_list
+
+
+def fake_service_get_by_host_binary(context, host, binary):
+ for service in fake_services_list:
+ if service['host'] == host and service['binary'] == binary:
+ return service
+ return None
+
+
+def fake_service_get_by_id(value):
+ for service in fake_services_list:
+ if service['id'] == value:
+ return service
+ return None
+
+
+def fake_service_update(context, service_id, values):
+ service = fake_service_get_by_id(service_id)
+ if service is None:
+ raise exception.ServiceNotFound(service_id=service_id)
+ else:
+ {'host': 'host1', 'service': 'nova-compute',
+ 'disabled': values['disabled']}
+
+
+def fake_utcnow():
+ return datetime(2012, 10, 29, 13, 42, 11)
+
+
+class ServicesTest(test.TestCase):
+
+ def setUp(self):
+ super(ServicesTest, self).setUp()
+
+ self.stubs.Set(db, "service_get_all", fake_servcie_get_all)
+ self.stubs.Set(timeutils, "utcnow", fake_utcnow)
+ self.stubs.Set(db, "service_get_by_args",
+ fake_service_get_by_host_binary)
+ self.stubs.Set(db, "service_update", fake_service_update)
+
+ self.context = context.get_admin_context()
+ self.controller = services.ServiceController()
+
+ def tearDown(self):
+ super(ServicesTest, self).tearDown()
+
+ def test_services_list(self):
+ req = FakeRequest()
+ res_dict = self.controller.index(req)
+
+ response = {'services': [{'binary': 'nova-scheduler',
+ 'host': 'host1', 'zone': 'nova',
+ 'status': 'disabled', 'state': 'up',
+ 'updated_at': datetime(2012, 10, 29, 13, 42, 2)},
+ {'binary': 'nova-compute',
+ 'host': 'host1', 'zone': 'nova',
+ 'status': 'disabled', 'state': 'up',
+ 'updated_at': datetime(2012, 10, 29, 13, 42, 5)},
+ {'binary': 'nova-scheduler', 'host': 'host2',
+ 'zone': 'nova',
+ 'status': 'enabled', 'state': 'down',
+ 'updated_at': datetime(2012, 9, 19, 6, 55, 34)},
+ {'binary': 'nova-compute', 'host': 'host2',
+ 'zone': 'nova',
+ 'status': 'disabled', 'state': 'down',
+ 'updated_at': datetime(2012, 9, 18, 8, 3, 38)}]}
+ self.assertEqual(res_dict, response)
+
+ def test_services_list_with_host(self):
+ req = FakeRequestWithHost()
+ res_dict = self.controller.index(req)
+
+ response = {'services': [{'binary': 'nova-scheduler', 'host': 'host1',
+ 'zone': 'nova',
+ 'status': 'disabled', 'state': 'up',
+ 'updated_at': datetime(2012, 10, 29, 13, 42, 2)},
+ {'binary': 'nova-compute', 'host': 'host1',
+ 'zone': 'nova',
+ 'status': 'disabled', 'state': 'up',
+ 'updated_at': datetime(2012, 10, 29, 13, 42, 5)}]}
+ self.assertEqual(res_dict, response)
+
+ def test_services_list_with_service(self):
+ req = FakeRequestWithSevice()
+ res_dict = self.controller.index(req)
+
+ response = {'services': [{'binary': 'nova-compute', 'host': 'host1',
+ 'zone': 'nova',
+ 'status': 'disabled', 'state': 'up',
+ 'updated_at': datetime(2012, 10, 29, 13, 42, 5)},
+ {'binary': 'nova-compute', 'host': 'host2',
+ 'zone': 'nova',
+ 'status': 'disabled', 'state': 'down',
+ 'updated_at': datetime(2012, 9, 18, 8, 3, 38)}]}
+ self.assertEqual(res_dict, response)
+
+ def test_services_list_with_host_service(self):
+ req = FakeRequestWithHostService()
+ res_dict = self.controller.index(req)
+
+ response = {'services': [{'binary': 'nova-compute', 'host': 'host1',
+ 'zone': 'nova',
+ 'status': 'disabled', 'state': 'up',
+ 'updated_at': datetime(2012, 10, 29, 13, 42, 5)}]}
+ self.assertEqual(res_dict, response)
+
+ def test_services_enable(self):
+ body = {'host': 'host1', 'service': 'nova-compute'}
+ req = fakes.HTTPRequest.blank('/v2/fake/os-services/enable')
+ res_dict = self.controller.update(req, "enable", body)
+
+ self.assertEqual(res_dict['disabled'], False)
+
+ def test_services_disable(self):
+ req = fakes.HTTPRequest.blank('/v2/fake/os-services/disable')
+ body = {'host': 'host1', 'service': 'nova-compute'}
+ res_dict = self.controller.update(req, "disable", body)
+
+ self.assertEqual(res_dict['disabled'], True)
diff --git a/nova/tests/api/openstack/compute/test_consoles.py b/nova/tests/api/openstack/compute/test_consoles.py
index 90bd06e3b..8a701588c 100644
--- a/nova/tests/api/openstack/compute/test_consoles.py
+++ b/nova/tests/api/openstack/compute/test_consoles.py
@@ -30,6 +30,7 @@ from nova import flags
from nova.openstack.common import timeutils
from nova import test
from nova.tests.api.openstack import fakes
+from nova.tests import matchers
from nova import utils
FAKE_UUID = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'
@@ -165,7 +166,7 @@ class ConsolesControllerTest(test.TestCase):
req = fakes.HTTPRequest.blank(self.url + '/20')
res_dict = self.controller.show(req, self.uuid, '20')
- self.assertDictMatch(res_dict, expected)
+ self.assertThat(res_dict, matchers.DictMatches(expected))
def test_show_console_unknown_console(self):
def fake_get_console(cons_self, context, instance_id, console_id):
@@ -209,7 +210,7 @@ class ConsolesControllerTest(test.TestCase):
req = fakes.HTTPRequest.blank(self.url)
res_dict = self.controller.index(req, self.uuid)
- self.assertDictMatch(res_dict, expected)
+ self.assertThat(res_dict, matchers.DictMatches(expected))
def test_delete_console(self):
def fake_get_console(cons_self, context, instance_id, console_id):
diff --git a/nova/tests/api/openstack/compute/test_extensions.py b/nova/tests/api/openstack/compute/test_extensions.py
index 282c6d122..f3e65a150 100644
--- a/nova/tests/api/openstack/compute/test_extensions.py
+++ b/nova/tests/api/openstack/compute/test_extensions.py
@@ -30,6 +30,7 @@ from nova import flags
from nova.openstack.common import jsonutils
from nova import test
from nova.tests.api.openstack import fakes
+from nova.tests import matchers
CONF = config.CONF
@@ -189,6 +190,7 @@ class ExtensionControllerTest(ExtensionTestCase):
"SecurityGroups",
"ServerDiagnostics",
"ServerStartStop",
+ "Services",
"SimpleTenantUsage",
"UsedLimits",
"UserData",
@@ -347,7 +349,7 @@ class ResourceExtensionTest(ExtensionTestCase):
"code": 400
}
}
- self.assertDictMatch(expected, body)
+ self.assertThat(expected, matchers.DictMatches(body))
def test_non_exist_resource(self):
res_ext = base_extensions.ResourceExtension('tweedles',
@@ -365,7 +367,7 @@ class ResourceExtensionTest(ExtensionTestCase):
"code": 404
}
}
- self.assertDictMatch(expected, body)
+ self.assertThat(expected, matchers.DictMatches(body))
class InvalidExtension(object):
@@ -430,7 +432,7 @@ class ActionExtensionTest(ExtensionTestCase):
"code": 400
}
}
- self.assertDictMatch(expected, body)
+ self.assertThat(expected, matchers.DictMatches(body))
def test_non_exist_action(self):
body = dict(blah=dict(name="test"))
@@ -451,7 +453,7 @@ class ActionExtensionTest(ExtensionTestCase):
"code": 400
}
}
- self.assertDictMatch(expected, body)
+ self.assertThat(expected, matchers.DictMatches(body))
class RequestExtensionTest(ExtensionTestCase):
diff --git a/nova/tests/api/openstack/compute/test_flavors.py b/nova/tests/api/openstack/compute/test_flavors.py
index 6726aa579..0fc748fde 100644
--- a/nova/tests/api/openstack/compute/test_flavors.py
+++ b/nova/tests/api/openstack/compute/test_flavors.py
@@ -29,6 +29,7 @@ from nova import exception
from nova import flags
from nova import test
from nova.tests.api.openstack import fakes
+from nova.tests import matchers
NS = "{http://docs.openstack.org/compute/api/v1.1}"
ATOMNS = "{http://www.w3.org/2005/Atom}"
@@ -215,7 +216,7 @@ class FlavorsTest(test.TestCase):
'rel': 'next'}
]
}
- self.assertDictMatch(flavor, expected)
+ self.assertThat(flavor, matchers.DictMatches(expected))
def test_get_flavor_detail_with_limit(self):
req = fakes.HTTPRequest.blank('/v2/fake/flavors/detail?limit=1')
@@ -247,7 +248,8 @@ class FlavorsTest(test.TestCase):
href_parts = urlparse.urlparse(response_links[0]['href'])
self.assertEqual('/v2/fake/flavors', href_parts.path)
params = urlparse.parse_qs(href_parts.query)
- self.assertDictMatch({'limit': ['1'], 'marker': ['1']}, params)
+ self.assertThat({'limit': ['1'], 'marker': ['1']},
+ matchers.DictMatches(params))
def test_get_flavor_with_limit(self):
req = fakes.HTTPRequest.blank('/v2/fake/flavors?limit=2')
@@ -293,7 +295,8 @@ class FlavorsTest(test.TestCase):
href_parts = urlparse.urlparse(response_links[0]['href'])
self.assertEqual('/v2/fake/flavors', href_parts.path)
params = urlparse.parse_qs(href_parts.query)
- self.assertDictMatch({'limit': ['2'], 'marker': ['2']}, params)
+ self.assertThat({'limit': ['2'], 'marker': ['2']},
+ matchers.DictMatches(params))
def test_get_flavor_list_detail(self):
req = fakes.HTTPRequest.blank('/v2/fake/flavors/detail')
diff --git a/nova/tests/api/openstack/compute/test_images.py b/nova/tests/api/openstack/compute/test_images.py
index 34dc2682d..fe49e6c04 100644
--- a/nova/tests/api/openstack/compute/test_images.py
+++ b/nova/tests/api/openstack/compute/test_images.py
@@ -32,6 +32,7 @@ from nova import exception
from nova import flags
from nova import test
from nova.tests.api.openstack import fakes
+from nova.tests import matchers
from nova import utils
NS = "{http://docs.openstack.org/compute/api/v1.1}"
@@ -108,7 +109,7 @@ class ImagesControllerTest(test.TestCase):
},
}
- self.assertDictMatch(expected_image, actual_image)
+ self.assertThat(actual_image, matchers.DictMatches(expected_image))
def test_get_image_with_custom_prefix(self):
self.flags(osapi_compute_link_prefix='https://zoo.com:42',
@@ -162,7 +163,7 @@ class ImagesControllerTest(test.TestCase):
}],
},
}
- self.assertDictMatch(expected_image, actual_image)
+ self.assertThat(actual_image, matchers.DictMatches(expected_image))
def test_get_image_404(self):
fake_req = fakes.HTTPRequest.blank('/v2/fake/images/unknown')
@@ -457,7 +458,7 @@ class ImagesControllerTest(test.TestCase):
},
]
- self.assertDictListMatch(expected, response_list)
+ self.assertThat(expected, matchers.DictListMatches(response_list))
def test_get_image_details_with_limit(self):
request = fakes.HTTPRequest.blank('/v2/fake/images/detail?limit=2')
@@ -533,13 +534,14 @@ class ImagesControllerTest(test.TestCase):
}],
}]
- self.assertDictListMatch(expected, response_list)
+ self.assertThat(expected, matchers.DictListMatches(response_list))
href_parts = urlparse.urlparse(response_links[0]['href'])
self.assertEqual('/v2/fake/images', href_parts.path)
params = urlparse.parse_qs(href_parts.query)
- self.assertDictMatch({'limit': ['2'], 'marker': ['124']}, params)
+ self.assertThat({'limit': ['2'], 'marker': ['124']},
+ matchers.DictMatches(params))
def test_image_detail_filter_with_name(self):
image_service = self.mox.CreateMockAnything()
diff --git a/nova/tests/api/openstack/compute/test_limits.py b/nova/tests/api/openstack/compute/test_limits.py
index 32f2e1294..32e7ab9e0 100644
--- a/nova/tests/api/openstack/compute/test_limits.py
+++ b/nova/tests/api/openstack/compute/test_limits.py
@@ -30,6 +30,7 @@ from nova.api.openstack import xmlutil
import nova.context
from nova.openstack.common import jsonutils
from nova import test
+from nova.tests import matchers
TEST_LIMITS = [
@@ -862,7 +863,7 @@ class LimitsViewBuilderTest(test.TestCase):
output = self.view_builder.build(self.rate_limits,
self.absolute_limits)
- self.assertDictMatch(output, expected_limits)
+ self.assertThat(output, matchers.DictMatches(expected_limits))
def test_build_limits_empty_limits(self):
expected_limits = {"limits": {"rate": [],
@@ -871,7 +872,7 @@ class LimitsViewBuilderTest(test.TestCase):
abs_limits = {}
rate_limits = []
output = self.view_builder.build(rate_limits, abs_limits)
- self.assertDictMatch(output, expected_limits)
+ self.assertThat(output, matchers.DictMatches(expected_limits))
class LimitsXMLSerializationTest(test.TestCase):
diff --git a/nova/tests/api/openstack/compute/test_server_actions.py b/nova/tests/api/openstack/compute/test_server_actions.py
index de08c6124..ae2fde791 100644
--- a/nova/tests/api/openstack/compute/test_server_actions.py
+++ b/nova/tests/api/openstack/compute/test_server_actions.py
@@ -31,6 +31,7 @@ from nova.openstack.common import importutils
from nova import test
from nova.tests.api.openstack import fakes
from nova.tests.image import fake
+from nova.tests import matchers
from nova import utils
CONF = config.CONF
@@ -1052,7 +1053,7 @@ class TestServerActionXMLDeserializer(test.TestCase):
],
},
}
- self.assertDictMatch(request['body'], expected)
+ self.assertThat(request['body'], matchers.DictMatches(expected))
def test_rebuild_minimum(self):
serial_request = """<?xml version="1.0" encoding="UTF-8"?>
@@ -1065,7 +1066,7 @@ class TestServerActionXMLDeserializer(test.TestCase):
"imageRef": "http://localhost/images/1",
},
}
- self.assertDictMatch(request['body'], expected)
+ self.assertThat(request['body'], matchers.DictMatches(expected))
def test_rebuild_no_imageRef(self):
serial_request = """<?xml version="1.0" encoding="UTF-8"?>
diff --git a/nova/tests/api/openstack/compute/test_servers.py b/nova/tests/api/openstack/compute/test_servers.py
index 4ef89806a..e329a5f7b 100644
--- a/nova/tests/api/openstack/compute/test_servers.py
+++ b/nova/tests/api/openstack/compute/test_servers.py
@@ -48,6 +48,7 @@ from nova import test
from nova.tests.api.openstack import fakes
from nova.tests import fake_network
from nova.tests.image import fake
+from nova.tests import matchers
from nova import utils
CONF = config.CONF
@@ -316,7 +317,7 @@ class ServersControllerTest(test.TestCase):
}
}
- self.assertDictMatch(res_dict, expected_server)
+ self.assertThat(res_dict, matchers.DictMatches(expected_server))
def test_get_server_with_active_status_by_id(self):
image_bookmark = "http://localhost/fake/images/10"
@@ -382,7 +383,7 @@ class ServersControllerTest(test.TestCase):
}
}
- self.assertDictMatch(res_dict, expected_server)
+ self.assertThat(res_dict, matchers.DictMatches(expected_server))
def test_get_server_with_id_image_ref_by_id(self):
image_ref = "10"
@@ -451,7 +452,7 @@ class ServersControllerTest(test.TestCase):
}
}
- self.assertDictMatch(res_dict, expected_server)
+ self.assertThat(res_dict, matchers.DictMatches(expected_server))
def test_get_server_addresses_from_cache(self):
pub0 = ('172.19.0.1', '172.19.0.2',)
@@ -502,7 +503,7 @@ class ServersControllerTest(test.TestCase):
],
},
}
- self.assertDictMatch(res_dict, expected)
+ self.assertThat(res_dict, matchers.DictMatches(expected))
def test_get_server_addresses_nonexistent_network(self):
url = '/v2/fake/servers/%s/ips/network_0' % FAKE_UUID
@@ -597,7 +598,7 @@ class ServersControllerTest(test.TestCase):
params = urlparse.parse_qs(href_parts.query)
expected_params = {'limit': ['3'],
'marker': [fakes.get_fake_uuid(2)]}
- self.assertDictMatch(expected_params, params)
+ self.assertThat(params, matchers.DictMatches(expected_params))
def test_get_servers_with_limit_bad_value(self):
req = fakes.HTTPRequest.blank('/v2/fake/servers?limit=aaa')
@@ -619,7 +620,7 @@ class ServersControllerTest(test.TestCase):
self.assertEqual('/v2/fake/servers', href_parts.path)
params = urlparse.parse_qs(href_parts.query)
expected = {'limit': ['3'], 'marker': [fakes.get_fake_uuid(2)]}
- self.assertDictMatch(expected, params)
+ self.assertThat(params, matchers.DictMatches(expected))
def test_get_server_details_with_limit_bad_value(self):
req = fakes.HTTPRequest.blank('/v2/fake/servers/detail?limit=aaa')
@@ -641,9 +642,9 @@ class ServersControllerTest(test.TestCase):
href_parts = urlparse.urlparse(servers_links[0]['href'])
self.assertEqual('/v2/fake/servers', href_parts.path)
params = urlparse.parse_qs(href_parts.query)
-
- self.assertDictMatch({'limit': ['3'], 'blah': ['2:t'],
- 'marker': [fakes.get_fake_uuid(2)]}, params)
+ expected = {'limit': ['3'], 'blah': ['2:t'],
+ 'marker': [fakes.get_fake_uuid(2)]}
+ self.assertThat(params, matchers.DictMatches(expected))
def test_get_servers_with_too_big_limit(self):
req = fakes.HTTPRequest.blank('/v2/fake/servers?limit=30')
@@ -3254,7 +3255,7 @@ class TestServerCreateRequestXMLDeserializer(test.TestCase):
],
},
}
- self.assertDictMatch(request['body'], expected)
+ self.assertThat(request['body'], matchers.DictMatches(expected))
def test_spec_request(self):
image_bookmark_link = ("http://servers.api.openstack.org/1234/"
@@ -3699,7 +3700,7 @@ class ServersViewBuilderTest(test.TestCase):
}
output = self.view_builder.basic(self.request, self.instance)
- self.assertDictMatch(output, expected_server)
+ self.assertThat(output, matchers.DictMatches(expected_server))
def test_build_server_with_project_id(self):
expected_server = {
@@ -3721,7 +3722,7 @@ class ServersViewBuilderTest(test.TestCase):
}
output = self.view_builder.basic(self.request, self.instance)
- self.assertDictMatch(output, expected_server)
+ self.assertThat(output, matchers.DictMatches(expected_server))
def test_build_server_detail(self):
image_bookmark = "http://localhost/fake/images/5"
@@ -3780,7 +3781,7 @@ class ServersViewBuilderTest(test.TestCase):
}
output = self.view_builder.show(self.request, self.instance)
- self.assertDictMatch(output, expected_server)
+ self.assertThat(output, matchers.DictMatches(expected_server))
def test_build_server_detail_with_fault(self):
self.instance['vm_state'] = vm_states.ERROR
@@ -3854,7 +3855,7 @@ class ServersViewBuilderTest(test.TestCase):
self.request.context = context.RequestContext('fake', 'fake')
output = self.view_builder.show(self.request, self.instance)
- self.assertDictMatch(output, expected_server)
+ self.assertThat(output, matchers.DictMatches(expected_server))
def test_build_server_detail_with_fault_no_details_not_admin(self):
self.instance['vm_state'] = vm_states.ERROR
@@ -3872,7 +3873,8 @@ class ServersViewBuilderTest(test.TestCase):
self.request.context = context.RequestContext('fake', 'fake')
output = self.view_builder.show(self.request, self.instance)
- self.assertDictMatch(output['server']['fault'], expected_fault)
+ self.assertThat(output['server']['fault'],
+ matchers.DictMatches(expected_fault))
def test_build_server_detail_with_fault_admin(self):
self.instance['vm_state'] = vm_states.ERROR
@@ -3891,7 +3893,8 @@ class ServersViewBuilderTest(test.TestCase):
self.request.context = context.get_admin_context()
output = self.view_builder.show(self.request, self.instance)
- self.assertDictMatch(output['server']['fault'], expected_fault)
+ self.assertThat(output['server']['fault'],
+ matchers.DictMatches(expected_fault))
def test_build_server_detail_with_fault_no_details_admin(self):
self.instance['vm_state'] = vm_states.ERROR
@@ -3909,7 +3912,8 @@ class ServersViewBuilderTest(test.TestCase):
self.request.context = context.get_admin_context()
output = self.view_builder.show(self.request, self.instance)
- self.assertDictMatch(output['server']['fault'], expected_fault)
+ self.assertThat(output['server']['fault'],
+ matchers.DictMatches(expected_fault))
def test_build_server_detail_with_fault_but_active(self):
self.instance['vm_state'] = vm_states.ACTIVE
@@ -3990,7 +3994,7 @@ class ServersViewBuilderTest(test.TestCase):
}
output = self.view_builder.show(self.request, self.instance)
- self.assertDictMatch(output, expected_server)
+ self.assertThat(output, matchers.DictMatches(expected_server))
def test_build_server_detail_with_accessipv4(self):
@@ -4052,7 +4056,7 @@ class ServersViewBuilderTest(test.TestCase):
}
output = self.view_builder.show(self.request, self.instance)
- self.assertDictMatch(output, expected_server)
+ self.assertThat(output, matchers.DictMatches(expected_server))
def test_build_server_detail_with_accessipv6(self):
@@ -4114,7 +4118,7 @@ class ServersViewBuilderTest(test.TestCase):
}
output = self.view_builder.show(self.request, self.instance)
- self.assertDictMatch(output, expected_server)
+ self.assertThat(output, matchers.DictMatches(expected_server))
def test_build_server_detail_with_metadata(self):
@@ -4178,7 +4182,7 @@ class ServersViewBuilderTest(test.TestCase):
}
output = self.view_builder.show(self.request, self.instance)
- self.assertDictMatch(output, expected_server)
+ self.assertThat(output, matchers.DictMatches(expected_server))
class ServerXMLSerializationTest(test.TestCase):
diff --git a/nova/tests/api/openstack/compute/test_versions.py b/nova/tests/api/openstack/compute/test_versions.py
index 4520faa48..d59270bd6 100644
--- a/nova/tests/api/openstack/compute/test_versions.py
+++ b/nova/tests/api/openstack/compute/test_versions.py
@@ -26,6 +26,7 @@ from nova.openstack.common import jsonutils
from nova import test
from nova.tests.api.openstack import common
from nova.tests.api.openstack import fakes
+from nova.tests import matchers
from nova import utils
@@ -346,7 +347,8 @@ class VersionsTest(test.TestCase):
},
], }
- self.assertDictMatch(expected, jsonutils.loads(res.body))
+ self.assertThat(jsonutils.loads(res.body),
+ matchers.DictMatches(expected))
def test_multi_choice_image_xml(self):
req = webob.Request.blank('/images/1')
@@ -416,7 +418,8 @@ class VersionsTest(test.TestCase):
},
], }
- self.assertDictMatch(expected, jsonutils.loads(res.body))
+ self.assertThat(jsonutils.loads(res.body),
+ matchers.DictMatches(expected))
class VersionsViewBuilderTests(test.TestCase):
diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py
index f894f3305..3b2c00b32 100644
--- a/nova/tests/compute/test_compute.py
+++ b/nova/tests/compute/test_compute.py
@@ -60,6 +60,7 @@ from nova.tests.db.fakes import FakeModel
from nova.tests import fake_network
from nova.tests import fake_network_cache_model
from nova.tests.image import fake as fake_image
+from nova.tests import matchers
from nova import utils
from nova.virt import fake
from nova.volume import cinder
@@ -4508,7 +4509,7 @@ class ComputeAPITestCase(BaseTestCase):
]
bdms.sort()
expected_result.sort()
- self.assertDictListMatch(bdms, expected_result)
+ self.assertThat(bdms, matchers.DictListMatches(expected_result))
self.compute_api._update_block_device_mapping(
self.context, instance_types.get_default_instance_type(),
@@ -4544,7 +4545,7 @@ class ComputeAPITestCase(BaseTestCase):
{'no_device': True, 'device_name': '/dev/sdd4'}]
bdms.sort()
expected_result.sort()
- self.assertDictListMatch(bdms, expected_result)
+ self.assertThat(bdms, matchers.DictListMatches(expected_result))
for bdm in db.block_device_mapping_get_all_by_instance(
self.context, instance['uuid']):
@@ -5055,7 +5056,8 @@ class ComputeAPIAggrTestCase(BaseTestCase):
metadata['foo_key1'] = None
expected = self.api.update_aggregate_metadata(self.context,
aggr['id'], metadata)
- self.assertDictMatch(expected['metadata'], {'foo_key2': 'foo_value2'})
+ self.assertThat(expected['metadata'],
+ matchers.DictMatches({'foo_key2': 'foo_value2'}))
def test_delete_aggregate(self):
"""Ensure we can delete an aggregate."""
diff --git a/nova/tests/image/test_glance.py b/nova/tests/image/test_glance.py
index 13e090cef..e8baf4353 100644
--- a/nova/tests/image/test_glance.py
+++ b/nova/tests/image/test_glance.py
@@ -28,6 +28,7 @@ from nova.image import glance
from nova import test
from nova.tests.api.openstack import fakes
from nova.tests.glance import stubs as glance_stubs
+from nova.tests import matchers
class NullWriter(object):
@@ -155,10 +156,10 @@ class TestGlanceImageService(test.TestCase):
'properties': {'instance_id': '42', 'user_id': 'fake'},
'owner': None,
}
- self.assertDictMatch(image_meta, expected)
+ self.assertThat(image_meta, matchers.DictMatches(expected))
image_metas = self.service.detail(self.context)
- self.assertDictMatch(image_metas[0], expected)
+ self.assertThat(image_metas[0], matchers.DictMatches(expected))
def test_create_without_instance_id(self):
"""
@@ -188,7 +189,7 @@ class TestGlanceImageService(test.TestCase):
'owner': None,
}
actual = self.service.show(self.context, image_id)
- self.assertDictMatch(actual, expected)
+ self.assertThat(actual, matchers.DictMatches(expected))
def test_create(self):
fixture = self._make_fixture(name='test image')
@@ -259,7 +260,7 @@ class TestGlanceImageService(test.TestCase):
'owner': None,
}
- self.assertDictMatch(meta, expected)
+ self.assertThat(meta, matchers.DictMatches(expected))
i = i + 1
def test_detail_limit(self):
@@ -315,7 +316,7 @@ class TestGlanceImageService(test.TestCase):
'deleted': None,
'owner': None,
}
- self.assertDictMatch(meta, expected)
+ self.assertThat(meta, matchers.DictMatches(expected))
i = i + 1
def test_detail_invalid_marker(self):
diff --git a/nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.json.tpl b/nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.json.tpl
index 9581a0e7e..34f305967 100644
--- a/nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.json.tpl
+++ b/nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.json.tpl
@@ -209,6 +209,14 @@
"updated": "%(timestamp)s"
},
{
+ "alias": "os-services",
+ "description": "%(text)s",
+ "links": [],
+ "name": "Services",
+ "namespace": "http://docs.openstack.org/compute/ext/services/api/v2",
+ "updated": "%(timestamp)s"
+ },
+ {
"alias": "os-hypervisors",
"description": "%(text)s",
"links": [],
diff --git a/nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.xml.tpl b/nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.xml.tpl
index e8246aad8..44aa5ee81 100644
--- a/nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.xml.tpl
+++ b/nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.xml.tpl
@@ -78,6 +78,9 @@
<extension alias="os-hosts" updated="%(timestamp)s" namespace="http://docs.openstack.org/compute/ext/hosts/api/v1.1" name="Hosts">
<description>%(text)s</description>
</extension>
+ <extension alias="os-services" name="Services" namespace="http://docs.openstack.org/compute/ext/services/api/v2" updated="%(timestamp)s">
+ <description>%(text)s</description>
+ </extension>
<extension alias="os-hypervisors" updated="%(timestamp)s" namespace="http://docs.openstack.org/compute/ext/hypervisors/api/v1.1" name="Hypervisors">
<description>%(text)s</description>
</extension>
diff --git a/nova/tests/integrated/test_servers.py b/nova/tests/integrated/test_servers.py
index 0c9024a8a..d971af4f4 100644
--- a/nova/tests/integrated/test_servers.py
+++ b/nova/tests/integrated/test_servers.py
@@ -434,7 +434,3 @@ class ServersTest(integrated_helpers._IntegratedTestBase):
self._delete_server(created_server_id)
for server_id in server_map.iterkeys():
self._delete_server(server_id)
-
-
-if __name__ == "__main__":
- unittest.main()
diff --git a/nova/tests/matchers.py b/nova/tests/matchers.py
new file mode 100644
index 000000000..c3b88d2e5
--- /dev/null
+++ b/nova/tests/matchers.py
@@ -0,0 +1,196 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2010 United States Government as represented by the
+# Administrator of the National Aeronautics and Space Administration.
+# Copyright 2012 Hewlett-Packard Development Company, L.P.
+#
+# 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.
+
+"""Matcher classes to be used inside of the testtools assertThat framework."""
+
+import pprint
+
+
+class DictKeysMismatch(object):
+ def __init__(self, d1only, d2only):
+ self.d1only = d1only
+ self.d2only = d2only
+
+ def describe(self):
+ return ('Keys in d1 and not d2: %(d1only)s.'
+ ' Keys in d2 and not d1: %(d2only)s' % self.__dict__)
+
+ def get_details(self):
+ return {}
+
+
+class DictMismatch(object):
+ def __init__(self, key, d1_value, d2_value):
+ self.key = key
+ self.d1_value = d1_value
+ self.d2_value = d2_value
+
+ def describe(self):
+ return ("Dictionaries do not match at %(key)s."
+ " d1: %(d1_value)s d2: %(d2_value)s" % self.__dict__)
+
+ def get_details(self):
+ return {}
+
+
+class DictMatches(object):
+
+ def __init__(self, d1, approx_equal=False, tolerance=0.001):
+ self.d1 = d1
+ self.approx_equal = approx_equal
+ self.tolerance = tolerance
+
+ def __str__(self):
+ return 'DictMatches(%s)' % (pprint.pformat(self.d1))
+
+ # Useful assertions
+ def match(self, d2):
+ """Assert two dicts are equivalent.
+
+ This is a 'deep' match in the sense that it handles nested
+ dictionaries appropriately.
+
+ NOTE:
+
+ If you don't care (or don't know) a given value, you can specify
+ the string DONTCARE as the value. This will cause that dict-item
+ to be skipped.
+
+ """
+
+ d1keys = set(self.d1.keys())
+ d2keys = set(d2.keys())
+ if d1keys != d2keys:
+ d1only = d1keys - d2keys
+ d2only = d2keys - d1keys
+ return DictKeysMismatch(d1only, d2only)
+
+ for key in d1keys:
+ d1value = self.d1[key]
+ d2value = d2[key]
+ try:
+ error = abs(float(d1value) - float(d2value))
+ within_tolerance = error <= self.tolerance
+ except (ValueError, TypeError):
+ # If both values aren't convertible to float, just ignore
+ # ValueError if arg is a str, TypeError if it's something else
+ # (like None)
+ within_tolerance = False
+
+ if hasattr(d1value, 'keys') and hasattr(d2value, 'keys'):
+ matcher = DictMatches(d1value)
+ did_match = matcher.match(d2value)
+ if did_match is not None:
+ return did_match
+ elif 'DONTCARE' in (d1value, d2value):
+ continue
+ elif self.approx_equal and within_tolerance:
+ continue
+ elif d1value != d2value:
+ return DictMismatch(key, d1value, d2value)
+
+
+class ListLengthMismatch(object):
+ def __init__(self, len1, len2):
+ self.len1 = len1
+ self.len2 = len2
+
+ def describe(self):
+ return ('Length mismatch: len(L1)=%(len1)d != '
+ 'len(L2)=%(len2)d' % self.__dict__)
+
+ def get_details(self):
+ return {}
+
+
+class DictListMatches(object):
+
+ def __init__(self, l1, approx_equal=False, tolerance=0.001):
+ self.l1 = l1
+ self.approx_equal = approx_equal
+ self.tolerance = tolerance
+
+ def __str__(self):
+ return 'DictListMatches(%s)' % (pprint.pformat(self.l1))
+
+ # Useful assertions
+ def match(self, l2):
+ """Assert a list of dicts are equivalent."""
+
+ l1count = len(self.l1)
+ l2count = len(l2)
+ if l1count != l2count:
+ return ListLengthMismatch(l1count, l2count)
+
+ for d1, d2 in zip(self.l1, l2):
+ matcher = DictMatches(d2,
+ approx_equal=self.approx_equal,
+ tolerance=self.tolerance)
+ did_match = matcher.match(d1)
+ if did_match:
+ return did_match
+
+
+class SubDictMismatch(object):
+ def __init__(self,
+ key=None,
+ sub_value=None,
+ super_value=None,
+ keys=False):
+ self.key = key
+ self.sub_value = sub_value
+ self.super_value = super_value
+ self.keys = keys
+
+ def describe(self):
+ if self.keys:
+ return "Keys between dictionaries did not match"
+ else:
+ return("Dictionaries do not match at %s. d1: %s d2: %s"
+ % (self.key,
+ self.super_value,
+ self.sub_value))
+
+ def get_details(self):
+ return {}
+
+
+class IsSubDictOf(object):
+
+ def __init__(self, super_dict):
+ self.super_dict = super_dict
+
+ def __str__(self):
+ return 'IsSubDictOf(%s)' % (self.super_dict)
+
+ def match(self, sub_dict):
+ """Assert a sub_dict is subset of super_dict."""
+ if not set(sub_dict.keys()).issubset(set(self.super_dict.keys())):
+ return SubDictMismatch(keys=True)
+ for k, sub_value in sub_dict.items():
+ super_value = self.super_dict[k]
+ if isinstance(sub_value, dict):
+ matcher = IsSubDictOf(super_value)
+ did_match = matcher.match(sub_value)
+ if did_match is not None:
+ return did_match
+ elif 'DONTCARE' in (sub_value, super_value):
+ continue
+ else:
+ if sub_value != super_value:
+ return SubDictMismatch(k, sub_value, super_value)
diff --git a/nova/tests/network/test_manager.py b/nova/tests/network/test_manager.py
index 77fccd904..698ce8f59 100644
--- a/nova/tests/network/test_manager.py
+++ b/nova/tests/network/test_manager.py
@@ -32,6 +32,7 @@ import nova.policy
from nova import test
from nova.tests import fake_ldap
from nova.tests import fake_network
+from nova.tests import matchers
from nova import utils
@@ -168,7 +169,7 @@ class FlatNetworkTestCase(test.TestCase):
'bridge_interface': None,
'vlan': None}
- self.assertDictMatch(nw, check)
+ self.assertThat(nw, matchers.DictMatches(check))
check = {'broadcast': '192.168.%d.255' % nid,
'dhcp_server': '192.168.1.1',
@@ -184,13 +185,13 @@ class FlatNetworkTestCase(test.TestCase):
'00000000-0000-0000-0000-00000000000000%02d' % nid,
'should_create_vlan': False,
'should_create_bridge': False}
- self.assertDictMatch(info, check)
+ self.assertThat(info, matchers.DictMatches(check))
check = [{'enabled': 'DONTCARE',
'ip': '2001:db8:0:1::%x' % nid,
'netmask': 64,
'gateway': 'fe80::def'}]
- self.assertDictListMatch(info['ip6s'], check)
+ self.assertThat(info['ip6s'], matchers.DictListMatches(check))
num_fixed_ips = len(info['ips'])
check = [{'enabled': 'DONTCARE',
@@ -198,7 +199,7 @@ class FlatNetworkTestCase(test.TestCase):
'netmask': '255.255.255.0',
'gateway': '192.168.%d.1' % nid}
for ip_num in xrange(1, num_fixed_ips + 1)]
- self.assertDictListMatch(info['ips'], check)
+ self.assertThat(info['ips'], matchers.DictListMatches(check))
def test_validate_networks(self):
self.mox.StubOutWithMock(db, 'network_get')
diff --git a/nova/tests/policy.json b/nova/tests/policy.json
index efe2724ad..bf94d4e49 100644
--- a/nova/tests/policy.json
+++ b/nova/tests/policy.json
@@ -117,6 +117,7 @@
"compute_extension:rescue": "",
"compute_extension:security_groups": "",
"compute_extension:server_diagnostics": "",
+ "compute_extension:services": "",
"compute_extension:simple_tenant_usage:show": "",
"compute_extension:simple_tenant_usage:list": "",
"compute_extension:users": "",
diff --git a/nova/tests/scheduler/test_host_manager.py b/nova/tests/scheduler/test_host_manager.py
index d7d732d34..0984cbf80 100644
--- a/nova/tests/scheduler/test_host_manager.py
+++ b/nova/tests/scheduler/test_host_manager.py
@@ -24,6 +24,7 @@ from nova import exception
from nova.openstack.common import timeutils
from nova.scheduler import host_manager
from nova import test
+from nova.tests import matchers
from nova.tests.scheduler import fakes
@@ -92,7 +93,7 @@ class HostManagerTestCase(test.TestCase):
def test_update_service_capabilities(self):
service_states = self.host_manager.service_states
- self.assertDictMatch(service_states, {})
+ self.assertEqual(len(service_states.keys()), 0)
self.mox.StubOutWithMock(timeutils, 'utcnow')
timeutils.utcnow().AndReturn(31337)
timeutils.utcnow().AndReturn(31339)
@@ -116,11 +117,11 @@ class HostManagerTestCase(test.TestCase):
expected = {('host1', 'node1'): host1_compute_capabs,
('host2', 'node2'): host2_compute_capabs}
- self.assertDictMatch(service_states, expected)
+ self.assertThat(service_states, matchers.DictMatches(expected))
def test_update_service_capabilities_node_key(self):
service_states = self.host_manager.service_states
- self.assertDictMatch(service_states, {})
+ self.assertThat(service_states, matchers.DictMatches({}))
host1_cap = {'hypervisor_hostname': 'host1-hvhn'}
host2_cap = {}
@@ -135,7 +136,7 @@ class HostManagerTestCase(test.TestCase):
host2_cap['timestamp'] = 31338
expected = {('host1', 'host1-hvhn'): host1_cap,
('host2', None): host2_cap}
- self.assertDictMatch(service_states, expected)
+ self.assertThat(service_states, matchers.DictMatches(expected))
def test_get_all_host_states(self):
diff --git a/nova/tests/scheduler/test_least_cost.py b/nova/tests/scheduler/test_least_cost.py
index 3689a30bd..1d180d718 100644
--- a/nova/tests/scheduler/test_least_cost.py
+++ b/nova/tests/scheduler/test_least_cost.py
@@ -19,6 +19,7 @@ from nova import context
from nova.scheduler import host_manager
from nova.scheduler import least_cost
from nova import test
+from nova.tests import matchers
from nova.tests.scheduler import fakes
@@ -92,11 +93,11 @@ class TestWeightedHost(test.TestCase):
def test_dict_conversion_without_host_state(self):
host = least_cost.WeightedHost('someweight')
expected = {'weight': 'someweight'}
- self.assertDictMatch(host.to_dict(), expected)
+ self.assertThat(host.to_dict(), matchers.DictMatches(expected))
def test_dict_conversion_with_host_state(self):
host_state = host_manager.HostState('somehost', None)
host = least_cost.WeightedHost('someweight', host_state)
expected = {'weight': 'someweight',
'host': 'somehost'}
- self.assertDictMatch(host.to_dict(), expected)
+ self.assertThat(host.to_dict(), matchers.DictMatches(expected))
diff --git a/nova/tests/scheduler/test_scheduler.py b/nova/tests/scheduler/test_scheduler.py
index 9d31a0cc9..5fa3fbacd 100644
--- a/nova/tests/scheduler/test_scheduler.py
+++ b/nova/tests/scheduler/test_scheduler.py
@@ -36,6 +36,7 @@ from nova.openstack.common import timeutils
from nova.scheduler import driver
from nova.scheduler import manager
from nova import test
+from nova.tests import matchers
from nova.tests.scheduler import fakes
from nova import utils
@@ -136,7 +137,7 @@ class SchedulerManagerTestCase(test.TestCase):
'local_gb_used': 512,
'memory_mb': 1024,
'memory_mb_used': 512}}
- self.assertDictMatch(result, expected)
+ self.assertThat(result, matchers.DictMatches(expected))
def _mox_schedule_method_helper(self, method_name):
# Make sure the method exists that we're going to test call
@@ -719,7 +720,7 @@ class SchedulerDriverModuleTestCase(test.TestCase):
result = driver.encode_instance(instance, True)
expected = {'id': instance['id'], '_is_precooked': False}
- self.assertDictMatch(result, expected)
+ self.assertThat(result, matchers.DictMatches(expected))
# Orig dict not changed
self.assertNotEqual(result, instance)
@@ -727,6 +728,6 @@ class SchedulerDriverModuleTestCase(test.TestCase):
expected = {}
expected.update(instance)
expected['_is_precooked'] = True
- self.assertDictMatch(result, expected)
+ self.assertThat(result, matchers.DictMatches(expected))
# Orig dict not changed
self.assertNotEqual(result, instance)
diff --git a/nova/tests/test_api.py b/nova/tests/test_api.py
index c2a63fe25..afb366624 100644
--- a/nova/tests/test_api.py
+++ b/nova/tests/test_api.py
@@ -41,6 +41,7 @@ from nova import exception
from nova import flags
from nova.openstack.common import timeutils
from nova import test
+from nova.tests import matchers
class FakeHttplibSocket(object):
@@ -160,7 +161,7 @@ class Ec2utilsTestCase(test.TestCase):
'virtual_name': 'ephemeral0'}}}
out_dict = ec2utils.dict_from_dotted_str(in_str)
- self.assertDictMatch(out_dict, expected_dict)
+ self.assertThat(out_dict, matchers.DictMatches(expected_dict))
def test_properties_root_defice_name(self):
mappings = [{"device": "/dev/sda1", "virtual": "root"}]
@@ -206,8 +207,8 @@ class Ec2utilsTestCase(test.TestCase):
'device': '/dev/sdc1'},
{'virtual': 'ephemeral1',
'device': '/dev/sdc1'}]
- self.assertDictListMatch(block_device.mappings_prepend_dev(mappings),
- expected_result)
+ self.assertThat(block_device.mappings_prepend_dev(mappings),
+ matchers.DictListMatches(expected_result))
class ApiEc2TestCase(test.TestCase):
diff --git a/nova/tests/test_bdm.py b/nova/tests/test_bdm.py
index 381ed8070..2d0349534 100644
--- a/nova/tests/test_bdm.py
+++ b/nova/tests/test_bdm.py
@@ -22,6 +22,7 @@ Tests for Block Device Mapping Code.
from nova.api.ec2 import cloud
from nova.api.ec2 import ec2utils
from nova import test
+from nova.tests import matchers
class BlockDeviceMappingEc2CloudTestCase(test.TestCase):
@@ -41,7 +42,7 @@ class BlockDeviceMappingEc2CloudTestCase(test.TestCase):
def _assertApply(self, action, bdm_list):
for bdm, expected_result in bdm_list:
- self.assertDictMatch(action(bdm), expected_result)
+ self.assertThat(action(bdm), matchers.DictMatches(expected_result))
def test_parse_block_device_mapping(self):
self.stubs.Set(ec2utils,
diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py
index ac66a25c1..7a71a1247 100644
--- a/nova/tests/test_db_api.py
+++ b/nova/tests/test_db_api.py
@@ -28,6 +28,7 @@ from nova import exception
from nova import flags
from nova.openstack.common import timeutils
from nova import test
+from nova.tests import matchers
from nova import utils
CONF = config.CONF
@@ -621,14 +622,16 @@ class AggregateDBApiTestCase(test.TestCase):
ctxt = context.get_admin_context()
result = _create_aggregate(context=ctxt)
expected_metadata = db.aggregate_metadata_get(ctxt, result['id'])
- self.assertDictMatch(expected_metadata, _get_fake_aggr_metadata())
+ self.assertThat(expected_metadata,
+ matchers.DictMatches(_get_fake_aggr_metadata()))
def test_aggregate_create_delete_create_with_metadata(self):
"""Ensure aggregate metadata is deleted bug 1052479."""
ctxt = context.get_admin_context()
result = _create_aggregate(context=ctxt)
expected_metadata = db.aggregate_metadata_get(ctxt, result['id'])
- self.assertDictMatch(expected_metadata, _get_fake_aggr_metadata())
+ self.assertThat(expected_metadata,
+ matchers.DictMatches(_get_fake_aggr_metadata()))
db.aggregate_delete(ctxt, result['id'])
result = _create_aggregate(metadata=None)
expected_metadata = db.aggregate_metadata_get(ctxt, result['id'])
@@ -750,7 +753,8 @@ class AggregateDBApiTestCase(test.TestCase):
values['metadata'] = _get_fake_aggr_metadata()
db.aggregate_update(ctxt, 1, values)
expected = db.aggregate_metadata_get(ctxt, result.id)
- self.assertDictMatch(_get_fake_aggr_metadata(), expected)
+ self.assertThat(_get_fake_aggr_metadata(),
+ matchers.DictMatches(expected))
def test_aggregate_update_with_existing_metadata(self):
"""Ensure an aggregate can be updated with existing metadata."""
@@ -761,7 +765,7 @@ class AggregateDBApiTestCase(test.TestCase):
values['metadata']['fake_key1'] = 'foo'
db.aggregate_update(ctxt, 1, values)
expected = db.aggregate_metadata_get(ctxt, result.id)
- self.assertDictMatch(values['metadata'], expected)
+ self.assertThat(values['metadata'], matchers.DictMatches(expected))
def test_aggregate_update_raise_not_found(self):
"""Ensure AggregateNotFound is raised when updating an aggregate."""
@@ -807,7 +811,7 @@ class AggregateDBApiTestCase(test.TestCase):
metadata = _get_fake_aggr_metadata()
db.aggregate_metadata_add(ctxt, result.id, metadata)
expected = db.aggregate_metadata_get(ctxt, result.id)
- self.assertDictMatch(metadata, expected)
+ self.assertThat(metadata, matchers.DictMatches(expected))
def test_aggregate_metadata_update(self):
"""Ensure we can update metadata for the aggregate."""
@@ -820,7 +824,7 @@ class AggregateDBApiTestCase(test.TestCase):
db.aggregate_metadata_add(ctxt, result.id, new_metadata)
expected = db.aggregate_metadata_get(ctxt, result.id)
metadata[key] = 'foo'
- self.assertDictMatch(metadata, expected)
+ self.assertThat(metadata, matchers.DictMatches(expected))
def test_aggregate_metadata_delete(self):
"""Ensure we can delete metadata for the aggregate."""
@@ -831,7 +835,7 @@ class AggregateDBApiTestCase(test.TestCase):
db.aggregate_metadata_delete(ctxt, result.id, metadata.keys()[0])
expected = db.aggregate_metadata_get(ctxt, result.id)
del metadata[metadata.keys()[0]]
- self.assertDictMatch(metadata, expected)
+ self.assertThat(metadata, matchers.DictMatches(expected))
def test_aggregate_metadata_delete_raise_not_found(self):
"""Ensure AggregateMetadataNotFound is raised when deleting."""
diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py
index 0005b8a88..f52b7cbe1 100644
--- a/nova/tests/test_libvirt.py
+++ b/nova/tests/test_libvirt.py
@@ -46,6 +46,7 @@ from nova import test
from nova.tests import fake_libvirt_utils
from nova.tests import fake_network
import nova.tests.image.fake
+from nova.tests import matchers
from nova import utils
from nova.virt.disk import api as disk
from nova.virt import driver
@@ -719,7 +720,7 @@ class LibvirtConnTestCase(test.TestCase):
'id': 'fake'
}
result = conn.get_volume_connector(volume)
- self.assertDictMatch(expected, result)
+ self.assertThat(expected, matchers.DictMatches(result))
def test_get_guest_config(self):
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
@@ -2012,11 +2013,11 @@ class LibvirtConnTestCase(test.TestCase):
self.mox.ReplayAll()
return_value = conn.check_can_live_migrate_destination(self.context,
instance_ref, compute_info, compute_info, True)
- self.assertDictMatch(return_value,
- {"filename": "file",
- 'disk_available_mb': 409600,
- "disk_over_commit": False,
- "block_migration": True})
+ self.assertThat({"filename": "file",
+ 'disk_available_mb': 409600,
+ "disk_over_commit": False,
+ "block_migration": True},
+ matchers.DictMatches(return_value))
def test_check_can_live_migrate_dest_all_pass_no_block_migration(self):
instance_ref = db.instance_create(self.context, self.test_instance)
@@ -2038,11 +2039,11 @@ class LibvirtConnTestCase(test.TestCase):
self.mox.ReplayAll()
return_value = conn.check_can_live_migrate_destination(self.context,
instance_ref, compute_info, compute_info, False)
- self.assertDictMatch(return_value,
- {"filename": "file",
- "block_migration": False,
- "disk_over_commit": False,
- "disk_available_mb": None})
+ self.assertThat({"filename": "file",
+ "block_migration": False,
+ "disk_over_commit": False,
+ "disk_available_mb": None},
+ matchers.DictMatches(return_value))
def test_check_can_live_migrate_dest_incompatible_cpu_raises(self):
instance_ref = db.instance_create(self.context, self.test_instance)
diff --git a/nova/tests/test_matchers.py b/nova/tests/test_matchers.py
new file mode 100644
index 000000000..b764b3d45
--- /dev/null
+++ b/nova/tests/test_matchers.py
@@ -0,0 +1,144 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2012 Hewlett-Packard Development Company, L.P.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import testtools
+from testtools.tests.matchers import helpers
+
+from nova.tests import matchers
+
+
+class TestDictMatches(testtools.TestCase, helpers.TestMatchersInterface):
+
+ matches_matcher = matchers.DictMatches(
+ {'foo': 'bar', 'baz': 'DONTCARE',
+ 'cat': {'tabby': True, 'fluffy': False}}
+ )
+
+ matches_matches = [
+ {'foo': 'bar', 'baz': 'noox', 'cat': {'tabby': True, 'fluffy': False}},
+ {'foo': 'bar', 'baz': 'quux', 'cat': {'tabby': True, 'fluffy': False}},
+ ]
+
+ matches_mismatches = [
+ {},
+ {'foo': 'bar', 'baz': 'qux'},
+ {'foo': 'bop', 'baz': 'qux',
+ 'cat': {'tabby': True, 'fluffy': False}},
+ {'foo': 'bar', 'baz': 'quux',
+ 'cat': {'tabby': True, 'fluffy': True}},
+ {'foo': 'bar', 'cat': {'tabby': True, 'fluffy': False}},
+ ]
+
+ str_examples = [
+ ("DictMatches({'baz': 'DONTCARE', 'cat':"
+ " {'fluffy': False, 'tabby': True}, 'foo': 'bar'})",
+ matches_matcher),
+ ]
+
+ describe_examples = [
+ ("Keys in d1 and not d2: set(['foo', 'baz', 'cat'])."
+ " Keys in d2 and not d1: set([])", {}, matches_matcher),
+ ("Dictionaries do not match at fluffy. d1: False d2: True",
+ {'foo': 'bar', 'baz': 'quux',
+ 'cat': {'tabby': True, 'fluffy': True}}, matches_matcher),
+ ("Dictionaries do not match at foo. d1: bar d2: bop",
+ {'foo': 'bop', 'baz': 'quux',
+ 'cat': {'tabby': True, 'fluffy': False}}, matches_matcher),
+ ]
+
+
+class TestDictListMatches(testtools.TestCase, helpers.TestMatchersInterface):
+
+ matches_matcher = matchers.DictListMatches(
+ [{'foo': 'bar', 'baz': 'DONTCARE',
+ 'cat': {'tabby': True, 'fluffy': False}},
+ {'dog': 'yorkie'},
+ ])
+
+ matches_matches = [
+ [{'foo': 'bar', 'baz': 'qoox',
+ 'cat': {'tabby': True, 'fluffy': False}},
+ {'dog': 'yorkie'}],
+ [{'foo': 'bar', 'baz': False,
+ 'cat': {'tabby': True, 'fluffy': False}},
+ {'dog': 'yorkie'}],
+ ]
+
+ matches_mismatches = [
+ [],
+ {},
+ [{'foo': 'bar', 'baz': 'qoox',
+ 'cat': {'tabby': True, 'fluffy': True}},
+ {'dog': 'yorkie'}],
+ [{'foo': 'bar', 'baz': False,
+ 'cat': {'tabby': True, 'fluffy': False}},
+ {'cat': 'yorkie'}],
+ [{'foo': 'bop', 'baz': False,
+ 'cat': {'tabby': True, 'fluffy': False}},
+ {'dog': 'yorkie'}],
+ ]
+
+ str_examples = [
+ ("DictListMatches([{'baz': 'DONTCARE', 'cat':"
+ " {'fluffy': False, 'tabby': True}, 'foo': 'bar'},\n"
+ " {'dog': 'yorkie'}])",
+ matches_matcher),
+ ]
+
+ describe_examples = [
+ ("Length mismatch: len(L1)=2 != len(L2)=0", {}, matches_matcher),
+ ("Dictionaries do not match at fluffy. d1: True d2: False",
+ [{'foo': 'bar', 'baz': 'qoox',
+ 'cat': {'tabby': True, 'fluffy': True}},
+ {'dog': 'yorkie'}],
+ matches_matcher),
+ ]
+
+
+class TestDictMatches(testtools.TestCase, helpers.TestMatchersInterface):
+
+ matches_matcher = matchers.IsSubDictOf(
+ {'foo': 'bar', 'baz': 'DONTCARE',
+ 'cat': {'tabby': True, 'fluffy': False}}
+ )
+
+ matches_matches = [
+ {'foo': 'bar', 'baz': 'noox', 'cat': {'tabby': True, 'fluffy': False}},
+ {'foo': 'bar', 'baz': 'quux'}
+ ]
+
+ matches_mismatches = [
+ {'foo': 'bop', 'baz': 'qux',
+ 'cat': {'tabby': True, 'fluffy': False}},
+ {'foo': 'bar', 'baz': 'quux',
+ 'cat': {'tabby': True, 'fluffy': True}},
+ {'foo': 'bar', 'cat': {'tabby': True, 'fluffy': False}, 'dog': None},
+ ]
+
+ str_examples = [
+ ("IsSubDictOf({'foo': 'bar', 'baz': 'DONTCARE',"
+ " 'cat': {'fluffy': False, 'tabby': True}})",
+ matches_matcher),
+ ]
+
+ describe_examples = [
+ ("Dictionaries do not match at fluffy. d1: False d2: True",
+ {'foo': 'bar', 'baz': 'quux',
+ 'cat': {'tabby': True, 'fluffy': True}}, matches_matcher),
+ ("Dictionaries do not match at foo. d1: bar d2: bop",
+ {'foo': 'bop', 'baz': 'quux',
+ 'cat': {'tabby': True, 'fluffy': False}}, matches_matcher),
+ ]
diff --git a/nova/tests/test_powervm.py b/nova/tests/test_powervm.py
index 6745903d2..50de428b8 100644
--- a/nova/tests/test_powervm.py
+++ b/nova/tests/test_powervm.py
@@ -18,15 +18,17 @@
Test suite for PowerVMDriver.
"""
-from nova.compute import power_state
from nova import context
from nova import db
from nova import flags
from nova import test
+from nova.compute import power_state
from nova.openstack.common import log as logging
from nova.virt import images
+
from nova.virt.powervm import driver as powervm_driver
+from nova.virt.powervm import exception
from nova.virt.powervm import lpar
from nova.virt.powervm import operator
@@ -151,6 +153,28 @@ class PowerVMDriverTestCase(test.TestCase):
state = self.powervm_connection.get_info(self.instance)['state']
self.assertEqual(state, power_state.RUNNING)
+ def test_spawn_cleanup_on_fail(self):
+ """Verify on a failed spawn, we get the original exception raised"""
+ # helper function
+ def raise_(ex):
+ raise ex
+
+ self.flags(powervm_img_local_path='/images/')
+ self.stubs.Set(images, 'fetch_to_raw', lambda *x, **y: None)
+ self.stubs.Set(
+ self.powervm_connection._powervm._operator,
+ 'copy_image_file',
+ lambda *x, **y: raise_(exception.PowerVMImageCreationFailed()))
+ self.stubs.Set(
+ self.powervm_connection._powervm, '_cleanup',
+ lambda *x, **y: raise_(Exception('This should be logged.')))
+
+ self.assertRaises(exception.PowerVMImageCreationFailed,
+ self.powervm_connection.spawn,
+ context.get_admin_context(),
+ self.instance,
+ {'id': 'ANY_ID'}, 's3cr3t', [])
+
def test_destroy(self):
self.powervm_connection.destroy(self.instance, None)
self.stubs.Set(FakeIVMOperator, 'get_lpar', lambda x, y: None)
diff --git a/nova/tests/test_xenapi.py b/nova/tests/test_xenapi.py
index f5a5969aa..50ed9cd2a 100644
--- a/nova/tests/test_xenapi.py
+++ b/nova/tests/test_xenapi.py
@@ -42,6 +42,7 @@ from nova.tests.db import fakes as db_fakes
from nova.tests import fake_network
from nova.tests import fake_utils
import nova.tests.image.fake as fake_image
+from nova.tests import matchers
from nova.tests.xenapi import stubs
from nova.virt import fake
from nova.virt.xenapi import agent
@@ -361,7 +362,7 @@ class XenAPIVMTestCase(stubs.XenAPITestBase):
}
instance = self._create_instance()
expected = self.conn.get_diagnostics(instance)
- self.assertDictMatch(fake_diagnostics, expected)
+ self.assertThat(fake_diagnostics, matchers.DictMatches(expected))
def test_instance_snapshot_fails_with_no_primary_vdi(self):
def create_bad_vbd(session, vm_ref, vdi_ref, userdevice,
@@ -2140,7 +2141,8 @@ class XenAPIAggregateTestCase(stubs.XenAPITestBase):
self.conn._pool.add_to_aggregate(self.context, aggregate, "host")
result = db.aggregate_get(self.context, aggregate.id)
self.assertTrue(fake_init_pool.called)
- self.assertDictMatch(self.fake_metadata, result.metadetails)
+ self.assertThat(self.fake_metadata,
+ matchers.DictMatches(result.metadetails))
def test_join_slave(self):
"""Ensure join_slave gets called when the request gets to master."""
@@ -2218,8 +2220,9 @@ class XenAPIAggregateTestCase(stubs.XenAPITestBase):
self.conn._pool.remove_from_aggregate(self.context, aggregate, "host")
result = db.aggregate_get(self.context, aggregate.id)
self.assertTrue(fake_clear_pool.called)
- self.assertDictMatch({pool_states.POOL_FLAG: 'XenAPI',
- pool_states.KEY: pool_states.ACTIVE}, result.metadetails)
+ self.assertThat({pool_states.POOL_FLAG: 'XenAPI',
+ pool_states.KEY: pool_states.ACTIVE},
+ matchers.DictMatches(result.metadetails))
def test_remote_master_non_empty_pool(self):
"""Ensure AggregateError is raised if removing the master."""
diff --git a/nova/virt/disk/api.py b/nova/virt/disk/api.py
index 529f231af..e71faad70 100644
--- a/nova/virt/disk/api.py
+++ b/nova/virt/disk/api.py
@@ -157,13 +157,6 @@ def bind(src, target, instance_name):
utils.execute('touch', target, run_as_root=True)
utils.execute('mount', '-o', 'bind', src, target,
run_as_root=True)
- s = os.stat(src)
- cgroup_info = "b %s:%s rwm\n" % (os.major(s.st_rdev),
- os.minor(s.st_rdev))
- cgroups_path = ("/sys/fs/cgroup/devices/libvirt/lxc/"
- "%s/devices.allow" % instance_name)
- utils.execute('tee', cgroups_path,
- process_input=cgroup_info, run_as_root=True)
def unbind(target):
diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py
index 6dae2589e..94ce9f6f8 100644
--- a/nova/virt/libvirt/driver.py
+++ b/nova/virt/libvirt/driver.py
@@ -743,6 +743,13 @@ class LibvirtDriver(driver.ComputeDriver):
if lxc_container_target:
disk.bind(lxc_host_volume, lxc_container_target, instance_name)
+ s = os.stat(lxc_host_volume)
+ cgroup_info = "b %s:%s rwm\n" % (os.major(s.st_rdev),
+ os.minor(s.st_rdev))
+ cgroups_path = ("/sys/fs/cgroup/devices/libvirt/lxc/"
+ "%s/devices.allow" % instance_name)
+ utils.execute('tee', cgroups_path,
+ process_input=cgroup_info, run_as_root=True)
@exception.wrap_exception()
def _detach_lxc_volume(self, xml, virt_dom, instance_name):
@@ -2347,6 +2354,11 @@ class LibvirtDriver(driver.ComputeDriver):
None. if given cpu info is not compatible to this server,
raise exception.
"""
+
+ # NOTE(berendt): virConnectCompareCPU not working for Xen
+ if CONF.libvirt_type == 'xen':
+ return 1
+
info = jsonutils.loads(cpu_info)
LOG.info(_('Instance launched has CPU info:\n%s') % cpu_info)
cpu = vconfig.LibvirtConfigCPU()
diff --git a/nova/virt/libvirt/utils.py b/nova/virt/libvirt/utils.py
index 6f163e8d0..3a307c8e4 100644
--- a/nova/virt/libvirt/utils.py
+++ b/nova/virt/libvirt/utils.py
@@ -169,7 +169,7 @@ def list_logical_volumes(vg):
:param vg: volume group name
"""
- out, err = execute('lvs', '--noheadings', '-o', 'lv_path', vg,
+ out, err = execute('lvs', '--noheadings', '-o', 'lv_name', vg,
run_as_root=True)
return [line.strip() for line in out.splitlines()]
diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py
index 56c26dfd1..91088c3d2 100644
--- a/nova/virt/libvirt/vif.py
+++ b/nova/virt/libvirt/vif.py
@@ -293,7 +293,8 @@ class QuantumLinuxBridgeVIFDriver(vif.VIFDriver):
conf.model = 'virtio'
conf.net_type = "ethernet"
conf.target_dev = dev
- conf.script = ""
+ if CONF.libvirt_type != 'xen':
+ conf.script = ""
conf.mac_addr = mapping['mac']
return conf
@@ -303,7 +304,8 @@ class QuantumLinuxBridgeVIFDriver(vif.VIFDriver):
network, mapping = vif
dev = self.get_dev_name(mapping['vif_uuid'])
try:
- utils.execute('ip', 'link', 'delete', dev, run_as_root=True)
+ if CONF.libvirt_type != 'xen':
+ utils.execute('ip', 'link', 'delete', dev, run_as_root=True)
except exception.ProcessExecutionError:
LOG.warning(_("Failed while unplugging vif"), instance=instance)
raise
diff --git a/nova/virt/powervm/operator.py b/nova/virt/powervm/operator.py
index 09ad662b3..6ed7535a7 100644
--- a/nova/virt/powervm/operator.py
+++ b/nova/virt/powervm/operator.py
@@ -26,7 +26,9 @@ from nova import flags
from nova import utils
from nova.compute import power_state
+from nova.openstack.common import excutils
from nova.openstack.common import log as logging
+
from nova.virt import images
from nova.virt.powervm import command
from nova.virt.powervm import common
@@ -264,7 +266,13 @@ class PowerVMOperator(object):
time.sleep(1)
except exception.PowerVMImageCreationFailed:
- self._cleanup(instance['name'])
+ with excutils.save_and_reraise_exception():
+ # log errors in cleanup
+ try:
+ self._cleanup(instance['name'])
+ except Exception:
+ LOG.exception(_('Error while attempting to '
+ 'clean up failed instance launch.'))
def destroy(self, instance_name):
"""Destroy (shutdown and delete) the specified instance.
diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py
index f6d28ca54..61d59d83b 100644
--- a/nova/virt/xenapi/vm_utils.py
+++ b/nova/virt/xenapi/vm_utils.py
@@ -276,22 +276,42 @@ def destroy_vm(session, instance, vm_ref):
LOG.debug(_("VM destroyed"), instance=instance)
-def shutdown_vm(session, instance, vm_ref, hard=True):
- vm_rec = session.call_xenapi("VM.get_record", vm_ref)
- state = compile_info(vm_rec)['state']
- if state == power_state.SHUTDOWN:
+def clean_shutdown_vm(session, instance, vm_ref):
+ if _is_vm_shutdown(session, vm_ref):
LOG.warn(_("VM already halted, skipping shutdown..."),
instance=instance)
- return
+ return False
- LOG.debug(_("Shutting down VM"), instance=instance)
+ LOG.debug(_("Shutting down VM (cleanly)"), instance=instance)
try:
- if hard:
- session.call_xenapi('VM.hard_shutdown', vm_ref)
- else:
- session.call_xenapi('VM.clean_shutdown', vm_ref)
+ session.call_xenapi('VM.clean_shutdown', vm_ref)
except session.XenAPI.Failure, exc:
LOG.exception(exc)
+ return False
+ return True
+
+
+def hard_shutdown_vm(session, instance, vm_ref):
+ if _is_vm_shutdown(session, vm_ref):
+ LOG.warn(_("VM already halted, skipping shutdown..."),
+ instance=instance)
+ return False
+
+ LOG.debug(_("Shutting down VM (hard)"), instance=instance)
+ try:
+ session.call_xenapi('VM.hard_shutdown', vm_ref)
+ except session.XenAPI.Failure, exc:
+ LOG.exception(exc)
+ return False
+ return True
+
+
+def _is_vm_shutdown(session, vm_ref):
+ vm_rec = session.call_xenapi("VM.get_record", vm_ref)
+ state = compile_info(vm_rec)['state']
+ if state == power_state.SHUTDOWN:
+ return True
+ return False
def ensure_free_mem(session, instance):
diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py
index cc0d48d22..5d250c712 100644
--- a/nova/virt/xenapi/vmops.py
+++ b/nova/virt/xenapi/vmops.py
@@ -238,10 +238,10 @@ class VMOps(object):
False, False)
def _create_disks(self, context, instance, name_label, disk_image_type,
- block_device_info=None):
+ image_meta, block_device_info=None):
vdis = vm_utils.get_vdis_for_instance(context, self._session,
instance, name_label,
- instance['image_ref'],
+ image_meta['id'],
disk_image_type,
block_device_info=block_device_info)
# Just get the VDI ref once
@@ -269,9 +269,10 @@ class VMOps(object):
return vm_utils.determine_disk_image_type(image_meta)
@step
- def create_disks_step(undo_mgr, disk_image_type):
+ def create_disks_step(undo_mgr, disk_image_type, image_meta):
vdis = self._create_disks(context, instance, name_label,
- disk_image_type, block_device_info)
+ disk_image_type, image_meta,
+ block_device_info)
def undo_create_disks():
vdi_refs = [vdi['ref'] for vdi in vdis.values()
@@ -387,7 +388,7 @@ class VMOps(object):
bdev_set_default_root(undo_mgr)
disk_image_type = determine_disk_image_type_step(undo_mgr)
- vdis = create_disks_step(undo_mgr, disk_image_type)
+ vdis = create_disks_step(undo_mgr, disk_image_type, image_meta)
kernel_file, ramdisk_file = create_kernel_ramdisk_step(undo_mgr)
vm_ref = create_vm_record_step(undo_mgr, vdis, disk_image_type,
kernel_file, ramdisk_file)
@@ -692,8 +693,7 @@ class VMOps(object):
instance=instance)
# 2. Power down the instance before resizing
- vm_utils.shutdown_vm(
- self._session, instance, vm_ref, hard=False)
+ vm_utils.clean_shutdown_vm(self._session, instance, vm_ref)
self._update_instance_progress(context, instance,
step=2,
total_steps=RESIZE_TOTAL_STEPS)
@@ -740,8 +740,7 @@ class VMOps(object):
total_steps=RESIZE_TOTAL_STEPS)
# 3. Now power down the instance
- vm_utils.shutdown_vm(
- self._session, instance, vm_ref, hard=False)
+ vm_utils.clean_shutdown_vm(self._session, instance, vm_ref)
self._update_instance_progress(context, instance,
step=3,
total_steps=RESIZE_TOTAL_STEPS)
@@ -1074,7 +1073,7 @@ class VMOps(object):
instance=instance)
return
- vm_utils.shutdown_vm(self._session, instance, vm_ref)
+ vm_utils.hard_shutdown_vm(self._session, instance, vm_ref)
# Destroy VDIs
self._detach_vm_vols(instance, vm_ref, block_device_info)
@@ -1125,7 +1124,7 @@ class VMOps(object):
% instance['name'])
vm_ref = self._get_vm_opaque_ref(instance)
- vm_utils.shutdown_vm(self._session, instance, vm_ref)
+ vm_utils.hard_shutdown_vm(self._session, instance, vm_ref)
self._acquire_bootlock(vm_ref)
self.spawn(context, instance, image_meta, [], rescue_password,
network_info, name_label=rescue_name_label, rescue=True)
@@ -1158,7 +1157,7 @@ class VMOps(object):
LOG.warning(_("VM is not present, skipping soft delete..."),
instance=instance)
else:
- vm_utils.shutdown_vm(self._session, instance, vm_ref, hard=True)
+ vm_utils.hard_shutdown_vm(self._session, instance, vm_ref)
self._acquire_bootlock(vm_ref)
def restore(self, instance):
@@ -1170,7 +1169,7 @@ class VMOps(object):
def power_off(self, instance):
"""Power off the specified instance."""
vm_ref = self._get_vm_opaque_ref(instance)
- vm_utils.shutdown_vm(self._session, instance, vm_ref, hard=True)
+ vm_utils.hard_shutdown_vm(self._session, instance, vm_ref)
def power_on(self, instance):
"""Power on the specified instance."""
diff --git a/tox.ini b/tox.ini
index e986d587d..55ac0cd43 100644
--- a/tox.ini
+++ b/tox.ini
@@ -32,7 +32,7 @@ commands =
[testenv:pylint]
setenv = VIRTUAL_ENV={envdir}
deps = -r{toxinidir}/tools/pip-requires
- pylint==0.25.2
+ pylint==0.26.0
commands = bash tools/lintstack.sh
[testenv:cover]