From eea7a5fbbd513eeaac06239bb7ce5f754e4a668c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B6rn=20K=C3=BCnsem=C3=B6ller?=
 <jkuensem@physik.uni-bielefeld.de>
Date: Mon, 8 Mar 2021 20:02:07 +0100
Subject: [PATCH] TMSS-568: Fix task blueprint references on outputs in
 existing tests

---
 SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py | 14 +++++-----
 SAS/TMSS/backend/test/t_scheduling.py         | 27 ++++++++++++-------
 2 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py b/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py
index 71b949d0c02..ba3e07841b8 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py
@@ -299,7 +299,6 @@ def create_observation_control_subtask_from_task_blueprint(task_blueprint: TaskB
     # an observation has no input, it just produces output data
     subtask_output = SubtaskOutput.objects.create(subtask=subtask,
                                                   task_blueprint=task_blueprint)
-    logger.warning("######## created subtaskoutput id=%s for tb=%s" % (subtask_output.id, task_blueprint.name))
 
     # step 3: set state to DEFINED, unless we have a target obs with a related parallel calibrator obs
     defined = True
@@ -1028,20 +1027,21 @@ def schedule_observation_subtask(observation_subtask: Subtask):
 
     # select correct output for each pointing based on name
     subtask_output_dict = {}
+
     for task_blueprint in observation_subtask.task_blueprints.all():
         output = observation_subtask.outputs.filter(task_blueprint=task_blueprint).first()
-        logger.warning('########### tb=%s | output=%s' % (task_blueprint.name, output))
         if not output:
-            # todo: Do not fall back. But why don't outputs alsways match the task blueprints
-            output = observation_subtask.outputs.first()
-            #raise Exception('####### %s | %s' % (observation_subtask.task_blueprints.all(), [out.task_blueprint for out in observation_subtask.outputs.all()]))
+            raise SubtaskSchedulingException('Cannot schedule subtask id=%s because it is missing the output for '
+                                             'task_blueprint id=%s (subtask has associated task_blueprints=%s, but '
+                                             'has outputs for task_blueprint=%s' % (observation_subtask.id,
+                                                                                   task_blueprint.id,
+                                                                                   [(tb.id, tb.specifications_template.type) for tb in observation_subtask.task_blueprints.all()],
+                                                                                   [(out.task_blueprint.id, out.task_blueprint.specifications_template.type) for out in observation_subtask.outputs.all()]))
         if 'SAPs' in task_blueprint.specifications_doc:  # target
             for sap in task_blueprint.specifications_doc['SAPs']:
-                logger.warning('########### tb=%s | output=%s | pointing=%s' % (task_blueprint.name, output, sap['name']))
                 subtask_output_dict[sap['name']] = output
         if 'pointing' in task_blueprint.specifications_doc:  # calibrator
             subtask_output_dict[task_blueprint.specifications_doc['name']] = output
-            logger.warning('########### tb=%s | output=%s | pointing=%s' % (task_blueprint.name, output, task_blueprint.specifications_doc['name']))
 
     for sap_nr, pointing in enumerate(specifications_doc['stations']['digital_pointings']):
         if pointing['name'] in subtask_output_dict:
diff --git a/SAS/TMSS/backend/test/t_scheduling.py b/SAS/TMSS/backend/test/t_scheduling.py
index 99c3555396c..ebc846edc6c 100755
--- a/SAS/TMSS/backend/test/t_scheduling.py
+++ b/SAS/TMSS/backend/test/t_scheduling.py
@@ -129,7 +129,8 @@ class SchedulingTest(unittest.TestCase):
                                                      task_blueprint_urls=[task_blueprint['url']])
             subtask = test_data_creator.post_data_and_get_response_as_json_object(subtask_data, '/subtask/')
             subtask_id = subtask['id']
-            test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=subtask['url']), '/subtask_output/')
+            test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=subtask['url'],
+                                                                                    task_blueprint_url=task_blueprint['url']), '/subtask_output/')
 
             client.set_subtask_status(subtask_id, 'defined')
             subtask = client.schedule_subtask(subtask_id)
@@ -160,7 +161,8 @@ class SchedulingTest(unittest.TestCase):
                                                      task_blueprint_urls=[task_blueprint['url']])
             subtask = test_data_creator.post_data_and_get_response_as_json_object(subtask_data, '/subtask/')
             subtask_id = subtask['id']
-            test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=subtask['url']), '/subtask_output/')
+            test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=subtask['url'],
+                                                                                    task_blueprint_url=task_blueprint['url']), '/subtask_output/')
 
             client.set_subtask_status(subtask_id, 'defined')
 
