Skip to content

Commit 23130ef

Browse files
committed
✨ add run launcher and executor for KubeRay
1 parent 5d0c98d commit 23130ef

10 files changed

Lines changed: 679 additions & 20 deletions

File tree

src/dagster_ray/_base/utils.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
from __future__ import annotations
22

33
import dagster as dg
4+
from dagster._core.executor.step_delegating import (
5+
StepHandlerContext,
6+
)
7+
from dagster._core.launcher.base import LaunchRunContext
48

59
from dagster_ray._base.constants import DEFAULT_DEPLOYMENT_NAME
10+
from dagster_ray.types import AnyDagsterContext
611

712

813
def get_dagster_tags(
9-
context: dg.InitResourceContext | dg.OpExecutionContext | dg.AssetExecutionContext,
14+
context: dg.InitResourceContext | AnyDagsterContext | StepHandlerContext | LaunchRunContext,
1015
extra_tags: dict[str, str] | None = None,
1116
) -> dict[str, str]:
1217
"""
@@ -29,9 +34,24 @@ def get_dagster_tags(
2934
# inject the resource key used for this KubeRay resource
3035
# this enables e.g reusing the same `RayCluster` across Dagster steps that require it without recreating the cluster
3136
labels["dagster/resource-key"] = resource_key
32-
else:
37+
38+
elif isinstance(context, StepHandlerContext):
39+
labels.update(
40+
**context.dagster_run.dagster_execution_info,
41+
)
42+
elif isinstance(context, LaunchRunContext):
43+
labels.update(
44+
**context.dagster_run.dagster_execution_info,
45+
)
46+
elif isinstance(context, dg.OpExecutionContext):
47+
labels.update(
48+
**context.run.dagster_execution_info,
49+
)
50+
elif isinstance(context, dg.AssetExecutionContext):
3351
labels.update(
3452
**context.run.dagster_execution_info,
3553
)
54+
else:
55+
raise ValueError(f"Unexpected context type: {type(context)}")
3656

3757
return labels

src/dagster_ray/core/executor.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from __future__ import annotations
2-
31
from collections.abc import Iterator
42
from typing import TYPE_CHECKING, Any, cast
53

@@ -23,14 +21,14 @@
2321
except ImportError:
2422
# for new versions of dagster > 1.11.6
2523
from dagster._core.remote_origin import RemoteJobOrigin # pyright: ignore[reportMissingImports]
24+
2625
from dagster._utils.merger import merge_dicts
2726
from packaging.version import Version
2827
from pydantic import Field
2928

3029
from dagster_ray.configs import RayExecutionConfig, RayJobSubmissionClientConfig
3130
from dagster_ray.core.run_launcher import RayRunLauncher
32-
from dagster_ray.kuberay.utils import get_k8s_object_name
33-
from dagster_ray.utils import resolve_env_vars_list
31+
from dagster_ray.utils import get_k8s_object_name, resolve_env_vars_list
3432

3533
if TYPE_CHECKING:
3634
from ray.job_submission import JobSubmissionClient
@@ -129,7 +127,7 @@ def name(self):
129127

130128
def __init__(
131129
self,
132-
client: JobSubmissionClient,
130+
client: "JobSubmissionClient",
133131
env_vars: list[str] | None,
134132
runtime_env: dict[str, Any] | None,
135133
num_cpus: float | None,

src/dagster_ray/kuberay/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from dagster_ray.kuberay.configs import RayClusterConfig, RayClusterSpec, RayJobConfig, RayJobSpec
2+
from dagster_ray.kuberay.executor import kuberay_executor
23
from dagster_ray.kuberay.jobs import cleanup_kuberay_clusters, delete_kuberay_clusters
34
from dagster_ray.kuberay.ops import cleanup_kuberay_clusters_op, delete_kuberay_clusters_op
45
from dagster_ray.kuberay.pipes import PipesKubeRayJobClient
@@ -8,6 +9,7 @@
89
KubeRayInteractiveJob,
910
KubeRayJobClientResource,
1011
)
12+
from dagster_ray.kuberay.run_launcher import KubeRayRunLauncher
1113
from dagster_ray.kuberay.schedules import cleanup_kuberay_clusters_daily
1214

1315
__all__ = [
@@ -25,4 +27,6 @@
2527
"RayJobSpec",
2628
"KubeRayInteractiveJob",
2729
"KubeRayJobClientResource",
30+
"kuberay_executor",
31+
"KubeRayRunLauncher",
2832
]

src/dagster_ray/kuberay/configs.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,11 @@ def namespace(self) -> str:
164164

165165
def to_k8s(
166166
self,
167-
context: AnyDagsterContext,
168167
image: str | None = None, # is injected into headgroup and workergroups, unless already specified there
169168
labels: Mapping[str, str] | None = None,
170169
annotations: Mapping[str, str] | None = None,
171170
env_vars: Mapping[str, str] | None = None,
172171
) -> dict[str, Any]:
173-
assert context.log is not None
174172
"""Convert into Kubernetes manifests in camelCase format and inject additional information"""
175173

176174
labels = labels or {}
@@ -186,7 +184,7 @@ def to_k8s(
186184
"annotations": {**self.metadata.get("annotations", {}), **annotations},
187185
}
188186
),
189-
"spec": self.spec.to_k8s(context=context, image=image, env_vars=env_vars),
187+
"spec": self.spec.to_k8s(image=image, env_vars=env_vars),
190188
}
191189

192190

@@ -216,7 +214,6 @@ class RayJobSpec(dg.PermissiveConfig):
216214

217215
def to_k8s(
218216
self,
219-
context: AnyDagsterContext,
220217
image: str | None = None, # is injected into headgroup and workergroups, unless already specified there
221218
env_vars: Mapping[str, str] | None = None,
222219
) -> dict[str, Any]:
@@ -240,7 +237,7 @@ def to_k8s(
240237
"ttlSecondsAfterFinished": self.ttl_seconds_after_finished,
241238
"shutdownAfterJobFinishes": self.shutdown_after_job_finishes,
242239
"suspend": self.suspend,
243-
"rayClusterSpec": self.ray_cluster_spec.to_k8s(context=context, image=image, env_vars=env_vars)
240+
"rayClusterSpec": self.ray_cluster_spec.to_k8s(image=image, env_vars=env_vars)
244241
if self.ray_cluster_spec is not None
245242
else None,
246243
}
@@ -262,7 +259,6 @@ def namespace(self) -> str:
262259

263260
def to_k8s(
264261
self,
265-
context: AnyDagsterContext,
266262
image: str | None = None, # is injected into headgroup and workergroups, unless already specified there
267263
labels: Mapping[str, str] | None = None,
268264
annotations: Mapping[str, str] | None = None,
@@ -284,7 +280,6 @@ def to_k8s(
284280
}
285281
),
286282
"spec": self.spec.to_k8s(
287-
context=context,
288283
image=image,
289284
env_vars=env_vars,
290285
),

0 commit comments

Comments
 (0)