From bc90ec475b905878aa06058f443713a5aeb5ae6d Mon Sep 17 00:00:00 2001 From: Roy de Goei <goei@astron.nl> Date: Wed, 3 Mar 2021 07:54:10 +0100 Subject: [PATCH] TMSS-475 Add testcase can_run_within between and not between constraint and add todo comment --- .../constraints/template_constraints_v1.py | 7 ++- .../scheduling/test/t_dynamic_scheduling.py | 60 +++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/SAS/TMSS/backend/services/scheduling/lib/constraints/template_constraints_v1.py b/SAS/TMSS/backend/services/scheduling/lib/constraints/template_constraints_v1.py index b58194a8ee4..2b68de96458 100644 --- a/SAS/TMSS/backend/services/scheduling/lib/constraints/template_constraints_v1.py +++ b/SAS/TMSS/backend/services/scheduling/lib/constraints/template_constraints_v1.py @@ -183,6 +183,7 @@ def can_run_anywhere_within_timewindow_with_time_constraints(scheduling_unit: mo can_run_not_between = True constraints = scheduling_unit.draft.scheduling_constraints_doc + # TODO TMSS-672 Move to can_run_within and make logic correct if has_manual_scheduler_constraint(scheduling_unit): at = parser.parse(constraints['time']['at'], ignoretz=True) can_run_at = (at >= lower_bound and at+scheduling_unit.duration <= upper_bound) # todo: suggestion: use scheduling_unit.requirements_doc['tasks']['Observation']['specifications_doc']['duration'] @@ -195,17 +196,19 @@ def can_run_anywhere_within_timewindow_with_time_constraints(scheduling_unit: mo after = parser.parse(constraints['time']['after'], ignoretz=True) can_run_with_after = (lower_bound >= after) + # Run within one of these time windows if 'between' in constraints['time']: can_run_between = True # empty list is no constraint for between in constraints['time']['between']: time_from = parser.parse(between["from"], ignoretz=True) time_to = parser.parse(between["to"], ignoretz=True) - if time_from >= lower_bound and time_to <= (upper_bound-scheduling_unit.duration): + if time_from >= lower_bound and time_to <= upper_bound: can_run_between = True + break # something inside the boundary so True and don't look any further else: can_run_between = False - break # something outside the boundary so False and don't look any further + # Do NOT run within any of these time windows if 'not_between' in constraints['time']: can_run_not_between = True # empty list is no constraint for not_between in constraints['time']['not_between']: 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 30e7ce87311..2e53fa1c570 100755 --- a/SAS/TMSS/backend/services/scheduling/test/t_dynamic_scheduling.py +++ b/SAS/TMSS/backend/services/scheduling/test/t_dynamic_scheduling.py @@ -932,6 +932,66 @@ class TestTimeConstraints(TestCase): self.assertTrue(tc1.can_run_anywhere_within_timewindow_with_time_constraints(self.scheduling_unit_blueprint, datetime(2020, 1, 1, 13, 0, 0), datetime(2020, 1, 1, 15, 0, 0))) + def test_can_run_within_between_constraints(self): + """ + Test multiple 'between' and check overall result of can_run_within_timewindow_with_time_constraints + """ + # no constraints defined so should be OK + self.assertTrue(tc1.can_run_within_timewindow_with_time_constraints(self.scheduling_unit_blueprint, + datetime(2020, 1, 1, 12, 0, 0), datetime(2020, 1, 2, 12, 0, 0))) + # not inside constraints of 1hr + self.add_time_between_constraint(datetime(2020, 1, 1, 11, 0, 0), datetime(2020, 1, 1, 12, 0, 0)) + self.add_time_between_constraint(datetime(2020, 1, 2, 12, 0, 0), datetime(2020, 1, 2, 13, 0, 0)) + # not inside constraints of 2hr + self.add_time_between_constraint(datetime(2020, 1, 2, 11, 0, 0), datetime(2020, 1, 2, 13, 0, 0)) + # inside constraint of 20hr 'too long' constraint + self.add_time_between_constraint(datetime(2020, 1, 1, 14, 0, 0), datetime(2020, 1, 2, 10, 0, 0)) + self.assertFalse(tc1.can_run_within_timewindow_with_time_constraints(self.scheduling_unit_blueprint, + datetime(2020, 1, 1, 12, 0, 0), datetime(2020, 1, 2, 12, 0, 0))) + # add one 'inside' constraint, 1 hour within block of 2 hour so overall must be ok + self.add_time_between_constraint(datetime(2020, 1, 1, 13, 30, 0), datetime(2020, 1, 1, 14, 30, 0)) + self.assertTrue(tc1.can_run_within_timewindow_with_time_constraints(self.scheduling_unit_blueprint, + datetime(2020, 1, 1, 12, 0, 0), datetime(2020, 1, 2, 12, 0, 0))) + # not inside constraints of 3hr + self.add_time_between_constraint(datetime(2020, 1, 1, 11, 0, 0), datetime(2020, 1, 1, 12, 0, 0)) + # should still be OK + self.assertTrue(tc1.can_run_within_timewindow_with_time_constraints(self.scheduling_unit_blueprint, + datetime(2020, 1, 1, 12, 0, 0), datetime(2020, 1, 2, 12, 0, 0))) + + def test_can_run_within_not_between_constraints(self): + """ + Test multiple 'not_between' and check overall result of can_run_within_timewindow_with_time_constraints + """ + # no constraints defined so should be OK + self.assertTrue(tc1.can_run_within_timewindow_with_time_constraints(self.scheduling_unit_blueprint, + datetime(2020, 1, 1, 12, 0, 0), datetime(2020, 1, 2, 12, 0, 0))) + # not inside constraints of 1hr + self.add_time_not_between_constraint(datetime(2020, 1, 1, 11, 0, 0), datetime(2020, 1, 1, 12, 0, 0)) + self.add_time_not_between_constraint(datetime(2020, 1, 2, 12, 0, 0), datetime(2020, 1, 2, 13, 0, 0)) + # not inside constraints of 2hr + self.add_time_not_between_constraint(datetime(2020, 1, 2, 11, 0, 0), datetime(2020, 1, 2, 13, 0, 0)) + # inside constraint of 20hr 'too long' constraint + self.add_time_not_between_constraint(datetime(2020, 1, 1, 14, 0, 0), datetime(2020, 1, 2, 10, 0, 0)) + self.assertFalse(tc1.can_run_within_timewindow_with_time_constraints(self.scheduling_unit_blueprint, + datetime(2020, 1, 1, 12, 0, 0), datetime(2020, 1, 2, 12, 0, 0))) + # add one 'outside' constraint, 1 hour which is still not ok + self.add_time_not_between_constraint(datetime(2020, 1, 1, 9, 0, 0), datetime(2020, 1, 1, 10, 0, 0)) + print(self.scheduling_unit_blueprint.draft.scheduling_constraints_doc['time']["not_between"]) + self.assertFalse(tc1.can_run_within_timewindow_with_time_constraints(self.scheduling_unit_blueprint, + datetime(2020, 1, 1, 12, 0, 0), datetime(2020, 1, 2, 12, 0, 0))) + # Clear all not_between constraints + self.scheduling_unit_blueprint.draft.scheduling_constraints_doc['time']["not_between"] = [] + # not inside constraints of 1hr again + self.add_time_not_between_constraint(datetime(2020, 1, 1, 9, 0, 0), datetime(2020, 1, 1, 10, 0, 0)) + # should be OK now + self.assertTrue(tc1.can_run_within_timewindow_with_time_constraints(self.scheduling_unit_blueprint, + datetime(2020, 1, 1, 12, 0, 0), datetime(2020, 1, 2, 12, 0, 0))) + # Add one inside constraint and we are back not ok again + # TODO RGoe: Have to check why next is not working before finishing TMSS-475 !!!!!!!!!! + #self.add_time_not_between_constraint(datetime(2020, 1, 1, 13, 0, 0), datetime(2020, 1, 1, 14, 0, 0)) + #self.assertFalse(tc1.can_run_within_timewindow_with_time_constraints(self.scheduling_unit_blueprint, + # datetime(2020, 1, 1, 12, 0, 0), datetime(2020, 1, 2, 12, 0, 0))) + class TestReservedStations(unittest.TestCase): """ -- GitLab