Skip to content

Commit 75a64dc

Browse files
Merge pull request GoogleCloudPlatform#4469 from jemish-google/dws-calendar
Support DWS canlendar with regular reservation
2 parents 6a9ff8a + bd6b92f commit 75a64dc

3 files changed

Lines changed: 38 additions & 8 deletions

File tree

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -294,12 +294,12 @@ def chunk_nodes(nodes: List[str]):
294294
def resume_nodes(nodes: List[str], resume_data: Optional[ResumeData]):
295295
"""resume nodes in nodelist"""
296296
lkp = lookup()
297-
# Prevent dormant nodes associated with a future reservation from being resumed
298-
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)
299299

300-
if dormant_fr_nodes:
301-
log.warning(f"Resume was unable to resume future reservation nodes={dormant_fr_nodes}")
302-
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)
303303

304304
nodes, flex_managed = util.separate(lkp.is_provisioning_flex_node, nodes)
305305
if flex_managed:

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ def test_nodeset_reservation_err(nodeset, err):
198198
policies=[],
199199
deployment_type=None,
200200
reservation_mode=None,
201+
assured_count=0,
202+
delete_at_time=None,
201203
bulk_insert_name="projects/bobin/reservations/robin")),
202204
(TstNodeset(
203205
reservation_name="projects/bobin/reservations/robin",
@@ -210,6 +212,8 @@ def test_nodeset_reservation_err(nodeset, err):
210212
policies=["wanders", "apples", "yum"],
211213
deployment_type=None,
212214
reservation_mode=None,
215+
assured_count=0,
216+
delete_at_time=None,
213217
bulk_insert_name="projects/bobin/reservations/robin")),
214218
(TstNodeset(
215219
reservation_name="projects/bobin/reservations/robin/snek/cheese-brie-6",
@@ -222,6 +226,8 @@ def test_nodeset_reservation_err(nodeset, err):
222226
policies=[],
223227
deployment_type=None,
224228
reservation_mode=None,
229+
assured_count=0,
230+
delete_at_time=None,
225231
bulk_insert_name="projects/bobin/reservations/robin/snek/cheese-brie-6")),
226232
227233
])
@@ -549,6 +555,8 @@ def test_future_reservation_active(_):
549555
name='melon',
550556
policies=[],
551557
reservation_mode=None,
558+
assured_count=0,
559+
delete_at_time=None,
552560
bulk_insert_name="projects/manhattan/reservations/melon",
553561
deployment_type=None))
554562

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)