@@ -49,10 +49,6 @@ def gen_names(name):
49
49
return name , name
50
50
51
51
52
- def gen_dashboard_ingress_name (cluster_name ):
53
- return f"ray-dashboard-{ cluster_name } "
54
-
55
-
56
52
# Check if the routes api exists
57
53
def is_openshift_cluster ():
58
54
try :
@@ -67,156 +63,17 @@ def is_openshift_cluster():
67
63
return _kube_api_error_handling (e )
68
64
69
65
70
- def update_dashboard_route (route_item , cluster_name , namespace ):
71
- metadata = route_item .get ("generictemplate" , {}).get ("metadata" )
72
- metadata ["name" ] = gen_dashboard_ingress_name (cluster_name )
73
- metadata ["namespace" ] = namespace
74
- metadata ["labels" ]["odh-ray-cluster-service" ] = f"{ cluster_name } -head-svc"
75
- spec = route_item .get ("generictemplate" , {}).get ("spec" )
76
- spec ["to" ]["name" ] = f"{ cluster_name } -head-svc"
77
-
78
-
79
- # ToDo: refactor the update_x_route() functions
80
- def update_rayclient_route (route_item , cluster_name , namespace ):
81
- metadata = route_item .get ("generictemplate" , {}).get ("metadata" )
82
- metadata ["name" ] = f"rayclient-{ cluster_name } "
83
- metadata ["namespace" ] = namespace
84
- metadata ["labels" ]["odh-ray-cluster-service" ] = f"{ cluster_name } -head-svc"
85
- spec = route_item .get ("generictemplate" , {}).get ("spec" )
86
- spec ["to" ]["name" ] = f"{ cluster_name } -head-svc"
87
-
88
-
89
- def update_dashboard_exposure (
90
- ingress_item , route_item , cluster_name , namespace , ingress_options , ingress_domain
91
- ):
92
- if is_openshift_cluster ():
93
- update_dashboard_route (route_item , cluster_name , namespace )
94
- else :
95
- update_dashboard_ingress (
96
- ingress_item , cluster_name , namespace , ingress_options , ingress_domain
97
- )
98
-
99
-
100
- def update_rayclient_exposure (
101
- client_route_item , client_ingress_item , cluster_name , namespace , ingress_domain
102
- ):
103
- if is_openshift_cluster ():
104
- update_rayclient_route (client_route_item , cluster_name , namespace )
105
- else :
106
- update_rayclient_ingress (
107
- client_ingress_item , cluster_name , namespace , ingress_domain
108
- )
109
-
110
-
111
- def update_dashboard_ingress (
112
- ingress_item , cluster_name , namespace , ingress_options , ingress_domain
113
- ): # pragma: no cover
114
- metadata = ingress_item .get ("generictemplate" , {}).get ("metadata" )
115
- spec = ingress_item .get ("generictemplate" , {}).get ("spec" )
116
- if ingress_options != {}:
117
- for index , ingress_option in enumerate (ingress_options ["ingresses" ]):
118
- if "ingressName" not in ingress_option .keys ():
119
- raise ValueError (
120
- f"Error: 'ingressName' is missing or empty for ingress item at index { index } "
121
- )
122
- if "port" not in ingress_option .keys ():
123
- raise ValueError (
124
- f"Error: 'port' is missing or empty for ingress item at index { index } "
125
- )
126
- elif not isinstance (ingress_option ["port" ], int ):
127
- raise ValueError (
128
- f"Error: 'port' is not of type int for ingress item at index { index } "
129
- )
130
- if ingress_option is not None :
131
- metadata ["name" ] = ingress_option ["ingressName" ]
132
- metadata ["namespace" ] = namespace
133
- metadata ["labels" ]["ingress-owner" ] = cluster_name
134
- metadata ["labels" ]["ingress-options" ] = "true"
135
- if (
136
- "annotations" not in ingress_option .keys ()
137
- or ingress_option ["annotations" ] is None
138
- ):
139
- del metadata ["annotations" ]
140
- else :
141
- metadata ["annotations" ] = ingress_option ["annotations" ]
142
- if (
143
- "path" not in ingress_option .keys ()
144
- or ingress_option ["path" ] is None
145
- ):
146
- del spec ["rules" ][0 ]["http" ]["paths" ][0 ]["path" ]
147
- else :
148
- spec ["rules" ][0 ]["http" ]["paths" ][0 ]["path" ] = ingress_option [
149
- "path"
150
- ]
151
- if (
152
- "pathType" not in ingress_option .keys ()
153
- or ingress_option ["pathType" ] is None
154
- ):
155
- spec ["rules" ][0 ]["http" ]["paths" ][0 ][
156
- "pathType"
157
- ] = "ImplementationSpecific"
158
- if (
159
- "host" not in ingress_option .keys ()
160
- or ingress_option ["host" ] is None
161
- ):
162
- del spec ["rules" ][0 ]["host" ]
163
- else :
164
- spec ["rules" ][0 ]["host" ] = ingress_option ["host" ]
165
- if (
166
- "ingressClassName" not in ingress_option .keys ()
167
- or ingress_option ["ingressClassName" ] is None
168
- ):
169
- del spec ["ingressClassName" ]
170
- else :
171
- spec ["ingressClassName" ] = ingress_option ["ingressClassName" ]
172
-
173
- spec ["rules" ][0 ]["http" ]["paths" ][0 ]["backend" ]["service" ][
174
- "name"
175
- ] = f"{ cluster_name } -head-svc"
176
- else :
177
- spec ["ingressClassName" ] = "nginx"
178
- metadata ["name" ] = gen_dashboard_ingress_name (cluster_name )
179
- metadata ["labels" ]["ingress-owner" ] = cluster_name
180
- metadata ["namespace" ] = namespace
181
- spec ["rules" ][0 ]["http" ]["paths" ][0 ]["backend" ]["service" ][
182
- "name"
183
- ] = f"{ cluster_name } -head-svc"
184
- if ingress_domain is None :
185
- raise ValueError (
186
- "ingress_domain is invalid. Please specify an ingress domain"
187
- )
188
- else :
189
- domain = ingress_domain
190
- del metadata ["annotations" ]
191
- spec ["rules" ][0 ]["host" ] = f"ray-dashboard-{ cluster_name } -{ namespace } .{ domain } "
192
-
193
-
194
- def update_rayclient_ingress (
195
- ingress_item , cluster_name , namespace , ingress_domain
196
- ): # pragma: no cover
197
- metadata = ingress_item .get ("generictemplate" , {}).get ("metadata" )
198
- spec = ingress_item .get ("generictemplate" , {}).get ("spec" )
199
- metadata ["name" ] = f"rayclient-{ cluster_name } "
200
- metadata ["namespace" ] = namespace
201
- metadata ["labels" ]["odh-ray-cluster-service" ] = f"{ cluster_name } -head-svc"
202
-
203
- spec ["rules" ][0 ]["http" ]["paths" ][0 ]["backend" ]["service" ][
204
- "name"
205
- ] = f"{ cluster_name } -head-svc"
206
-
207
- if ingress_domain is not None :
208
- ingressClassName = "nginx"
209
- annotations = {
210
- "nginx.ingress.kubernetes.io/rewrite-target" : "/" ,
211
- "nginx.ingress.kubernetes.io/ssl-redirect" : "true" ,
212
- "nginx.ingress.kubernetes.io/ssl-passthrough" : "true" ,
213
- }
214
- else :
215
- raise ValueError ("ingress_domain is invalid. Please specify a domain" )
216
-
217
- metadata ["annotations" ] = annotations
218
- spec ["ingressClassName" ] = ingressClassName
219
- spec ["rules" ][0 ]["host" ] = f"rayclient-{ cluster_name } -{ namespace } .{ ingress_domain } "
66
+ def is_kind_cluster ():
67
+ try :
68
+ config_check ()
69
+ v1 = client .CoreV1Api ()
70
+ label_selector = "kubernetes.io/hostname=kind-control-plane"
71
+ nodes = v1 .list_node (label_selector = label_selector )
72
+ # If we find one or more nodes with the label, assume it's a KinD cluster
73
+ return len (nodes .items ) > 0
74
+ except Exception as e :
75
+ print (f"Error checking if cluster is KinD: { e } " )
76
+ return False
220
77
221
78
222
79
def update_names (yaml , item , appwrapper_name , cluster_name , namespace ):
@@ -433,10 +290,10 @@ def update_ca_secret(ca_secret_item, cluster_name, namespace):
433
290
data ["ca.key" ], data ["ca.crt" ] = generate_cert .generate_ca_cert (365 )
434
291
435
292
436
- def enable_local_interactive (resources , cluster_name , namespace , ingress_domain ):
437
- rayclient_ingress_item = resources [ "resources" ]. get ( "GenericItems" )[ 3 ]
438
- rayclient_route_item = resources [ "resources" ]. get ( "GenericItems" )[ 4 ]
439
- ca_secret_item = resources ["resources" ].get ("GenericItems" )[5 ]
293
+ def enable_local_interactive (resources , cluster_name , namespace ): # pragma: no cover
294
+ from .. cluster . cluster import _get_ingress_domain
295
+
296
+ ca_secret_item = resources ["resources" ].get ("GenericItems" )[1 ]
440
297
item = resources ["resources" ].get ("GenericItems" )[0 ]
441
298
update_ca_secret (ca_secret_item , cluster_name , namespace )
442
299
# update_ca_secret_volumes
@@ -460,40 +317,18 @@ def enable_local_interactive(resources, cluster_name, namespace, ingress_domain)
460
317
461
318
command = command .replace ("deployment-name" , cluster_name )
462
319
463
- if ingress_domain is None :
464
- raise ValueError (
465
- "ingress_domain is invalid. For creating the client route/ingress please specify an ingress domain"
466
- )
467
- else :
468
- domain = ingress_domain
320
+ domain = "" ## FIX - We can't retrieve ingress domain - move init container to CFO
469
321
470
322
command = command .replace ("server-name" , domain )
471
- update_rayclient_exposure (
472
- rayclient_route_item ,
473
- rayclient_ingress_item ,
474
- cluster_name ,
475
- namespace ,
476
- ingress_domain ,
477
- )
478
323
item ["generictemplate" ]["metadata" ]["annotations" ][
479
324
"sdk.codeflare.dev/local_interactive"
480
325
] = "True"
481
- item ["generictemplate" ]["metadata" ]["annotations" ][
482
- "sdk.codeflare.dev/ingress_domain"
483
- ] = ingress_domain
484
326
485
327
item ["generictemplate" ]["spec" ]["headGroupSpec" ]["template" ]["spec" ][
486
328
"initContainers"
487
329
][0 ].get ("command" )[2 ] = command
488
330
489
331
490
- def apply_ingress_domain_annotation (resources , ingress_domain ):
491
- item = resources ["resources" ].get ("GenericItems" )[0 ]
492
- item ["generictemplate" ]["metadata" ]["annotations" ][
493
- "sdk.codeflare.dev/ingress_domain"
494
- ] = ingress_domain
495
-
496
-
497
332
def del_from_list_by_name (l : list , target : typing .List [str ]) -> list :
498
333
return [x for x in l if x ["name" ] not in target ]
499
334
@@ -544,26 +379,6 @@ def disable_raycluster_tls(resources):
544
379
resources ["GenericItems" ] = updated_items
545
380
546
381
547
- def delete_route_or_ingress (resources ):
548
- if is_openshift_cluster ():
549
- client_to_remove_name = "rayclient-deployment-ingress"
550
- dashboard_to_remove_name = "ray-dashboard-deployment-ingress"
551
- else :
552
- client_to_remove_name = "rayclient-deployment-route"
553
- dashboard_to_remove_name = "ray-dashboard-deployment-route"
554
-
555
- updated_items = []
556
- for i in resources ["GenericItems" ][:]:
557
- if dashboard_to_remove_name in i ["generictemplate" ]["metadata" ]["name" ]:
558
- continue
559
- elif client_to_remove_name in i ["generictemplate" ]["metadata" ]["name" ]:
560
- continue
561
-
562
- updated_items .append (i )
563
-
564
- resources ["GenericItems" ] = updated_items
565
-
566
-
567
382
def write_user_appwrapper (user_yaml , output_file_name ):
568
383
# Create the directory if it doesn't exist
569
384
directory_path = os .path .dirname (output_file_name )
@@ -602,7 +417,6 @@ def enable_openshift_oauth(user_yaml, cluster_name, namespace):
602
417
ray_headgroup_pod = user_yaml ["spec" ]["resources" ]["GenericItems" ][0 ][
603
418
"generictemplate"
604
419
]["spec" ]["headGroupSpec" ]["template" ]["spec" ]
605
- user_yaml ["spec" ]["resources" ]["GenericItems" ].pop (1 )
606
420
ray_headgroup_pod ["serviceAccount" ] = oauth_sa_name
607
421
ray_headgroup_pod ["volumes" ] = ray_headgroup_pod .get ("volumes" , [])
608
422
@@ -707,18 +521,20 @@ def generate_appwrapper(
707
521
image_pull_secrets : list ,
708
522
dispatch_priority : str ,
709
523
priority_val : int ,
710
- ingress_domain : str ,
711
- ingress_options : dict ,
712
524
write_to_file : bool ,
713
525
verify_tls : bool ,
714
526
):
715
527
user_yaml = read_template (template )
716
528
appwrapper_name , cluster_name = gen_names (name )
717
529
resources = user_yaml .get ("spec" , "resources" )
718
530
item = resources ["resources" ].get ("GenericItems" )[0 ]
719
- ingress_item = resources ["resources" ].get ("GenericItems" )[1 ]
720
- route_item = resources ["resources" ].get ("GenericItems" )[2 ]
721
- update_names (user_yaml , item , appwrapper_name , cluster_name , namespace )
531
+ update_names (
532
+ user_yaml ,
533
+ item ,
534
+ appwrapper_name ,
535
+ cluster_name ,
536
+ namespace ,
537
+ )
722
538
update_labels (user_yaml , instascale , instance_types )
723
539
update_priority (user_yaml , item , dispatch_priority , priority_val )
724
540
update_custompodresources (
@@ -750,24 +566,12 @@ def generate_appwrapper(
750
566
head_memory ,
751
567
head_gpus ,
752
568
)
753
- update_dashboard_exposure (
754
- ingress_item ,
755
- route_item ,
756
- cluster_name ,
757
- namespace ,
758
- ingress_options ,
759
- ingress_domain ,
760
- )
761
- if ingress_domain is not None :
762
- apply_ingress_domain_annotation (resources , ingress_domain )
763
569
764
570
if local_interactive :
765
- enable_local_interactive (resources , cluster_name , namespace , ingress_domain )
571
+ enable_local_interactive (resources , cluster_name , namespace )
766
572
else :
767
573
disable_raycluster_tls (resources ["resources" ])
768
574
769
- delete_route_or_ingress (resources ["resources" ])
770
-
771
575
if is_openshift_cluster ():
772
576
enable_openshift_oauth (user_yaml , cluster_name , namespace )
773
577
0 commit comments