def process_failures(failure_ids, host_action, test_action, labels=(), keyvals=None, bugs=(), reason=None, invalidate=False): """ Triage a failure @param failure_id: The failure ID, as returned by get_failures() @param host_action: One of 'Block', 'Unblock', 'Reinstall' @param test_action: One of 'Skip', 'Rerun' @param labels: Test labels to apply, by name @param keyvals: Dictionary of job keyvals to add (or replace) @param bugs: List of bug IDs to associate with this failure @param reason: An override for the test failure reason @param invalidate: True if failure should be invalidated for the purposes of reporting. Defaults to False. """ host_choices = failure_actions.HostAction.values test_choices = failure_actions.TestAction.values if host_action not in host_choices: raise model_logic.ValidationError( {'host_action': ('host action %s not valid; must be one of %s' % (host_action, ', '.join(host_choices)))}) if test_action not in test_choices: raise model_logic.ValidationError( {'test_action': ('test action %s not valid; must be one of %s' % (test_action, ', '.join(test_choices)))}) for failure_id in failure_ids: rpc_utils.process_failure( failure_id=failure_id, host_action=host_action, test_action=test_action, labels=labels, keyvals=keyvals, bugs=bugs, reason=reason, invalidate=invalidate)
def test_process_failure(self): self._setup_active_plan() tko_test = tko_models.Test.objects.create(job=self._tko_job, machine=self._tko_machine, kernel=self._tko_kernel, status=self._running_status) failure = models.TestRun.objects.create( plan=self._plan, test_job=self._planner_job, tko_test=tko_test, host=self._planner_host, status=model_attributes.TestRunStatus.FAILED, finalized=True, seen=False, triaged=False) host_action = failure_actions.HostAction.UNBLOCK test_action = failure_actions.TestAction.SKIP labels = ['label1', 'label2'] keyvals = {'key1': 'value1', 'key2': 'value2'} bugs = ['bug1', 'bug2'] reason = 'overriden reason' invalidate = True self.god.stub_function(rpc_utils, '_process_host_action') self.god.stub_function(rpc_utils, '_process_test_action') rpc_utils._process_host_action.expect_call(self._planner_host, host_action) rpc_utils._process_test_action.expect_call(self._planner_job, test_action) rpc_utils.process_failure( failure_id=failure.id, host_action=host_action, test_action=test_action, labels=labels, keyvals=keyvals, bugs=bugs, reason=reason, invalidate=invalidate) failure = models.TestRun.objects.get(id=failure.id) self.assertEqual( set(failure.tko_test.testlabel_set.all()), set(tko_models.TestLabel.objects.filter(name__in=labels))) self.assertEqual( set(failure.tko_test.job.jobkeyval_set.all()), set(tko_models.JobKeyval.objects.filter( key__in=keyvals.iterkeys()))) self.assertEqual(set(failure.bugs.all()), set(models.Bug.objects.filter(external_uid__in=bugs))) self.assertEqual(failure.tko_test.reason, reason) self.assertEqual(failure.invalidated, invalidate) self.assertTrue(failure.seen) self.assertTrue(failure.triaged) self.god.check_playback()
def process_failures(failure_ids, host_action, test_action, labels=(), keyvals=None, bugs=(), reason=None, invalidate=False): """ Triage a failure @param failure_id: The failure ID, as returned by get_failures() @param host_action: One of 'Block', 'Unblock', 'Reinstall' @param test_action: One of 'Skip', 'Rerun' @param labels: Test labels to apply, by name @param keyvals: Dictionary of job keyvals to add (or replace) @param bugs: List of bug IDs to associate with this failure @param reason: An override for the test failure reason @param invalidate: True if failure should be invalidated for the purposes of reporting. Defaults to False. """ host_choices = failure_actions.HostAction.values test_choices = failure_actions.TestAction.values if host_action not in host_choices: raise model_logic.ValidationError({ 'host_action': ('host action %s not valid; must be one of %s' % (host_action, ', '.join(host_choices))) }) if test_action not in test_choices: raise model_logic.ValidationError({ 'test_action': ('test action %s not valid; must be one of %s' % (test_action, ', '.join(test_choices))) }) for failure_id in failure_ids: rpc_utils.process_failure(failure_id=failure_id, host_action=host_action, test_action=test_action, labels=labels, keyvals=keyvals, bugs=bugs, reason=reason, invalidate=invalidate)