Skip to content

Commit bd6b92f

Browse files
committed
Support DWS canlendar with regular reservation
1 parent 69920a2 commit bd6b92f

3 files changed

Lines changed: 36 additions & 13 deletions

File tree

community/modules/scheduler/schedmd-slurm-gcp-v6-controller/modules/slurm_files/scripts/resume.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ def instance_properties(nodeset: NSDict, model:str, placement_group:Optional[str
105105
props.resourcePolicies = [placement_group]
106106

107107
if reservation := lookup().nodeset_reservation(nodeset):
108-
109108
update_reservation_props(reservation, props, placement_group, reservation.calendar)
110109

111110
if (fr := lookup().future_reservation(nodeset)) and fr.specific:
@@ -295,12 +294,12 @@ def chunk_nodes(nodes: List[str]):
295294
def resume_nodes(nodes: List[str], resume_data: Optional[ResumeData]):
296295
"""resume nodes in nodelist"""
297296
lkp = lookup()
298-
# Prevent dormant nodes associated with a future reservation from being resumed
299-
nodes, dormant_fr_nodes = util.separate(lkp.is_dormant_fr_node, nodes)
297+
# Prevent dormant nodes associated with a reservation from being resumed
298+
nodes, dormant_res_nodes = util.separate(lkp.is_dormant_res_node, nodes)
300299

301-
if dormant_fr_nodes:
302-
log.warning(f"Resume was unable to resume future reservation nodes={dormant_fr_nodes}")
303-
down_nodes_notify_jobs(dormant_fr_nodes, "Reservation is not active, nodes cannot be resumed", resume_data)
300+
if dormant_res_nodes:
301+
log.warning(f"Resume was unable to resume reservation nodes={dormant_res_nodes}")
302+
down_nodes_notify_jobs(dormant_res_nodes, "Reservation is not active, nodes cannot be resumed", resume_data)
304303

305304
nodes, flex_managed = util.separate(lkp.is_provisioning_flex_node, nodes)
306305
if flex_managed:

community/modules/scheduler/schedmd-slurm-gcp-v6-controller/modules/slurm_files/scripts/tests/test_util.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ def test_nodeset_reservation_err(nodeset, err):
198198
policies=[],
199199
deployment_type=None,
200200
reservation_mode=None,
201-
assured_count=None,
201+
assured_count=0,
202202
delete_at_time=None,
203203
bulk_insert_name="projects/bobin/reservations/robin")),
204204
(TstNodeset(
@@ -212,7 +212,7 @@ def test_nodeset_reservation_err(nodeset, err):
212212
policies=["wanders", "apples", "yum"],
213213
deployment_type=None,
214214
reservation_mode=None,
215-
assured_count=None,
215+
assured_count=0,
216216
delete_at_time=None,
217217
bulk_insert_name="projects/bobin/reservations/robin")),
218218
(TstNodeset(
@@ -226,7 +226,7 @@ def test_nodeset_reservation_err(nodeset, err):
226226
policies=[],
227227
deployment_type=None,
228228
reservation_mode=None,
229-
assured_count=1,
229+
assured_count=0,
230230
delete_at_time=None,
231231
bulk_insert_name="projects/bobin/reservations/robin/snek/cheese-brie-6")),
232232
@@ -555,6 +555,8 @@ def test_future_reservation_active(_):
555555
name='melon',
556556
policies=[],
557557
reservation_mode=None,
558+
assured_count=0,
559+
delete_at_time=None,
558560
bulk_insert_name="projects/manhattan/reservations/melon",
559561
deployment_type=None))
560562

@@ -581,7 +583,7 @@ def test_future_reservation_inactive(_):
581583
TstNodeset(future_reservation="projects/manhattan/zones/danger/futureReservations/zebra")) == FutureReservation(
582584
project='manhattan',
583585
zone='danger',
584-
name='zebra',
586+
name='zebra',
585587
specific=True,
586588
start_time=datetime(2025, 1, 27, 23, 30, tzinfo=timezone.utc),
587589
end_time=datetime(2025, 2, 21, 23, 30, tzinfo=timezone.utc),

community/modules/scheduler/schedmd-slurm-gcp-v6-controller/modules/slurm_files/scripts/util.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1454,6 +1454,8 @@ class ReservationDetails:
14541454
bulk_insert_name: str # name in format suitable for bulk insert (currently identical to user supplied name in long format)
14551455
deployment_type: Optional[str]
14561456
reservation_mode: Optional[str]
1457+
assured_count: int
1458+
delete_at_time: Optional[datetime]
14571459

14581460
@property
14591461
def dense(self) -> bool:
@@ -1621,11 +1623,29 @@ def nodeset_is_tpu(self, nodeset_name=None) -> bool:
16211623
def node_is_fr(self, node_name:str) -> bool:
16221624
return bool(self.node_nodeset(node_name).future_reservation)
16231625

1624-
def is_dormant_fr_node(self, node_name:str) -> bool:
1626+
def is_dormant_res_node(self, node_name:str) -> bool:
16251627
fr = self.future_reservation(self.node_nodeset(node_name))
1626-
if not fr:
1628+
res = self.nodeset_reservation(self.node_nodeset(node_name))
1629+
1630+
if fr is None and res is None:
16271631
return False
1628-
return fr.active_reservation is None
1632+
1633+
if fr:
1634+
return fr.active_reservation is None
1635+
1636+
if res:
1637+
if res.calendar:
1638+
# If reservation is calendar based, check if it is past the delete_at_time
1639+
if res.delete_at_time is not None and now() >= res.delete_at_time:
1640+
log.info(f"DWS calendar reservation {res.bulk_insert_name} is past deletion time {res.delete_at_time}, skipping resume.")
1641+
return True
1642+
1643+
# If assured_count is 0 do not resume nodes as they are not active yet
1644+
if res.delete_at_time is not None and res.assured_count <= 0:
1645+
log.info(f"DWS calendar reservation {res.bulk_insert_name} is not active yet, skipping resume.")
1646+
return True
1647+
1648+
return False
16291649

16301650
def node_is_dyn(self, node_name=None) -> bool:
16311651
nodeset = self.node_nodeset_name(node_name)
@@ -1824,6 +1844,8 @@ def get_reservation_details(self, project:str, zone:str, name:str, bulk_insert_n
18241844
policies=policies,
18251845
deployment_type=reservation.get("deploymentType"),
18261846
reservation_mode=reservation.get("reservationMode"),
1847+
assured_count=reservation.get("assuredCount") if reservation.get("assuredCount") else 0,
1848+
delete_at_time=parse_gcp_timestamp(reservation.get("deleteAtTime")) if reservation.get("deleteAtTime") else None,
18271849
bulk_insert_name=bulk_insert_name)
18281850

18291851
def nodeset_reservation(self, nodeset: NSDict) -> Optional[ReservationDetails]:

0 commit comments

Comments
 (0)