Skip to content

Commit 4ac9d10

Browse files
authored
feat(k8s): migrate cluster or else force new (#1958)
1 parent e095716 commit 4ac9d10

File tree

4 files changed

+1166
-119
lines changed

4 files changed

+1166
-119
lines changed

scaleway/helpers_k8s.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,3 +256,24 @@ func flattenKubeletArgs(args map[string]string) map[string]interface{} {
256256

257257
return kubeletArgs
258258
}
259+
260+
func migrateToPrivateNetworkCluster(ctx context.Context, d *schema.ResourceData, i interface{}) error {
261+
k8sAPI, region, clusterID, err := k8sAPIWithRegionAndID(i, d.Id())
262+
if err != nil {
263+
return err
264+
}
265+
pnID := expandRegionalID(d.Get("private_network_id").(string)).ID
266+
_, err = k8sAPI.MigrateToPrivateNetworkCluster(&k8s.MigrateToPrivateNetworkClusterRequest{
267+
Region: region,
268+
ClusterID: clusterID,
269+
PrivateNetworkID: pnID,
270+
}, scw.WithContext(ctx))
271+
if err != nil {
272+
return err
273+
}
274+
_, err = waitK8SCluster(ctx, k8sAPI, region, clusterID, defaultK8SClusterTimeout)
275+
if err != nil {
276+
return err
277+
}
278+
return nil
279+
}

scaleway/resource_k8s_cluster.go

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,6 @@ func resourceScalewayK8SCluster() *schema.Resource {
161161
"private_network_id": {
162162
Type: schema.TypeString,
163163
Optional: true,
164-
Computed: true,
165-
ForceNew: true,
166164
Description: "The ID of the cluster's private network",
167165
ValidateFunc: validationUUIDorUUIDWithLocality(),
168166
DiffSuppressFunc: diffSuppressFuncLocality,
@@ -245,7 +243,31 @@ func resourceScalewayK8SCluster() *schema.Resource {
245243

246244
return nil
247245
},
248-
customizeDiffLocalityCheck("private_network_id"),
246+
func(ctx context.Context, diff *schema.ResourceDiff, i interface{}) error {
247+
if diff.HasChange("private_network_id") {
248+
actual, planned := diff.GetChange("private_network_id")
249+
if actual == "" {
250+
// If no private network has been set yet, migrate the cluster in the Update function
251+
return nil
252+
}
253+
if planned != "" {
254+
_, plannedPNID, err := parseLocalizedID(planned.(string))
255+
if err != nil {
256+
return err
257+
}
258+
if plannedPNID == actual {
259+
// If the private network ID is the same, do nothing
260+
return nil
261+
}
262+
}
263+
// Any other change will result in ForceNew
264+
err := diff.ForceNew("private_network_id")
265+
if err != nil {
266+
return err
267+
}
268+
}
269+
return nil
270+
},
249271
),
250272
}
251273
}
@@ -574,6 +596,9 @@ func resourceScalewayK8SClusterUpdate(ctx context.Context, d *schema.ResourceDat
574596
updateRequest.AdmissionPlugins = expandUpdatedStringsPtr(d.Get("admission_plugins"))
575597
}
576598

599+
////
600+
// AutoUpgrade changes
601+
////
577602
updateRequest.AutoUpgrade = &k8s.UpdateClusterRequestAutoUpgrade{}
578603
autoupgradeEnabled := d.Get("auto_upgrade.0.enable").(bool)
579604

@@ -587,6 +612,9 @@ func resourceScalewayK8SClusterUpdate(ctx context.Context, d *schema.ResourceDat
587612
updateRequest.AutoUpgrade.MaintenanceWindow.Day = k8s.MaintenanceWindowDayOfTheWeek(d.Get("auto_upgrade.0.maintenance_window_day").(string))
588613
}
589614

615+
////
616+
// Version changes
617+
////
590618
version := d.Get("version").(string)
591619
versionIsOnlyMinor := len(strings.Split(version, ".")) == 2
592620

@@ -622,6 +650,9 @@ func resourceScalewayK8SClusterUpdate(ctx context.Context, d *schema.ResourceDat
622650
}
623651
}
624652

653+
////
654+
// Autoscaler changes
655+
////
625656
autoscalerReq := &k8s.UpdateClusterRequestAutoscalerConfig{}
626657

