def test_on_job_failed_reading_logs_failed(self, mock_logging, mock_cluster_api): mock_cluster_api.return_value.read_job_logs.side_effect = ApiException(status=404, reason='Logs not found') watcher = JobWatcher(config=Mock()) watcher.get_most_recent_pod_for_job = Mock() watcher.get_most_recent_pod_for_job.return_value = Mock() watcher.lando_client = Mock() watcher.on_job_failed('myjob', '31', JobStepTypes.STAGE_DATA) payload = watcher.lando_client.job_step_error.call_args[0][0] message = watcher.lando_client.job_step_error.call_args[0][1] self.assertEqual(payload.job_id, '31') self.assertEqual(payload.error_command, JobCommands.STAGE_JOB_ERROR) self.assertEqual(message, 'Unable to read logs.') mock_logging.error.assert_called_with('Unable to read logs (404)\nReason: Logs not found\n')
def test_on_job_change_with_complete_job(self, mock_cluster_api): watcher = JobWatcher(config=Mock()) watcher.on_job_succeeded = Mock() watcher.on_job_failed = Mock() job = Mock() job.metadata.name = 'job1' job.metadata.labels = { JobLabels.JOB_ID: '32', JobLabels.STEP_TYPE: JobStepTypes.STAGE_DATA, } job.status.conditions = [Mock(type=JobConditionType.COMPLETE, status="True")] watcher.on_job_change({ 'type': EventTypes.MODIFIED, 'object': job }) watcher.on_job_succeeded.assert_called_with('32', 'stage_data') watcher.on_job_failed.assert_not_called()
def test_on_job_change_missing_labels(self, mock_cluster_api): watcher = JobWatcher(config=Mock()) watcher.on_job_succeeded = Mock() watcher.on_job_failed = Mock() job = Mock() job.metadata.name = 'job1' job.metadata.labels = {} job.status.conditions = [ Mock(type=JobConditionType.COMPLETE, status="True"), Mock(type=JobConditionType.FAILED, status="True"), ] watcher.on_job_change({ 'type': EventTypes.ADDED, 'object': job }) watcher.on_job_succeeded.assert_not_called() watcher.on_job_failed.assert_not_called()
def test_on_job_failed(self, mock_cluster_api): mock_cluster_api.return_value.read_job_logs.return_value = "Error details" watcher = JobWatcher(config=Mock()) watcher.lando_client = Mock() watcher.on_job_failed('myjob', '31', JobStepTypes.STAGE_DATA) mock_cluster_api.return_value.read_job_logs.assert_called_with('myjob') payload = watcher.lando_client.job_step_error.call_args[0][0] message = watcher.lando_client.job_step_error.call_args[0][1] self.assertEqual(payload.job_id, '31') self.assertEqual(payload.error_command, JobCommands.STAGE_JOB_ERROR) self.assertEqual(message, 'Error details') watcher.lando_client.job_step_complete.reset_mock() watcher.on_job_failed('myjob', '31', JobStepTypes.RUN_WORKFLOW) payload = watcher.lando_client.job_step_error.call_args[0][0] message = watcher.lando_client.job_step_error.call_args[0][1] self.assertEqual(payload.job_id, '31') self.assertEqual(payload.error_command, JobCommands.RUN_JOB_ERROR) self.assertEqual(message, 'Error details') watcher.lando_client.job_step_complete.reset_mock() watcher.on_job_failed('myjob', '31', JobStepTypes.ORGANIZE_OUTPUT) payload = watcher.lando_client.job_step_error.call_args[0][0] message = watcher.lando_client.job_step_error.call_args[0][1] self.assertEqual(payload.job_id, '31') self.assertEqual(payload.error_command, JobCommands.ORGANIZE_OUTPUT_ERROR) self.assertEqual(message, 'Error details') watcher.lando_client.job_step_complete.reset_mock() watcher.on_job_failed('myjob', '31', JobStepTypes.SAVE_OUTPUT) payload = watcher.lando_client.job_step_error.call_args[0][0] message = watcher.lando_client.job_step_error.call_args[0][1] self.assertEqual(payload.job_id, '31') self.assertEqual(payload.error_command, JobCommands.STORE_JOB_OUTPUT_ERROR) self.assertEqual(message, 'Error details')
def test_on_job_change_with_ignored_conditions(self, mock_cluster_api): watcher = JobWatcher(config=Mock()) watcher.on_job_succeeded = Mock() watcher.on_job_failed = Mock() job = Mock() job.metadata.name = 'job1' job.metadata.labels = { JobLabels.JOB_ID: '32', JobLabels.STEP_TYPE: JobStepTypes.STAGE_DATA, } job.status.conditions = [ Mock(type=JobConditionType.COMPLETE, status="False"), Mock(type=JobConditionType.FAILED, status="False"), Mock(type="other", status="True"), ] watcher.on_job_change({ 'type': EventTypes.ADDED, 'object': job }) watcher.on_job_succeeded.assert_not_called() watcher.on_job_failed.assert_not_called()