Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions scaleway/data_source_k8s_cluster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,17 @@ func TestAccScalewayDataSourceK8SCluster_Basic(t *testing.T) {
Steps: []resource.TestStep{
{
Config: fmt.Sprintf(`
resource "scaleway_vpc_private_network" "main" {
name = "test-data-source-cluster"
}

resource "scaleway_k8s_cluster" "main" {
name = "%s"
version = "%s"
cni = "cilium"
tags = [ "terraform-test", "data_scaleway_k8s_cluster", "basic" ]
delete_additional_resources = true
private_network_id = scaleway_vpc_private_network.main.id
}

resource "scaleway_k8s_pool" "default" {
Expand Down
56 changes: 35 additions & 21 deletions scaleway/resource_k8s_cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -245,30 +245,40 @@ func resourceScalewayK8SCluster() *schema.Resource {
},
func(ctx context.Context, diff *schema.ResourceDiff, i interface{}) error {
if diff.HasChange("private_network_id") {
clusterType := diff.Get("type")
isKapsule := clusterType == "" || strings.HasPrefix(clusterType.(string), "kapsule")
if !isKapsule {
return fmt.Errorf("only Kapsule clusters support private networks")
}
actual, planned := diff.GetChange("private_network_id")
if actual == "" {
// If no private network has been set yet, migrate the cluster in the Update function
return nil
}
if planned != "" {
_, plannedPNID, err := parseLocalizedID(planned.(string))
if err != nil {
return err
clusterType := diff.Get("type").(string)

switch {
// For Kosmos clusters
case strings.HasPrefix(clusterType, "multicloud"):
if planned != "" {
return fmt.Errorf("only Kapsule clusters support private networks")
}
if plannedPNID == actual {
// If the private network ID is the same, do nothing

// For Kapsule clusters
case clusterType == "" || strings.HasPrefix(clusterType, "kapsule"):
if actual == "" {
// If no private network has been set yet, migrate the cluster in the Update function
return nil
}
}
// Any other change will result in ForceNew
err := diff.ForceNew("private_network_id")
if err != nil {
return err
if planned != "" {
_, plannedPNID, err := parseLocalizedID(planned.(string))
if err != nil {
return err
}
if plannedPNID == actual {
// If the private network ID is the same, do nothing
return nil
}
}
// Any other change will result in ForceNew
err := diff.ForceNew("private_network_id")
if err != nil {
return err
}

default:
return fmt.Errorf("unknown cluster type %q", clusterType)
}
}
return nil
Expand Down Expand Up @@ -779,7 +789,11 @@ func resourceScalewayK8SClusterUpdate(ctx context.Context, d *schema.ResourceDat
// Private Network changes
////
if d.HasChange("private_network_id") {
actual, _ := d.GetChange("private_network_id")
actual, planned := d.GetChange("private_network_id")
if planned == "" && actual != "" {
// It's not possible to remove the private network anymore
return diag.FromErr(fmt.Errorf("it is only possible to change the private network attached to the cluster, but not to remove it"))
}
if actual == "" {
err = migrateToPrivateNetworkCluster(ctx, d, meta)
if err != nil {
Expand Down
118 changes: 70 additions & 48 deletions scaleway/resource_k8s_cluster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,8 @@ func TestAccScalewayK8SCluster_PrivateNetwork(t *testing.T) {

latestK8SVersion := testAccScalewayK8SClusterGetLatestK8SVersion(tt)

clusterID := ""

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() {
testAccPreCheck(t)
Expand All @@ -399,31 +401,24 @@ func TestAccScalewayK8SCluster_PrivateNetwork(t *testing.T) {
CheckDestroy: testAccCheckScalewayK8SClusterDestroy(tt),
Steps: []resource.TestStep{
{
Config: testAccCheckScalewayK8SClusterConfigPrivateNetworkNotLinked(latestK8SVersion),
Config: testAccCheckScalewayK8SClusterConfigPrivateNetworkLinked(latestK8SVersion),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayK8SClusterExists(tt, "scaleway_k8s_cluster.private_network"),
testAccCheckScalewayVPCPrivateNetworkExists(tt, "scaleway_vpc_private_network.private_network"),
resource.TestCheckResourceAttr("scaleway_k8s_cluster.private_network", "private_network_id", ""),
testAccCheckScalewayK8sClusterPrivateNetworkID(tt, "scaleway_k8s_cluster.private_network", "scaleway_vpc_private_network.private_network"),
testAccCheckScalewayResourceIDPersisted("scaleway_k8s_cluster.private_network", &clusterID),
),
},
{
Config: testAccCheckScalewayK8SClusterConfigPrivateNetworkLinked(latestK8SVersion),
Config: testAccCheckScalewayK8SClusterConfigPrivateNetworkChange(latestK8SVersion),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayK8SClusterExists(tt, "scaleway_k8s_cluster.private_network"),
testAccCheckScalewayVPCPrivateNetworkExists(tt, "scaleway_vpc_private_network.private_network"),
testAccCheckScalewayK8sClusterPrivateNetworkID(tt, "scaleway_k8s_cluster.private_network", "scaleway_vpc_private_network.private_network"),
testAccCheckScalewayVPCPrivateNetworkExists(tt, "scaleway_vpc_private_network.private_network_2"),
testAccCheckScalewayK8sClusterPrivateNetworkID(tt, "scaleway_k8s_cluster.private_network", "scaleway_vpc_private_network.private_network_2"),
testAccCheckScalewayResourceIDChanged("scaleway_k8s_cluster.private_network", &clusterID),
),
},
{
Config: testAccCheckScalewayK8SClusterConfigPrivateNetworkChange(latestK8SVersion),
PlanOnly: true,
ExpectNonEmptyPlan: true,
},
{
Config: testAccCheckScalewayK8SClusterConfigPrivateNetworkNotLinked(latestK8SVersion),
PlanOnly: true,
ExpectNonEmptyPlan: true,
},
},
})
}
Expand Down Expand Up @@ -478,7 +473,7 @@ func TestAccScalewayK8SCluster_TypeChange(t *testing.T) {
},
{
// 2 : Upgrade to a dedicated Kapsule --> should migrate
Config: testAccCheckScalewayK8SClusterTypeChange("kapsule-dedicated-4", "cilium", latestK8SVersion), // + testAccCheckScalewayK8SClusterTypeChangeCopy(latestK8SVersion),
Config: testAccCheckScalewayK8SClusterTypeChange("kapsule-dedicated-4", "cilium", latestK8SVersion),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayK8SClusterExists(tt, "scaleway_k8s_cluster.type-change"),
resource.TestCheckResourceAttr("scaleway_k8s_cluster.type-change", "type", "kapsule-dedicated-4"),
Expand All @@ -487,7 +482,7 @@ func TestAccScalewayK8SCluster_TypeChange(t *testing.T) {
},
{
// 3 : Upgrade to an even bigger dedicated Kapsule --> should migrate
Config: testAccCheckScalewayK8SClusterTypeChange("kapsule-dedicated-16", "cilium", latestK8SVersion), // + testAccCheckScalewayK8SClusterTypeChangeCopy(latestK8SVersion),
Config: testAccCheckScalewayK8SClusterTypeChange("kapsule-dedicated-16", "cilium", latestK8SVersion),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayK8SClusterExists(tt, "scaleway_k8s_cluster.type-change"),
resource.TestCheckResourceAttr("scaleway_k8s_cluster.type-change", "type", "kapsule-dedicated-16"),
Expand All @@ -496,7 +491,7 @@ func TestAccScalewayK8SCluster_TypeChange(t *testing.T) {
},
{
// 4 : Downgrade to a smaller dedicated Kapsule --> should recreate
Config: testAccCheckScalewayK8SClusterTypeChange("kapsule-dedicated-8", "cilium", latestK8SVersion), // + testAccCheckScalewayK8SClusterTypeChangeCopy(latestK8SVersion),
Config: testAccCheckScalewayK8SClusterTypeChange("kapsule-dedicated-8", "cilium", latestK8SVersion),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayK8SClusterExists(tt, "scaleway_k8s_cluster.type-change"),
resource.TestCheckResourceAttr("scaleway_k8s_cluster.type-change", "type", "kapsule-dedicated-8"),
Expand All @@ -505,7 +500,7 @@ func TestAccScalewayK8SCluster_TypeChange(t *testing.T) {
},
{
// 5 : Change to a dedicated Kosmos --> should recreate
Config: testAccCheckScalewayK8SClusterTypeChange("multicloud-dedicated-4", "kilo", latestK8SVersion), // + testAccCheckScalewayK8SClusterTypeChangeCopy(latestK8SVersion),
Config: testAccCheckScalewayK8SClusterTypeChange("multicloud-dedicated-4", "kilo", latestK8SVersion),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayK8SClusterExists(tt, "scaleway_k8s_cluster.type-change"),
resource.TestCheckResourceAttr("scaleway_k8s_cluster.type-change", "type", "multicloud-dedicated-4"),
Expand All @@ -514,7 +509,7 @@ func TestAccScalewayK8SCluster_TypeChange(t *testing.T) {
},
{
// 6 : Upgrade to a bigger dedicated Kosmos --> should migrate
Config: testAccCheckScalewayK8SClusterTypeChange("multicloud-dedicated-8", "kilo", latestK8SVersion), // + testAccCheckScalewayK8SClusterTypeChangeCopy(latestK8SVersion),
Config: testAccCheckScalewayK8SClusterTypeChange("multicloud-dedicated-8", "kilo", latestK8SVersion),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayK8SClusterExists(tt, "scaleway_k8s_cluster.type-change"),
resource.TestCheckResourceAttr("scaleway_k8s_cluster.type-change", "type", "multicloud-dedicated-8"),
Expand All @@ -523,7 +518,7 @@ func TestAccScalewayK8SCluster_TypeChange(t *testing.T) {
},
{
// 7 : Downgrade to a mutualized Kosmos --> should recreate
Config: testAccCheckScalewayK8SClusterTypeChange("multicloud", "kilo", latestK8SVersion), // + testAccCheckScalewayK8SClusterTypeChangeCopy(latestK8SVersion),
Config: testAccCheckScalewayK8SClusterTypeChange("multicloud", "kilo", latestK8SVersion),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayK8SClusterExists(tt, "scaleway_k8s_cluster.type-change"),
resource.TestCheckResourceAttr("scaleway_k8s_cluster.type-change", "type", "multicloud"),
Expand Down Expand Up @@ -639,21 +634,29 @@ func testAccCheckScalewayK8sClusterPrivateNetworkID(tt *TestTools, clusterName,

func testAccCheckScalewayK8SClusterConfigMinimal(version string) string {
return fmt.Sprintf(`
resource "scaleway_vpc_private_network" "minimal" {
name = "test-minimal"
}
resource "scaleway_k8s_cluster" "minimal" {
cni = "calico"
version = "%s"
name = "ClusterConfigMinimal"
name = "test-minimal"
tags = [ "terraform-test", "scaleway_k8s_cluster", "minimal" ]
delete_additional_resources = true
private_network_id = scaleway_vpc_private_network.minimal.id
}`, version)
}

func testAccCheckScalewayK8SClusterConfigAutoscaler(version string) string {
return fmt.Sprintf(`
resource "scaleway_vpc_private_network" "autoscaler" {
name = "test-autoscaler"
region = "nl-ams"
}
resource "scaleway_k8s_cluster" "autoscaler" {
cni = "calico"
version = "%s"
name = "autoscaler-01"
name = "test-autoscaler-01"
region = "nl-ams"
autoscaler_config {
disable_scale_down = true
Expand All @@ -669,15 +672,20 @@ resource "scaleway_k8s_cluster" "autoscaler" {
}
tags = [ "terraform-test", "scaleway_k8s_cluster", "autoscaler-config" ]
delete_additional_resources = true
private_network_id = scaleway_vpc_private_network.autoscaler.id
}`, version)
}

func testAccCheckScalewayK8SClusterConfigAutoscalerChange(version string) string {
return fmt.Sprintf(`
resource "scaleway_vpc_private_network" "autoscaler" {
name = "test-autoscaler"
region = "nl-ams"
}
resource "scaleway_k8s_cluster" "autoscaler" {
cni = "calico"
version = "%s"
name = "autoscaler-02"
name = "test-autoscaler-02"
region = "nl-ams"
autoscaler_config {
disable_scale_down = false
Expand All @@ -691,15 +699,19 @@ resource "scaleway_k8s_cluster" "autoscaler" {
}
tags = [ "terraform-test", "scaleway_k8s_cluster", "autoscaler-config" ]
delete_additional_resources = true
private_network_id = scaleway_vpc_private_network.autoscaler.id
}`, version)
}

func testAccCheckScalewayK8SClusterConfigOIDC(version string) string {
return fmt.Sprintf(`
resource "scaleway_vpc_private_network" "oidc" {
name = "test-oidc"
}
resource "scaleway_k8s_cluster" "oidc" {
cni = "cilium"
version = "%s"
name = "oidc"
name = "test-oidc"
open_id_connect_config {
issuer_url = "https://accounts.google.com"
client_id = "my-super-id"
Expand All @@ -709,16 +721,20 @@ resource "scaleway_k8s_cluster" "oidc" {
}
tags = [ "terraform-test", "scaleway_k8s_cluster", "oidc-config" ]
delete_additional_resources = true
private_network_id = scaleway_vpc_private_network.oidc.id
}
`, version)
}

func testAccCheckScalewayK8SClusterConfigOIDCChange(version string) string {
return fmt.Sprintf(`
resource "scaleway_vpc_private_network" "oidc" {
name = "test-oidc"
}
resource "scaleway_k8s_cluster" "oidc" {
cni = "cilium"
version = "%s"
name = "oidc"
name = "test-oidc"
open_id_connect_config {
issuer_url = "https://gitlab.com"
client_id = "my-even-more-awesome-id"
Expand All @@ -728,41 +744,31 @@ resource "scaleway_k8s_cluster" "oidc" {
}
tags = [ "terraform-test", "scaleway_k8s_cluster", "oidc-config" ]
delete_additional_resources = true
private_network_id = scaleway_vpc_private_network.oidc.id
}
`, version)
}

func testAccCheckScalewayK8SClusterAutoUpgrade(enable bool, day string, hour uint64, version string) string {
return fmt.Sprintf(`
resource "scaleway_vpc_private_network" "auto_upgrade" {
name = "test-auto-upgrade"
}
resource "scaleway_k8s_cluster" "auto_upgrade" {
cni = "calico"
version = "%s"
name = "default-pool"
name = "test-auto-upgrade"
auto_upgrade {
enable = %t
maintenance_window_start_hour = %d
maintenance_window_day = "%s"
}
tags = [ "terraform-test", "scaleway_k8s_cluster", "auto_upgrade" ]
delete_additional_resources = true
private_network_id = scaleway_vpc_private_network.auto_upgrade.id
}`, version, enable, hour, day)
}

func testAccCheckScalewayK8SClusterConfigPrivateNetworkNotLinked(version string) string {
return fmt.Sprintf(`
resource "scaleway_vpc_private_network" "private_network" {
name = "k8s-private-network"
}
resource "scaleway_k8s_cluster" "private_network" {
cni = "calico"
version = "%s"
name = "k8s-private-network-cluster"
tags = [ "terraform-test", "scaleway_k8s_cluster", "private_network" ]
delete_additional_resources = true
depends_on = [scaleway_vpc_private_network.private_network]
}`, version)
}

func testAccCheckScalewayK8SClusterConfigPrivateNetworkLinked(version string) string {
return fmt.Sprintf(`
resource "scaleway_vpc_private_network" "private_network" {
Expand All @@ -772,10 +778,10 @@ resource "scaleway_k8s_cluster" "private_network" {
cni = "calico"
version = "%s"
name = "k8s-private-network-cluster"
private_network_id = scaleway_vpc_private_network.private_network.id
tags = [ "terraform-test", "scaleway_k8s_cluster", "private_network" ]
delete_additional_resources = true
delete_additional_resources = false
depends_on = [scaleway_vpc_private_network.private_network]
private_network_id = scaleway_vpc_private_network.private_network.id
}`, version)
}

Expand All @@ -791,10 +797,10 @@ resource "scaleway_k8s_cluster" "private_network" {
cni = "calico"
version = "%s"
name = "k8s-private-network-cluster"
private_network_id = scaleway_vpc_private_network.private_network_2.id
tags = [ "terraform-test", "scaleway_k8s_cluster", "private_network" ]
delete_additional_resources = true
delete_additional_resources = false
depends_on = [scaleway_vpc_private_network.private_network_2]
private_network_id = scaleway_vpc_private_network.private_network_2.id
}`, version)
}

Expand All @@ -818,13 +824,29 @@ resource "scaleway_k8s_pool" "multicloud" {
}

func testAccCheckScalewayK8SClusterTypeChange(clusterType, cni, version string) string {
return fmt.Sprintf(`
config := ""
isKapsule := strings.HasPrefix(clusterType, "kapsule")
if isKapsule {
config = `
resource "scaleway_vpc_private_network" "type-change" {
name = "test-type-change"
}`
}

config += fmt.Sprintf(`
resource "scaleway_k8s_cluster" "type-change" {
type = "%s"
cni = "%s"
version = "%s"
name = "test-type-change"
tags = [ "terraform-test", "scaleway_k8s_cluster", "type-change" ]
delete_additional_resources = true
}`, clusterType, cni, version)
delete_additional_resources = false`, clusterType, cni, version)

if isKapsule {
config += "\nprivate_network_id = scaleway_vpc_private_network.type-change.id\n}"
} else {
config += "\n}"
}

return config
}
Loading