627658
if d.HasChange("autoscaler_config.0.disable_scale_down") {
@@ -666,6 +697,9 @@ func resourceScalewayK8SClusterUpdate(ctx context.Context, d *schema.ResourceDat
666697

667698
updateRequest.AutoscalerConfig = autoscalerReq
668699

700+
////
701+
// OpenIDConnect Config changes
702+
////
669703
updateClusterRequestOpenIDConnectConfig := &k8s.UpdateClusterRequestOpenIDConnectConfig{}
670704

671705
if d.HasChange("open_id_connect_config.0.issuer_url") {
@@ -698,6 +732,19 @@ func resourceScalewayK8SClusterUpdate(ctx context.Context, d *schema.ResourceDat
698732

699733
updateRequest.OpenIDConnectConfig = updateClusterRequestOpenIDConnectConfig
700734

735+
////
736+
// Private Network changes
737+
////
738+
if d.HasChange("private_network_id") {
739+
actual, _ := d.GetChange("private_network_id")
740+
if actual == "" {
741+
err = migrateToPrivateNetworkCluster(ctx, d, meta)
742+
if err != nil {
743+
return diag.FromErr(err)
744+
}
745+
}
746+
}
747+
701748
////
702749
// Apply Update
703750
////

scaleway/resource_k8s_cluster_test.go

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,13 +398,31 @@ func TestAccScalewayK8SCluster_PrivateNetwork(t *testing.T) {
398398
CheckDestroy: testAccCheckScalewayK8SClusterDestroy(tt),
399399
Steps: []resource.TestStep{
400400
{
401-
Config: testAccCheckScalewayK8SClusterConfigPrivateNetwork(latestK8SVersion),
401+
Config: testAccCheckScalewayK8SClusterConfigPrivateNetworkNotLinked(latestK8SVersion),
402+
Check: resource.ComposeTestCheckFunc(
403+
testAccCheckScalewayK8SClusterExists(tt, "scaleway_k8s_cluster.private_network"),
404+
testAccCheckScalewayVPCPrivateNetworkExists(tt, "scaleway_vpc_private_network.private_network"),
405+
resource.TestCheckNoResourceAttr("scaleway_k8s_cluster.private_network", "private_network_id"),
406+
),
407+
},
408+
{
409+
Config: testAccCheckScalewayK8SClusterConfigPrivateNetworkLinked(latestK8SVersion),
402410
Check: resource.ComposeTestCheckFunc(
403411
testAccCheckScalewayK8SClusterExists(tt, "scaleway_k8s_cluster.private_network"),
404412
testAccCheckScalewayVPCPrivateNetworkExists(tt, "scaleway_vpc_private_network.private_network"),
405413
testAccCheckScalewayK8sClusterPrivateNetworkID(tt, "scaleway_k8s_cluster.private_network", "scaleway_vpc_private_network.private_network"),
406414
),
407415
},
416+
{
417+
Config: testAccCheckScalewayK8SClusterConfigPrivateNetworkChange(latestK8SVersion),
418+
PlanOnly: true,
419+
ExpectNonEmptyPlan: true,
420+
},
421+
{
422+
Config: testAccCheckScalewayK8SClusterConfigPrivateNetworkNotLinked(latestK8SVersion),
423+
PlanOnly: true,
424+
ExpectNonEmptyPlan: true,
425+
},
408426
},
409427
})
410428
}
@@ -642,7 +660,22 @@ resource "scaleway_k8s_cluster" "auto_upgrade" {
642660
}`, version, enable, hour, day)
643661
}
644662

645-
func testAccCheckScalewayK8SClusterConfigPrivateNetwork(version string) string {
663+
func testAccCheckScalewayK8SClusterConfigPrivateNetworkNotLinked(version string) string {
664+
return fmt.Sprintf(`
665+
resource "scaleway_vpc_private_network" "private_network" {
666+
name = "k8s-private-network"
667+
}
668+
resource "scaleway_k8s_cluster" "private_network" {
669+
cni = "calico"
670+
version = "%s"
671+
name = "k8s-private-network-cluster"
672+
tags = [ "terraform-test", "scaleway_k8s_cluster", "private_network" ]
673+
delete_additional_resources = true
674+
depends_on = [scaleway_vpc_private_network.private_network]
675+
}`, version)
676+
}
677+
678+
func testAccCheckScalewayK8SClusterConfigPrivateNetworkLinked(version string) string {
646679
return fmt.Sprintf(`
647680
resource "scaleway_vpc_private_network" "private_network" {
648681
name = "k8s-private-network"
@@ -658,6 +691,25 @@ resource "scaleway_k8s_cluster" "private_network" {
658691
}`, version)
659692
}
660693

694+
func testAccCheckScalewayK8SClusterConfigPrivateNetworkChange(version string) string {
695+
return fmt.Sprintf(`
696+
resource "scaleway_vpc_private_network" "private_network" {
697+
name = "k8s-private-network"
698+
}
699+
resource "scaleway_vpc_private_network" "private_network_2" {
700+
name = "other-private-network"
701+
}
702+
resource "scaleway_k8s_cluster" "private_network" {
703+
cni = "calico"
704+
version = "%s"
705+
name = "k8s-private-network-cluster"
706+
private_network_id = scaleway_vpc_private_network.private_network_2.id
707+
tags = [ "terraform-test", "scaleway_k8s_cluster", "private_network" ]
708+
delete_additional_resources = true
709+
depends_on = [scaleway_vpc_private_network.private_network_2]
710+
}`, version)
711+
}
712+
661713
func testAccCheckScalewayK8SClusterMulticloud(version string) string {
662714
return fmt.Sprintf(`
663715
resource "scaleway_k8s_cluster" "multicloud" {

0 commit comments

Comments
 (0)