@@ -22,45 +22,84 @@ import (
2222 "fmt"
2323 "log"
2424
25+ kerrors "k8s.io/apimachinery/pkg/api/errors"
2526 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2627 "k8s.io/apimachinery/pkg/runtime/schema"
2728)
2829
2930func haveACMHub (r * PatternReconciler ) bool {
3031 gvrMCH := schema.GroupVersionResource {Group : "operator.open-cluster-management.io" , Version : "v1" , Resource : "multiclusterhubs" }
3132
32- serverNamespace := ""
33-
34- cms , err := r .fullClient .CoreV1 ().ConfigMaps ("" ).List (context .TODO (), metav1.ListOptions {
35- LabelSelector : fmt .Sprintf ("%v = %v" , "ocm-configmap-type" , "image-manifest" ),
36- })
37- if (err != nil || len (cms .Items ) == 0 ) && serverNamespace != "" {
38- cms , err = r .fullClient .CoreV1 ().ConfigMaps (serverNamespace ).List (context .TODO (), metav1.ListOptions {
39- LabelSelector : fmt .Sprintf ("%v = %v" , "ocm-configmap-type" , "image-manifest" ),
40- })
33+ _ , err := r .dynamicClient .Resource (gvrMCH ).Namespace ("open-cluster-management" ).Get (context .Background (), "multiclusterhub" , metav1.GetOptions {})
34+ if err != nil {
35+ log .Printf ("Error obtaining hub: %s\n " , err )
36+ return false
4137 }
42- if err != nil || len (cms .Items ) == 0 {
43- cms , err = r .fullClient .CoreV1 ().ConfigMaps ("open-cluster-management" ).List (context .TODO (), metav1.ListOptions {
44- LabelSelector : fmt .Sprintf ("%v = %v" , "ocm-configmap-type" , "image-manifest" ),
45- })
38+ return true
39+ }
40+
41+ // listManagedClusters lists all ManagedCluster resources (excluding local-cluster)
42+ // Returns a list of cluster names and an error
43+ func (r * PatternReconciler ) listManagedClusters (ctx context.Context ) ([]string , error ) {
44+ gvrMC := schema.GroupVersionResource {
45+ Group : "cluster.open-cluster-management.io" ,
46+ Version : "v1" ,
47+ Resource : "managedclusters" ,
4648 }
49+
50+ // ManagedCluster is a cluster-scoped resource, so no namespace needed
51+ mcList , err := r .dynamicClient .Resource (gvrMC ).List (ctx , metav1.ListOptions {})
4752 if err != nil {
48- log .Printf ("config map error: %s\n " , err .Error ())
49- return false
53+ return nil , fmt .Errorf ("failed to list ManagedClusters: %w" , err )
5054 }
51- if len (cms .Items ) == 0 {
52- log .Printf ("No config map\n " )
53- return false
55+
56+ var clusterNames []string
57+ for _ , item := range mcList .Items {
58+ name := item .GetName ()
59+ // Exclude local-cluster (hub cluster)
60+ if name != "local-cluster" {
61+ clusterNames = append (clusterNames , name )
62+ }
5463 }
55- ns := cms .Items [0 ].Namespace
5664
57- umch , err := r .dynamicClient .Resource (gvrMCH ).Namespace (ns ).List (context .TODO (), metav1.ListOptions {})
65+ return clusterNames , nil
66+ }
67+
68+ // deleteManagedClusters deletes all ManagedCluster resources (excluding local-cluster)
69+ // Returns the number of clusters deleted and an error
70+ func (r * PatternReconciler ) deleteManagedClusters (ctx context.Context ) (int , error ) {
71+ gvrMC := schema.GroupVersionResource {
72+ Group : "cluster.open-cluster-management.io" ,
73+ Version : "v1" ,
74+ Resource : "managedclusters" ,
75+ }
76+
77+ // ManagedCluster is a cluster-scoped resource, so no namespace needed
78+ mcList , err := r .dynamicClient .Resource (gvrMC ).List (ctx , metav1.ListOptions {})
5879 if err != nil {
59- log .Printf ("Error obtaining hub: %s\n " , err )
60- return false
61- } else if len (umch .Items ) == 0 {
62- log .Printf ("No hub in %s\n " , ns )
63- return false
80+ return 0 , fmt .Errorf ("failed to list ManagedClusters: %w" , err )
6481 }
65- return true
82+
83+ deletedCount := 0
84+ for _ , item := range mcList .Items {
85+ name := item .GetName ()
86+ // Exclude local-cluster (hub cluster)
87+ if name == "local-cluster" {
88+ continue
89+ }
90+
91+ // Delete the managed cluster
92+ err := r .dynamicClient .Resource (gvrMC ).Delete (ctx , name , metav1.DeleteOptions {})
93+ if err != nil {
94+ // If already deleted, that's fine
95+ if kerrors .IsNotFound (err ) {
96+ continue
97+ }
98+ return deletedCount , fmt .Errorf ("failed to delete ManagedCluster %q: %w" , name , err )
99+ }
100+ log .Printf ("Deleted ManagedCluster: %q" , name )
101+ deletedCount ++
102+ }
103+
104+ return deletedCount , nil
66105}
0 commit comments