Skip to content

Commit 56c1d12

Browse files
Fixed get_cluster() method
1 parent 3ed1b42 commit 56c1d12

File tree

7 files changed

+81
-20
lines changed

7 files changed

+81
-20
lines changed

src/codeflare_sdk/cluster/cluster.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@ def torchx_config(
492492
to_return["requirements"] = requirements
493493
return to_return
494494

495-
def from_k8_cluster_object(rc, mcad=True):
495+
def from_k8_cluster_object(rc, mcad=True, ingress_domain=None):
496496
machine_types = (
497497
rc["metadata"]["labels"]["orderedinstance"].split("_")
498498
if "orderedinstance" in rc["metadata"]["labels"]
@@ -532,6 +532,7 @@ def from_k8_cluster_object(rc, mcad=True):
532532
]["image"],
533533
local_interactive=local_interactive,
534534
mcad=mcad,
535+
ingress_domain=ingress_domain,
535536
)
536537
return Cluster(cluster_config)
537538

@@ -685,7 +686,29 @@ def get_cluster(cluster_name: str, namespace: str = "default"):
685686
for rc in rcs["items"]:
686687
if rc["metadata"]["name"] == cluster_name:
687688
mcad = _check_aw_exists(cluster_name, namespace)
688-
return Cluster.from_k8_cluster_object(rc, mcad=mcad)
689+
690+
try:
691+
config_check()
692+
api_instance = client.NetworkingV1Api(api_config_handler())
693+
ingresses = api_instance.list_namespaced_ingress(namespace)
694+
if mcad == True:
695+
for ingress in ingresses.items:
696+
# Search for ingress with AppWrapper name as the owner
697+
if cluster_name == ingress.metadata.owner_references[0].name:
698+
ingress_host = ingress.spec.rules[0].host
699+
else:
700+
for ingress in ingresses.items:
701+
# Search for the ingress with the ingress-owner label
702+
if ingress.metadata.labels["ingress-owner"] == cluster_name:
703+
ingress_host = ingress.spec.rules[0].host
704+
except Exception as e:
705+
return _kube_api_error_handling(e)
706+
707+
# We gather the ingress domain from the host
708+
ingress_domain = ingress_host.split(".", 1)[1]
709+
return Cluster.from_k8_cluster_object(
710+
rc, mcad=mcad, ingress_domain=ingress_domain
711+
)
689712
raise FileNotFoundError(
690713
f"Cluster {cluster_name} is not found in {namespace} namespace"
691714
)

src/codeflare_sdk/templates/base-template.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,8 @@ spec:
293293
namespace: default
294294
annotations:
295295
annotations-example:annotations-example
296+
labels:
297+
ingress-owner: appwrapper-name
296298
spec:
297299
ingressClassName: nginx
298300
rules:

