def update_execution_status(self, execution_id, status, error): execution = self.get_execution(execution_id) if not self._validate_execution_update(execution.status, status): raise manager_exceptions.InvalidExecutionUpdateStatus( "Invalid relationship - can't change status from {0} to {1}" .format(execution.status, status)) return self.sm.update_execution_status( execution_id, status, error)
def test_bad_update_execution_status(self): execution = self.test_get_execution_by_id() resource_path = '/executions/{0}'.format(execution['id']) expected_error = manager_exceptions.InvalidExecutionUpdateStatus() expected_message = ( 'Invalid relationship - can\'t change status from {0} to {1}' ' for "{2}" execution while running "{3}" workflow.') force_cancelling_invalid_future_statuses = ( ExecutionState.ACTIVE_STATES + [ExecutionState.TERMINATED]) cancelling_invalid_future_statuses = dropwhile( lambda status: status == ExecutionState.CANCELLING, force_cancelling_invalid_future_statuses) invalid_status_map = { ExecutionState.TERMINATED: ExecutionState.STATES, ExecutionState.FAILED: ExecutionState.STATES, ExecutionState.CANCELLED: ExecutionState.STATES, ExecutionState.CANCELLING: cancelling_invalid_future_statuses, ExecutionState.FORCE_CANCELLING: force_cancelling_invalid_future_statuses, } def assert_invalid_update(): self._modify_execution_status_in_database(execution=execution, new_status=last_status) response = self.patch(resource_path, {'status': next_status}) self.assertEqual(expected_error.status_code, response.status_code) self.assertEqual(expected_error.error_code, response.json['error_code']) self.assertEqual( expected_message.format(last_status, next_status, execution['id'], execution['workflow_id']), response.json['message']) for last_status, status_list in invalid_status_map.items(): for next_status in status_list: assert_invalid_update()