Warning, file /swf-monitor/src/monitor_app/tests/test_storage_doors.py was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 """The storage door record's two readings the node guard depends on
0002 (monitor_app/panda/storage_doors.py, site-canary docs/STORAGE_DOORS.md):
0003 the spans a door was down, and the failures those spans excuse.
0004
0005 Dict tests over the spans; no door is touched and no cycle runs."""
0006 from datetime import datetime, timedelta, timezone
0007
0008 from django.test import SimpleTestCase
0009
0010 from monitor_app.panda import storage_doors
0011
0012 T0 = datetime(2026, 9, 22, 12, 0, tzinfo=timezone.utc)
0013
0014
0015 def span(start_min, end_min, rse='BNL-XRD'):
0016 return {'rse': rse, 'door': 'root://epicxrd1.sdcc.bnl.gov:1094',
0017 'start': T0 + timedelta(minutes=start_min),
0018 'end': None if end_min is None else T0 + timedelta(minutes=end_min)}
0019
0020
0021 def row(minutes, error='pilot 1305', status='failed', queue='NERSC_Perlmutter_epic'):
0022 return {'queue': queue, 'host': 'nid006057', 'jobstatus': status,
0023 'jeditaskid': 40052, 'duration_s': 740.0,
0024 'endtime': (T0 + timedelta(minutes=minutes)).isoformat(),
0025 'error': error}
0026
0027
0028 class SetAsideDoor(SimpleTestCase):
0029 def test_a_registration_failure_inside_a_span_is_set_aside(self):
0030 kept, by_queue = storage_doors.set_aside_door([row(30)], [span(0, 60)])
0031 self.assertEqual(kept, [])
0032 self.assertEqual(by_queue, {'NERSC_Perlmutter_epic': 1})
0033
0034 def test_the_same_failure_outside_the_span_stands(self):
0035 kept, by_queue = storage_doors.set_aside_door([row(90)], [span(0, 60)])
0036 self.assertEqual(len(kept), 1)
0037 self.assertEqual(by_queue, {})
0038
0039 def test_a_span_still_open_covers_everything_after_it(self):
0040 kept, _ = storage_doors.set_aside_door([row(600)], [span(0, None)])
0041 self.assertEqual(kept, [])
0042
0043 def test_another_failure_in_the_span_stands(self):
0044 """A node killing jobs for its own reasons during an outage still
0045 reads as what it is."""
0046 kept, by_queue = storage_doors.set_aside_door(
0047 [row(30, error='pilot 1201')], [span(0, 60)])
0048 self.assertEqual(len(kept), 1)
0049 self.assertEqual(by_queue, {})
0050
0051 def test_the_payloads_own_registration_exit_counts_too(self):
0052 for error in ('exe 78', 'trans 78'):
0053 kept, _ = storage_doors.set_aside_door([row(30, error=error)], [span(0, 60)])
0054 self.assertEqual(kept, [], error)
0055
0056 def test_a_finished_job_is_never_set_aside(self):
0057 kept, _ = storage_doors.set_aside_door(
0058 [row(30, error='', status='finished')], [span(0, 60)])
0059 self.assertEqual(len(kept), 1)
0060
0061 def test_no_spans_set_nothing_aside(self):
0062 """Before the canary has watched a door there is nothing to
0063 excuse, and the guard judges as it always did."""
0064 rows = [row(30), row(90)]
0065 kept, by_queue = storage_doors.set_aside_door(rows, [])
0066 self.assertEqual(kept, rows)
0067 self.assertEqual(by_queue, {})
0068
0069 def test_a_row_without_an_end_time_stands(self):
0070 kept, _ = storage_doors.set_aside_door(
0071 [dict(row(30), endtime=None)], [span(0, 60)])
0072 self.assertEqual(len(kept), 1)
0073
0074 def test_counts_are_per_queue(self):
0075 rows = [row(10), row(20), row(30, queue='BNL_OSG_PanDA_1')]
0076 _, by_queue = storage_doors.set_aside_door(rows, [span(0, 60)])
0077 self.assertEqual(by_queue, {'NERSC_Perlmutter_epic': 2, 'BNL_OSG_PanDA_1': 1})