1- from kr8s .asyncio .objects import APIObject
1+ from __future__ import annotations
2+ from typing import List
3+
4+ from kr8s .asyncio .objects import APIObject , Pod , Deployment , Service
25
36
47class DaskCluster (APIObject ):
@@ -11,6 +14,61 @@ class DaskCluster(APIObject):
1114 scalable = True
1215 scalable_spec = "worker.replicas"
1316
17+ async def worker_groups (self ) -> List [DaskWorkerGroup ]:
18+ return await self .api .get (
19+ DaskWorkerGroup .endpoint ,
20+ label_selector = f"dask.org/cluster-name={ self .name } " ,
21+ namespace = self .namespace ,
22+ )
23+
24+ async def scheduler_pod (self ) -> Pod :
25+ pods = []
26+ while not pods :
27+ pods = await self .api .get (
28+ Pod .endpoint ,
29+ label_selector = "," .join (
30+ [
31+ f"dask.org/cluster-name={ self .name } " ,
32+ "dask.org/component=scheduler" ,
33+ ]
34+ ),
35+ namespace = self .namespace ,
36+ )
37+ assert len (pods ) == 1
38+ return pods [0 ]
39+
40+ async def scheduler_deployment (self ) -> Deployment :
41+ deployments = []
42+ while not deployments :
43+ deployments = await self .api .get (
44+ Deployment .endpoint ,
45+ label_selector = "," .join (
46+ [
47+ f"dask.org/cluster-name={ self .name } " ,
48+ "dask.org/component=scheduler" ,
49+ ]
50+ ),
51+ namespace = self .namespace ,
52+ )
53+ assert len (deployments ) == 1
54+ return deployments [0 ]
55+
56+ async def scheduler_service (self ) -> Service :
57+ services = []
58+ while not services :
59+ services = await self .api .get (
60+ Service .endpoint ,
61+ label_selector = "," .join (
62+ [
63+ f"dask.org/cluster-name={ self .name } " ,
64+ "dask.org/component=scheduler" ,
65+ ]
66+ ),
67+ namespace = self .namespace ,
68+ )
69+ assert len (services ) == 1
70+ return services [0 ]
71+
1472
1573class DaskWorkerGroup (APIObject ):
1674 version = "kubernetes.dask.org/v1"
@@ -21,6 +79,35 @@ class DaskWorkerGroup(APIObject):
2179 namespaced = True
2280 scalable = True
2381
82+ async def pods (self ) -> List [Pod ]:
83+ return await self .api .get (
84+ Pod .endpoint ,
85+ label_selector = "," .join (
86+ [
87+ f"dask.org/cluster-name={ self .spec ['cluster' ]} " ,
88+ "dask.org/component=worker" ,
89+ f"dask.org/workergroup-name={ self .name } " ,
90+ ]
91+ ),
92+ namespace = self .namespace ,
93+ )
94+
95+ async def deployments (self ) -> List [Deployment ]:
96+ return await self .api .get (
97+ Deployment .endpoint ,
98+ label_selector = "," .join (
99+ [
100+ f"dask.org/cluster-name={ self .spec ['cluster' ]} " ,
101+ "dask.org/component=worker" ,
102+ f"dask.org/workergroup-name={ self .name } " ,
103+ ]
104+ ),
105+ namespace = self .namespace ,
106+ )
107+
108+ async def cluster (self ) -> DaskCluster :
109+ return await DaskCluster .get (self .spec ["cluster" ], namespace = self .namespace )
110+
24111
25112class DaskAutoscaler (APIObject ):
26113 version = "kubernetes.dask.org/v1"
@@ -30,6 +117,9 @@ class DaskAutoscaler(APIObject):
30117 singular = "daskautoscaler"
31118 namespaced = True
32119
120+ async def cluster (self ) -> DaskCluster :
121+ return await DaskCluster .get (self .spec ["cluster" ], namespace = self .namespace )
122+
33123
34124class DaskJob (APIObject ):
35125 version = "kubernetes.dask.org/v1"
@@ -38,3 +128,22 @@ class DaskJob(APIObject):
38128 plural = "daskjobs"
39129 singular = "daskjob"
40130 namespaced = True
131+
132+ async def cluster (self ) -> DaskCluster :
133+ return await DaskCluster .get (self .name , namespace = self .namespace )
134+
135+ async def pod (self ) -> Pod :
136+ pods = []
137+ while not pods :
138+ pods = await self .api .get (
139+ Pod .endpoint ,
140+ label_selector = "," .join (
141+ [
142+ f"dask.org/cluster-name={ self .name } " ,
143+ "dask.org/component=job-runner" ,
144+ ]
145+ ),
146+ namespace = self .namespace ,
147+ )
148+ assert len (pods ) == 1
149+ return pods [0 ]
0 commit comments