From f23998f3aa0e3e044c0e6a9d66d49c67a772f092 Mon Sep 17 00:00:00 2001
From: Jorrit Schaap <schaap@astron.nl>
Date: Fri, 24 Dec 2021 09:23:58 +0100
Subject: [PATCH] TMSS-671: derive TestTriggers from
BaseDynamicSchedulingTestCase for reusability. Changed testenv
delete_scheduling_sets_cascade to delete_scheduling_unit_drafts_cascade, so
we can reuse the projects and sets in the tests
---
.../scheduling/test/t_dynamic_scheduling.py | 76 ++++++++++---------
...egies_specification_and_scheduling_test.py | 2 +-
SAS/TMSS/backend/test/t_scheduling.py | 4 +-
SAS/TMSS/backend/test/test_environment.py | 65 ++++++++--------
4 files changed, 75 insertions(+), 72 deletions(-)
diff --git a/SAS/TMSS/backend/services/scheduling/test/t_dynamic_scheduling.py b/SAS/TMSS/backend/services/scheduling/test/t_dynamic_scheduling.py
index 6c0dadc0f59..179d5c3bbac 100755
--- a/SAS/TMSS/backend/services/scheduling/test/t_dynamic_scheduling.py
+++ b/SAS/TMSS/backend/services/scheduling/test/t_dynamic_scheduling.py
@@ -117,7 +117,7 @@ class BaseDynamicSchedulingTestCase(unittest.TestCase):
priority_queue = models.PriorityQueueType.objects.get(value=models.PriorityQueueType.Choices.A.value)
if scheduling_set is None:
- scheduling_set = TestDynamicScheduling.scheduling_set_medium
+ scheduling_set = models.SchedulingSet.objects.create(**SchedulingSet_test_data())
# ensure the (reused) project is active
scheduling_set.project.project_state = models.ProjectState.objects.get(value=models.ProjectState.Choices.ACTIVE.value)
@@ -169,7 +169,7 @@ class TestFixedTimeScheduling(BaseDynamicSchedulingTestCase):
'''Test the behaviour of the dynamic scheduler for scheduling_units with a 'fixed_time' 'at' constraint'''
def setUp(self) -> None:
# wipe all scheduling_unit_drafts in between tests, so the tests don't influence each other
- tmss_test_env.delete_scheduling_sets_cascade()
+ tmss_test_env.delete_scheduling_unit_drafts_cascade()
models.Reservation.objects.all().delete()
@staticmethod
@@ -188,8 +188,8 @@ class TestFixedTimeScheduling(BaseDynamicSchedulingTestCase):
if isinstance(obs_duration, timedelta):
obs_duration = obs_duration.total_seconds()
- scheduling_unit_draft = TestDynamicScheduling.create_simple_observation_scheduling_unit(name, scheduling_set=scheduling_set, obs_duration=obs_duration)
- TestDynamicScheduling._clear_constraints(scheduling_unit_draft)
+ scheduling_unit_draft = BaseDynamicSchedulingTestCase.create_simple_observation_scheduling_unit(name, scheduling_set=scheduling_set, obs_duration=obs_duration)
+ BaseDynamicSchedulingTestCase._clear_constraints(scheduling_unit_draft)
scheduling_unit_draft.scheduling_constraints_doc['scheduler'] = 'fixed_time'
scheduling_unit_draft.scheduling_constraints_doc['time']['at'] = at.isoformat()
scheduling_unit_draft.save()
@@ -2380,30 +2380,34 @@ class TestReservedStationsTimeWindows(BaseDynamicSchedulingTestCase):
self.assertTrue(can_run_within_station_reservations(self.scheduling_unit_blueprint))
-class TestTriggers(unittest.TestCase):
+class TestTriggers(BaseDynamicSchedulingTestCase):
"""
Tests for scheduling behavior of triggered observations
"""
- def setUp(self):
- tmss_test_env.delete_scheduling_sets_cascade()
- models.Reservation.objects.all().delete()
+ @classmethod
+ def setUpClass(cls) -> None:
+ super().setUpClass()
# create a scheduling set in a project that allows triggers
- self.scheduling_set = models.SchedulingSet.objects.create(**SchedulingSet_test_data())
- self.scheduling_set.project.can_trigger = True
- self.scheduling_set.project.save()
+ cls.scheduling_set = models.SchedulingSet.objects.create(**SchedulingSet_test_data())
+ cls.scheduling_set.project.can_trigger = True
+ cls.scheduling_set.project.trigger_priority = 1
+ cls.scheduling_set.project.save()
# create a second scheduling set in a project that allows triggers and has higher trigger_priority
- self.scheduling_set_high_trigger_priority = models.SchedulingSet.objects.create(**SchedulingSet_test_data())
- self.scheduling_set_high_trigger_priority.project.can_trigger = True
- self.scheduling_set_high_trigger_priority.project.trigger_priority = self.scheduling_set_high_trigger_priority.project.trigger_priority + 1
- self.scheduling_set_high_trigger_priority.project.save()
+ cls.scheduling_set_high_trigger_priority = models.SchedulingSet.objects.create(**SchedulingSet_test_data())
+ cls.scheduling_set_high_trigger_priority.project.can_trigger = True
+ cls.scheduling_set_high_trigger_priority.project.trigger_priority = cls.scheduling_set.project.trigger_priority + 1
+ cls.scheduling_set_high_trigger_priority.project.save()
- self.scheduler = Scheduler()
+ def setUp(self) -> None:
+ # wipe all scheduling_unit_drafts in between tests, so the tests don't influence each other
+ tmss_test_env.delete_scheduling_unit_drafts_cascade()
+ models.Reservation.objects.all().delete()
def test_simple_triggered_scheduling_unit_gets_scheduled(self):
- scheduling_unit_draft = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft = self.create_simple_observation_scheduling_unit(
"triggered scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set,
interrupts_telescope=True)
@@ -2418,7 +2422,7 @@ class TestTriggers(unittest.TestCase):
def test_triggered_scheduling_unit_with_at_constraint_gets_scheduled_at_correct_time(self):
- scheduling_unit_draft = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft = self.create_simple_observation_scheduling_unit(
'scheduling_unit for at %s' % self._testMethodName,
scheduling_set=self.scheduling_set)
# Clear constraints
@@ -2444,13 +2448,13 @@ class TestTriggers(unittest.TestCase):
def test_triggered_scheduling_unit_has_priority_over_regular_observation(self):
- scheduling_unit_draft = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft = self.create_simple_observation_scheduling_unit(
"scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set,
interrupts_telescope=False)
regular_scheduling_unit_blueprint = create_scheduling_unit_blueprint_and_tasks_and_subtasks_from_scheduling_unit_draft(scheduling_unit_draft)
- scheduling_unit_draft = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft = self.create_simple_observation_scheduling_unit(
"triggered scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set,
interrupts_telescope=True)
@@ -2470,7 +2474,7 @@ class TestTriggers(unittest.TestCase):
def test_triggered_scheduling_unit_unschedules_regular_observation(self):
# create a regular scheduling_unit
- scheduling_unit_draft = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft = self.create_simple_observation_scheduling_unit(
"scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set,
interrupts_telescope=False)
@@ -2488,7 +2492,7 @@ class TestTriggers(unittest.TestCase):
self.assertEqual(regular_scheduling_unit_blueprint.status.value, 'scheduled')
# add a triggered scheduling_unit
- scheduling_unit_draft = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft = self.create_simple_observation_scheduling_unit(
"triggered scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set,
interrupts_telescope=True)
@@ -2511,7 +2515,7 @@ class TestTriggers(unittest.TestCase):
def test_triggered_scheduling_unit_cancels_regular_observation(self, kill_observation_subtask_mock):
# create a regular scheduling_unit
- scheduling_unit_draft = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft = self.create_simple_observation_scheduling_unit(
"scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set,
interrupts_telescope=False)
@@ -2544,7 +2548,7 @@ class TestTriggers(unittest.TestCase):
self.assertNotIn(subtask, running_subtasks)
# add a triggered scheduling_unit with higher priority
- scheduling_unit_draft = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft = self.create_simple_observation_scheduling_unit(
"triggered scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set_high_trigger_priority,
interrupts_telescope=True)
@@ -2574,7 +2578,7 @@ class TestTriggers(unittest.TestCase):
def test_triggered_scheduling_unit_does_not_cancel_regular_observation_with_same_trigger_priority(self, cancel_mock):
# create a regular scheduling_unit
- scheduling_unit_draft = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft = self.create_simple_observation_scheduling_unit(
"scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set,
interrupts_telescope=False)
@@ -2605,7 +2609,7 @@ class TestTriggers(unittest.TestCase):
self.assertNotIn(subtask, running_subtasks)
# add a triggered scheduling_unit with same trigger priority
- scheduling_unit_draft = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft = self.create_simple_observation_scheduling_unit(
"triggered scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set,
interrupts_telescope=True)
@@ -2629,7 +2633,7 @@ class TestTriggers(unittest.TestCase):
def test_triggered_scheduling_unit_does_not_cancel_regular_observation_if_it_cannot_run_anyway(self, cancel_mock):
# create a regular scheduling_unit
- scheduling_unit_draft = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft = self.create_simple_observation_scheduling_unit(
"scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set,
interrupts_telescope=False)
@@ -2660,7 +2664,7 @@ class TestTriggers(unittest.TestCase):
self.assertNotIn(subtask, running_subtasks)
# add a triggered scheduling_unit with higher priority, but a between constraint that can never be met
- scheduling_unit_draft = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft = self.create_simple_observation_scheduling_unit(
"triggered scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set_high_trigger_priority,
interrupts_telescope=True)
@@ -2685,7 +2689,7 @@ class TestTriggers(unittest.TestCase):
def test_triggered_scheduling_unit_gets_scheduled_in_correct_trigger_priority_order(self, cancel_mock):
# create three regular scheduling_units, two with high trigger priority, one with lower
- scheduling_unit_draft_high1 = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft_high1 = self.create_simple_observation_scheduling_unit(
"scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set_high_trigger_priority,
interrupts_telescope=False)
@@ -2693,7 +2697,7 @@ class TestTriggers(unittest.TestCase):
regular_scheduling_unit_blueprint_high1.scheduling_constraints_doc = {}
regular_scheduling_unit_blueprint_high1.save()
- scheduling_unit_draft_high2 = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft_high2 = self.create_simple_observation_scheduling_unit(
"scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set_high_trigger_priority,
interrupts_telescope=False)
@@ -2701,7 +2705,7 @@ class TestTriggers(unittest.TestCase):
regular_scheduling_unit_blueprint_high2.scheduling_constraints_doc = {}
regular_scheduling_unit_blueprint_high2.save()
- scheduling_unit_draft_low = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft_low = self.create_simple_observation_scheduling_unit(
"scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set,
interrupts_telescope=False)
@@ -2725,7 +2729,7 @@ class TestTriggers(unittest.TestCase):
subtask.save()
# add a triggered scheduling_unit with same priority
- scheduling_unit_draft_trigger = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft_trigger = self.create_simple_observation_scheduling_unit(
"triggered scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set_high_trigger_priority,
interrupts_telescope=True)
@@ -2755,7 +2759,7 @@ class TestTriggers(unittest.TestCase):
def test_triggered_scheduling_unit_goes_to_unschedulable_if_it_cannot_cancel_and_does_not_fit(self, cancel_mock):
# create three regular scheduling_units, two with high trigger priority, one with lower
- scheduling_unit_draft_high1 = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft_high1 = self.create_simple_observation_scheduling_unit(
"scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set_high_trigger_priority,
interrupts_telescope=False)
@@ -2763,7 +2767,7 @@ class TestTriggers(unittest.TestCase):
regular_scheduling_unit_blueprint_high1.scheduling_constraints_doc = {}
regular_scheduling_unit_blueprint_high1.save()
- scheduling_unit_draft_high2 = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft_high2 = self.create_simple_observation_scheduling_unit(
"scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set_high_trigger_priority,
interrupts_telescope=False)
@@ -2771,7 +2775,7 @@ class TestTriggers(unittest.TestCase):
regular_scheduling_unit_blueprint_high2.scheduling_constraints_doc = {}
regular_scheduling_unit_blueprint_high2.save()
- scheduling_unit_draft_low = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft_low = self.create_simple_observation_scheduling_unit(
"scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set,
interrupts_telescope=False)
@@ -2793,7 +2797,7 @@ class TestTriggers(unittest.TestCase):
# add a triggered scheduling_unit with same trigger priority, and a between constraint that can only be met
# when the regular obs would be cancelled (which is not allowed because it requires higher trigger priority).
- scheduling_unit_draft_trigger = TestDynamicScheduling.create_simple_observation_scheduling_unit(
+ scheduling_unit_draft_trigger = self.create_simple_observation_scheduling_unit(
"triggered scheduling unit for %s" % self._testMethodName,
scheduling_set=self.scheduling_set_high_trigger_priority,
interrupts_telescope=True)
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 0d0ff3fb17b..71bdb5acedb 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
@@ -59,7 +59,7 @@ class TestObservationStrategiesSpecificationAndScheduling(unittest.TestCase):
shutil.rmtree(cls.TEST_DIR, ignore_errors=True)
def setUp(self) -> None:
- self.tmss_test_env.delete_scheduling_sets_cascade()
+ self.tmss_test_env.delete_scheduling_unit_drafts_cascade()
# prepare a new clean project and parent scheduling_set for each tested observation strategy template
test_data_creator = self.tmss_test_env.create_test_data_creator()
diff --git a/SAS/TMSS/backend/test/t_scheduling.py b/SAS/TMSS/backend/test/t_scheduling.py
index 2150df7e8c6..02fb92df927 100755
--- a/SAS/TMSS/backend/test/t_scheduling.py
+++ b/SAS/TMSS/backend/test/t_scheduling.py
@@ -126,7 +126,7 @@ def duplicates(l: list) -> list:
class SchedulingTest(unittest.TestCase):
def setUp(self):
- tmss_test_env.delete_scheduling_sets_cascade()
+ tmss_test_env.delete_scheduling_unit_drafts_cascade()
models.Reservation.objects.all().delete()
test_data_creator.wipe_cache()
@@ -894,7 +894,7 @@ class TestWithUC1Specifications(unittest.TestCase):
Note that this test requires Resource Assigner testenvironment being alive
"""
def setUp(self) -> None:
- tmss_test_env.delete_scheduling_sets_cascade()
+ tmss_test_env.delete_scheduling_unit_drafts_cascade()
models.Reservation.objects.all().delete()
test_data_creator.wipe_cache()
diff --git a/SAS/TMSS/backend/test/test_environment.py b/SAS/TMSS/backend/test/test_environment.py
index 4dcbcc7beae..0d97edb2d4e 100644
--- a/SAS/TMSS/backend/test/test_environment.py
+++ b/SAS/TMSS/backend/test/test_environment.py
@@ -471,9 +471,9 @@ class TMSSTestEnvironment:
from lofar.sas.tmss.test.tmss_test_data_rest import TMSSRESTTestDataCreator
return TMSSRESTTestDataCreator(self.django_server.url, (self.django_server.ldap_dbcreds.user, self.django_server.ldap_dbcreds.password))
- def delete_scheduling_sets_cascade(self, mute_delete_event_messages: bool=True):
- '''convenience method for TESTING to wipe ALL scheduling_sets, scheduling_unit_draft/blueprint, task_draft/blueprint, subtask, subtask_input/output, dataproducts in a cascading manner.'''
- from lofar.sas.tmss.tmss.tmssapp.models import SchedulingSet, SubtaskState
+ def delete_scheduling_unit_drafts_cascade(self, mute_delete_event_messages: bool=True):
+ '''convenience method for TESTING to wipe ALL scheduling_unit_drafts, scheduling_unit_blueprints, task_draft/blueprint, subtask, subtask_input/output, dataproducts in a cascading manner.'''
+ from lofar.sas.tmss.tmss.tmssapp.models import SchedulingUnitDraft, SubtaskState
from lofar.sas.tmss.tmss.tmssapp.subtasks import unschedule_subtask
if self.postgres_listener is not None and mute_delete_event_messages:
@@ -481,36 +481,35 @@ class TMSSTestEnvironment:
self.postgres_listener.stop()
# loop over all instances in the tree and delete them, as we modelled many of these models to PROTECT on delete instead of CASCADE (for good reason)
- for scheduling_set in SchedulingSet.objects.all():
- for scheduling_unit_draft in scheduling_set.scheduling_unit_drafts.all():
- for scheduling_unit_blueprint in scheduling_unit_draft.scheduling_unit_blueprints.all():
- for task_blueprint in scheduling_unit_blueprint.task_blueprints.all():
- for subtask in task_blueprint.subtasks.all():
- try:
- if subtask.state.value == SubtaskState.Choices.SCHEDULED.value:
- unschedule_subtask(subtask)
- except Exception as e:
- logger.exception(e)
- for output in subtask.outputs.all():
- for dataproduct in output.dataproducts.all():
- for transform in dataproduct.consumer_transforms.all():
- transform.delete()
- for transform in dataproduct.producer_transforms.all():
- transform.delete()
- dataproduct.delete()
- for consumer in output.consumers.all():
- consumer.delete()
- output.delete()
- for input in subtask.inputs.all():
- input.delete()
- subtask.delete()
- task_blueprint.delete()
- scheduling_unit_blueprint.delete()
-
- for task_draft in scheduling_unit_draft.task_drafts.all():
- task_draft.delete()
-
- scheduling_unit_draft.delete()
+ for scheduling_unit_draft in SchedulingUnitDraft.objects.all():
+ for scheduling_unit_blueprint in scheduling_unit_draft.scheduling_unit_blueprints.all():
+ for task_blueprint in scheduling_unit_blueprint.task_blueprints.all():
+ for subtask in task_blueprint.subtasks.all():
+ try:
+ if subtask.state.value == SubtaskState.Choices.SCHEDULED.value:
+ unschedule_subtask(subtask)
+ except Exception as e:
+ logger.exception(e)
+ for output in subtask.outputs.all():
+ for dataproduct in output.dataproducts.all():
+ for transform in dataproduct.consumer_transforms.all():
+ transform.delete()
+ for transform in dataproduct.producer_transforms.all():
+ transform.delete()
+ dataproduct.delete()
+ for consumer in output.consumers.all():
+ consumer.delete()
+ output.delete()
+ for input in subtask.inputs.all():
+ input.delete()
+ subtask.delete()
+ task_blueprint.delete()
+ scheduling_unit_blueprint.delete()
+
+ for task_draft in scheduling_unit_draft.task_drafts.all():
+ task_draft.delete()
+
+ scheduling_unit_draft.delete()
if self.postgres_listener is not None and mute_delete_event_messages:
# restart the previously stopped postgres_listener
--
GitLab