nova rebuild won't work

Bug #904724 reported by Boris Filippov
2
Affects Status Importance Assigned to Milestone
OpenStack Compute (nova)
Invalid
Undecided
Unassigned

Bug Description

Using nova 2011.3

Suppose, we want to perform nova rebuild:

bash4.1$ nova rebuild 7 9

but in compute.log we get:

2011-12-15 14:53:11,940 DEBUG nova.virt.libvirt_conn [-] instance instance-00000007: starting toXML method from (pid=3284) to_xml /usr/lib/python2.7/site-packages/nova/virt/libvirt/connection.py:1164
2011-12-15 14:53:11,940 ERROR nova.exception [-] Uncaught exception
(nova.exception): TRACE: Traceback (most recent call last):
(nova.exception): TRACE: File "/usr/lib/python2.7/site-packages/nova/exception.py", line 98, in wrapped
(nova.exception): TRACE: return f(*args, **kw)
(nova.exception): TRACE: File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/connection.py", line 606, in spawn
(nova.exception): TRACE: block_device_info=block_device_info)
(nova.exception): TRACE: File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/connection.py", line 1166, in to_xml
(nova.exception): TRACE: block_device_info)
(nova.exception): TRACE: File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/connection.py", line 1060, in _prepare_xml_info
(nova.exception): TRACE: block_device_info)
(nova.exception): TRACE: File "/usr/lib/python2.7/site-packages/nova/virt/driver.py", line 58, in block_device_info_get_mapping
(nova.exception): TRACE: block_device_mapping = block_device_info.get('block_device_mapping') or []
(nova.exception): TRACE: AttributeError: 'tuple' object has no attribute 'get'
(nova.exception): TRACE:
2011-12-15 14:53:12,141 ERROR nova.rpc [-] Exception during message handling
(nova.rpc): TRACE: Traceback (most recent call last):
(nova.rpc): TRACE: File "/usr/lib/python2.7/site-packages/nova/rpc/impl_kombu.py", line 620, in _process_data
(nova.rpc): TRACE: rval = node_func(context=ctxt, **node_args)
(nova.rpc): TRACE: File "/usr/lib/python2.7/site-packages/nova/exception.py", line 98, in wrapped
(nova.rpc): TRACE: return f(*args, **kw)
(nova.rpc): TRACE: File "/usr/lib/python2.7/site-packages/nova/compute/manager.py", line 117, in decorated_function
(nova.rpc): TRACE: function(self, context, instance_id, *args, **kwargs)
(nova.rpc): TRACE: File "/usr/lib/python2.7/site-packages/nova/compute/manager.py", line 591, in rebuild_instance
(nova.rpc): TRACE: self.driver.spawn(context, instance_ref, network_info, bd_mapping)
(nova.rpc): TRACE: File "/usr/lib/python2.7/site-packages/nova/exception.py", line 129, in wrapped
(nova.rpc): TRACE: raise Error(str(e))
(nova.rpc): TRACE: Error: 'tuple' object has no attribute 'get'

Further investigation show, that self.driver.spawn in rebuild_instance (nova/compute/manager.py) is called with wrong arguments:

        bd_mapping = self._setup_block_device_mapping(context, instance)

        self._instance_update(context,
                              instance_uuid,
                              vm_state=vm_states.REBUILDING,
                              task_state=task_states.SPAWNING)
        # pull in new password here since the original password isn't in the db
        instance.admin_pass = kwargs.get('new_pass',
                utils.generate_password(FLAGS.password_length))

        image_meta = _get_image_meta(context, instance['image_ref'])

        self.driver.spawn(context, instance, image_meta,
                          network_info, bd_mapping)

as opposed to _run_instance:

                block_device_info = self._prep_block_device(context, instance)
                instance = self._spawn(context, instance, image_meta,
                                       network_info, block_device_info,
                                       injected_files, admin_password)

...

    def _prep_block_device(self, context, instance):
        """Set up the block device for an instance with error logging"""
        self._instance_update(context, instance['uuid'],
                              vm_state=vm_states.BUILDING,
                              task_state=task_states.BLOCK_DEVICE_MAPPING)
        try:
            mapping = self._setup_block_device_mapping(context, instance)
            swap, ephemerals, block_device_mapping = mapping
        except:
            msg = _("Instance %s failed block device setup")
            LOG.exception(msg % instance['uuid'])
            raise
        return {'root_device_name': instance['root_device_name'],
                'swap': swap,
                'ephemerals': ephemerals,
                'block_device_mapping': block_device_mapping}

Revision history for this message
Boris Filippov (bfilippov) wrote :
description: updated
Revision history for this message
Boris Filippov (bfilippov) wrote :
Changed in nova:
status: New → Invalid
Revision history for this message
Mark McLoughlin (markmc) wrote :

This was marked as invalid because apparently it's already fixed in essex. See https://review.openstack.org/2414

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.