diff options
Diffstat (limited to 'nova/scheduler/utils.py')
-rw-r--r-- | nova/scheduler/utils.py | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/nova/scheduler/utils.py b/nova/scheduler/utils.py index aa6cff149..eeb68f439 100644 --- a/nova/scheduler/utils.py +++ b/nova/scheduler/utils.py @@ -14,9 +14,17 @@ """Utility methods for scheduling.""" +import sys + from nova.compute import flavors +from nova.compute import utils as compute_utils from nova import db +from nova import notifications from nova.openstack.common import jsonutils +from nova.openstack.common import log as logging +from nova.openstack.common.notifier import api as notifier + +LOG = logging.getLogger(__name__) def build_request_spec(ctxt, image, instances): @@ -41,3 +49,46 @@ def build_request_spec(ctxt, image, instances): # scheduler to conductor. Provides backwards compatibility now. 'instance_uuids': [inst['uuid'] for inst in instances]} return jsonutils.to_primitive(request_spec) + + +def set_vm_state_and_notify(context, service, method, updates, ex, + request_spec, db): + """changes VM state and notifies.""" + LOG.warning(_("Failed to %(service)s_%(method)s: %(ex)s"), + {'service': service, 'method': method, 'ex': ex}) + + vm_state = updates['vm_state'] + properties = request_spec.get('instance_properties', {}) + # NOTE(vish): We shouldn't get here unless we have a catastrophic + # failure, so just set all instances to error. if uuid + # is not set, instance_uuids will be set to [None], this + # is solely to preserve existing behavior and can + # be removed along with the 'if instance_uuid:' if we can + # verify that uuid is always set. + uuids = [properties.get('uuid')] + from nova.conductor import api as conductor_api + for instance_uuid in request_spec.get('instance_uuids') or uuids: + if instance_uuid: + state = vm_state.upper() + LOG.warning(_('Setting instance to %s state.'), state, + instance_uuid=instance_uuid) + + # update instance state and notify on the transition + (old_ref, new_ref) = db.instance_update_and_get_original( + context, instance_uuid, updates) + notifications.send_update(context, old_ref, new_ref, + service=service) + compute_utils.add_instance_fault_from_exc(context, + conductor_api.LocalAPI(), + new_ref, ex, sys.exc_info()) + + payload = dict(request_spec=request_spec, + instance_properties=properties, + instance_id=instance_uuid, + state=vm_state, + method=method, + reason=ex) + + event_type = '%s.%s' % (service, method) + notifier.notify(context, notifier.publisher_id(service), + event_type, notifier.ERROR, payload) |