From 0c0a211f9fb22485a2c75f70ad86cf4697db11ae Mon Sep 17 00:00:00 2001 From: Brian Elliott Date: Fri, 26 Apr 2013 15:15:23 +0000 Subject: Send a instance create error notification Send a 'create.error' notification if instance creation (run_instance) fails. This will make it easier for external notification consuming systems to learn when instance build attempts fail within the nova-compute layer. blueprint create-error-notification Change-Id: I62d7c9c80c51241bf124509af7cdd8484d9ea2d3 --- nova/compute/manager.py | 14 ++++++++++---- nova/compute/utils.py | 9 +++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) (limited to 'nova/compute') diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 1e03d6f7e..33afe44ea 100755 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -838,10 +838,14 @@ class ComputeManager(manager.SchedulerDependentManager): extra_usage_info = {} def notify(status, msg=None): - """Send a create.{start,end} notification.""" + """Send a create.{start,error,end} notification.""" type_ = "create.%(status)s" % dict(status=status) + info = extra_usage_info.copy() + if not msg: + msg = "" + info['message'] = msg self._notify_about_instance_usage(context, instance, type_, - extra_usage_info=extra_usage_info) + extra_usage_info=info) try: image_meta = self._prebuild_instance(context, instance) @@ -853,20 +857,22 @@ class ComputeManager(manager.SchedulerDependentManager): instance = self._build_instance(context, request_spec, filter_properties, requested_networks, injected_files, admin_password, is_first_time, node, instance, image_meta) - notify("end") # notify that build is done + notify("end", msg=_("Success")) # notify that build is done except exception.RescheduledException as e: # Instance build encountered an error, and has been rescheduled. - pass + notify("error", msg=unicode(e)) # notify that build failed except exception.BuildAbortException as e: # Instance build aborted due to a non-failure LOG.info(e) + notify("end", msg=unicode(e)) # notify that build is done except Exception as e: # Instance build encountered a non-recoverable error: with excutils.save_and_reraise_exception(): self._set_instance_error_state(context, instance['uuid']) + notify("error", msg=unicode(e)) # notify that build failed def _prebuild_instance(self, context, instance): self._check_instance_exists(context, instance) diff --git a/nova/compute/utils.py b/nova/compute/utils.py index 797bb9f1a..24ace0702 100644 --- a/nova/compute/utils.py +++ b/nova/compute/utils.py @@ -245,9 +245,14 @@ def notify_about_instance_usage(context, instance, event_suffix, usage_info = notifications.info_from_instance(context, instance, network_info, system_metadata, **extra_usage_info) + if event_suffix.endswith("error"): + level = notifier_api.ERROR + else: + level = notifier_api.INFO + notifier_api.notify(context, 'compute.%s' % host, - 'compute.instance.%s' % event_suffix, - notifier_api.INFO, usage_info) + 'compute.instance.%s' % event_suffix, level, + usage_info) def get_nw_info_for_instance(instance): -- cgit