Skip to content

Commit 1d77bed

Browse files
committed
Added local_interactive ingress support & fixed unit tests
1 parent 3addeb5 commit 1d77bed

File tree

4 files changed

+53
-34
lines changed

4 files changed

+53
-34
lines changed

src/codeflare_sdk/cluster/cluster.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -434,13 +434,12 @@ def get_cluster(cluster_name: str, namespace: str = "default"):
434434
def _get_ingress_domain():
435435
try:
436436
config.load_kube_config()
437-
api_client = client.CustomObjectsApi(api_config_handler())
438-
ingress = api_client.get_cluster_custom_object(
439-
"networking.k8s.io", "v1", "ingresses", "cluster"
440-
)
437+
api_client = client.NetworkingV1Api(api_config_handler())
438+
ingress = api_client.list_namespaced_ingress(get_current_namespace())
441439
except Exception as e: # pragma: no cover
442440
return _kube_api_error_handling(e)
443-
return ingress["spec"]["domain"]
441+
domain = ingress.items[1].spec.rules[0].host
442+
return domain
444443

445444

446445
def _app_wrapper_status(name, namespace="default") -> Optional[AppWrapper]:

src/codeflare_sdk/templates/base-template.yaml

+28-5
Original file line numberDiff line numberDiff line change
@@ -293,19 +293,42 @@ spec:
293293
kind: Ingress
294294
metadata:
295295
name: ray-dashboard-raytest
296-
namespace: opendatahub
296+
namespace: default
297297
spec:
298298
rules:
299-
- host: placeholder # Replace with your desired hostname or domain
299+
- host: placeholder
300300
http:
301301
paths:
302-
- path: / # Replace with the path you want to route to the service
302+
- path: /
303303
pathType: Prefix
304304
backend:
305305
service:
306-
name: raytest-head-svc # Replace with your service name
306+
name: raytest-head-svc
307307
port:
308-
number: 8265 # Replace with the service port
308+
number: 8265
309+
- replicas: 1
310+
generictemplate:
311+
apiVersion: networking.k8s.io/v1
312+
kind: Ingress
313+
metadata:
314+
name: rayclient-deployment-name
315+
namespace: default
316+
labels:
317+
odh-ray-cluster-service: deployment-name-head-svc
318+
spec:
319+
rules:
320+
- host: "localhost"
321+
http:
322+
paths:
323+
- path: /
324+
pathType: Prefix
325+
backend:
326+
service:
327+
name: raycluster-tls-head-svc
328+
port:
329+
number: 10001
330+
tls:
331+
termination: passthrough
309332
- replicas: 1
310333
generictemplate:
311334
apiVersion: v1

src/codeflare_sdk/utils/generate_yaml.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,9 @@ def update_dashboard_route(route_item, cluster_name, namespace):
4949
metadata["name"] = f"ray-dashboard-{cluster_name}"
5050
metadata["namespace"] = namespace
5151
spec = route_item.get("generictemplate", {}).get("spec")
52-
print(spec["rules"][0]["http"]["paths"][0]["backend"]["service"]["name"])
5352
spec["rules"][0]["http"]["paths"][0]["backend"]["service"][
5453
"name"
5554
] = f"{cluster_name}-head-svc"
56-
print(spec["rules"][0]["http"]["paths"][0]["backend"]["service"]["name"])
5755
try:
5856
config_check()
5957
api_client = client.CustomObjectsApi(api_config_handler())
@@ -73,7 +71,9 @@ def update_rayclient_route(route_item, cluster_name, namespace):
7371
metadata["namespace"] = namespace
7472
metadata["labels"]["odh-ray-cluster-service"] = f"{cluster_name}-head-svc"
7573
spec = route_item.get("generictemplate", {}).get("spec")
76-
spec["to"]["name"] = f"{cluster_name}-head-svc"
74+
spec["rules"][0]["http"]["paths"][0]["backend"]["service"][
75+
"name"
76+
] = f"{cluster_name}-head-svc"
7777

7878

7979
def update_names(yaml, item, appwrapper_name, cluster_name, namespace):
@@ -267,7 +267,7 @@ def enable_local_interactive(resources, cluster_name, namespace):
267267
config.load_kube_config()
268268
api_client = client.CustomObjectsApi(api_config_handler())
269269
ingress = api_client.get_cluster_custom_object(
270-
"config.openshift.io", "v1", "ingresses", "cluster"
270+
"networking.k8s.io", "v1", "ingresses", "cluster"
271271
)
272272
except Exception as e: # pragma: no cover
273273
return _kube_api_error_handling(e)

tests/unit_test.py

+17-20
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,10 @@ def test_cluster_uris(mocker):
334334
"kubernetes.client.CustomObjectsApi.get_cluster_custom_object",
335335
return_value={"spec": {"domain": ""}},
336336
)
337+
mocker.patch(
338+
"codeflare_sdk.cluster.cluster._get_ingress_domain",
339+
return_value="apps.cluster.awsroute.org",
340+
)
337341
mocker.patch(
338342
"kubernetes.client.NetworkingV1Api.list_namespaced_ingress",
339343
return_value=ingress_retrieval(),
@@ -382,37 +386,30 @@ def ray_addr(self, *args):
382386

383387
def ingress_retrieval():
384388
mock_ingress = client.V1Ingress(
385-
metadata={"name": "mock-ingress-1"},
386-
spec={
387-
"rules": [
388-
{
389-
"host": "ray-dashboard-unit-test-cluster-ns.apps.cluster.awsroute.org",
390-
"http": {
391-
"paths": [
392-
{
393-
"path": "/",
394-
"backend": {
395-
"service_name": "unit-test-cluster-head-svc"
396-
},
397-
}
398-
]
399-
},
400-
}
401-
]
402-
},
389+
metadata=client.V1ObjectMeta(name="ray-dashboard-unit-test-cluster"),
390+
spec=client.V1IngressSpec(
391+
rules=[
392+
client.V1IngressRule(
393+
host="ray-dashboard-unit-test-cluster-ns.apps.cluster.awsroute.org"
394+
)
395+
],
396+
),
403397
)
404398
mock_ingress_list = client.V1IngressList(items=[mock_ingress])
405399
return mock_ingress_list
406400

407401

408402
def test_ray_job_wrapping(mocker):
409-
mocker.patch("kubernetes.config.load_kube_config", return_value="ignore")
410403
mocker.patch(
411404
"kubernetes.client.CustomObjectsApi.get_cluster_custom_object",
412405
return_value={"spec": {"domain": ""}},
413406
)
414407
cluster = test_cluster_creation(mocker)
415-
408+
mocker.patch("kubernetes.config.load_kube_config", return_value="ignore")
409+
mocker.patch(
410+
"kubernetes.client.NetworkingV1Api.list_namespaced_ingress",
411+
return_value=ingress_retrieval(),
412+
)
416413
mocker.patch(
417414
"ray.job_submission.JobSubmissionClient._check_connection_and_version_with_url",
418415
return_value="None",

0 commit comments

Comments
 (0)