@@ -197,7 +199,8 @@ class SchedulingTest(unittest.TestCase):
                                                      task_blueprint_urls=[task_blueprint['url']])
             subtask = test_data_creator.post_data_and_get_response_as_json_object(subtask_data, '/subtask/')
             subtask_id = subtask['id']
-            test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=subtask['url']), '/subtask_output/')
+            test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=subtask['url'],
+                                                                                    task_blueprint_url=task_blueprint['url']), '/subtask_output/')
 
             client.set_subtask_status(subtask_id, 'defined')
 
@@ -233,7 +236,8 @@ class SchedulingTest(unittest.TestCase):
                                                      task_blueprint_urls=[task_blueprint['url']])
             subtask = test_data_creator.post_data_and_get_response_as_json_object(subtask_data, '/subtask/')
             subtask_id = subtask['id']
-            test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=subtask['url']),
+            test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=subtask['url'],
+                                                                                    task_blueprint_url=task_blueprint['url']),
                                                     '/subtask_output/')
 
             client.set_subtask_status(subtask_id, 'defined')
@@ -258,7 +262,8 @@ class SchedulingTest(unittest.TestCase):
                                                          cluster_url=cluster_url,
                                                          task_blueprint_urls=[obs_task_blueprint['url']])
             obs_subtask = test_data_creator.post_data_and_get_response_as_json_object(obs_subtask_data, '/subtask/')
-            obs_subtask_output_url = test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=obs_subtask['url']), '/subtask_output/')
+            obs_subtask_output_url = test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=obs_subtask['url'],
+                                                                                                             task_blueprint_url=obs_task_blueprint['url']), '/subtask_output/')
             test_data_creator.post_data_and_get_url(test_data_creator.Dataproduct(filename="L%s_SB000.MS"%obs_subtask['id'],
                                                                                   subtask_output_url=obs_subtask_output_url), '/dataproduct/')
 
@@ -277,7 +282,8 @@ class SchedulingTest(unittest.TestCase):
 
             # ...and connect it to the observation
             test_data_creator.post_data_and_get_url(test_data_creator.SubtaskInput(subtask_url=pipe_subtask['url'], subtask_output_url=obs_subtask_output_url), '/subtask_input/')
-            test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=pipe_subtask['url']), '/subtask_output/')
+            test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=pipe_subtask['url'],
+                                                                                    task_blueprint_url=pipe_task_blueprint['url']), '/subtask_output/')
 
             for predecessor in client.get_subtask_predecessors(pipe_subtask['id']):
                 client.set_subtask_status(predecessor['id'], 'finished')
@@ -302,7 +308,8 @@ class SchedulingTest(unittest.TestCase):
                                                          cluster_url=cluster_url,
                                                          task_blueprint_urls=[test_data_creator.post_data_and_get_url(test_data_creator.TaskBlueprint(), '/task_blueprint/')])
             obs_subtask = test_data_creator.post_data_and_get_response_as_json_object(obs_subtask_data, '/subtask/')
-            obs_subtask_output_url = test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=obs_subtask['url']), '/subtask_output/')
+            obs_subtask_output_url = test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=obs_subtask['url'],
+                                                                                                             task_blueprint_url=obs_subtask['task_blueprints'][0]), '/subtask_output/')
             test_data_creator.post_data_and_get_url(test_data_creator.Dataproduct(filename="L%s_SB000.MS"%obs_subtask['id'],
                                                     subtask_output_url=obs_subtask_output_url), '/dataproduct/')
 
@@ -318,7 +325,8 @@ class SchedulingTest(unittest.TestCase):
 
             # ...and connect it to the observation
             test_data_creator.post_data_and_get_url(test_data_creator.SubtaskInput(subtask_url=ingest_subtask['url'], subtask_output_url=obs_subtask_output_url), '/subtask_input/')
-            test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=ingest_subtask['url']), '/subtask_output/')
+            test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=ingest_subtask['url'],
+                                                                                    task_blueprint_url=obs_subtask['task_blueprints'][0]), '/subtask_output/')  # todo: correct to link this to the obs?
 
             for predecessor in client.get_subtask_predecessors(ingest_subtask['id']):
                 client.set_subtask_status(predecessor['id'], 'finished')
@@ -536,7 +544,8 @@ class SAPTest(unittest.TestCase):
                                                      stop_time=datetime.utcnow() + timedelta(minutes=15))
             subtask = test_data_creator.post_data_and_get_response_as_json_object(subtask_data, '/subtask/')
             subtask_id = subtask['id']
-            test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=subtask['url']),
+            test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=subtask['url'],
+                                                                                    task_blueprint_url=task_blueprint['url']),
                                                     '/subtask_output/')
 
             subtask_model = models.Subtask.objects.get(id=subtask_id)
-- 
GitLab