Skip to content
Snippets Groups Projects
Commit 60924f04 authored by Janet Goldstein's avatar Janet Goldstein
Browse files

WS-765: Create REST endpoint for sending 'Do Not Calibrate' message to AAT

parent 228c284f
No related branches found
No related tags found
1 merge request!624WS-765: Create REST endpoint for sending 'Do Not Calibrate' message to AAT
Pipeline #3536 passed
Pipeline: workspaces

#3537

    ......@@ -22,6 +22,8 @@ import shutil
    from pathlib import Path
    from typing import Dict, List
    import requests
    from .interfaces import ConveyorIF
    """
    ......@@ -53,16 +55,16 @@ class RetrievalConveyor(ConveyorIF):
    self.logger.info(f"Directories from {qa_path} have already been retrieved! Continuing...")
    if self.action == "QA Fail Cleanup":
    self.send_qa_fail_msg()
    self.send_qa_fail_msg(self.settings["sdm_ids"])
    def send_qa_fail_msg(self):
    def send_qa_fail_msg(self, sdm_id: str):
    """
    TODO
    Calls REST endpoint that shoots off QA Fail message
    Call REST endpoint that shoots off QA Fail message
    :return:
    """
    print("Ready to send QA Fail message!")
    url = f"/workflows/requests/{self.settings['request_id']}/send-do-not-calibrate/{sdm_id}"
    requests.post(url, json={"sdm_id": sdm_id})
    def break_symlinks(self, spool_path: Path, dir_list: List[str]):
    self.logger.info(f"Breaking symlinks between qa2 and spool for directory {spool_path.stem}...")
    ......
    ......@@ -90,11 +90,15 @@ class TestConveyor:
    :return:
    """
    args.qa_fail = [TEST_JSON]
    with patch("os.chdir"):
    with patch("argparse.ArgumentParser.parse_args", MagicMock(return_value=args)):
    with patch("conveyor.retrieve.RetrievalConveyor.convey") as mock_convey:
    con.main()
    assert mock_convey.call_count == 1
    # reset for other testing
    args.qa_fail = None
    args.fileSetIds = "brain_000.58099.67095825232"
    try:
    with patch("os.chdir"):
    with patch("argparse.ArgumentParser.parse_args", MagicMock(return_value=args)):
    with patch("conveyor.retrieve.RetrievalConveyor.convey") as mock_convey:
    con.main()
    assert mock_convey.call_count == 1
    finally:
    # reset for other testing
    args.qa_fail = None
    args.fileSetIds = None
    ......@@ -21,6 +21,7 @@
    import datetime
    import http
    import logging
    from unittest.mock import MagicMock
    import pytest
    ......@@ -31,6 +32,8 @@ from workspaces.workflow.schema import Workflow, WorkflowRequest
    from workspaces.workflow.services.workflow_info import WorkflowInfo
    from workspaces.workflow.services.workflow_service import WorkflowService
    logger = logging.getLogger(__name__)
    @pytest.fixture
    def workflow() -> Workflow:
    ......@@ -184,6 +187,36 @@ def test_send_carta_url_to_aat(workflow_request_request: DummyRequest):
    workflow_request_request.json_body = body_savepoint
    def test_send_do_not_calibate_msg_to_aat(workflow_request_request: DummyRequest):
    """
    Confirm that "Do Not Calibrate" message is sent to AAT with appropriate parameters
    :param workflow_request_request:
    :return:
    """
    # Init dummy request values
    matchdict_savepoint = workflow_request_request.matchdict
    body_savepoint = workflow_request_request.json_body
    request_id = -1
    workflow_request_request.matchdict["request_id"] = request_id
    sdm_id = "brain_000.58099.67095825232"
    workflow_request_request.json_body["sdm_id"] = sdm_id
    # Mock out WorkflowService method call side effect
    workflow_request_request.workflows.send_do_not_calibrate = MagicMock()
    expected_response = f"SUCCESS for request #{request_id}: Sent 'Do Not Calibrate' for {sdm_id} to AAT"
    try:
    response = WorkflowRequestRestService(workflow_request_request).send_do_not_calibrate()
    workflow_request_request.workflows.send_do_not_calibrate.assert_called_with(request_id, sdm_id)
    assert response.status_code == http.HTTPStatus.OK
    assert response.text == expected_response
    finally:
    # Reset dummy request properties to their initial values
    workflow_request_request.matchdict = matchdict_savepoint
    workflow_request_request.json_body = body_savepoint
    def test_get_request_htcondor_id(workflow_request_request: DummyRequest):
    matchdict_savepoint = workflow_request_request.matchdict
    workflow_request_request.matchdict["request_id"] = -1
    ......
    ......@@ -325,6 +325,21 @@ class WorkflowRequestRestService:
    body=f"SUCCESS: Sent CARTA URL {carta_url} to Workspaces System",
    )
    @view_config(request_method="POST", route_name="send_do_not_calibrate")
    def send_do_not_calibrate(self):
    """
    Pyramid view that sends a "Do Not Calibrate" message to the Workspaces system
    return: 200 (OK) HTTP Response
    """
    request_id = self.request.matchdict["request_id"]
    sdm_id = self.request.json_body["sdm_id"]
    self.request.workflows.send_do_not_calibrate(request_id, sdm_id)
    return Response(
    status_code=http.HTTPStatus.OK,
    body=f"SUCCESS for request #{request_id}: Sent 'Do Not Calibrate' for {sdm_id} to AAT",
    )
    @view_config(request_method="POST", route_name="announce_qa")
    def announce_qa(self):
    """
    ......@@ -557,6 +572,14 @@ def main(global_config, **settings):
    "/workflows/{name}/requests/{request_id}/ingest",
    factory=lookup_request,
    )
    # Use this route to send a Do Not Calibrate message to the AAT system
    config.add_route(
    "send_do_not_calibrate",
    "/workflows/requests/{request_id}/send-do-not-calibrate/{sdm_id}",
    factory=lookup_request,
    )
    # Use this route to send a CARTA envoy URL to the AAT system
    config.add_route(
    "send_carta_url_to_aat",
    ......
    ......@@ -15,6 +15,10 @@
    #
    # You should have received a copy of the GNU General Public License
    # along with Workspaces. If not, see <https://www.gnu.org/licenses/>.
    # pylint: disable=C0116, R0903, W0406
    """ Useful enums for workflows """
    from enum import Enum
    ......
    ......@@ -38,7 +38,10 @@ from requests import Response
    from workspaces.system.services.remote_processing_service import CapoInjector
    from workspaces.workflow.enum import ArchiveWorkflows, WorkflowRequestState
    from workspaces.workflow.message_architect import ArchiveMessageArchitect, WorkflowMessageArchitect
    from workspaces.workflow.message_architect import (
    ArchiveMessageArchitect,
    WorkflowMessageArchitect,
    )
    from workspaces.workflow.schema import Workflow, WorkflowRequest, WorkflowRequestFile
    from workspaces.workflow.services.interfaces import WorkflowInfoIF, WorkflowServiceIF
    ......@@ -220,6 +223,22 @@ class WorkflowService(WorkflowServiceIF):
    carta_url_msg = WorkflowMessageArchitect(request=wf_request, carta_url=carta_url).compose_message("carta_ready")
    self.messenger.send_message(**carta_url_msg)
    def send_do_not_calibrate(self, request_id: int, sdm_id: str):
    """
    Tell the archive to set specified SDM to "Do Not Calibrate".
    :param message: message containing key-value pairs
    :return:
    """
    wf_request = self.info.lookup_workflow_request(request_id)
    if wf_request.workflow_name == ArchiveWorkflows.DO_NOT_CALIBRATE.value:
    logger.info(f"SENDING 'DO NOT CALIBRATE' MESSAGE to AAT for request #{request_id}!")
    dnc_msg = ArchiveMessageArchitect(
    routing_key="qa-script.fail", request=request_id, sdm_id=sdm_id
    ).compose_message("qa_fail")
    self.archive_messenger.send_message(**dnc_msg)
    def execute(self, request: WorkflowRequest):
    """
    Execute a workflow per the supplied parameters.
    ......@@ -672,6 +691,7 @@ class WorkflowMessageHandler:
    self.clean_workflow(request)
    elif message["type"] == "delivery" or message["type"] == "ingestion-complete":
    status = WorkflowRequestState.Complete.name
    else:
    status = "Unknown"
    ......
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment