@@ -22,6 +22,7 @@ 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)
@@ -64,3 +65,69 @@ func haveACMHub(r *PatternReconciler) bool {
6465 }
6566 return true
6667}
68+
69+ // listManagedClusters lists all ManagedCluster resources (excluding local-cluster)
70+ // Returns a list of cluster names and an error
71+ func (r * PatternReconciler ) listManagedClusters (ctx context.Context ) ([]string , error ) {
72+ gvrMC := schema.GroupVersionResource {
73+ Group : "cluster.open-cluster-management.io" ,
74+ Version : "v1" ,
75+ Resource : "managedclusters" ,
76+ }
77+
78+ // ManagedCluster is a cluster-scoped resource, so no namespace needed
79+ mcList , err := r .dynamicClient .Resource (gvrMC ).List (ctx , metav1.ListOptions {})
80+ if err != nil {
81+ return nil , fmt .Errorf ("failed to list ManagedClusters: %w" , err )
82+ }
83+
84+ var clusterNames []string
85+ for _ , item := range mcList .Items {
86+ name := item .GetName ()
87+ // Exclude local-cluster (hub cluster)
88+ if name != "local-cluster" {
89+ clusterNames = append (clusterNames , name )
90+ }
91+ }
92+
93+ return clusterNames , nil
94+ }
95+
96+ // deleteManagedClusters deletes all ManagedCluster resources (excluding local-cluster)
97+ // Returns the number of clusters deleted and an error
98+ func (r * PatternReconciler ) deleteManagedClusters (ctx context.Context ) (int , error ) {
99+ gvrMC := schema.GroupVersionResource {
100+ Group : "cluster.open-cluster-management.io" ,
101+ Version : "v1" ,
102+ Resource : "managedclusters" ,
103+ }
104+
105+ // ManagedCluster is a cluster-scoped resource, so no namespace needed
106+ mcList , err := r .dynamicClient .Resource (gvrMC ).List (ctx , metav1.ListOptions {})
107+ if err != nil {
108+ return 0 , fmt .Errorf ("failed to list ManagedClusters: %w" , err )
109+ }
110+
111+ deletedCount := 0
112+ for _ , item := range mcList .Items {
113+ name := item .GetName ()
114+ // Exclude local-cluster (hub cluster)
115+ if name == "local-cluster" {
116+ continue
117+ }
118+
119+ // Delete the managed cluster
120+ err := r .dynamicClient .Resource (gvrMC ).Delete (ctx , name , metav1.DeleteOptions {})
121+ if err != nil {
122+ // If already deleted, that's fine
123+ if kerrors .IsNotFound (err ) {
124+ continue
125+ }
126+ return deletedCount , fmt .Errorf ("failed to delete ManagedCluster %q: %w" , name , err )
127+ }
128+ log .Printf ("Deleted ManagedCluster: %q" , name )
129+ deletedCount ++
130+ }
131+
132+ return deletedCount , nil
133+ }
0 commit comments