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)
Esempio n. 2
0
    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()