def emit_script_result_status_transition_event(script_result, old_values, **kwargs): """Send a status transition event.""" [old_status] = old_values if script_result.physical_blockdevice and script_result.interface: script_name = "%s on %s and %s" % ( script_result.name, script_result.physical_blockdevice.name, script_result.interface.name, ) elif script_result.physical_blockdevice: script_name = "%s on %s" % ( script_result.name, script_result.physical_blockdevice.name, ) elif script_result.interface: script_name = "%s on %s" % ( script_result.name, script_result.interface.name, ) else: script_name = script_result.name if (script_result.script_set.result_type == RESULT_TYPE.TESTING and old_status == SCRIPT_STATUS.PENDING and (script_result.status in SCRIPT_STATUS_RUNNING)): Event.objects.create_node_event( script_result.script_set.node, EVENT_TYPES.RUNNING_TEST, event_description=script_name, ) elif script_result.status in SCRIPT_STATUS_FAILED.union( {SCRIPT_STATUS.ABORTED}): Event.objects.create_node_event( script_result.script_set.node, EVENT_TYPES.SCRIPT_DID_NOT_COMPLETE, event_description="%s %s" % ( script_name, SCRIPT_STATUS_CHOICES[script_result.status][1].lower(), ), ) else: old_status_name = None new_status_name = None for status, status_name in SCRIPT_STATUS_CHOICES: if old_status == status: old_status_name = status_name elif script_result.status == status: new_status_name = status_name Event.objects.create_node_event( script_result.script_set.node, EVENT_TYPES.SCRIPT_RESULT_CHANGED_STATUS, event_description="%s changed status from '%s' to '%s'" % (script_name, old_status_name, new_status_name), ) if (CURTIN_INSTALL_LOG == script_result.name and not script_result.script_set.node.netboot): Event.objects.create_node_event(script_result.script_set.node, EVENT_TYPES.REBOOTING)
def test_script_did_not_complete_emits_event(self): script_result = factory.make_ScriptResult( status=SCRIPT_STATUS.RUNNING, script_set=factory.make_ScriptSet(result_type=RESULT_TYPE.TESTING), script=factory.make_Script(), ) script_result.status = random.choice( list(SCRIPT_STATUS_FAILED.union({SCRIPT_STATUS.ABORTED}))) script_result.save() latest_event = Event.objects.last() self.assertEqual( ( EVENT_TYPES.SCRIPT_DID_NOT_COMPLETE, EVENT_DETAILS[EVENT_TYPES.SCRIPT_DID_NOT_COMPLETE].description, "%s %s" % ( script_result.name, SCRIPT_STATUS_CHOICES[script_result.status][1].lower(), ), ), ( latest_event.type.name, latest_event.type.description, latest_event.description, ), )
def dehydrate_hardware_status_tooltip(self, script_results): script_statuses = {} for script_result in script_results: if script_result.status in script_statuses: script_statuses[script_result.status].add(script_result.name) else: script_statuses[script_result.status] = {script_result.name} tooltip = '' for status, scripts in script_statuses.items(): len_scripts = len(scripts) if status in SCRIPT_STATUS_RUNNING_OR_PENDING: verb = 'is' if len_scripts == 1 else 'are' elif status in SCRIPT_STATUS_FAILED.union({SCRIPT_STATUS.PASSED}): verb = 'has' if len_scripts == 1 else 'have' else: # Covers SCRIPT_STATUS.ABORTED, an else is used incase new # statuses are ever added. verb = 'was' if len_scripts == 1 else 'were' if tooltip != '': tooltip += ' ' if len_scripts == 1: tooltip += '1 test ' else: tooltip += '%s tests ' % len_scripts tooltip += '%s %s.' % (verb, SCRIPT_STATUS_CHOICES[status][1].lower()) if tooltip == '': tooltip = 'No tests have been run.' return tooltip
def emit_script_result_status_transition_event(instance, old_values, **kwargs): """Send a status transition event.""" script_result = instance [old_status] = old_values if (script_result.script_set.result_type == RESULT_TYPE.TESTING and old_status == SCRIPT_STATUS.PENDING and (script_result.status in SCRIPT_STATUS_RUNNING)): storage_name = script_result.parameters.get('storage', {}).get('value', {}).get('name') Event.objects.create_node_event( script_result.script_set.node, EVENT_TYPES.RUNNING_TEST, event_description="%s on %s" % (script_result.name, storage_name) if storage_name else script_result.name) elif script_result.status in SCRIPT_STATUS_FAILED.union( {SCRIPT_STATUS.ABORTED}): Event.objects.create_node_event( script_result.script_set.node, EVENT_TYPES.SCRIPT_DID_NOT_COMPLETE, event_description="%s %s" % (script_result.name, SCRIPT_STATUS_CHOICES[script_result.status][1].lower())) else: old_status_name = None new_status_name = None for status, status_name in SCRIPT_STATUS_CHOICES: if old_status == status: old_status_name = status_name elif script_result.status == status: new_status_name = status_name Event.objects.create_node_event( script_result.script_set.node, EVENT_TYPES.SCRIPT_RESULT_CHANGED_STATUS, event_description="%s changed status from '%s' to '%s'" % (script_result.name, old_status_name, new_status_name)) if (CURTIN_INSTALL_LOG == script_result.name and not script_result.script_set.node.netboot): Event.objects.create_node_event(script_result.script_set.node, EVENT_TYPES.REBOOTING)