29
29
from base64 import b64encode
30
30
from urllib3 .util import parse_url
31
31
32
- from kubernetes import client , config
33
-
34
32
from .kube_api_helpers import _get_api_host
35
33
36
34
@@ -56,26 +54,23 @@ def gen_dashboard_ingress_name(cluster_name):
56
54
return f"ray-dashboard-{ cluster_name } "
57
55
58
56
59
- # Check if the ingress api cluster resource exists
57
+ # Check if the routes api exists
60
58
def is_openshift_cluster ():
61
59
try :
62
60
config_check ()
63
- api_instance = client .CustomObjectsApi (api_config_handler ())
64
- api_instance .get_cluster_custom_object (
65
- "config.openshift.io" , "v1" , "ingresses" , "cluster"
66
- )
67
-
68
- return True
69
- except client .ApiException as e : # pragma: no cover
70
- if e .status == 404 or e .status == 403 :
71
- return False
61
+ for api in client .ApisApi (api_config_handler ()).get_api_versions ().groups :
62
+ for v in api .versions :
63
+ if "route.openshift.io/v1" in v .group_version :
64
+ return True
72
65
else :
73
- print (f"Error detecting cluster type defaulting to Kubernetes: { e } " )
74
66
return False
67
+ except client .ApiException as e : # pragma: no cover
68
+ print (f"Error detecting cluster type defaulting to Kubernetes: { e } " )
69
+ return False
75
70
76
71
77
72
def update_dashboard_ingress (
78
- ingress_item , cluster_name , namespace , ingress_options , ingress_domain
73
+ ingress_item , cluster_name , namespace , ingress_options , domain_name
79
74
): # pragma: no cover
80
75
metadata = ingress_item .get ("generictemplate" , {}).get ("metadata" )
81
76
spec = ingress_item .get ("generictemplate" , {}).get ("spec" )
@@ -123,34 +118,26 @@ def update_dashboard_ingress(
123
118
"name"
124
119
] = f"{ cluster_name } -head-svc"
125
120
else :
121
+ if is_openshift_cluster ():
122
+ spec ["ingressClassName" ] = "openshift-default"
123
+ else :
124
+ spec ["ingressClassName" ] = "nginx"
125
+
126
126
metadata ["name" ] = f"ray-dashboard-{ cluster_name } "
127
127
metadata ["namespace" ] = namespace
128
128
spec ["rules" ][0 ]["http" ]["paths" ][0 ]["backend" ]["service" ][
129
129
"name"
130
130
] = f"{ cluster_name } -head-svc"
131
- if is_openshift_cluster ():
132
- try :
133
- config_check ()
134
- api_client = client .CustomObjectsApi (api_config_handler ())
135
- ingress = api_client .get_cluster_custom_object (
136
- "config.openshift.io" , "v1" , "ingresses" , "cluster"
137
- )
138
- del spec ["ingressClassName" ]
139
- except Exception as e : # pragma: no cover
140
- return _kube_api_error_handling (e )
141
- domain = ingress ["spec" ]["domain" ]
142
- elif ingress_domain is None :
143
- raise ValueError (
144
- "ingress_domain is invalid. For Kubernetes Clusters please specify an ingress domain"
145
- )
131
+ if domain_name is None :
132
+ raise ValueError ("domain_name is invalid. Please specify an ingress domain" )
146
133
else :
147
- domain = ingress_domain
134
+ domain = domain_name
148
135
del metadata ["annotations" ]
149
136
spec ["rules" ][0 ]["host" ] = f"ray-dashboard-{ cluster_name } -{ namespace } .{ domain } "
150
137
151
138
152
139
def update_rayclient_ingress (
153
- ingress_item , cluster_name , namespace , ingress_domain
140
+ ingress_item , cluster_name , namespace , domain_name
154
141
): # pragma: no cover
155
142
metadata = ingress_item .get ("generictemplate" , {}).get ("metadata" )
156
143
spec = ingress_item .get ("generictemplate" , {}).get ("spec" )
@@ -162,38 +149,27 @@ def update_rayclient_ingress(
162
149
"name"
163
150
] = f"{ cluster_name } -head-svc"
164
151
165
- if is_openshift_cluster ():
166
- try :
167
- config_check ()
168
- api_client = client .CustomObjectsApi (api_config_handler ())
169
- ingress = api_client .get_cluster_custom_object (
170
- "config.openshift.io" , "v1" , "ingresses" , "cluster"
171
- )
152
+ if domain_name is not None :
153
+ if is_openshift_cluster ():
172
154
ingressClassName = "openshift-default"
173
155
annotations = {
174
156
"nginx.ingress.kubernetes.io/rewrite-target" : "/" ,
175
157
"nginx.ingress.kubernetes.io/ssl-redirect" : "true" ,
176
158
"route.openshift.io/termination" : "passthrough" ,
177
159
}
178
- except Exception as e : # pragma: no cover
179
- return _kube_api_error_handling ( e )
180
- domain = ingress [ "spec" ][ "domain" ]
181
- elif ingress_domain is None :
182
- raise ValueError (
183
- "ingress_domain is invalid. For Kubernetes Clusters please specify an ingress domain"
184
- )
160
+ else :
161
+ ingressClassName = "nginx"
162
+ annotations = {
163
+ "nginx.ingress.kubernetes.io/rewrite-target" : "/" ,
164
+ "nginx.ingress.kubernetes.io/ssl-redirect" : "true" ,
165
+ "nginx. ingress.kubernetes.io/ssl-passthrough" : "true" ,
166
+ }
185
167
else :
186
- domain = ingress_domain
187
- ingressClassName = "nginx"
188
- annotations = {
189
- "nginx.ingress.kubernetes.io/rewrite-target" : "/" ,
190
- "nginx.ingress.kubernetes.io/ssl-redirect" : "true" ,
191
- "nginx.ingress.kubernetes.io/ssl-passthrough" : "true" ,
192
- }
168
+ raise ValueError ("domain_name is invalid. Please specify a domain" )
193
169
194
170
metadata ["annotations" ] = annotations
195
171
spec ["ingressClassName" ] = ingressClassName
196
- spec ["rules" ][0 ]["host" ] = f"rayclient-{ cluster_name } -{ namespace } .{ domain } "
172
+ spec ["rules" ][0 ]["host" ] = f"rayclient-{ cluster_name } -{ namespace } .{ domain_name } "
197
173
198
174
199
175
def update_names (yaml , item , appwrapper_name , cluster_name , namespace ):
@@ -396,7 +372,7 @@ def update_ca_secret(ca_secret_item, cluster_name, namespace):
396
372
data ["ca.key" ], data ["ca.crt" ] = generate_cert .generate_ca_cert (365 )
397
373
398
374
399
- def enable_local_interactive (resources , cluster_name , namespace , ingress_domain ):
375
+ def enable_local_interactive (resources , cluster_name , namespace , domain_name ):
400
376
rayclient_ingress_item = resources ["resources" ].get ("GenericItems" )[2 ]
401
377
ca_secret_item = resources ["resources" ].get ("GenericItems" )[3 ]
402
378
item = resources ["resources" ].get ("GenericItems" )[0 ]
@@ -422,23 +398,12 @@ def enable_local_interactive(resources, cluster_name, namespace, ingress_domain)
422
398
423
399
command = command .replace ("deployment-name" , cluster_name )
424
400
425
- if is_openshift_cluster ():
426
- # We can try get the domain through checking ingresses.config.openshift.io
427
- try :
428
- config_check ()
429
- api_client = client .CustomObjectsApi (api_config_handler ())
430
- ingress = api_client .get_cluster_custom_object (
431
- "config.openshift.io" , "v1" , "ingresses" , "cluster"
432
- )
433
- except Exception as e : # pragma: no cover
434
- return _kube_api_error_handling (e )
435
- domain = ingress ["spec" ]["domain" ]
436
- elif ingress_domain is None :
401
+ if domain_name is None :
437
402
raise ValueError (
438
- "ingress_domain is invalid. For Kubernetes Clusters please specify an ingress domain"
403
+ "domain_name is invalid. For Kubernetes Clusters please specify an ingress domain"
439
404
)
440
405
else :
441
- domain = ingress_domain
406
+ domain = domain_name
442
407
443
408
command = command .replace ("server-name" , domain )
444
409
update_rayclient_ingress (rayclient_ingress_item , cluster_name , namespace , domain )
@@ -618,7 +583,7 @@ def generate_appwrapper(
618
583
dispatch_priority : str ,
619
584
priority_val : int ,
620
585
openshift_oauth : bool ,
621
- ingress_domain : str ,
586
+ domain_name : str ,
622
587
ingress_options : dict ,
623
588
):
624
589
user_yaml = read_template (template )
@@ -659,10 +624,10 @@ def generate_appwrapper(
659
624
head_gpus ,
660
625
)
661
626
update_dashboard_ingress (
662
- ingress_item , cluster_name , namespace , ingress_options , ingress_domain
627
+ ingress_item , cluster_name , namespace , ingress_options , domain_name
663
628
)
664
629
if local_interactive :
665
- enable_local_interactive (resources , cluster_name , namespace , ingress_domain )
630
+ enable_local_interactive (resources , cluster_name , namespace , domain_name )
666
631
else :
667
632
disable_raycluster_tls (resources ["resources" ])
668
633
0 commit comments