summaryrefslogtreecommitdiffstats
path: root/nova/scheduler/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'nova/scheduler/utils.py')
-rw-r--r--nova/scheduler/utils.py51
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)