diff --git a/requirements.txt b/requirements.txt index 7b66147ed058c2a42f68c6daa4803d843b3d9ff7..63ef8fefebe0b5105e49983b26ee38a0248359cd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,3 +30,4 @@ grpcio-tools # Apache 2 parse # MIT mergedeep # MIT getmac # MIT +python-dateutil # remove when on python 3.12 \ No newline at end of file diff --git a/tangostationcontrol/configuration/observation_field_settings.py b/tangostationcontrol/configuration/observation_field_settings.py index 8988fa8c50bedbdf1082e506778921c79021027d..b56ad4264a0a26db6cd18938035a6c214de1e085 100644 --- a/tangostationcontrol/configuration/observation_field_settings.py +++ b/tangostationcontrol/configuration/observation_field_settings.py @@ -3,6 +3,7 @@ from datetime import datetime from typing import Sequence +from dateutil import parser from tangostationcontrol.configuration.configuration_base import _ConfigurationBase from tangostationcontrol.configuration.dithering import Dithering @@ -11,7 +12,6 @@ from tangostationcontrol.configuration.sap import Sap from tangostationcontrol.configuration.sst import SST from tangostationcontrol.configuration.xst import XST - class ObservationFieldSettings(_ConfigurationBase): def __init__( self, @@ -48,7 +48,7 @@ class ObservationFieldSettings(_ConfigurationBase): """Transparently convert datetime to string in isoformat""" if time and not isinstance(time, datetime): try: - datetime.fromisoformat(time) + parser.isoparse(time) except ValueError as ex: raise ex if time and isinstance(time, datetime): diff --git a/tangostationcontrol/rpc/observation.py b/tangostationcontrol/rpc/observation.py index 62d049574f1bd8985bb150b49d375c6625701dd1..c769b43aeb6ccb14d4bf4555677539feece9db24 100644 --- a/tangostationcontrol/rpc/observation.py +++ b/tangostationcontrol/rpc/observation.py @@ -9,6 +9,7 @@ from tangostationcontrol.rpc.common import ( reply_on_exception, ) from tangostationcontrol.common.proxies.proxy import create_device_proxy +from tangostationcontrol.configuration import ObservationSettings logger = logging.getLogger() @@ -21,10 +22,43 @@ class Observation(observation_pb2_grpc.ObservationServicer): def StartObservation( self, request: observation_pb2.StartObservationRequest, context ): + logger.info("Start observation request incomming %s", request.configuration) + # Validate before handing over to Observation Control + + observation_id = "" + # guard against empty jsons incomming + if request.configuration is not None and request.configuration.strip() != "{}" : + observationsettings = ObservationSettings.from_json(request.configuration) + logger.info("Converted ObservationSettings %s", observationsettings) + if observationsettings.antenna_fields: + primary_antenna = observationsettings.antenna_fields[0] + observation_id = primary_antenna.observation_id + logger.info( + "Creating device proxy. ", + extra={ + "observation_id": observation_id, + "start_time": primary_antenna.start_time, + "stop_time": primary_antenna.stop_time, + }, + ) + else: + logger.error( + "No Observation Id found in observation %s", request.configuration + ) + else: + logger.error( + "No Observation configuration found %s", request.configuration + ) + + observation_control = create_device_proxy( "STAT/ObservationControl/1", self.TIMEOUT ) observation_control.add_observation(request.configuration) + logger.info( + "Start observation request added to Add observation.", + extra={"observation_id": observation_id}, + ) return observation_pb2.ObservationReply(success=True) @reply_on_exception(observation_pb2.ObservationReply)