99
1010 "github.com/MakeNowJust/heredoc/v2"
1111 "github.com/Masterminds/semver"
12+ "github.com/charmbracelet/log"
1213 "github.com/ctrlplanedev/cli/internal/api"
1314 "github.com/ctrlplanedev/cli/internal/kinds"
1415
@@ -19,10 +20,6 @@ import (
1920 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2021)
2122
22- const (
23- vclusterKind = "VCluster"
24- )
25-
2623func getParentClusterResource (ctx context.Context , ctrlplaneClient * api.ClientWithResponses , workspaceId string , clusterIdentifier string ) (ClusterResource , error ) {
2724 clusterResourceResponse , err := ctrlplaneClient .GetResourceByIdentifierWithResponse (ctx , workspaceId , clusterIdentifier )
2825 if err != nil {
@@ -84,7 +81,7 @@ func generateVclusterMetadata(vcluster find.VCluster, clusterMetadata api.Metada
8481 metadata [kinds .VClusterMetadataNamespace ] = vcluster .Namespace
8582 metadata [kinds .VClusterMetadataStatus ] = getNormalizedVclusterStatus (vcluster .Status )
8683 metadata [kinds .VClusterMetadataCreated ] = vcluster .Created .Format (time .RFC3339 )
87- metadata [kinds .K8SMetadataFlavor ] = vclusterKind
84+ metadata [kinds .K8SMetadataFlavor ] = "vcluster"
8885
8986 if vcluster .Labels != nil {
9087 for key , value := range vcluster .Labels {
@@ -126,6 +123,10 @@ type ClusterResource struct {
126123 Version string
127124}
128125
126+ func generateVclusterKind (clusterResource ClusterResource ) string {
127+ return fmt .Sprintf ("%s/%s" , clusterResource .Kind , kinds .KindVCluster )
128+ }
129+
129130func getCreateResourceFromVcluster (vcluster find.VCluster , clusterResource ClusterResource ) (api.CreateResource , error ) {
130131 metadata , err := generateVclusterMetadata (vcluster , clusterResource .Metadata )
131132 if err != nil {
@@ -140,7 +141,7 @@ func getCreateResourceFromVcluster(vcluster find.VCluster, clusterResource Clust
140141 resource := api.CreateResource {
141142 Name : fmt .Sprintf ("%s/%s/%s" , clusterResource .Name , vcluster .Namespace , vcluster .Name ),
142143 Identifier : fmt .Sprintf ("%s/%s/vcluster/%s" , clusterResource .Identifier , vcluster .Namespace , vcluster .Name ),
143- Kind : fmt . Sprintf ( "%s/%s" , clusterResource . Kind , vclusterKind ),
144+ Kind : generateVclusterKind ( clusterResource ),
144145 Version : "ctrlplane.dev/kubernetes/cluster/v1" ,
145146 Metadata : metadata ,
146147 Config : generateVclusterConfig (vcluster , clusterResource .Name , clonedParentConfig ),
@@ -149,6 +150,34 @@ func getCreateResourceFromVcluster(vcluster find.VCluster, clusterResource Clust
149150 return resource , nil
150151}
151152
153+ func createResourceRelationshipRule (ctx context.Context , resourceProvider * api.ResourceProvider , clusterResource ClusterResource ) error {
154+ var metadataKey string
155+ switch clusterResource .Kind {
156+ case kinds .KindGoogleKubernetesEngine :
157+ metadataKey = kinds .GoogleMetadataSelfLink
158+ case kinds .KindAmazonElasticKubernetesService :
159+ metadataKey = kinds .AWSMetadataARN
160+ case kinds .KindAzureKubernetesService :
161+ metadataKey = kinds .AzureMetadataId
162+ default :
163+ return fmt .Errorf ("unsupported cluster kind: %s" , clusterResource .Kind )
164+ }
165+
166+ metadataKeysMatches := []string {metadataKey }
167+
168+ resourceRelationshipRule := api.CreateResourceRelationshipRule {
169+ DependencyType : api .ProvisionedIn ,
170+ Reference : "vcluster" ,
171+ TargetKind : clusterResource .Kind ,
172+ TargetVersion : clusterResource .Version ,
173+ SourceKind : generateVclusterKind (clusterResource ),
174+ SourceVersion : clusterResource .Version ,
175+ MetadataKeysMatches : & metadataKeysMatches ,
176+ }
177+
178+ return resourceProvider .AddResourceRelationshipRule (ctx , []api.CreateResourceRelationshipRule {resourceRelationshipRule })
179+ }
180+
152181func NewSyncVclusterCmd () * cobra.Command {
153182 var clusterIdentifier string
154183 var providerName string
@@ -197,9 +226,6 @@ func NewSyncVclusterCmd() *cobra.Command {
197226 if err != nil {
198227 return err
199228 }
200-
201- fmt .Printf ("Found %d vclusters in namespace %s\n " , len (vclusters ), namespace )
202-
203229 if providerName == "" {
204230 providerName = fmt .Sprintf ("%s-vcluster-scanner" , clusterResource .Name )
205231 }
@@ -218,12 +244,14 @@ func NewSyncVclusterCmd() *cobra.Command {
218244 resourcesToUpsert = append (resourcesToUpsert , resource )
219245 }
220246
221- upsertResp , err := rp .UpsertResource (cmd .Context (), resourcesToUpsert )
222- if err != nil {
247+ if _ , err := rp .UpsertResource (cmd .Context (), resourcesToUpsert ); err != nil {
223248 return fmt .Errorf ("failed to upsert resources: %w" , err )
224249 }
225- fmt .Printf ("Response from upserting resources: %v\n " , upsertResp .StatusCode )
226- fmt .Printf ("Upserted %d resources\n " , len (resourcesToUpsert ))
250+ log .Infof ("Upserted %d resources" , len (resourcesToUpsert ))
251+
252+ if err := createResourceRelationshipRule (cmd .Context (), rp , clusterResource ); err != nil {
253+ return fmt .Errorf ("failed to create resource relationship rule: %w" , err )
254+ }
227255 return nil
228256 },
229257 }
0 commit comments