diff --git a/nova-powervc/powervc/nova/driver/compute/manager.py b/nova-powervc/powervc/nova/driver/compute/manager.py index ca902f9..c6a991c 100644 --- a/nova-powervc/powervc/nova/driver/compute/manager.py +++ b/nova-powervc/powervc/nova/driver/compute/manager.py @@ -77,6 +77,8 @@ class PowerVCCloudManager(manager.Manager): LOG.error(_("Unable to load the PowerVC driver: %s") % (e)) sys.exit(1) + # Defer update local vm when powervc vm ids in spawning status + self.defer_update_local_vm_in_spawning_ids = [] # The variable used to cache the volume data self.cache_volume = utills.VolumeCache(self.driver) self.compute_api = compute.API() @@ -1622,26 +1624,45 @@ class PowerVCCloudManager(manager.Manager): pvc_instance) return True + local_id = local_instance.get('uuid') if (pvc_task_state is None and (pvc_vm_state == vm_states.ACTIVE or pvc_vm_state == vm_states.ERROR) and local_task_state == task_states.SPAWNING): - LOG.info(_('Update %(pvc_ins)s to %(local_ins)s, when' - 'pvc_task_state is %(pvc_task_state)s,' - 'pvc_vm_state is %(pvc_vm_state)s,' - 'local_task_state is %(local_task_state)s,' - 'local_vm_state is %(local_vm_state)s' - % {'pvc_ins': pvc_instance, - 'local_ins': local_instance, - 'pvc_task_state': pvc_task_state, - 'pvc_vm_state': pvc_vm_state, - 'local_task_state': local_task_state, - 'local_vm_state': local_vm_state})) + # Defer update local vm when powervc vm ids in spawning status + if local_id in self.defer_update_local_vm_in_spawning_ids: + LOG.info(_('Update %(pvc_ins)s to %(local_ins)s, when' + 'pvc_task_state is %(pvc_task_state)s,' + 'pvc_vm_state is %(pvc_vm_state)s,' + 'local_task_state is %(local_task_state)s,' + 'local_vm_state is %(local_vm_state)s' + % {'pvc_ins': pvc_instance, + 'local_ins': local_instance, + 'pvc_task_state': pvc_task_state, + 'pvc_vm_state': pvc_vm_state, + 'local_task_state': local_task_state, + 'local_vm_state': local_vm_state})) + + self._sync_existing_instance(context, + local_instance, + pvc_instance) + + # send out event for instance create finished + compute.utils.notify_about_instance_usage(self.notifier, + context, + local_instance, + "create.sync", + network_info={}, + system_metadata={}, + extra_usage_info={}) + self.defer_update_local_vm_in_spawning_ids.remove(local_id) + else: + self.defer_update_local_vm_in_spawning_ids.append(local_id) + LOG.info(_('VM: %(uuid)s is in spawning status, defer update.' + ' Just add uuid to list and will update next time.' + % {'uuid': local_id})) - self._sync_existing_instance(context, - local_instance, - pvc_instance) return True LOG.debug(_('Skip update %(pvc_ins)s to %(local_ins)s, because'