src/codeflare_sdk/utils/generate_yaml.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,10 @@ def update_dashboard_ingress(
129129
raise ValueError(
130130
f"Error: 'port' is not of type int for ingress item at index {index}"
131131
)
132-
if ingress_option["port"] == 8265:
132+
if ingress_option is not None:
133133
metadata["name"] = ingress_option["ingressName"]
134134
metadata["namespace"] = namespace
135+
metadata["labels"]["ingress-owner"] = cluster_name
135136
if "annotations" not in ingress_option.keys():
136137
del metadata["annotations"]
137138
else:
@@ -161,6 +162,7 @@ def update_dashboard_ingress(
161162
else:
162163
spec["ingressClassName"] = "nginx"
163164
metadata["name"] = gen_dashboard_ingress_name(cluster_name)
165+
metadata["labels"]["ingress-owner"] = cluster_name
164166
metadata["namespace"] = namespace
165167
spec["rules"][0]["http"]["paths"][0]["backend"]["service"][
166168
"name"

tests/test-case-no-mcad.yamls

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ spec:
142142
apiVersion: networking.k8s.io/v1
143143
kind: Ingress
144144
metadata:
145+
labels:
146+
ingress-owner: unit-test-cluster-ray
145147
name: ray-dashboard-unit-test-cluster-ray
146148
namespace: ns
147149
spec:

tests/test-case-prio.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ spec:
175175
apiVersion: networking.k8s.io/v1
176176
kind: Ingress
177177
metadata:
178+
labels:
179+
ingress-owner: prio-test-cluster
178180
name: ray-dashboard-prio-test-cluster
179181
namespace: ns
180182
spec:

tests/test-case.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,8 @@ spec:
172172
apiVersion: networking.k8s.io/v1
173173
kind: Ingress
174174
metadata:
175+
labels:
176+
ingress-owner: unit-test-cluster
175177
name: ray-dashboard-unit-test-cluster
176178
namespace: ns
177179
spec:

tests/unit_test.py

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ def arg_check_apply_effect(group, version, namespace, plural, body, *args):
397397
with open(f"{aw_dir}unit-test-cluster-ray.yaml") as f:
398398
yamls = yaml.load_all(f, Loader=yaml.FullLoader)
399399
for resource in yamls:
400-
if resource["kind"] == "Route":
400+
if resource["kind"] == "Ingress":
401401
assert body == resource
402402
else:
403403
assert 1 == 0
@@ -414,8 +414,8 @@ def arg_check_del_effect(group, version, namespace, plural, name, *args):
414414
assert group == "ray.io"
415415
assert version == "v1alpha1"
416416
assert name == "unit-test-cluster-ray"
417-
elif plural == "routes":
418-
assert group == "route.openshift.io"
417+
elif plural == "ingresses":
418+
assert group == "networking.k8s.io"
419419
assert version == "v1"
420420
assert name == "ray-dashboard-unit-test-cluster-ray"
421421

@@ -623,7 +623,13 @@ def ingress_retrieval(port, annotations=None):
623623
serviceName = "dashboard"
624624
mock_ingress = client.V1Ingress(
625625
metadata=client.V1ObjectMeta(
626-
name=f"ray-{serviceName}-unit-test-cluster", annotations=annotations
626+
name=f"ray-{serviceName}-unit-test-cluster",
627+
annotations=annotations,
628+
owner_references=[
629+
client.V1OwnerReference(
630+
api_version="v1", kind="Ingress", name="quicktest", uid="unique-id"
631+
)
632+
],
627633
),
628634
spec=client.V1IngressSpec(
629635
rules=[
@@ -1148,6 +1154,11 @@ def get_ray_obj(group, version, namespace, plural, cls=None):
11481154
return api_obj
11491155

11501156

1157+
def get_named_aw(group, version, namespace, plural, name):
1158+
aws = get_aw_obj("workload.codeflare.dev", "v1beta1", "ns", "appwrappers")
1159+
return aws["items"][0]
1160+
1161+
11511162
def get_aw_obj(group, version, namespace, plural):
11521163
api_obj1 = {
11531164
"items": [
@@ -1403,21 +1414,34 @@ def get_aw_obj(group, version, namespace, plural):
14031414
{
14041415
"allocated": 0,
14051416
"generictemplate": {
1406-
"apiVersion": "route.openshift.io/v1",
1407-
"kind": "Route",
1417+
"apiVersion": "networking.k8s.io/v1",
1418+
"kind": "Ingress",
14081419
"metadata": {
1409-
"labels": {
1410-
"odh-ray-cluster-service": "quicktest-head-svc"
1411-
},
1420+
"labels": {"ingress-owner": "appwrapper-name"},
14121421
"name": "ray-dashboard-quicktest",
14131422
"namespace": "default",
14141423
},
14151424
"spec": {
1416-
"port": {"targetPort": "dashboard"},
1417-
"to": {
1418-
"kind": "Service",
1419-
"name": "quicktest-head-svc",
1420-
},
1425+
"ingressClassName": "nginx",
1426+
"rules": [
1427+
{
1428+
"http": {
1429+
"paths": {
1430+
"backend": {
1431+
"service": {
1432+
"name": "quicktest-head-svc",
1433+
"port": {
1434+
"number": 8265
1435+
},
1436+
},
1437+
},
1438+
"pathType": "Prefix",
1439+
"path": "/",
1440+
},
1441+
},
1442+
"host": "quicktest.awsroute.com",
1443+
}
1444+
],
14211445
},
14221446
},
14231447
"metadata": {},
@@ -1788,10 +1812,14 @@ def test_get_cluster(mocker):
17881812
side_effect=get_ray_obj,
17891813
)
17901814
mocker.patch(
1791-
"codeflare_sdk.utils.generate_yaml.is_openshift_cluster",
1792-
return_value=True,
1815+
"kubernetes.client.CustomObjectsApi.get_namespaced_custom_object",
1816+
side_effect=get_named_aw,
1817+
)
1818+
mocker.patch(
1819+
"kubernetes.client.NetworkingV1Api.list_namespaced_ingress",
1820+
return_value=ingress_retrieval(port=8265),
17931821
)
1794-
cluster = get_cluster(cluster_name="quicktest")
1822+
cluster = get_cluster("quicktest")
17951823
cluster_config = cluster.config
17961824
assert cluster_config.name == "quicktest" and cluster_config.namespace == "ns"
17971825
assert (

0 commit comments

Comments
 (0)