diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py b/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py index 2d174984f09ed26989107c2362976a88515470c4..acee34210d383ccdbd59e157bc9966fe624aadb4 100644 --- a/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py +++ b/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py @@ -1,4 +1,6 @@ import logging +import typing + logger = logging.getLogger(__name__) from copy import deepcopy @@ -1733,8 +1735,12 @@ def get_observation_task_specification_with_check_for_calibrator(subtask): return task_spec -def set_subtask_state_following_allowed_transitions(subtask: Subtask, state_value:str) -> Subtask: +def set_subtask_state_following_allowed_transitions(subtask: typing.Union[Subtask, int], state_value:str) -> Subtask: '''helper function to set subtask state following allowed transitions''' + if isinstance(subtask, int): + # the given subtask is an id. Fetch object. + subtask = Subtask.objects.get(id=subtask) + while subtask.state.value != state_value and (subtask.state.value not in (SubtaskState.Choices.FINISHED.value, SubtaskState.Choices.ERROR.value, SubtaskState.Choices.CANCELLED.value)): diff --git a/SAS/TMSS/backend/test/t_observation_strategies_specification_and_scheduling_test.py b/SAS/TMSS/backend/test/t_observation_strategies_specification_and_scheduling_test.py index ea14384ce3551ed12ec5040a1682f76dc52d8561..8988a1739810ed5b38e67bda3ac3acf0b8f422d3 100755 --- a/SAS/TMSS/backend/test/t_observation_strategies_specification_and_scheduling_test.py +++ b/SAS/TMSS/backend/test/t_observation_strategies_specification_and_scheduling_test.py @@ -101,6 +101,9 @@ class TestObservationStrategiesSpecificationAndScheduling(unittest.TestCase): self.assertEqual(False, strtobool(obs_parset.get('Observation.DataProducts.Output_InstrumentModel.enabled','false'))) self.assertEqual(False, strtobool(obs_parset.get('Observation.DataProducts.Output_SkyImage.enabled','false'))) + # import helper method to cycle through allowed state transitions + from lofar.sas.tmss.tmss.tmssapp.subtasks import set_subtask_state_following_allowed_transitions + # setup: create a scheduling unit from the UC1 observation strategy template observing_strategy_templates = self.tmss_client.get_path_as_json_object('scheduling_unit_observing_strategy_template') self.assertGreater(len(observing_strategy_templates), 0) @@ -155,12 +158,12 @@ class TestObservationStrategiesSpecificationAndScheduling(unittest.TestCase): self.assertEqual(244, len(cal_obs1_output_dataproducts)) # "mimic" that the cal_obs1_subtask starts running - self.tmss_client.set_subtask_status(cal_obs1_subtask['id'], 'started') + set_subtask_state_following_allowed_transitions(cal_obs1_subtask['id'], 'started') self.check_statuses(cal_obs1_subtask['id'], "started", "started", "observing") # "mimic" that the cal_obs1_subtask finished (including qa subtasks) for subtask in cal_obs1_task['subtasks']: - self.tmss_client.set_subtask_status(subtask['id'], 'finished') + set_subtask_state_following_allowed_transitions(subtask['id'], 'finished') self.check_statuses(cal_obs1_subtask['id'], "finished", "finished", "observing") @@ -177,12 +180,12 @@ class TestObservationStrategiesSpecificationAndScheduling(unittest.TestCase): self.assertEqual(488, len(target_obs_output_dataproducts)) # "mimic" that the target_obs_subtask starts running - self.tmss_client.set_subtask_status(target_obs_subtask['id'], 'started') + set_subtask_state_following_allowed_transitions(target_obs_subtask['id'], 'started') self.check_statuses(target_obs_subtask['id'], "started", "started", "observing") # "mimic" that the target_obs_subtask finished (including qa subtasks) for subtask in target_obs_task['subtasks']: - self.tmss_client.set_subtask_status(subtask['id'], 'finished') + set_subtask_state_following_allowed_transitions(subtask['id'], 'finished') self.check_statuses(target_obs_subtask['id'], "finished", "finished", "observing") @@ -199,12 +202,12 @@ class TestObservationStrategiesSpecificationAndScheduling(unittest.TestCase): self.assertEqual(244, len(cal_obs2_output_dataproducts)) # "mimic" that the cal_obs2_subtask starts running - self.tmss_client.set_subtask_status(cal_obs2_subtask['id'], 'started') + set_subtask_state_following_allowed_transitions(cal_obs2_subtask['id'], 'started') self.check_statuses(cal_obs2_subtask['id'], "started", "started", "observing") # "mimic" that the cal_obs2_subtask finished (including qa subtasks) for subtask in cal_obs2_task['subtasks']: - self.tmss_client.set_subtask_status(subtask['id'], 'finished') + set_subtask_state_following_allowed_transitions(subtask['id'], 'finished') self.check_statuses(cal_obs2_subtask['id'], "finished", "finished", "observed") @@ -231,11 +234,11 @@ class TestObservationStrategiesSpecificationAndScheduling(unittest.TestCase): self.assertEqual(244, len(cal_pipe1_output_dataproducts)) # "mimic" that the cal_pipe1_subtask starts running - self.tmss_client.set_subtask_status(cal_pipe1_subtask['id'], 'started') + set_subtask_state_following_allowed_transitions(cal_pipe1_subtask['id'], 'started') self.check_statuses(cal_pipe1_subtask['id'], "started", "started", "processing") # "mimic" that the cal_pipe1_subtask finished - self.tmss_client.set_subtask_status(cal_pipe1_subtask['id'], 'finished') + set_subtask_state_following_allowed_transitions(cal_pipe1_subtask['id'], 'finished') self.check_statuses(cal_pipe1_subtask['id'], "finished", "finished", "processing") @@ -253,11 +256,11 @@ class TestObservationStrategiesSpecificationAndScheduling(unittest.TestCase): self.assertEqual(244, len(target_pipe1_output_dataproducts)) # "mimic" that the target_pipe1_subtask starts running - self.tmss_client.set_subtask_status(target_pipe1_subtask['id'], 'started') + set_subtask_state_following_allowed_transitions(target_pipe1_subtask['id'], 'started') self.check_statuses(target_pipe1_subtask['id'], "started", "started", "processing") # "mimic" that the target_pipe1_subtask finished - self.tmss_client.set_subtask_status(target_pipe1_subtask['id'], 'finished') + set_subtask_state_following_allowed_transitions(target_pipe1_subtask['id'], 'finished') self.check_statuses(target_pipe1_subtask['id'], "finished", "finished", "processing") @@ -275,11 +278,11 @@ class TestObservationStrategiesSpecificationAndScheduling(unittest.TestCase): self.assertEqual(244, len(target_pipe2_output_dataproducts)) # "mimic" that the target_pipe2_subtask starts running - self.tmss_client.set_subtask_status(target_pipe2_subtask['id'], 'started') + set_subtask_state_following_allowed_transitions(target_pipe2_subtask['id'], 'started') self.check_statuses(target_pipe2_subtask['id'], "started", "started", "processing") # "mimic" that the target_pipe2_subtask finished - self.tmss_client.set_subtask_status(target_pipe2_subtask['id'], 'finished') + set_subtask_state_following_allowed_transitions(target_pipe2_subtask['id'], 'finished') self.check_statuses(target_pipe2_subtask['id'], "finished", "finished", "processing") @@ -297,11 +300,11 @@ class TestObservationStrategiesSpecificationAndScheduling(unittest.TestCase): self.assertEqual(244, len(cal_pipe2_output_dataproducts)) # "mimic" that the cal_pipe2_subtask starts running - self.tmss_client.set_subtask_status(cal_pipe2_subtask['id'], 'started') + set_subtask_state_following_allowed_transitions(cal_pipe2_subtask['id'], 'started') self.check_statuses(cal_pipe2_subtask['id'], "started", "started", "processing") # "mimic" that the cal_pipe2_subtask finished - self.tmss_client.set_subtask_status(cal_pipe2_subtask['id'], 'finished') + set_subtask_state_following_allowed_transitions(cal_pipe2_subtask['id'], 'finished') self.check_statuses(cal_pipe2_subtask['id'], "finished", "finished", "processed") @@ -331,6 +334,9 @@ class TestObservationStrategiesSpecificationAndScheduling(unittest.TestCase): self.assertEqual(False, strtobool(obs_parset.get('Observation.DataProducts.Output_InstrumentModel.enabled','false'))) self.assertEqual(False, strtobool(obs_parset.get('Observation.DataProducts.Output_SkyImage.enabled','false'))) + # import helper method to cycle through allowed state transitions + from lofar.sas.tmss.tmss.tmssapp.subtasks import set_subtask_state_following_allowed_transitions + # setup: create a scheduling unit from the UC1 observation strategy template observing_strategy_templates = self.tmss_client.get_path_as_json_object('scheduling_unit_observing_strategy_template') self.assertGreater(len(observing_strategy_templates), 0) @@ -379,12 +385,12 @@ class TestObservationStrategiesSpecificationAndScheduling(unittest.TestCase): self.assertEqual(1, len(obs_output_dataproducts)) # "mimic" that the cal_obs1_subtask starts running - self.tmss_client.set_subtask_status(obs_subtask['id'], 'started') + set_subtask_state_following_allowed_transitions(obs_subtask['id'], 'started') self.check_statuses(obs_subtask['id'], "started", "started", "observing") # "mimic" that the cal_obs1_subtask finished (including qa subtasks) for subtask in obs_task['subtasks']: - self.tmss_client.set_subtask_status(subtask['id'], 'finished') + set_subtask_state_following_allowed_transitions(subtask['id'], 'finished') self.check_statuses(obs_subtask['id'], "finished", "finished", "finished")