diff --git a/provider/resource_rediscloud_pro_database.go b/provider/resource_rediscloud_pro_database.go index 633d72bf..f5a87dc6 100644 --- a/provider/resource_rediscloud_pro_database.go +++ b/provider/resource_rediscloud_pro_database.go @@ -81,14 +81,12 @@ func resourceRedisCloudProDatabase() *schema.Resource { Description: "(Deprecated) Maximum memory usage for this specific database", Type: schema.TypeFloat, Optional: true, - Computed: true, ExactlyOneOf: []string{"memory_limit_in_gb", "dataset_size_in_gb"}, }, "dataset_size_in_gb": { Description: "Maximum amount of data in the dataset for this specific database in GB", Type: schema.TypeFloat, Optional: true, - Computed: true, ExactlyOneOf: []string{"memory_limit_in_gb", "dataset_size_in_gb"}, }, "support_oss_cluster_api": { @@ -659,16 +657,14 @@ func resourceRedisCloudProDatabaseRead(ctx context.Context, d *schema.ResourceDa return diag.FromErr(err) } - // To prevent both fields being included in API requests, only one of these two fields should be set in the state - // Only add `dataset_size_in_gb` to the state if `memory_limit_in_gb` is not already in the state - if _, inState := d.GetOk("memory_limit_in_gb"); !inState { + // The user (state) has one of dataset_size_in_gb and memory_limit_in_gb + if _, inState := d.GetOk("dataset_size_in_gb"); inState { if err := d.Set("dataset_size_in_gb", redis.Float64Value(db.DatasetSizeInGB)); err != nil { return diag.FromErr(err) } } - // Likewise, only add `memory_limit_in_gb` to the state if `dataset_size_in_gb` is not already in the state - if _, inState := d.GetOk("dataset_size_in_gb"); !inState { + if _, inState := d.GetOk("memory_limit_in_gb"); inState { if err := d.Set("memory_limit_in_gb", redis.Float64Value(db.MemoryLimitInGB)); err != nil { return diag.FromErr(err) } @@ -827,10 +823,9 @@ func resourceRedisCloudProDatabaseUpdate(ctx context.Context, d *schema.Resource // One of the following fields must be set, validation is handled in the schema (ExactlyOneOf) if v, ok := d.GetOk("dataset_size_in_gb"); ok { update.DatasetSizeInGB = redis.Float64(v.(float64)) - } else { - if v, ok := d.GetOk("memory_limit_in_gb"); ok { - update.MemoryLimitInGB = redis.Float64(v.(float64)) - } + } + if v, ok := d.GetOk("memory_limit_in_gb"); ok { + update.MemoryLimitInGB = redis.Float64(v.(float64)) } // The below fields are optional and will only be sent in the request if they are present in the Terraform configuration diff --git a/provider/resource_rediscloud_pro_database_test.go b/provider/resource_rediscloud_pro_database_test.go index 79e5c627..8a76490c 100644 --- a/provider/resource_rediscloud_pro_database_test.go +++ b/provider/resource_rediscloud_pro_database_test.go @@ -147,9 +147,10 @@ func TestAccResourceRedisCloudProDatabase_CRUDI(t *testing.T) { }, // Test that that database is imported successfully { - ResourceName: "rediscloud_subscription_database.no_password_database", - ImportState: true, - ImportStateVerify: true, + ResourceName: "rediscloud_subscription_database.no_password_database", + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"dataset_size_in_gb"}, }, }, }) @@ -217,9 +218,10 @@ func TestAccResourceRedisCloudProDatabase_MultiModules(t *testing.T) { ), }, { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"dataset_size_in_gb"}, }, }, }) @@ -257,6 +259,193 @@ func TestAccResourceRedisCloudProDatabase_respversion(t *testing.T) { }) } +func TestAccResourceRedisCloudProDatabase_datasetSizeWithReplication(t *testing.T) { + name := acctest.RandomWithPrefix(testResourcePrefix) + subName := name + "-subscription" + dbName := name + "-database" + const resourceName = "rediscloud_subscription_database.example" + testCloudAccountName := os.Getenv("AWS_TEST_CLOUD_ACCOUNT_NAME") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t); testAccAwsPreExistingCloudAccountPreCheck(t) }, + ProviderFactories: providerFactories, + CheckDestroy: testAccCheckProSubscriptionDestroy, + Steps: []resource.TestStep{ + // Test database creation with dataset_size_in_gb + { + Config: fmt.Sprintf(testAccResourceRedisCloudProDatabaseDatasetMemory, testCloudAccountName, subName, dbName, "dataset_size_in_gb = 2", true), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "dataset_size_in_gb", "2"), + resource.TestCheckNoResourceAttr(resourceName, "memory_limit_in_gb"), + ), + }, + // Test dataset_size_in_gb updates + { + Config: fmt.Sprintf(testAccResourceRedisCloudProDatabaseDatasetMemory, testCloudAccountName, subName, dbName, "dataset_size_in_gb = 1", true), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "dataset_size_in_gb", "1"), + resource.TestCheckNoResourceAttr(resourceName, "memory_limit_in_gb"), + ), + }, + // Test switch to memory_limit_in_gb + { + Config: fmt.Sprintf(testAccResourceRedisCloudProDatabaseDatasetMemory, testCloudAccountName, subName, dbName, "memory_limit_in_gb = 1", true), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "dataset_size_in_gb", "0"), + resource.TestCheckResourceAttr(resourceName, "memory_limit_in_gb", "1"), + ), + }, + // Test memory_limit_in_gb updates + { + Config: fmt.Sprintf(testAccResourceRedisCloudProDatabaseDatasetMemory, testCloudAccountName, subName, dbName, "memory_limit_in_gb = 2", true), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "dataset_size_in_gb", "0"), + resource.TestCheckResourceAttr(resourceName, "memory_limit_in_gb", "2"), + ), + }, + // Test switch back to dataset_size_in_gb + { + Config: fmt.Sprintf(testAccResourceRedisCloudProDatabaseDatasetMemory, testCloudAccountName, subName, dbName, "dataset_size_in_gb = 1", true), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "dataset_size_in_gb", "1"), + resource.TestCheckResourceAttr(resourceName, "memory_limit_in_gb", "0"), + ), + }, + // Test that that database is imported successfully + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"dataset_size_in_gb", "memory_limit_in_gb"}, + }, + }, + }) +} + +func TestAccResourceRedisCloudProDatabase_datasetSizeWithoutReplication(t *testing.T) { + name := acctest.RandomWithPrefix(testResourcePrefix) + subName := name + "-subscription" + dbName := name + "-database" + const resourceName = "rediscloud_subscription_database.example" + testCloudAccountName := os.Getenv("AWS_TEST_CLOUD_ACCOUNT_NAME") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t); testAccAwsPreExistingCloudAccountPreCheck(t) }, + ProviderFactories: providerFactories, + CheckDestroy: testAccCheckProSubscriptionDestroy, + Steps: []resource.TestStep{ + // Test database creation with dataset_size_in_gb + { + Config: fmt.Sprintf(testAccResourceRedisCloudProDatabaseDatasetMemory, testCloudAccountName, subName, dbName, "dataset_size_in_gb = 2", false), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "dataset_size_in_gb", "2"), + resource.TestCheckNoResourceAttr(resourceName, "memory_limit_in_gb"), + ), + }, + // Test dataset_size_in_gb updates + { + Config: fmt.Sprintf(testAccResourceRedisCloudProDatabaseDatasetMemory, testCloudAccountName, subName, dbName, "dataset_size_in_gb = 1", false), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "dataset_size_in_gb", "1"), + resource.TestCheckNoResourceAttr(resourceName, "memory_limit_in_gb"), + ), + }, + // Test switch to memory_limit_in_gb + { + Config: fmt.Sprintf(testAccResourceRedisCloudProDatabaseDatasetMemory, testCloudAccountName, subName, dbName, "memory_limit_in_gb = 1", false), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "dataset_size_in_gb", "0"), + resource.TestCheckResourceAttr(resourceName, "memory_limit_in_gb", "1"), + ), + }, + // Test memory_limit_in_gb updates + { + Config: fmt.Sprintf(testAccResourceRedisCloudProDatabaseDatasetMemory, testCloudAccountName, subName, dbName, "memory_limit_in_gb = 2", false), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "dataset_size_in_gb", "0"), + resource.TestCheckResourceAttr(resourceName, "memory_limit_in_gb", "2"), + ), + }, // Test switch back to dataset_size_in_gb + { + Config: fmt.Sprintf(testAccResourceRedisCloudProDatabaseDatasetMemory, testCloudAccountName, subName, dbName, "dataset_size_in_gb = 1", false), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "dataset_size_in_gb", "1"), + resource.TestCheckResourceAttr(resourceName, "memory_limit_in_gb", "0"), + ), + }, + // Test that that database is imported successfully + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"dataset_size_in_gb", "memory_limit_in_gb"}, + }, + }, + }) +} + +func TestAccResourceRedisCloudProDatabase_datasetSizeStartAsMemoryLimit(t *testing.T) { + name := acctest.RandomWithPrefix(testResourcePrefix) + subName := name + "-subscription" + dbName := name + "-database" + const resourceName = "rediscloud_subscription_database.example" + testCloudAccountName := os.Getenv("AWS_TEST_CLOUD_ACCOUNT_NAME") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t); testAccAwsPreExistingCloudAccountPreCheck(t) }, + ProviderFactories: providerFactories, + CheckDestroy: testAccCheckProSubscriptionDestroy, + Steps: []resource.TestStep{ + // Test database creation with memory_limit_in_gb + { + Config: fmt.Sprintf(testAccResourceRedisCloudProDatabaseDatasetMemory, testCloudAccountName, subName, dbName, "memory_limit_in_gb = 2", false), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckNoResourceAttr(resourceName, "dataset_size_in_gb"), + resource.TestCheckResourceAttr(resourceName, "memory_limit_in_gb", "2"), + ), + }, + // Test memory_limit_in_gb updates + { + Config: fmt.Sprintf(testAccResourceRedisCloudProDatabaseDatasetMemory, testCloudAccountName, subName, dbName, "memory_limit_in_gb = 1", false), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckNoResourceAttr(resourceName, "dataset_size_in_gb"), + resource.TestCheckResourceAttr(resourceName, "memory_limit_in_gb", "1"), + ), + }, + // Test switch to dataset_size_in_gb + { + Config: fmt.Sprintf(testAccResourceRedisCloudProDatabaseDatasetMemory, testCloudAccountName, subName, dbName, "dataset_size_in_gb = 1", false), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "dataset_size_in_gb", "1"), + resource.TestCheckResourceAttr(resourceName, "memory_limit_in_gb", "0"), + ), + }, + // Test dataset_size_in_gb updates + { + Config: fmt.Sprintf(testAccResourceRedisCloudProDatabaseDatasetMemory, testCloudAccountName, subName, dbName, "dataset_size_in_gb = 2", false), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "dataset_size_in_gb", "2"), + resource.TestCheckResourceAttr(resourceName, "memory_limit_in_gb", "0"), + ), + }, // Test switch back to memory_limit_in_gb + { + Config: fmt.Sprintf(testAccResourceRedisCloudProDatabaseDatasetMemory, testCloudAccountName, subName, dbName, "memory_limit_in_gb = 1", false), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "memory_limit_in_gb", "1"), + resource.TestCheckResourceAttr(resourceName, "dataset_size_in_gb", "0"), + ), + }, + // Test that that database is imported successfully + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"dataset_size_in_gb", "memory_limit_in_gb"}, + }, + }, + }) +} + const proSubscriptionBoilerplate = ` data "rediscloud_payment_method" "card" { card_type = "Visa" @@ -524,3 +713,18 @@ resource "rediscloud_subscription_database" "example" { resp_version = "%s" } ` + +const testAccResourceRedisCloudProDatabaseDatasetMemory = proSubscriptionBoilerplate + ` + +resource "rediscloud_subscription_database" "example" { + subscription_id = rediscloud_subscription.example.id + name = "%s" + # This is the dataset_size_in_gb/memory_limit_in_gb line + %s + data_persistence = "none" + data_eviction = "noeviction" + throughput_measurement_by = "operations-per-second" + throughput_measurement_value = 1000 + replication = %t +} +` diff --git a/provider/resource_rediscloud_pro_tls_test.go b/provider/resource_rediscloud_pro_tls_test.go index b94aad12..68ccd928 100644 --- a/provider/resource_rediscloud_pro_tls_test.go +++ b/provider/resource_rediscloud_pro_tls_test.go @@ -116,7 +116,7 @@ func TestAccResourceRedisCloudSubscription_createWithDatabaseWithEnabledTlsAndSs ResourceName: databaseName, ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"client_ssl_certificate", "client_tls_certificates"}, + ImportStateVerifyIgnore: []string{"client_ssl_certificate", "client_tls_certificates", "dataset_size_in_gb"}, }, }, }) @@ -361,7 +361,7 @@ func TestAccResourceRedisCloudSubscription_createWithDatabaseWithEnabledTlsAndTl ResourceName: databaseName, ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"client_tls_certificates"}, + ImportStateVerifyIgnore: []string{"client_tls_certificates", "dataset_size_in_gb"}, }, }, })