diff --git a/apps/cli/executables/pexable/casa_envoy/casa_envoy/palaver.py b/apps/cli/executables/pexable/casa_envoy/casa_envoy/palaver.py index 8656a254a7135a42102a0d109ed606f2185d8f82..4ab429d4b92d69ca250b8e5685cdac3660d1b796 100644 --- a/apps/cli/executables/pexable/casa_envoy/casa_envoy/palaver.py +++ b/apps/cli/executables/pexable/casa_envoy/casa_envoy/palaver.py @@ -69,13 +69,13 @@ def arg_parser() -> argparse.ArgumentParser: "--restore", required=False, action="store_true", - help="run the restore measurement set CASA pipeline", + help="run the restore measurement set CASA pipeline, use in conjunction with '-c'", ) parser.add_argument( "--integrated", required=False, action="store_true", - help="run an integrated calibration-imaging pipeline", + help="run an integrated calibration-imaging pipeline, use in conjunction with '-i'", ) return parser diff --git a/apps/cli/utilities/aat_wrest/aat_wrest/metadata_wrester.py b/apps/cli/utilities/aat_wrest/aat_wrest/metadata_wrester.py index b5f82a02b18a7eb6e82276cb4b91ff2cda6654c0..633f44004721b776f92aa9e65d3ab56fee9624db 100644 --- a/apps/cli/utilities/aat_wrest/aat_wrest/metadata_wrester.py +++ b/apps/cli/utilities/aat_wrest/aat_wrest/metadata_wrester.py @@ -7,10 +7,10 @@ import logging import sys import pendulum -import psycopg2 as pg +from typing import List + from aat_wrest.observation_wrester import ObservationWrester from aat_wrest.utilities import PENDULUM_FORMAT, TIME_ZONE, MDDBConnector -from pycapo import CapoConfig logger = logging.getLogger("aat_wrest") logger.setLevel(logging.INFO) @@ -23,7 +23,11 @@ class WrestWorkflowMetadata: """ def __init__( - self, connection: MDDBConnector, spl: str = None, fileset_id: str = None, sdm_id: str = None + self, + connection: MDDBConnector, + spl: List[str] = None, + fileset_id: str = None, + sdm_id: str = None, ): self.logger = logging.getLogger("aat_wrest") self.conn = connection @@ -58,7 +62,7 @@ class WrestWorkflowMetadata: make_json = {} try: cursor = self.conn.cursor() - cursor.execute(sql, {"spl": self.spl}) + cursor.execute(sql, {"spl": self.spl[0]}) data = cursor.fetchall() if data: make_json = json.dumps( @@ -77,7 +81,7 @@ class WrestWorkflowMetadata: else: self.logger.error( f"ERROR: aat-wrest query returned no results!" - f" The database appears to be missing information for SPL {self.spl}!" + f" The database appears to be missing information for SPL {self.spl[0]}!" ) finally: self.conn.close() @@ -130,6 +134,62 @@ class WrestWorkflowMetadata: self.conn.close() return make_json + def wrest_restore_info(self) -> json: + """ + Given an execution block science product locator and calibration science product locator, returns + the required metadata to run the restore CMS workflow + :return: + """ + + eb_sql = f""" + SELECT ngas_fileset_id as filesetId, + e.project_code as projectCode, + p.title as title, + e.starttime as startTime, + (a.firstname || ' ' || a.lastname) as observer, + telescope as telescope + FROM execution_blocks e + JOIN projects p on e.project_code = p.project_code + JOIN authors a on p.project_code = a.project_code + WHERE science_product_locator = %(spl)s AND a.is_pi = true + """ + + cal_sql = f""" + SELECT external_name as calSdmId + from science_products WHERE science_product_locator = %(cal_spl)s + """ + + make_json = {} + try: + cursor = self.conn.cursor() + cursor.execute(eb_sql, {"spl": self.spl[0]}) + data = cursor.fetchall() + cursor.execute(cal_sql, {"cal_spl": self.spl[1]}) + cal_data = cursor.fetchall() + if data and cal_data: + make_json = json.dumps( + { + "sdmId": data[0][0], + "calSdmId": cal_data[0][0], + "projectCode": data[0][1], + "title": data[0][2], + "startTime": data[0][3], + "observer": data[0][4], + "telescope": data[0][5], + "created_at": str( + pendulum.now().in_timezone(TIME_ZONE).format(PENDULUM_FORMAT) + ), + } + ) + else: + self.logger.error( + f"ERROR: aat-wrest query returned no results!" + f" The database appears to be missing information for either SPL {self.spl[0]} or Cal SPL {self.spl[1]}!" + ) + finally: + self.conn.close() + return make_json + def wrest_obs_metadata_from_fileset_id(self, fileset_id: str) -> str: """ Given a fileset_id, query the Metadata DB and return the corresponding science_product_locator @@ -182,6 +242,14 @@ def parser() -> argparse.ArgumentParser: required=False, help="Find workflow metadata for standard CMS imaging with provided SDM id", ) + arg_parser.add_argument( + "-r", + "--restore", + nargs=2, + action="store", + required=False, + help="Find workflow metadata for Restores with provided EB product locator and Cal product locator", + ) arg_parser.add_argument( "-obs", "--observation", @@ -198,6 +266,8 @@ def determine_wrester(connection: MDDBConnector, args: argparse.Namespace): data = WrestWorkflowMetadata(connection, spl=args.stdcals[0]).wrest_standard_cal_info() if args.stdimg: data = WrestWorkflowMetadata(connection, sdm_id=args.stdimg[0]).wrest_standard_image_info() + if args.restore: + data = WrestWorkflowMetadata(connection, spl=args.restore[0]).wrest_restore_info() if args.observation: data = ObservationWrester(connection, spl=args.observation[0]).wrest_observation_info() diff --git a/shared/workspaces/workspaces/workflow/services/workflow_service.py b/shared/workspaces/workspaces/workflow/services/workflow_service.py index 91cbd67a9cd178ea69aecfd45474b458f9e071a7..95e2d1983c888dd6983a85a29cee3ee8e1c475b6 100644 --- a/shared/workspaces/workspaces/workflow/services/workflow_service.py +++ b/shared/workspaces/workspaces/workflow/services/workflow_service.py @@ -235,6 +235,9 @@ class WorkflowService(WorkflowServiceIF): if "calibration" in name: wrest_type = "-sc" argument = wf_request.argument["product_locator"] + elif "restore" in name: + wrest_type = "-r" + argument = [wf_request.argument["product_locator"], wf_request.argument["cal_locator"]] elif "imaging" in name: wrest_type = "-si" argument = wf_request.argument["sdmId"]