Exemple #1
0
    def test_inquiry(self):
        wf_meta = base.get_wf_fixture_meta_data(TEST_PACK_PATH,
                                                'ask-approval.yaml')
        lv_ac_db = lv_db_models.LiveActionDB(action=wf_meta['name'])
        lv_ac_db, ac_ex_db = action_service.request(lv_ac_db)

        # Assert action execution is running.
        lv_ac_db = lv_db_access.LiveAction.get_by_id(str(lv_ac_db.id))
        self.assertEqual(lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_RUNNING)
        wf_ex_db = wf_db_access.WorkflowExecution.query(
            action_execution=str(ac_ex_db.id))[0]
        self.assertEqual(wf_ex_db.status,
                         action_constants.LIVEACTION_STATUS_RUNNING)

        # Assert start task is already completed.
        query_filters = {
            'workflow_execution': str(wf_ex_db.id),
            'task_id': 'start'
        }
        t1_ex_db = wf_db_access.TaskExecution.query(**query_filters)[0]
        t1_ac_ex_db = ex_db_access.ActionExecution.query(
            task_execution=str(t1_ex_db.id))[0]
        t1_lv_ac_db = lv_db_access.LiveAction.get_by_id(
            t1_ac_ex_db.liveaction['id'])
        self.assertEqual(t1_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        workflows.get_engine().process(t1_ac_ex_db)
        t1_ex_db = wf_db_access.TaskExecution.get_by_id(t1_ex_db.id)
        self.assertEqual(t1_ex_db.status, wf_statuses.SUCCEEDED)

        # Assert the main workflow is still running.
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.RUNNING)

        # Assert get approval task is already pending.
        query_filters = {
            'workflow_execution': str(wf_ex_db.id),
            'task_id': 'get_approval'
        }
        t2_ex_db = wf_db_access.TaskExecution.query(**query_filters)[0]
        t2_ac_ex_db = ex_db_access.ActionExecution.query(
            task_execution=str(t2_ex_db.id))[0]
        t2_lv_ac_db = lv_db_access.LiveAction.get_by_id(
            t2_ac_ex_db.liveaction['id'])
        self.assertEqual(t2_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_PENDING)
        workflows.get_engine().process(t2_ac_ex_db)
        t2_ex_db = wf_db_access.TaskExecution.get_by_id(t2_ex_db.id)
        self.assertEqual(t2_ex_db.status, wf_statuses.PENDING)

        # Assert the main workflow is paused since it has no other active tasks.
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.PAUSED)

        # Respond to the inquiry and check status.
        inquiry_api = inqy_api_models.InquiryAPI.from_model(t2_ac_ex_db)
        inquiry_response = {'approved': True}
        inquiry_service.respond(inquiry_api, inquiry_response)
        t2_lv_ac_db = lv_db_access.LiveAction.get_by_id(str(t2_lv_ac_db.id))
        self.assertEqual(t2_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        t2_ac_ex_db = ex_db_access.ActionExecution.get_by_id(
            str(t2_ac_ex_db.id))
        self.assertEqual(t2_ac_ex_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        workflows.get_engine().process(t2_ac_ex_db)
        t2_ex_db = wf_db_access.TaskExecution.get_by_id(str(t2_ex_db.id))
        self.assertEqual(t2_ex_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)

        # Assert the main workflow is paused since it has no other active tasks.
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.RUNNING)

        # Assert the final task is completed.
        query_filters = {
            'workflow_execution': str(wf_ex_db.id),
            'task_id': 'finish'
        }
        t3_ex_db = wf_db_access.TaskExecution.query(**query_filters)[0]
        t3_ac_ex_db = ex_db_access.ActionExecution.query(
            task_execution=str(t3_ex_db.id))[0]
        t3_lv_ac_db = lv_db_access.LiveAction.get_by_id(
            t3_ac_ex_db.liveaction['id'])
        self.assertEqual(t3_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        workflows.get_engine().process(t3_ac_ex_db)
        t3_ex_db = wf_db_access.TaskExecution.get_by_id(t3_ex_db.id)
        self.assertEqual(t3_ex_db.status, wf_statuses.SUCCEEDED)

        # Assert the main workflow is completed
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.SUCCEEDED)
Exemple #2
0
    def put(self, inquiry_id, response_data, requester_user):
        """Provide response data to an Inquiry

            In general, provided the response data validates against the provided
            schema, and the user has the appropriate permissions to respond,
            this will set the Inquiry execution to a successful status, and resume
            the parent workflow.

            Handles requests:
                PUT /inquiries/<inquiry id>
        """
        LOG.debug("Inquiry %s received response payload: %s" %
                  (inquiry_id, response_data.response))

        # Set requester to system user if not provided.
        if not requester_user:
            requester_user = cfg.CONF.system_user.user

        # Retrieve the inquiry by id.
        try:
            inquiry = self._get_one_by_id(
                id=inquiry_id,
                requester_user=requester_user,
                permission_type=rbac_types.PermissionType.INQUIRY_RESPOND)
        except db_exceptions.StackStormDBObjectNotFoundError as e:
            LOG.exception('Unable to identify inquiry with id "%s".' %
                          inquiry_id)
            api_router.abort(http_client.NOT_FOUND, six.text_type(e))
        except rbac_exceptions.ResourceAccessDeniedError as e:
            LOG.exception('User is denied access to inquiry "%s".' %
                          inquiry_id)
            api_router.abort(http_client.FORBIDDEN, six.text_type(e))
        except Exception as e:
            LOG.exception('Unable to get record for inquiry "%s".' %
                          inquiry_id)
            api_router.abort(http_client.INTERNAL_SERVER_ERROR,
                             six.text_type(e))

        # Check if inquiry can still be respond to.
        try:
            inquiry_service.check_inquiry(inquiry)
        except Exception as e:
            LOG.exception('Fail checking validity of inquiry "%s".' %
                          inquiry_id)
            api_router.abort(http_client.BAD_REQUEST, six.text_type(e))

        # Check if user has permission to respond to this inquiry.
        try:
            inquiry_service.check_permission(inquiry, requester_user)
        except Exception as e:
            LOG.exception('Fail checking permission for inquiry "%s".' %
                          inquiry_id)
            api_router.abort(http_client.FORBIDDEN, six.text_type(e))

        # Validate the body of the response against the schema parameter for this inquiry.
        try:
            inquiry_service.validate_response(inquiry, response_data.response)
        except Exception as e:
            LOG.exception('Fail checking response for inquiry "%s".' %
                          inquiry_id)
            api_router.abort(http_client.BAD_REQUEST, six.text_type(e))

        # Respond to inquiry and update if there is a partial response.
        try:
            inquiry_service.respond(inquiry,
                                    response_data.response,
                                    requester=requester_user)
        except Exception as e:
            LOG.exception('Fail to update response for inquiry "%s".' %
                          inquiry_id)
            api_router.abort(http_client.INTERNAL_SERVER_ERROR,
                             six.text_type(e))

        return {'id': inquiry_id, 'response': response_data.response}
Exemple #3
0
    def put(self, inquiry_id, response_data, requester_user):
        """Provide response data to an Inquiry

            In general, provided the response data validates against the provided
            schema, and the user has the appropriate permissions to respond,
            this will set the Inquiry execution to a successful status, and resume
            the parent workflow.

            Handles requests:
                PUT /inquiries/<inquiry id>
        """
        LOG.debug("Inquiry %s received response payload: %s" % (inquiry_id, response_data.response))

        # Set requester to system user if not provided.
        if not requester_user:
            requester_user = cfg.CONF.system_user.user

        # Retrieve the inquiry by id.
        try:
            inquiry = self._get_one_by_id(
                id=inquiry_id,
                requester_user=requester_user,
                permission_type=rbac_types.PermissionType.INQUIRY_RESPOND
            )
        except db_exceptions.StackStormDBObjectNotFoundError as e:
            LOG.exception('Unable to identify inquiry with id "%s".' % inquiry_id)
            api_router.abort(http_client.NOT_FOUND, six.text_type(e))
        except rbac_exceptions.ResourceAccessDeniedError as e:
            LOG.exception('User is denied access to inquiry "%s".' % inquiry_id)
            api_router.abort(http_client.FORBIDDEN, six.text_type(e))
        except Exception as e:
            LOG.exception('Unable to get record for inquiry "%s".' % inquiry_id)
            api_router.abort(http_client.INTERNAL_SERVER_ERROR, six.text_type(e))

        # Check if inquiry can still be respond to.
        try:
            inquiry_service.check_inquiry(inquiry)
        except Exception as e:
            LOG.exception('Fail checking validity of inquiry "%s".' % inquiry_id)
            api_router.abort(http_client.BAD_REQUEST, six.text_type(e))

        # Check if user has permission to respond to this inquiry.
        try:
            inquiry_service.check_permission(inquiry, requester_user)
        except Exception as e:
            LOG.exception('Fail checking permission for inquiry "%s".' % inquiry_id)
            api_router.abort(http_client.FORBIDDEN, six.text_type(e))

        # Validate the body of the response against the schema parameter for this inquiry.
        try:
            inquiry_service.validate_response(inquiry, response_data.response)
        except Exception as e:
            LOG.exception('Fail checking response for inquiry "%s".' % inquiry_id)
            api_router.abort(http_client.BAD_REQUEST, six.text_type(e))

        # Respond to inquiry and update if there is a partial response.
        try:
            inquiry_service.respond(inquiry, response_data.response, requester=requester_user)
        except Exception as e:
            LOG.exception('Fail to update response for inquiry "%s".' % inquiry_id)
            api_router.abort(http_client.INTERNAL_SERVER_ERROR, six.text_type(e))

        return {
            'id': inquiry_id,
            'response': response_data.response
        }
Exemple #4
0
    def test_inquiry(self):
        wf_meta = base.get_wf_fixture_meta_data(TEST_PACK_PATH, 'ask-approval.yaml')
        lv_ac_db = lv_db_models.LiveActionDB(action=wf_meta['name'])
        lv_ac_db, ac_ex_db = action_service.request(lv_ac_db)

        # Assert action execution is running.
        lv_ac_db = lv_db_access.LiveAction.get_by_id(str(lv_ac_db.id))
        self.assertEqual(lv_ac_db.status, action_constants.LIVEACTION_STATUS_RUNNING)
        wf_ex_db = wf_db_access.WorkflowExecution.query(action_execution=str(ac_ex_db.id))[0]
        self.assertEqual(wf_ex_db.status, action_constants.LIVEACTION_STATUS_RUNNING)

        # Assert start task is already completed.
        query_filters = {'workflow_execution': str(wf_ex_db.id), 'task_id': 'start'}
        t1_ex_db = wf_db_access.TaskExecution.query(**query_filters)[0]
        t1_ac_ex_db = ex_db_access.ActionExecution.query(task_execution=str(t1_ex_db.id))[0]
        t1_lv_ac_db = lv_db_access.LiveAction.get_by_id(t1_ac_ex_db.liveaction['id'])
        self.assertEqual(t1_lv_ac_db.status, action_constants.LIVEACTION_STATUS_SUCCEEDED)
        workflows.get_engine().process(t1_ac_ex_db)
        t1_ex_db = wf_db_access.TaskExecution.get_by_id(t1_ex_db.id)
        self.assertEqual(t1_ex_db.status, wf_statuses.SUCCEEDED)

        # Assert the main workflow is still running.
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.RUNNING)

        # Assert get approval task is already pending.
        query_filters = {'workflow_execution': str(wf_ex_db.id), 'task_id': 'get_approval'}
        t2_ex_db = wf_db_access.TaskExecution.query(**query_filters)[0]
        t2_ac_ex_db = ex_db_access.ActionExecution.query(task_execution=str(t2_ex_db.id))[0]
        t2_lv_ac_db = lv_db_access.LiveAction.get_by_id(t2_ac_ex_db.liveaction['id'])
        self.assertEqual(t2_lv_ac_db.status, action_constants.LIVEACTION_STATUS_PENDING)
        workflows.get_engine().process(t2_ac_ex_db)
        t2_ex_db = wf_db_access.TaskExecution.get_by_id(t2_ex_db.id)
        self.assertEqual(t2_ex_db.status, wf_statuses.PENDING)

        # Assert the main workflow is paused since it has no other active tasks.
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.PAUSED)

        # Respond to the inquiry and check status.
        inquiry_api = inqy_api_models.InquiryAPI.from_model(t2_ac_ex_db)
        inquiry_response = {'approved': True}
        inquiry_service.respond(inquiry_api, inquiry_response)
        t2_lv_ac_db = lv_db_access.LiveAction.get_by_id(str(t2_lv_ac_db.id))
        self.assertEqual(t2_lv_ac_db.status, action_constants.LIVEACTION_STATUS_SUCCEEDED)
        t2_ac_ex_db = ex_db_access.ActionExecution.get_by_id(str(t2_ac_ex_db.id))
        self.assertEqual(t2_ac_ex_db.status, action_constants.LIVEACTION_STATUS_SUCCEEDED)
        workflows.get_engine().process(t2_ac_ex_db)
        t2_ex_db = wf_db_access.TaskExecution.get_by_id(str(t2_ex_db.id))
        self.assertEqual(t2_ex_db.status, action_constants.LIVEACTION_STATUS_SUCCEEDED)

        # Assert the main workflow is paused since it has no other active tasks.
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.RUNNING)

        # Assert the final task is completed.
        query_filters = {'workflow_execution': str(wf_ex_db.id), 'task_id': 'finish'}
        t3_ex_db = wf_db_access.TaskExecution.query(**query_filters)[0]
        t3_ac_ex_db = ex_db_access.ActionExecution.query(task_execution=str(t3_ex_db.id))[0]
        t3_lv_ac_db = lv_db_access.LiveAction.get_by_id(t3_ac_ex_db.liveaction['id'])
        self.assertEqual(t3_lv_ac_db.status, action_constants.LIVEACTION_STATUS_SUCCEEDED)
        workflows.get_engine().process(t3_ac_ex_db)
        t3_ex_db = wf_db_access.TaskExecution.get_by_id(t3_ex_db.id)
        self.assertEqual(t3_ex_db.status, wf_statuses.SUCCEEDED)

        # Assert the main workflow is completed
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.SUCCEEDED)
Exemple #5
0
    def test_nested_inquiry(self):
        wf_meta = base.get_wf_fixture_meta_data(TEST_PACK_PATH,
                                                "ask-nested-approval.yaml")
        lv_ac_db = lv_db_models.LiveActionDB(action=wf_meta["name"])
        lv_ac_db, ac_ex_db = action_service.request(lv_ac_db)

        # Assert action execution is running.
        lv_ac_db = lv_db_access.LiveAction.get_by_id(str(lv_ac_db.id))
        self.assertEqual(lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_RUNNING)
        wf_ex_db = wf_db_access.WorkflowExecution.query(
            action_execution=str(ac_ex_db.id))[0]
        self.assertEqual(wf_ex_db.status,
                         action_constants.LIVEACTION_STATUS_RUNNING)

        # Assert start task is already completed.
        query_filters = {
            "workflow_execution": str(wf_ex_db.id),
            "task_id": "start"
        }
        t1_ex_db = wf_db_access.TaskExecution.query(**query_filters)[0]
        t1_ac_ex_db = ex_db_access.ActionExecution.query(
            task_execution=str(t1_ex_db.id))[0]
        t1_lv_ac_db = lv_db_access.LiveAction.get_by_id(
            t1_ac_ex_db.liveaction["id"])
        self.assertEqual(t1_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        workflows.get_engine().process(t1_ac_ex_db)
        t1_ex_db = wf_db_access.TaskExecution.get_by_id(t1_ex_db.id)
        self.assertEqual(t1_ex_db.status, wf_statuses.SUCCEEDED)

        # Assert the main workflow is still running.
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.RUNNING)

        # Assert the subworkflow is already started.
        query_filters = {
            "workflow_execution": str(wf_ex_db.id),
            "task_id": "get_approval",
        }
        t2_ex_db = wf_db_access.TaskExecution.query(**query_filters)[0]
        t2_ac_ex_db = ex_db_access.ActionExecution.query(
            task_execution=str(t2_ex_db.id))[0]
        t2_lv_ac_db = lv_db_access.LiveAction.get_by_id(
            t2_ac_ex_db.liveaction["id"])
        self.assertEqual(t2_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_RUNNING)
        workflows.get_engine().process(t2_ac_ex_db)
        t2_ex_db = wf_db_access.TaskExecution.get_by_id(t2_ex_db.id)
        self.assertEqual(t2_ex_db.status, wf_statuses.RUNNING)
        t2_wf_ex_db = wf_db_access.WorkflowExecution.query(
            action_execution=str(t2_ac_ex_db.id))[0]
        self.assertEqual(t2_wf_ex_db.status, wf_statuses.RUNNING)

        # Process task1 of subworkflow.
        query_filters = {
            "workflow_execution": str(t2_wf_ex_db.id),
            "task_id": "start"
        }
        t2_t1_ex_db = wf_db_access.TaskExecution.query(**query_filters)[0]
        t2_t1_ac_ex_db = ex_db_access.ActionExecution.query(
            task_execution=str(t2_t1_ex_db.id))[0]
        t2_t1_lv_ac_db = lv_db_access.LiveAction.get_by_id(
            t2_t1_ac_ex_db.liveaction["id"])
        self.assertEqual(t2_t1_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        workflows.get_engine().process(t2_t1_ac_ex_db)
        t2_t1_ex_db = wf_db_access.TaskExecution.get_by_id(t2_t1_ex_db.id)
        self.assertEqual(t2_t1_ex_db.status, wf_statuses.SUCCEEDED)
        t2_wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(
            str(t2_wf_ex_db.id))
        self.assertEqual(t2_wf_ex_db.status, wf_statuses.RUNNING)

        # Process inquiry task of subworkflow and assert the subworkflow is paused.
        query_filters = {
            "workflow_execution": str(t2_wf_ex_db.id),
            "task_id": "get_approval",
        }
        t2_t2_ex_db = wf_db_access.TaskExecution.query(**query_filters)[0]
        t2_t2_ac_ex_db = ex_db_access.ActionExecution.query(
            task_execution=str(t2_t2_ex_db.id))[0]
        t2_t2_lv_ac_db = lv_db_access.LiveAction.get_by_id(
            t2_t2_ac_ex_db.liveaction["id"])
        self.assertEqual(t2_t2_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_PENDING)
        workflows.get_engine().process(t2_t2_ac_ex_db)
        t2_t2_ex_db = wf_db_access.TaskExecution.get_by_id(t2_t2_ex_db.id)
        self.assertEqual(t2_t2_ex_db.status, wf_statuses.PENDING)
        t2_wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(
            str(t2_wf_ex_db.id))
        self.assertEqual(t2_wf_ex_db.status, wf_statuses.PAUSED)

        # Process the corresponding task in parent workflow and assert the task is paused.
        t2_ac_ex_db = ex_db_access.ActionExecution.query(
            task_execution=str(t2_ex_db.id))[0]
        t2_lv_ac_db = lv_db_access.LiveAction.get_by_id(
            t2_ac_ex_db.liveaction["id"])
        self.assertEqual(t2_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_PAUSED)
        workflows.get_engine().process(t2_ac_ex_db)
        t2_ex_db = wf_db_access.TaskExecution.get_by_id(t2_ex_db.id)
        self.assertEqual(t2_ex_db.status, wf_statuses.PAUSED)

        # Assert the main workflow is paused.
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.PAUSED)

        # Respond to the inquiry and check status.
        inquiry_api = inqy_api_models.InquiryAPI.from_model(t2_t2_ac_ex_db)
        inquiry_response = {"approved": True}
        inquiry_service.respond(inquiry_api, inquiry_response)
        t2_t2_lv_ac_db = lv_db_access.LiveAction.get_by_id(
            str(t2_t2_lv_ac_db.id))
        self.assertEqual(t2_t2_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        t2_t2_ac_ex_db = ex_db_access.ActionExecution.get_by_id(
            str(t2_t2_ac_ex_db.id))
        self.assertEqual(t2_t2_ac_ex_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        workflows.get_engine().process(t2_t2_ac_ex_db)
        t2_t2_ex_db = wf_db_access.TaskExecution.get_by_id(str(t2_t2_ex_db.id))
        self.assertEqual(t2_t2_ex_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)

        # Assert the main workflow is running again.
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.RUNNING)

        # Complete the rest of the subworkflow
        query_filters = {
            "workflow_execution": str(t2_wf_ex_db.id),
            "task_id": "finish"
        }
        t2_t3_ex_db = wf_db_access.TaskExecution.query(**query_filters)[0]
        t2_t3_ac_ex_db = ex_db_access.ActionExecution.query(
            task_execution=str(t2_t3_ex_db.id))[0]
        t2_t3_lv_ac_db = lv_db_access.LiveAction.get_by_id(
            t2_t3_ac_ex_db.liveaction["id"])
        self.assertEqual(t2_t3_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        workflows.get_engine().process(t2_t3_ac_ex_db)
        t2_t3_ex_db = wf_db_access.TaskExecution.get_by_id(t2_t3_ex_db.id)
        self.assertEqual(t2_t3_ex_db.status, wf_statuses.SUCCEEDED)
        t2_wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(
            str(t2_wf_ex_db.id))
        self.assertEqual(t2_wf_ex_db.status, wf_statuses.SUCCEEDED)
        t2_ac_ex_db = ex_db_access.ActionExecution.query(
            task_execution=str(t2_ex_db.id))[0]
        t2_lv_ac_db = lv_db_access.LiveAction.get_by_id(
            t2_ac_ex_db.liveaction["id"])
        self.assertEqual(t2_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        workflows.get_engine().process(t2_ac_ex_db)
        t2_ex_db = wf_db_access.TaskExecution.get_by_id(t2_ex_db.id)
        self.assertEqual(t2_ex_db.status, wf_statuses.SUCCEEDED)
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.RUNNING)

        # Complete the rest of the main workflow
        query_filters = {
            "workflow_execution": str(wf_ex_db.id),
            "task_id": "finish"
        }
        t3_ex_db = wf_db_access.TaskExecution.query(**query_filters)[0]
        t3_ac_ex_db = ex_db_access.ActionExecution.query(
            task_execution=str(t3_ex_db.id))[0]
        t3_lv_ac_db = lv_db_access.LiveAction.get_by_id(
            t3_ac_ex_db.liveaction["id"])
        self.assertEqual(t3_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        workflows.get_engine().process(t3_ac_ex_db)
        t3_ex_db = wf_db_access.TaskExecution.get_by_id(t3_ex_db.id)
        self.assertEqual(t3_ex_db.status, wf_statuses.SUCCEEDED)
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.SUCCEEDED)
Exemple #6
0
    def test_parallel_inquiries(self):
        wf_meta = base.get_wf_fixture_meta_data(TEST_PACK_PATH,
                                                "ask-parallel-approvals.yaml")
        lv_ac_db = lv_db_models.LiveActionDB(action=wf_meta["name"])
        lv_ac_db, ac_ex_db = action_service.request(lv_ac_db)

        # Assert action execution is running.
        lv_ac_db = lv_db_access.LiveAction.get_by_id(str(lv_ac_db.id))
        self.assertEqual(lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_RUNNING)
        wf_ex_db = wf_db_access.WorkflowExecution.query(
            action_execution=str(ac_ex_db.id))[0]
        self.assertEqual(wf_ex_db.status,
                         action_constants.LIVEACTION_STATUS_RUNNING)

        # Assert start task is already completed.
        query_filters = {
            "workflow_execution": str(wf_ex_db.id),
            "task_id": "start"
        }
        t1_ex_db = wf_db_access.TaskExecution.query(**query_filters)[0]
        t1_ac_ex_db = ex_db_access.ActionExecution.query(
            task_execution=str(t1_ex_db.id))[0]
        t1_lv_ac_db = lv_db_access.LiveAction.get_by_id(
            t1_ac_ex_db.liveaction["id"])
        self.assertEqual(t1_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        workflows.get_engine().process(t1_ac_ex_db)
        t1_ex_db = wf_db_access.TaskExecution.get_by_id(t1_ex_db.id)
        self.assertEqual(t1_ex_db.status, wf_statuses.SUCCEEDED)

        # Assert the main workflow is still running.
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.RUNNING)

        # Assert get approval task is already pending.
        query_filters = {
            "workflow_execution": str(wf_ex_db.id),
            "task_id": "ask_jack"
        }
        t2_ex_db = wf_db_access.TaskExecution.query(**query_filters)[0]
        t2_ac_ex_db = ex_db_access.ActionExecution.query(
            task_execution=str(t2_ex_db.id))[0]
        t2_lv_ac_db = lv_db_access.LiveAction.get_by_id(
            t2_ac_ex_db.liveaction["id"])
        self.assertEqual(t2_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_PENDING)
        workflows.get_engine().process(t2_ac_ex_db)
        t2_ex_db = wf_db_access.TaskExecution.get_by_id(t2_ex_db.id)
        self.assertEqual(t2_ex_db.status, wf_statuses.PENDING)

        # Assert the main workflow is paused since it has no other active tasks.
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.PAUSING)

        # Assert get approval task is already pending.
        query_filters = {
            "workflow_execution": str(wf_ex_db.id),
            "task_id": "ask_jill"
        }
        t3_ex_db = wf_db_access.TaskExecution.query(**query_filters)[0]
        t3_ac_ex_db = ex_db_access.ActionExecution.query(
            task_execution=str(t3_ex_db.id))[0]
        t3_lv_ac_db = lv_db_access.LiveAction.get_by_id(
            t3_ac_ex_db.liveaction["id"])
        self.assertEqual(t3_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_PENDING)
        workflows.get_engine().process(t3_ac_ex_db)
        t3_ex_db = wf_db_access.TaskExecution.get_by_id(t3_ex_db.id)
        self.assertEqual(t3_ex_db.status, wf_statuses.PENDING)

        # Assert the main workflow is paused since it has no other active tasks.
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.PAUSED)

        # Respond to the inquiry and check status.
        inquiry_api = inqy_api_models.InquiryAPI.from_model(t2_ac_ex_db)
        inquiry_response = {"approved": True}
        inquiry_service.respond(inquiry_api, inquiry_response)
        t2_lv_ac_db = lv_db_access.LiveAction.get_by_id(str(t2_lv_ac_db.id))
        self.assertEqual(t2_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        t2_ac_ex_db = ex_db_access.ActionExecution.get_by_id(
            str(t2_ac_ex_db.id))
        self.assertEqual(t2_ac_ex_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        workflows.get_engine().process(t2_ac_ex_db)
        t2_ex_db = wf_db_access.TaskExecution.get_by_id(str(t2_ex_db.id))
        self.assertEqual(t2_ex_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)

        # Assert the main workflow is paused because we are still waiting for
        # the other pending task and there are no other active tasks.
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.PAUSED)

        # Respond to the inquiry and check status.
        inquiry_api = inqy_api_models.InquiryAPI.from_model(t3_ac_ex_db)
        inquiry_response = {"approved": True}
        inquiry_service.respond(inquiry_api, inquiry_response)
        t3_lv_ac_db = lv_db_access.LiveAction.get_by_id(str(t3_lv_ac_db.id))
        self.assertEqual(t3_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        t3_ac_ex_db = ex_db_access.ActionExecution.get_by_id(
            str(t3_ac_ex_db.id))
        self.assertEqual(t3_ac_ex_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        workflows.get_engine().process(t3_ac_ex_db)
        t3_ex_db = wf_db_access.TaskExecution.get_by_id(str(t3_ex_db.id))
        self.assertEqual(t3_ex_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)

        # Assert the main workflow resumed running.
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.RUNNING)

        # Assert the final task is completed.
        query_filters = {
            "workflow_execution": str(wf_ex_db.id),
            "task_id": "finish"
        }
        t4_ex_db = wf_db_access.TaskExecution.query(**query_filters)[0]
        t4_ac_ex_db = ex_db_access.ActionExecution.query(
            task_execution=str(t4_ex_db.id))[0]
        t4_lv_ac_db = lv_db_access.LiveAction.get_by_id(
            t4_ac_ex_db.liveaction["id"])
        self.assertEqual(t4_lv_ac_db.status,
                         action_constants.LIVEACTION_STATUS_SUCCEEDED)
        workflows.get_engine().process(t4_ac_ex_db)
        t4_ex_db = wf_db_access.TaskExecution.get_by_id(t4_ex_db.id)
        self.assertEqual(t4_ex_db.status, wf_statuses.SUCCEEDED)

        # Assert the main workflow is completed
        wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_db.id)
        self.assertEqual(wf_ex_db.status, wf_statuses.SUCCEEDED)