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

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

parent 6d8590af
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 #3516 passed
......@@ -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,34 @@ 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"
# 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(request_id, sdm_id)
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,19 @@ 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, request_id: str, sdm_id: str):
"""
Pyramid view that sends a "Do Not Calibrate" message to the Workspaces system
return: 200 (OK) HTTP Response
"""
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):
"""
......
......@@ -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
......@@ -36,6 +40,7 @@ class ArchiveWorkflows(Enum):
CARTA = "carta"
SECI = "vlass_seci"
DO_NOT_CALIBRATE = "do_not_calibrate"
@classmethod
def values(cls):
......
......@@ -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
......@@ -675,6 +678,8 @@ class WorkflowMessageHandler:
else:
status = "Unknown"
logger.info(f">>> message type: {message['type']}")
raise ValueError()
logger.info(
"Updating state on workflow request %s to %s...",
request.workflow_request_id,
......@@ -725,6 +730,25 @@ class WorkflowMessageHandler:
)
self.archive_messenger.send_message(**seci_msg)
def send_do_not_calibrate_message(self, **message: Dict):
"""
Tell the archive to set specified SDM to "Do Not Calibrate".
:param message: message containing key-value pairs
:return:
"""
subject = message["subject"]
wf_id = subject["workflow_request_id"]
sdm_id = subject["fileset_id"]
wf_request = self.info.lookup_workflow_request(wf_id)
if wf_request.workflow_name == ArchiveWorkflows.DO_NOT_CALIBRATE.value:
logger.info(f"SENDING 'DO NOT CALIBRATE' MESSAGE to AAT for request #{wf_id}!")
dnc_msg = ArchiveMessageArchitect(
routing_key="qa-script.fail", request=wf_id, sdm_id=sdm_id
).compose_message("qa_fail")
self.archive_messenger.send_message(**dnc_msg)
def clean_remote_workflow(self, request: WorkflowRequest):
injector = CapoInjector(request)
......
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