diff options
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.""" @@ -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] |