From 36deb3e6ea898776cdab4e733da062401bc3f830 Mon Sep 17 00:00:00 2001 From: Adrian Johnson Date: Fri, 21 Nov 2025 10:41:52 -0600 Subject: [PATCH 1/6] aws_odb_cloud_vm_cluster: check only that values are null for validation --- internal/service/odb/cloud_vm_cluster.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/service/odb/cloud_vm_cluster.go b/internal/service/odb/cloud_vm_cluster.go index bf145895c97c..a0f68a4a5d9a 100644 --- a/internal/service/odb/cloud_vm_cluster.go +++ b/internal/service/odb/cloud_vm_cluster.go @@ -880,17 +880,17 @@ type cloudVMCDbIormConfigResourceModel struct { } func (r cloudVmClusterResourceModel) isNetworkIdAndExadataInfraIdPresent() bool { - return !r.OdbNetworkId.IsNull() && !r.OdbNetworkId.IsUnknown() && !r.CloudExadataInfrastructureId.IsNull() && !r.CloudExadataInfrastructureId.IsUnknown() + return !r.OdbNetworkId.IsNull() && !r.CloudExadataInfrastructureId.IsNull() } func (r cloudVmClusterResourceModel) isNetworkARNAndExadataInfraARNPresent() bool { - return !r.OdbNetworkArn.IsNull() && !r.OdbNetworkArn.IsUnknown() && !r.CloudExadataInfrastructureArn.IsNull() && !r.CloudExadataInfrastructureArn.IsUnknown() + return !r.OdbNetworkArn.IsNull() && !r.CloudExadataInfrastructureArn.IsNull() } func (r cloudVmClusterResourceModel) isNetworkARNAndIdPresent() bool { - return (!r.OdbNetworkId.IsNull() && !r.OdbNetworkId.IsUnknown()) && (!r.OdbNetworkArn.IsNull() && !r.OdbNetworkArn.IsUnknown()) + return !r.OdbNetworkId.IsNull() && !r.OdbNetworkArn.IsNull() } func (r cloudVmClusterResourceModel) isExadataInfraARNAndIdPresent() bool { - return (!r.CloudExadataInfrastructureId.IsNull() && !r.CloudExadataInfrastructureId.IsUnknown()) && (!r.CloudExadataInfrastructureArn.IsNull() && !r.CloudExadataInfrastructureArn.IsUnknown()) + return !r.CloudExadataInfrastructureId.IsNull() && !r.CloudExadataInfrastructureArn.IsNull() } From 3675df4314b64c013f49608fe8c8c836ca026f40 Mon Sep 17 00:00:00 2001 From: Adrian Johnson Date: Fri, 21 Nov 2025 11:14:32 -0600 Subject: [PATCH 2/6] aws_odb_cloud_vm_cluster: add test for variable validation --- internal/service/odb/cloud_vm_cluster_test.go | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/internal/service/odb/cloud_vm_cluster_test.go b/internal/service/odb/cloud_vm_cluster_test.go index b7e561c8d87c..e6f1e8426afa 100644 --- a/internal/service/odb/cloud_vm_cluster_test.go +++ b/internal/service/odb/cloud_vm_cluster_test.go @@ -332,6 +332,31 @@ func TestAccODBCloudVmCluster_usingARN(t *testing.T) { }) } +func TestAccODBCloudVmCluster_variables(t *testing.T) { + ctx := acctest.Context(t) + if testing.Short() { + t.Skip("skipping long-running test in short mode") + } + + vmcDisplayName := sdkacctest.RandomWithPrefix(vmClusterTestEntity.vmClusterDisplayNamePrefix) + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { + acctest.PreCheck(ctx, t) + vmClusterTestEntity.testAccPreCheck(ctx, t) + }, + ErrorCheck: acctest.ErrorCheck(t, names.ODBServiceID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: vmClusterTestEntity.testAccCheckCloudVmClusterDestroy(ctx), + Steps: []resource.TestStep{ + { + Config: testAccCloudVmClusterConfig_useVariables(vmcDisplayName), + PlanOnly: true, + ExpectNonEmptyPlan: true, + }, + }, + }) +} + func (cloudVmClusterResourceTest) testAccCheckCloudVmClusterDestroy(ctx context.Context) resource.TestCheckFunc { return func(s *terraform.State) error { conn := acctest.Provider.Meta().(*conns.AWSClient).ODBClient(ctx) @@ -383,6 +408,43 @@ func (cloudVmClusterResourceTest) testAccPreCheck(ctx context.Context, t *testin } } +func testAccCloudVmClusterConfig_useVariables(rName string) string { + return fmt.Sprintf(` +variable cloud_exadata_infrastructure_id { + default = "exa_gjrmtxl4qk" + type = string + description = "ODB Exadata Infrastructure Resource ID" + +} +variable odb_network_id { + default = "odbnet_3l9st3litg" + type = string + description = "ODB Network" +} + +resource "aws_odb_cloud_vm_cluster" "test" { + display_name = %[1]q + cloud_exadata_infrastructure_id = var.cloud_exadata_infrastructure_id + cpu_core_count = 6 + gi_version = "23.0.0.0" + hostname_prefix = "apollo12" + ssh_public_keys = ["public-ssh-key"] + odb_network_id = var.odb_network_id + is_local_backup_enabled = true + is_sparse_diskgroup_enabled = true + license_model = "LICENSE_INCLUDED" + data_storage_size_in_tbs = 20.0 + db_servers = ["db-server-1", "db-server-2"] + db_node_storage_size_in_gbs = 120.0 + memory_size_in_gbs = 60 + data_collection_options { + is_diagnostics_events_enabled = false + is_health_monitoring_enabled = false + is_incident_logs_enabled = false + } +} +`, rName) +} func (cloudVmClusterResourceTest) testAccCloudVmClusterConfigBasic(vmClusterDisplayName, sshKey string) (string, string) { exaInfraDisplayName := sdkacctest.RandomWithPrefix(vmClusterTestEntity.exaInfraDisplayNamePrefix) odbNetDisplayName := sdkacctest.RandomWithPrefix(vmClusterTestEntity.odbNetDisplayNamePrefix) From c44ab7f311be5a1f29781bbe491a877fc5839c69 Mon Sep 17 00:00:00 2001 From: Adrian Johnson Date: Fri, 21 Nov 2025 11:18:12 -0600 Subject: [PATCH 3/6] linter fix --- internal/service/odb/cloud_vm_cluster_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/service/odb/cloud_vm_cluster_test.go b/internal/service/odb/cloud_vm_cluster_test.go index e6f1e8426afa..3a9336227045 100644 --- a/internal/service/odb/cloud_vm_cluster_test.go +++ b/internal/service/odb/cloud_vm_cluster_test.go @@ -411,13 +411,13 @@ func (cloudVmClusterResourceTest) testAccPreCheck(ctx context.Context, t *testin func testAccCloudVmClusterConfig_useVariables(rName string) string { return fmt.Sprintf(` variable cloud_exadata_infrastructure_id { - default = "exa_gjrmtxl4qk" + default = "exa_gjrmtxl4qk" type = string description = "ODB Exadata Infrastructure Resource ID" } variable odb_network_id { - default = "odbnet_3l9st3litg" + default = "odbnet_3l9st3litg" type = string description = "ODB Network" } From f256ec517d4a2d8bb6f96156bad5e7a9692ddd77 Mon Sep 17 00:00:00 2001 From: Adrian Johnson Date: Fri, 21 Nov 2025 11:20:00 -0600 Subject: [PATCH 4/6] add CHANGELOG entry --- .changelog/45205.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/45205.txt diff --git a/.changelog/45205.txt b/.changelog/45205.txt new file mode 100644 index 000000000000..2a155235ed36 --- /dev/null +++ b/.changelog/45205.txt @@ -0,0 +1,3 @@ +```release-note:bug +resource/aws_odb_cloud_vm_cluster: Fix incorrect validation error when arguments are configured using variables +``` \ No newline at end of file From 67b49e234f265a88e439fb44d6595a0fd087a16f Mon Sep 17 00:00:00 2001 From: Adrian Johnson Date: Fri, 21 Nov 2025 11:26:23 -0600 Subject: [PATCH 5/6] update CHANGELOG entry --- .changelog/45205.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changelog/45205.txt b/.changelog/45205.txt index 2a155235ed36..3db6869e7008 100644 --- a/.changelog/45205.txt +++ b/.changelog/45205.txt @@ -1,3 +1,3 @@ ```release-note:bug -resource/aws_odb_cloud_vm_cluster: Fix incorrect validation error when arguments are configured using variables +resource/aws_odb_cloud_vm_cluster: Fix incorrect validation error when arguments are configured using variables. This addresses a regression introduced in [v6.22.0](https://github.com/hashicorp/terraform-provider-aws/blob/main/CHANGELOG.md#6220-november-20-2025) ``` \ No newline at end of file From 01dba23c7aaaa635c7817d654247b91dce6a8306 Mon Sep 17 00:00:00 2001 From: Adrian Johnson Date: Fri, 21 Nov 2025 11:48:58 -0600 Subject: [PATCH 6/6] linter fix --- internal/service/odb/cloud_vm_cluster_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/service/odb/cloud_vm_cluster_test.go b/internal/service/odb/cloud_vm_cluster_test.go index 3a9336227045..5a311c71e8f6 100644 --- a/internal/service/odb/cloud_vm_cluster_test.go +++ b/internal/service/odb/cloud_vm_cluster_test.go @@ -348,6 +348,7 @@ func TestAccODBCloudVmCluster_variables(t *testing.T) { ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, CheckDestroy: vmClusterTestEntity.testAccCheckCloudVmClusterDestroy(ctx), Steps: []resource.TestStep{ + // nosemgrep:ci.semgrep.acctest.checks.replace-planonly-checks { Config: testAccCloudVmClusterConfig_useVariables(vmcDisplayName), PlanOnly: true,