Skip to content

Commit 6fced8c

Browse files
feat: create relationship between parent cluster and vclusters
1 parent a5f3e7f commit 6fced8c

File tree

3 files changed

+65
-13
lines changed

3 files changed

+65
-13
lines changed

cmd/ctrlc/root/sync/kubernetes/vcluster.go

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
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-
2623
func 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+
129130
func 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+
152181
func 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
}

internal/api/resource_provider.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,17 @@ func (r *ResourceProvider) AddResourceRelationshipRule(ctx context.Context, rule
7171
for _, rule := range rules {
7272
rule.WorkspaceId = r.workspaceId
7373
resp, err := r.client.CreateResourceRelationshipRuleWithResponse(ctx, rule)
74+
if resp.StatusCode() == http.StatusConflict {
75+
log.Info("Resource relationship rule already exists, skipped creation")
76+
return nil
77+
}
7478
if err != nil {
7579
return err
7680
}
7781
if resp.StatusCode() != http.StatusOK {
7882
return fmt.Errorf("failed to upsert resource relationship rule: %s", string(resp.Body))
7983
}
8084
}
85+
log.Info("Successfully created resource relationship rules")
8186
return nil
8287
}

internal/kinds/db.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,18 @@ const (
7373
K8SMetadataFlavor = "kubernetes/flavor"
7474
)
7575

76+
const (
77+
GoogleMetadataSelfLink = "google/self-link"
78+
)
79+
80+
const (
81+
AWSMetadataARN = "aws/arn"
82+
)
83+
84+
const (
85+
AzureMetadataId = "azure/id"
86+
)
87+
7688
const (
7789
VClusterMetadataVersion = "vcluster/version"
7890
VClusterMetadataVersionMajor = "vcluster/version-major"
@@ -83,3 +95,10 @@ const (
8395
VClusterMetadataStatus = "vcluster/status"
8496
VClusterMetadataCreated = "vcluster/created"
8597
)
98+
99+
const (
100+
KindAmazonElasticKubernetesService = "AmazonElasticKubernetesService"
101+
KindGoogleKubernetesEngine = "GoogleKubernetesEngine"
102+
KindAzureKubernetesService = "AzureKubernetesService"
103+
KindVCluster = "VCluster"
104+
)

0 commit comments

Comments
 (0)