@@ -73,9 +73,7 @@ def __init__(self, config: ClusterConfiguration):
73
73
self .config = config
74
74
self .app_wrapper_yaml = self .create_app_wrapper ()
75
75
self ._job_submission_client = None
76
- self .app_wrapper_name = self .app_wrapper_yaml .replace (".yaml" , "" ).split ("/" )[
77
- - 1
78
- ]
76
+ self .app_wrapper_name = self .config .name
79
77
80
78
@property
81
79
def _client_headers (self ):
@@ -192,6 +190,7 @@ def create_app_wrapper(self):
192
190
dispatch_priority = self .config .dispatch_priority
193
191
ingress_domain = self .config .ingress_domain
194
192
ingress_options = self .config .ingress_options
193
+ write_to_file = self .config .write_to_file
195
194
return generate_appwrapper (
196
195
name = name ,
197
196
namespace = namespace ,
@@ -217,6 +216,7 @@ def create_app_wrapper(self):
217
216
openshift_oauth = self .config .openshift_oauth ,
218
217
ingress_domain = ingress_domain ,
219
218
ingress_options = ingress_options ,
219
+ write_to_file = write_to_file ,
220
220
)
221
221
222
222
# creates a new cluster with the provided or default spec
@@ -235,15 +235,25 @@ def up(self):
235
235
config_check ()
236
236
api_instance = client .CustomObjectsApi (api_config_handler ())
237
237
if self .config .mcad :
238
- with open (self .app_wrapper_yaml ) as f :
239
- aw = yaml .load (f , Loader = yaml .FullLoader )
240
- api_instance .create_namespaced_custom_object (
241
- group = "workload.codeflare.dev" ,
242
- version = "v1beta1" ,
243
- namespace = namespace ,
244
- plural = "appwrappers" ,
245
- body = aw ,
246
- )
238
+ if self .config .write_to_file :
239
+ with open (self .app_wrapper_yaml ) as f :
240
+ aw = yaml .load (f , Loader = yaml .FullLoader )
241
+ api_instance .create_namespaced_custom_object (
242
+ group = "workload.codeflare.dev" ,
243
+ version = "v1beta1" ,
244
+ namespace = namespace ,
245
+ plural = "appwrappers" ,
246
+ body = aw ,
247
+ )
248
+ else :
249
+ aw = yaml .safe_load (self .app_wrapper_yaml )
250
+ api_instance .create_namespaced_custom_object (
251
+ group = "workload.codeflare.dev" ,
252
+ version = "v1beta1" ,
253
+ namespace = namespace ,
254
+ plural = "appwrappers" ,
255
+ body = aw ,
256
+ )
247
257
else :
248
258
self ._component_resources_up (namespace , api_instance )
249
259
except Exception as e : # pragma: no cover
@@ -492,7 +502,9 @@ def torchx_config(
492
502
to_return ["requirements" ] = requirements
493
503
return to_return
494
504
495
- def from_k8_cluster_object (rc , mcad = True , ingress_domain = None , ingress_options = {}):
505
+ def from_k8_cluster_object (
506
+ rc , mcad = True , ingress_domain = None , ingress_options = {}, write_to_file = False
507
+ ):
496
508
machine_types = (
497
509
rc ["metadata" ]["labels" ]["orderedinstance" ].split ("_" )
498
510
if "orderedinstance" in rc ["metadata" ]["labels" ]
@@ -538,6 +550,7 @@ def from_k8_cluster_object(rc, mcad=True, ingress_domain=None, ingress_options={
538
550
mcad = mcad ,
539
551
ingress_domain = ingress_domain ,
540
552
ingress_options = ingress_options ,
553
+ write_to_file = write_to_file ,
541
554
)
542
555
return Cluster (cluster_config )
543
556
@@ -551,79 +564,25 @@ def local_client_url(self):
551
564
def _component_resources_up (
552
565
self , namespace : str , api_instance : client .CustomObjectsApi
553
566
):
554
- with open (self .app_wrapper_yaml ) as f :
555
- yamls = yaml .load_all (f , Loader = yaml .FullLoader )
556
- for resource in yamls :
557
- if resource ["kind" ] == "RayCluster" :
558
- api_instance .create_namespaced_custom_object (
559
- group = "ray.io" ,
560
- version = "v1" ,
561
- namespace = namespace ,
562
- plural = "rayclusters" ,
563
- body = resource ,
564
- )
565
- elif resource ["kind" ] == "Ingress" :
566
- api_instance .create_namespaced_custom_object (
567
- group = "networking.k8s.io" ,
568
- version = "v1" ,
569
- namespace = namespace ,
570
- plural = "ingresses" ,
571
- body = resource ,
572
- )
573
- elif resource ["kind" ] == "Route" :
574
- api_instance .create_namespaced_custom_object (
575
- group = "route.openshift.io" ,
576
- version = "v1" ,
577
- namespace = namespace ,
578
- plural = "routes" ,
579
- body = resource ,
580
- )
581
- elif resource ["kind" ] == "Secret" :
582
- secret_instance = client .CoreV1Api (api_config_handler ())
583
- secret_instance .create_namespaced_secret (
584
- namespace = namespace ,
585
- body = resource ,
586
- )
567
+ if self .config .write_to_file :
568
+ with open (self .app_wrapper_yaml ) as f :
569
+ yamls = yaml .load_all (f , Loader = yaml .FullLoader )
570
+ _create_resources (yamls , namespace , api_instance )
571
+ else :
572
+ yamls = yaml .load_all (self .app_wrapper_yaml , Loader = yaml .FullLoader )
573
+ _create_resources (yamls , namespace , api_instance )
587
574
588
575
def _component_resources_down (
589
576
self , namespace : str , api_instance : client .CustomObjectsApi
590
577
):
591
- with open (self .app_wrapper_yaml ) as f :
592
- yamls = yaml .load_all (f , Loader = yaml .FullLoader )
593
- for resource in yamls :
594
- if resource ["kind" ] == "RayCluster" :
595
- api_instance .delete_namespaced_custom_object (
596
- group = "ray.io" ,
597
- version = "v1" ,
598
- namespace = namespace ,
599
- plural = "rayclusters" ,
600
- name = self .app_wrapper_name ,
601
- )
602
- elif resource ["kind" ] == "Ingress" :
603
- name = resource ["metadata" ]["name" ]
604
- api_instance .delete_namespaced_custom_object (
605
- group = "networking.k8s.io" ,
606
- version = "v1" ,
607
- namespace = namespace ,
608
- plural = "ingresses" ,
609
- name = name ,
610
- )
611
- elif resource ["kind" ] == "Route" :
612
- name = resource ["metadata" ]["name" ]
613
- api_instance .delete_namespaced_custom_object (
614
- group = "route.openshift.io" ,
615
- version = "v1" ,
616
- namespace = namespace ,
617
- plural = "routes" ,
618
- name = name ,
619
- )
620
- elif resource ["kind" ] == "Secret" :
621
- name = resource ["metadata" ]["name" ]
622
- secret_instance = client .CoreV1Api (api_config_handler ())
623
- secret_instance .delete_namespaced_secret (
624
- namespace = namespace ,
625
- name = name ,
626
- )
578
+ cluster_name = self .config .name
579
+ if self .config .write_to_file :
580
+ with open (self .app_wrapper_yaml ) as f :
581
+ yamls = yaml .load_all (f , Loader = yaml .FullLoader )
582
+ _delete_resources (yamls , namespace , api_instance , cluster_name )
583
+ else :
584
+ yamls = yaml .safe_load_all (self .app_wrapper_yaml )
585
+ _delete_resources (yamls , namespace , api_instance , cluster_name )
627
586
628
587
629
588
def list_all_clusters (namespace : str , print_to_console : bool = True ):
@@ -675,7 +634,9 @@ def get_current_namespace(): # pragma: no cover
675
634
return None
676
635
677
636
678
- def get_cluster (cluster_name : str , namespace : str = "default" ):
637
+ def get_cluster (
638
+ cluster_name : str , namespace : str = "default" , write_to_file : bool = False
639
+ ):
679
640
try :
680
641
config_check ()
681
642
api_instance = client .CustomObjectsApi (api_config_handler ())
@@ -746,13 +707,88 @@ def get_cluster(cluster_name: str, namespace: str = "default"):
746
707
mcad = mcad ,
747
708
ingress_domain = ingress_domain ,
748
709
ingress_options = ingress_options ,
710
+ write_to_file = write_to_file ,
749
711
)
750
712
raise FileNotFoundError (
751
713
f"Cluster { cluster_name } is not found in { namespace } namespace"
752
714
)
753
715
754
716
755
717
# private methods
718
+ def _delete_resources (
719
+ yamls , namespace : str , api_instance : client .CustomObjectsApi , cluster_name : str
720
+ ):
721
+ for resource in yamls :
722
+ if resource ["kind" ] == "RayCluster" :
723
+ name = resource ["metadata" ]["name" ]
724
+ api_instance .delete_namespaced_custom_object (
725
+ group = "ray.io" ,
726
+ version = "v1" ,
727
+ namespace = namespace ,
728
+ plural = "rayclusters" ,
729
+ name = name ,
730
+ )
731
+ elif resource ["kind" ] == "Ingress" :
732
+ name = resource ["metadata" ]["name" ]
733
+ api_instance .delete_namespaced_custom_object (
734
+ group = "networking.k8s.io" ,
735
+ version = "v1" ,
736
+ namespace = namespace ,
737
+ plural = "ingresses" ,
738
+ name = name ,
739
+ )
740
+ elif resource ["kind" ] == "Route" :
741
+ name = resource ["metadata" ]["name" ]
742
+ api_instance .delete_namespaced_custom_object (
743
+ group = "route.openshift.io" ,
744
+ version = "v1" ,
745
+ namespace = namespace ,
746
+ plural = "routes" ,
747
+ name = name ,
748
+ )
749
+ elif resource ["kind" ] == "Secret" :
750
+ name = resource ["metadata" ]["name" ]
751
+ secret_instance = client .CoreV1Api (api_config_handler ())
752
+ secret_instance .delete_namespaced_secret (
753
+ namespace = namespace ,
754
+ name = name ,
755
+ )
756
+
757
+
758
+ def _create_resources (yamls , namespace : str , api_instance : client .CustomObjectsApi ):
759
+ for resource in yamls :
760
+ if resource ["kind" ] == "RayCluster" :
761
+ api_instance .create_namespaced_custom_object (
762
+ group = "ray.io" ,
763
+ version = "v1" ,
764
+ namespace = namespace ,
765
+ plural = "rayclusters" ,
766
+ body = resource ,
767
+ )
768
+ elif resource ["kind" ] == "Ingress" :
769
+ api_instance .create_namespaced_custom_object (
770
+ group = "networking.k8s.io" ,
771
+ version = "v1" ,
772
+ namespace = namespace ,
773
+ plural = "ingresses" ,
774
+ body = resource ,
775
+ )
776
+ elif resource ["kind" ] == "Route" :
777
+ api_instance .create_namespaced_custom_object (
778
+ group = "route.openshift.io" ,
779
+ version = "v1" ,
780
+ namespace = namespace ,
781
+ plural = "routes" ,
782
+ body = resource ,
783
+ )
784
+ elif resource ["kind" ] == "Secret" :
785
+ secret_instance = client .CoreV1Api (api_config_handler ())
786
+ secret_instance .create_namespaced_secret (
787
+ namespace = namespace ,
788
+ body = resource ,
789
+ )
790
+
791
+
756
792
def _check_aw_exists (name : str , namespace : str ) -> bool :
757
793
try :
758
794
config_check ()
0 commit comments