11package kubernetes
22
33import (
4+ "context"
45 "encoding/json"
56 "fmt"
67 "strconv"
@@ -22,6 +23,26 @@ const (
2223 vclusterKind = "VCluster"
2324)
2425
26+ func getParentClusterResource (ctx context.Context , ctrlplaneClient * api.ClientWithResponses , workspaceId string , clusterIdentifier string ) (ClusterResource , error ) {
27+ clusterResourceResponse , err := ctrlplaneClient .GetResourceByIdentifierWithResponse (ctx , workspaceId , clusterIdentifier )
28+ if err != nil {
29+ return ClusterResource {}, fmt .Errorf ("failed to get cluster resource: %w" , err )
30+ }
31+ if clusterResourceResponse .StatusCode () != 200 {
32+ return ClusterResource {}, fmt .Errorf ("failed to get cluster resource: %s" , clusterResourceResponse .Status ())
33+ }
34+ clusterResource := ClusterResource {
35+ Config : clusterResourceResponse .JSON200 .Config ,
36+ Metadata : clusterResourceResponse .JSON200 .Metadata ,
37+ Name : clusterResourceResponse .JSON200 .Name ,
38+ Identifier : clusterResourceResponse .JSON200 .Identifier ,
39+ Kind : clusterResourceResponse .JSON200 .Kind ,
40+ Version : clusterResourceResponse .JSON200 .Version ,
41+ }
42+
43+ return clusterResource , nil
44+ }
45+
2546func deepClone (src map [string ]interface {}) (map [string ]interface {}, error ) {
2647 bytes , err := json .Marshal (src )
2748 if err != nil {
@@ -96,6 +117,38 @@ func generateVclusterConfig(vcluster find.VCluster, clusterName string, clusterC
96117 return clusterConfig
97118}
98119
120+ type ClusterResource struct {
121+ Config map [string ]interface {}
122+ Metadata api.MetadataMap
123+ Name string
124+ Identifier string
125+ Kind string
126+ Version string
127+ }
128+
129+ func getCreateResourceFromVcluster (vcluster find.VCluster , clusterResource ClusterResource ) (api.CreateResource , error ) {
130+ metadata , err := generateVclusterMetadata (vcluster , clusterResource .Metadata )
131+ if err != nil {
132+ return api.CreateResource {}, fmt .Errorf ("failed to generate vcluster metadata: %w" , err )
133+ }
134+
135+ clonedParentConfig , err := deepClone (clusterResource .Config )
136+ if err != nil {
137+ return api.CreateResource {}, fmt .Errorf ("failed to clone parent config: %w" , err )
138+ }
139+
140+ resource := api.CreateResource {
141+ Name : fmt .Sprintf ("%s/%s/%s" , clusterResource .Name , vcluster .Namespace , vcluster .Name ),
142+ Identifier : fmt .Sprintf ("%s/%s/vcluster/%s" , clusterResource .Identifier , vcluster .Namespace , vcluster .Name ),
143+ Kind : fmt .Sprintf ("%s/%s" , clusterResource .Kind , vclusterKind ),
144+ Version : "ctrlplane.dev/kubernetes/cluster/v1" ,
145+ Metadata : metadata ,
146+ Config : generateVclusterConfig (vcluster , clusterResource .Name , clonedParentConfig ),
147+ }
148+
149+ return resource , nil
150+ }
151+
99152func NewSyncVclusterCmd () * cobra.Command {
100153 var clusterIdentifier string
101154 var providerName string
@@ -107,7 +160,6 @@ func NewSyncVclusterCmd() *cobra.Command {
107160 $ ctrlc sync vcluster
108161 ` ),
109162 RunE : func (cmd * cobra.Command , args []string ) error {
110-
111163 apiURL := viper .GetString ("url" )
112164 apiKey := viper .GetString ("api-key" )
113165 workspaceId := viper .GetString ("workspace" )
@@ -125,14 +177,10 @@ func NewSyncVclusterCmd() *cobra.Command {
125177 return fmt .Errorf ("failed to create API client: %w" , err )
126178 }
127179
128- clusterResourceResponse , err := ctrlplaneClient . GetResourceByIdentifierWithResponse (cmd .Context (), workspaceId , clusterIdentifier )
180+ clusterResource , err := getParentClusterResource (cmd .Context (), ctrlplaneClient , workspaceId , clusterIdentifier )
129181 if err != nil {
130- return fmt .Errorf ("failed to get cluster resource: %w" , err )
182+ return fmt .Errorf ("failed to get parent cluster resource: %w" , err )
131183 }
132- if clusterResourceResponse .StatusCode () != 200 {
133- return fmt .Errorf ("failed to get cluster resource: %s" , clusterResourceResponse .Status ())
134- }
135- clusterResource := clusterResourceResponse .JSON200
136184
137185 config , context , err := getKubeConfig ()
138186 if err != nil {
@@ -144,21 +192,6 @@ func NewSyncVclusterCmd() *cobra.Command {
144192 return fmt .Errorf ("failed to create kube client: %w" , err )
145193 }
146194
147- allNamespaces , err := clientset .CoreV1 ().Namespaces ().List (cmd .Context (), metav1.ListOptions {})
148- if err != nil {
149- return fmt .Errorf ("failed to get all namespaces: %w" , err )
150- }
151- for _ , namespace := range allNamespaces .Items {
152- fmt .Printf ("Namespace: %s\n " , namespace .Name )
153- statefulSetList , err := clientset .AppsV1 ().StatefulSets (namespace .Name ).List (cmd .Context (), metav1.ListOptions {})
154- if err != nil {
155- return fmt .Errorf ("failed to get stateful sets for namespace %s: %w" , namespace .Name , err )
156- }
157- for _ , p := range statefulSetList .Items {
158- fmt .Printf ("StatefulSet: %s\n " , p .Name )
159- }
160- }
161-
162195 namespace := metav1 .NamespaceAll
163196 vclusters , err := find .ListOSSVClusters (cmd .Context (), clientset , context , "" , namespace )
164197 if err != nil {
@@ -177,27 +210,10 @@ func NewSyncVclusterCmd() *cobra.Command {
177210 }
178211
179212 resourcesToUpsert := []api.CreateResource {}
180-
181213 for _ , vcluster := range vclusters {
182- metadata , err := generateVclusterMetadata (vcluster , clusterResource .Metadata )
183- if err != nil {
184- fmt .Printf ("failed to generate vcluster metadata for %s: %v\n " , vcluster .Name , err )
185- continue
186- }
187-
188- clonedParentConfig , err := deepClone (clusterResource .Config )
214+ resource , err := getCreateResourceFromVcluster (vcluster , clusterResource )
189215 if err != nil {
190- fmt .Printf ("failed to clone parent config for %s: %v\n " , vcluster .Name , err )
191- continue
192- }
193-
194- resource := api.CreateResource {
195- Name : fmt .Sprintf ("%s/%s/%s" , clusterResource .Name , vcluster .Namespace , vcluster .Name ),
196- Identifier : fmt .Sprintf ("%s/%s/vcluster/%s" , clusterResource .Identifier , vcluster .Namespace , vcluster .Name ),
197- Kind : fmt .Sprintf ("%s/%s" , clusterResource .Kind , vclusterKind ),
198- Version : "ctrlplane.dev/kubernetes/cluster/v1" ,
199- Metadata : metadata ,
200- Config : generateVclusterConfig (vcluster , clusterResource .Name , clonedParentConfig ),
216+ return fmt .Errorf ("failed to get create resource from vcluster: %w" , err )
201217 }
202218 resourcesToUpsert = append (resourcesToUpsert , resource )
203219 }
0 commit comments