Skip to content

Commit 6d80620

Browse files
Terraform Team AutomationNagaRajuPasunuri
authored andcommitted
Bug Fix - Only trigger recreation while change subnet_id for endpoint config on native vcn cluster
1 parent aa1a022 commit 6d80620

File tree

2 files changed

+136
-2
lines changed

2 files changed

+136
-2
lines changed

internal/integrationtest/containerengine_cluster_test.go

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,19 @@ import (
2626
)
2727

2828
var (
29+
ContainerengineNativeVCNMigrationClusterRepresentation = map[string]interface{}{
30+
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
31+
"kubernetes_version": acctest.Representation{RepType: acctest.Required, Create: `${data.oci_containerengine_cluster_option.test_cluster_option.kubernetes_versions[length(data.oci_containerengine_cluster_option.test_cluster_option.kubernetes_versions)-1]}`},
32+
"name": acctest.Representation{RepType: acctest.Required, Create: `test_cluster`},
33+
"vcn_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_core_vcn.test_vcn.id}`},
34+
"endpoint_config": acctest.RepresentationGroup{RepType: acctest.Optional, Group: ContainerengineNativeVCNMIgrationClusterEndpointConfigRepresentation},
35+
}
36+
37+
ContainerengineNativeVCNMIgrationClusterEndpointConfigRepresentation = map[string]interface{}{
38+
"nsg_ids": acctest.Representation{RepType: acctest.Optional, Create: []string{`${oci_core_network_security_group.test_network_security_group.id}`}, Update: []string{}},
39+
"subnet_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_core_subnet.test_subnet.id}`, Update: `${oci_core_subnet.test_subnet2.id}`},
40+
}
41+
2942
ContainerengineClusterRequiredOnlyResource = ContainerengineClusterResourceDependencies +
3043
acctest.GenerateResourceFromRepresentationMap("oci_containerengine_cluster", "test_cluster", acctest.Required, acctest.Create, ContainerengineClusterRepresentation)
3144

@@ -96,6 +109,7 @@ var (
96109
acctest.GenerateDataSourceFromRepresentationMap("oci_containerengine_cluster_option", "test_cluster_option", acctest.Required, acctest.Create, ContainerengineContainerengineClusterOptionSingularDataSourceRepresentation) +
97110
acctest.GenerateResourceFromRepresentationMap("oci_core_network_security_group", "test_network_security_group", acctest.Required, acctest.Create, CoreNetworkSecurityGroupRepresentation) +
98111
acctest.GenerateResourceFromRepresentationMap("oci_core_subnet", "test_subnet", acctest.Required, acctest.Create, CoreSubnetRepresentation) +
112+
acctest.GenerateResourceFromRepresentationMap("oci_core_subnet", "test_subnet2", acctest.Required, acctest.Create, acctest.RepresentationCopyWithNewProperties(CoreSubnetRepresentation, map[string]interface{}{"cidr_block": acctest.Representation{RepType: acctest.Required, Create: `10.0.22.0/24`}})) +
99113
acctest.GenerateResourceFromRepresentationMap("oci_core_vcn", "test_vcn", acctest.Required, acctest.Create, acctest.RepresentationCopyWithNewProperties(CoreVcnRepresentation, map[string]interface{}{
100114
"dns_label": acctest.Representation{RepType: acctest.Required, Create: `dnslabel`},
101115
})) +
@@ -410,3 +424,114 @@ func ContainerengineClusterSweepResponseFetchOperation(client *tf_client.OracleC
410424
})
411425
return err
412426
}
427+
428+
// issue-routing-tag: containerengine/default
429+
func TestContainerengineNativeVcnMigration_test(t *testing.T) {
430+
httpreplay.SetScenario("TestContainerengineNativeVcnMigration_test")
431+
defer httpreplay.SaveScenario()
432+
433+
config := acctest.ProviderTestConfig()
434+
435+
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
436+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
437+
438+
resourceName := "oci_containerengine_cluster.test_cluster"
439+
singularDatasourceName := "data.oci_containerengine_migrate_to_native_vcn_status.test_migrate_to_native_vcn_status"
440+
441+
var resId, resId2 string
442+
443+
acctest.SaveConfigContent("", "", "", t)
444+
445+
acctest.ResourceTest(t, nil, []resource.TestStep{
446+
// Create V1h Cluster
447+
{
448+
Config: config + compartmentIdVariableStr + ContainerengineClusterResourceDependencies +
449+
acctest.GenerateResourceFromRepresentationMap("oci_containerengine_cluster", "test_cluster", acctest.Required, acctest.Create, ContainerengineNativeVCNMigrationClusterRepresentation),
450+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
451+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
452+
resource.TestCheckResourceAttrSet(resourceName, "kubernetes_version"),
453+
resource.TestCheckResourceAttr(resourceName, "name", "test_cluster"),
454+
resource.TestCheckResourceAttrSet(resourceName, "vcn_id"),
455+
456+
func(s *terraform.State) (err error) {
457+
resId, err = acctest.FromInstanceState(s, resourceName, "id")
458+
return err
459+
},
460+
),
461+
},
462+
// verify V1h Cluster migrates to V2
463+
{
464+
Config: config + compartmentIdVariableStr + ContainerengineClusterResourceDependencies +
465+
acctest.GenerateResourceFromRepresentationMap("oci_containerengine_cluster", "test_cluster", acctest.Optional, acctest.Update, ContainerengineNativeVCNMigrationClusterRepresentation),
466+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
467+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
468+
resource.TestCheckResourceAttr(resourceName, "endpoint_config.#", "1"),
469+
resource.TestCheckResourceAttr(resourceName, "endpoint_config.0.is_public_ip_enabled", "false"),
470+
resource.TestCheckResourceAttrSet(resourceName, "endpoint_config.0.subnet_id"),
471+
resource.TestCheckResourceAttrSet(resourceName, "kubernetes_version"),
472+
resource.TestCheckResourceAttrSet(resourceName, "vcn_id"),
473+
474+
func(s *terraform.State) (err error) {
475+
resId2, err = acctest.FromInstanceState(s, resourceName, "id")
476+
if resId != resId2 {
477+
return fmt.Errorf("Resource recreated when it was supposed to be updated.")
478+
}
479+
return err
480+
},
481+
),
482+
},
483+
// verify singular datasource
484+
{
485+
Config: config + compartmentIdVariableStr + ContainerengineClusterResourceDependencies + acctest.GenerateResourceFromRepresentationMap("oci_containerengine_cluster", "test_cluster", acctest.Optional, acctest.Update, ContainerengineNativeVCNMigrationClusterRepresentation) + acctest.GenerateDataSourceFromRepresentationMap(
486+
"oci_containerengine_migrate_to_native_vcn_status", "test_migrate_to_native_vcn_status",
487+
acctest.Optional, acctest.Create, ContainerengineContainerengineMigrateToNativeVcnStatuSingularDataSourceRepresentation),
488+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
489+
resource.TestCheckResourceAttrSet(singularDatasourceName, "cluster_id"),
490+
resource.TestCheckResourceAttrSet(singularDatasourceName, "state"),
491+
resource.TestCheckResourceAttrSet(singularDatasourceName, "time_decommission_scheduled"),
492+
),
493+
},
494+
// delete before next Create
495+
{
496+
Config: config + compartmentIdVariableStr + ContainerengineClusterResourceDependencies,
497+
},
498+
// create v2 cluster
499+
{
500+
Config: config + compartmentIdVariableStr + ContainerengineClusterResourceDependencies +
501+
acctest.GenerateResourceFromRepresentationMap("oci_containerengine_cluster", "test_cluster", acctest.Optional, acctest.Create, ContainerengineNativeVCNMigrationClusterRepresentation),
502+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
503+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
504+
resource.TestCheckResourceAttrSet(resourceName, "kubernetes_version"),
505+
resource.TestCheckResourceAttr(resourceName, "name", "test_cluster"),
506+
resource.TestCheckResourceAttrSet(resourceName, "vcn_id"),
507+
resource.TestCheckResourceAttr(resourceName, "endpoint_config.#", "1"),
508+
resource.TestCheckResourceAttr(resourceName, "endpoint_config.0.nsg_ids.#", "1"),
509+
resource.TestCheckResourceAttrSet(resourceName, "endpoint_config.0.subnet_id"),
510+
func(s *terraform.State) (err error) {
511+
resId, err = acctest.FromInstanceState(s, resourceName, "id")
512+
return err
513+
},
514+
),
515+
},
516+
//verify recreation when changing endpointconfig.subnetId
517+
{
518+
Config: config + compartmentIdVariableStr + ContainerengineClusterResourceDependencies +
519+
acctest.GenerateResourceFromRepresentationMap("oci_containerengine_cluster", "test_cluster", acctest.Optional, acctest.Update, ContainerengineNativeVCNMigrationClusterRepresentation),
520+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
521+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
522+
resource.TestCheckResourceAttr(resourceName, "endpoint_config.#", "1"),
523+
resource.TestCheckResourceAttr(resourceName, "endpoint_config.0.is_public_ip_enabled", "false"),
524+
resource.TestCheckResourceAttrSet(resourceName, "endpoint_config.0.subnet_id"),
525+
resource.TestCheckResourceAttrSet(resourceName, "kubernetes_version"),
526+
resource.TestCheckResourceAttrSet(resourceName, "vcn_id"),
527+
func(s *terraform.State) (err error) {
528+
resId2, err = acctest.FromInstanceState(s, resourceName, "id")
529+
if resId == resId2 {
530+
return fmt.Errorf("resource is supposed to be recreated when endpoint_config.subnet_id updated")
531+
}
532+
return err
533+
},
534+
),
535+
},
536+
})
537+
}

internal/service/containerengine/containerengine_cluster_resource.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515

1616
"github.com/oracle/terraform-provider-oci/httpreplay"
1717

18+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff"
1819
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1920
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
2021

@@ -96,9 +97,7 @@ func ContainerengineClusterResource() *schema.Resource {
9697
"subnet_id": {
9798
Type: schema.TypeString,
9899
Required: true,
99-
ForceNew: true,
100100
},
101-
102101
// Optional
103102
"is_public_ip_enabled": {
104103
Type: schema.TypeBool,
@@ -437,6 +436,16 @@ func ContainerengineClusterResource() *schema.Resource {
437436
Computed: true,
438437
},
439438
},
439+
CustomizeDiff: customdiff.All(
440+
customdiff.ForceNewIfChange("endpoint_config.0.subnet_id", func(ctx context.Context, old, new, meta interface{}) bool {
441+
oldSubnetId := old.(string)
442+
if len(oldSubnetId) > 0 {
443+
// OKE do not allow customer to change endpointConfig.subnetId once it is configured. Once the oldSubnetId exist, we need to force a recreation.
444+
return true
445+
}
446+
return false
447+
}),
448+
),
440449
}
441450
}
442451

0 commit comments

Comments
 (0)