Skip to content
Closed
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
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ go 1.24.0
toolchain go1.24.1

require (
github.com/RedisLabs/rediscloud-go-api v0.38.0
github.com/RedisLabs/rediscloud-go-api v0.39.0
github.com/bflad/tfproviderlint v0.31.0
github.com/hashicorp/go-cty v1.5.0
github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw=
github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
github.com/RedisLabs/rediscloud-go-api v0.38.0 h1:lLOS0E8tQhUzuUfb/H+QWtDaZrC9xNnTvAPBygH4WS8=
github.com/RedisLabs/rediscloud-go-api v0.38.0/go.mod h1:Hkh3i/EsHnyfgV0ijednbofz/EmZC3sFnSNNruF3G6I=
github.com/RedisLabs/rediscloud-go-api v0.39.0 h1:VNI7VyP9V41Z8FP558v60WCJFBB57AGuQQq3QY4t2VU=
github.com/RedisLabs/rediscloud-go-api v0.39.0/go.mod h1:Hkh3i/EsHnyfgV0ijednbofz/EmZC3sFnSNNruF3G6I=
github.com/agext/levenshtein v1.2.2 h1:0S/Yg6LYmFJ5stwQeRp6EeOcCbj7xiqQSdNelsXvaqE=
github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec=
Expand Down
26 changes: 19 additions & 7 deletions provider/pro/resource_rediscloud_pro_database.go
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,12 @@ func ResourceRedisCloudProDatabase() *schema.Resource {
Optional: true,
Default: true,
},
"auto_minor_version_upgrade": {
Description: "When 'true', enables auto minor version upgrades for this database. Default: 'true'",
Type: schema.TypeBool,
Optional: true,
Default: true,
},
"port": {
Description: "TCP port on which the database is available",
Type: schema.TypeInt,
Expand Down Expand Up @@ -436,6 +442,10 @@ func resourceRedisCloudProDatabaseCreate(ctx context.Context, d *schema.Resource
createDatabase.RespVersion = s
})

utils.SetBool(d, "auto_minor_version_upgrade", func(b *bool) {
createDatabase.AutoMinorVersionUpgrade = b
})

// Confirm sub is ready to accept a db request
if err := utils.WaitForSubscriptionToBeActive(ctx, subId, api); err != nil {
return diag.FromErr(err)
Expand Down Expand Up @@ -731,12 +741,13 @@ func resourceRedisCloudProDatabaseUpdate(ctx context.Context, d *schema.Resource
Value: utils.GetInt(d, "throughput_measurement_value"),
},

DataPersistence: utils.GetString(d, "data_persistence"),
DataEvictionPolicy: utils.GetString(d, "data_eviction"),
SourceIP: utils.SetToStringSlice(d.Get("source_ips").(*schema.Set)),
Alerts: &alerts,
RemoteBackup: BuildBackupPlan(d.Get("remote_backup").([]interface{}), d.Get("periodic_backup_path")),
EnableDefaultUser: utils.GetBool(d, "enable_default_user"),
DataPersistence: utils.GetString(d, "data_persistence"),
DataEvictionPolicy: utils.GetString(d, "data_eviction"),
SourceIP: utils.SetToStringSlice(d.Get("source_ips").(*schema.Set)),
Alerts: &alerts,
RemoteBackup: BuildBackupPlan(d.Get("remote_backup").([]interface{}), d.Get("periodic_backup_path")),
EnableDefaultUser: utils.GetBool(d, "enable_default_user"),
AutoMinorVersionUpgrade: utils.GetBool(d, "auto_minor_version_upgrade"),
}

// One of the following fields must be set, validation is handled in the schema (ExactlyOneOf)
Expand Down Expand Up @@ -1048,7 +1059,8 @@ func validateModulesForRedis8() schema.CustomizeDiffFunc {
if strings.HasPrefix(version, "8.") {
moduleSet := modules.(*schema.Set)
if moduleSet.Len() > 0 {
return fmt.Errorf(`"modules" cannot be explicitly set for Redis version %s as modules are bundled by default. Remove the "modules" field from your configuration`, version)
log.Printf("[WARN] Modules are bundled by default in Redis %s. You should remove the modules block as it is deprecated for this version.", version)
return nil
}
}
}
Expand Down
50 changes: 50 additions & 0 deletions provider/pro/testdata/pro_database_auto_minor_version_upgrade.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
locals {
rediscloud_cloud_account = "%s"
rediscloud_subscription_name = "%s"
auto_minor_version_upgrade = %s
}

data "rediscloud_payment_method" "card" {
card_type = "Visa"
last_four_numbers = "5556"
}

data "rediscloud_cloud_account" "account" {
exclude_internal_account = true
provider_type = "AWS"
name = local.rediscloud_cloud_account
}

resource "rediscloud_subscription" "example" {
name = local.rediscloud_subscription_name
payment_method_id = data.rediscloud_payment_method.card.id
memory_storage = "ram"
cloud_provider {
provider = data.rediscloud_cloud_account.account.provider_type
cloud_account_id = data.rediscloud_cloud_account.account.id
region {
region = "eu-west-1"
networking_deployment_cidr = "10.0.0.0/24"
preferred_availability_zones = ["eu-west-1a"]
}
}

creation_plan {
memory_limit_in_gb = 1
quantity = 1
replication = false
throughput_measurement_by = "operations-per-second"
throughput_measurement_value = 1000
}
}

resource "rediscloud_subscription_database" "example" {
subscription_id = rediscloud_subscription.example.id
name = "auto-minor-version-upgrade-test"
protocol = "redis"
memory_limit_in_gb = 1
data_persistence = "none"
throughput_measurement_by = "operations-per-second"
throughput_measurement_value = 1000
auto_minor_version_upgrade = local.auto_minor_version_upgrade
}
45 changes: 22 additions & 23 deletions provider/pro/testdata/pro_database_data_source.tf
Original file line number Diff line number Diff line change
@@ -1,40 +1,39 @@
locals {
rediscloud_cloud_account = "%s"
rediscloud_cloud_account = "%s"
rediscloud_subscription_name = "%s"
rediscloud_password = "%s"
rediscloud_password = "%s"
}

data "rediscloud_payment_method" "card" {
card_type = "Visa"
card_type = "Visa"
last_four_numbers = "5556"
}

data "rediscloud_cloud_account" "account" {
exclude_internal_account = true
provider_type = "AWS"
name = local.rediscloud_cloud_account
provider_type = "AWS"
name = local.rediscloud_cloud_account
}
resource "rediscloud_subscription" "example" {
name = local.rediscloud_subscription_name
name = local.rediscloud_subscription_name
payment_method_id = data.rediscloud_payment_method.card.id
memory_storage = "ram"
memory_storage = "ram"
cloud_provider {
provider = data.rediscloud_cloud_account.account.provider_type
provider = data.rediscloud_cloud_account.account.provider_type
cloud_account_id = data.rediscloud_cloud_account.account.id
region {
region = "eu-west-1"
region = "eu-west-1"
networking_deployment_cidr = "10.0.0.0/24"
preferred_availability_zones = ["eu-west-1a"]
}
}
creation_plan {
memory_limit_in_gb = 1
quantity = 1
replication=false
support_oss_cluster_api=true
throughput_measurement_by = "operations-per-second"
memory_limit_in_gb = 1
quantity = 1
replication = false
support_oss_cluster_api = true
throughput_measurement_by = "operations-per-second"
throughput_measurement_value = 1000
query_performance_factor = "2x"
modules = ["RediSearch"]
}
}
Expand All @@ -47,24 +46,24 @@ resource "rediscloud_subscription_database" "example" {
throughput_measurement_by = "operations-per-second"
throughput_measurement_value = 1000
password = local.rediscloud_password
support_oss_cluster_api = true
replication = false
enable_default_user = true
query_performance_factor = "2x"
redis_version = "7.4"
support_oss_cluster_api = true
replication = false
enable_default_user = true
query_performance_factor = "2x"
redis_version = "7.4"
modules = [
{
name: "RediSearch"
name : "RediSearch"
}
]
}

data "rediscloud_database" "example-by-id" {
subscription_id = rediscloud_subscription.example.id
db_id = rediscloud_subscription_database.example.db_id
db_id = rediscloud_subscription_database.example.db_id
}

data "rediscloud_database" "example-by-name" {
subscription_id = rediscloud_subscription.example.id
name = rediscloud_subscription_database.example.name
name = rediscloud_subscription_database.example.name
}
33 changes: 33 additions & 0 deletions provider/rediscloud_active_active_database_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -515,3 +515,36 @@ resource "rediscloud_active_active_subscription_database" "example" {
}
}
`

func TestAccResourceRedisCloudActiveActiveDatabase_autoMinorVersionUpgrade(t *testing.T) {

utils.AccRequiresEnvVar(t, "EXECUTE_TESTS")

subscriptionName := acctest.RandomWithPrefix(testResourcePrefix) + "-subscription"
name := acctest.RandomWithPrefix(testResourcePrefix) + "-database"
const resourceName = "rediscloud_active_active_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: testAccCheckActiveActiveSubscriptionDestroy,
Steps: []resource.TestStep{
// Test database creation with auto_minor_version_upgrade set to false
{
Config: fmt.Sprintf(utils.GetTestConfig(t, "./testdata/active_active_database_auto_minor_version_upgrade.tf"), testCloudAccountName, subscriptionName, name, "false"),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttr(resourceName, "name", "auto-minor-version-upgrade-test"),
resource.TestCheckResourceAttr(resourceName, "auto_minor_version_upgrade", "false"),
),
},
// Test database update with auto_minor_version_upgrade set to true
{
Config: fmt.Sprintf(utils.GetTestConfig(t, "./testdata/active_active_database_auto_minor_version_upgrade.tf"), testCloudAccountName, subscriptionName, name, "true"),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttr(resourceName, "auto_minor_version_upgrade", "true"),
),
},
},
})
}
16 changes: 15 additions & 1 deletion provider/resource_rediscloud_active_active_database.go
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,13 @@ func resourceRedisCloudActiveActiveDatabase() *schema.Resource {
Type: schema.TypeBool,
Optional: true,
},
"override_region": {
"auto_minor_version_upgrade": {
Description: "When 'true', enables auto minor version upgrades for this database. Default: 'true'",
Type: schema.TypeBool,
Optional: true,
Default: true,
},
"override_region": {
Description: "Region-specific configuration parameters to override the global configuration",
Type: schema.TypeSet,
Optional: true,
Expand Down Expand Up @@ -447,6 +453,10 @@ func resourceRedisCloudActiveActiveDatabaseCreate(ctx context.Context, d *schema
createDatabase.RedisVersion = s
})

utils.SetBool(d, "auto_minor_version_upgrade", func(b *bool) {
createDatabase.AutoMinorVersionUpgrade = b
})

// Confirm Subscription Active status before creating database
err = utils.WaitForSubscriptionToBeActive(ctx, subId, api)
if err != nil {
Expand Down Expand Up @@ -799,6 +809,10 @@ func resourceRedisCloudActiveActiveDatabaseUpdate(ctx context.Context, d *schema
update.GlobalEnableDefaultUser = redis.Bool(v.(bool))
}

if v, ok := d.GetOk("auto_minor_version_upgrade"); ok {
update.AutoMinorVersionUpgrade = redis.Bool(v.(bool))
}

if v, ok := d.GetOk("support_oss_cluster_api"); ok {
update.SupportOSSClusterAPI = redis.Bool(v.(bool))
}
Expand Down
9 changes: 9 additions & 0 deletions provider/resource_rediscloud_essentials_database.go
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,7 @@ func resourceRedisCloudEssentialsDatabaseCreate(ctx context.Context, d *schema.R
api := meta.(*client.ApiClient)

subId := d.Get("subscription_id").(int)
log.Printf("[DEBUG] Creating essentials database in subscription %d", subId)

utils.SubscriptionMutex.Lock(subId)

Expand All @@ -316,6 +317,11 @@ func resourceRedisCloudEssentialsDatabaseCreate(ctx context.Context, d *schema.R
Replication: redis.Bool(d.Get("replication").(bool)),
PeriodicBackupPath: redis.String(d.Get("periodic_backup_path").(string)),
}
log.Printf("[DEBUG] Essentials database create request - Name: %s, DataPersistence: %s, DataEviction: %s, Replication: %v",
redis.StringValue(createDatabaseRequest.Name),
redis.StringValue(createDatabaseRequest.DataPersistence),
redis.StringValue(createDatabaseRequest.DataEvictionPolicy),
redis.BoolValue(createDatabaseRequest.Replication))

protocol := d.Get("protocol").(string)
if protocol != "" {
Expand Down Expand Up @@ -411,11 +417,14 @@ func resourceRedisCloudEssentialsDatabaseCreate(ctx context.Context, d *schema.R
createDatabaseRequest.EnableTls = redis.Bool(d.Get("enable_tls").(bool))
}

log.Printf("[DEBUG] Calling FixedDatabases.Create API for subscription %d with database name: %s", subId, redis.StringValue(createDatabaseRequest.Name))
databaseId, err := api.Client.FixedDatabases.Create(ctx, subId, createDatabaseRequest)
if err != nil {
log.Printf("[ERROR] FixedDatabases.Create failed for subscription %d: %v", subId, err)
utils.SubscriptionMutex.Unlock(subId)
return diag.FromErr(err)
}
log.Printf("[DEBUG] FixedDatabases.Create succeeded for subscription %d, database ID: %d", subId, databaseId)

d.SetId(utils.BuildResourceId(subId, databaseId))

Expand Down
4 changes: 2 additions & 2 deletions provider/resource_rediscloud_pro_database_qpf_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ func TestAccResourceRedisCloudProDatabase_qpf_missingModule(t *testing.T) {

config := formatDatabaseConfig(name, testCloudAccountName, password, "4x", "")

testErrorCase(t, config, regexp.MustCompile("query_performance_factor\" requires the \"modules\" key to be explicitly defined in HCL"))
testErrorCase(t, config, regexp.MustCompile("DATABASE_QUERY_PERFORMANCE_FACTOR_SEARCH_IS_REQUIRED.*RediSearch.*required"))
}

func TestAccResourceRedisCloudProDatabase_qpf_missingRediSearchModule(t *testing.T) {
Expand All @@ -160,7 +160,7 @@ func TestAccResourceRedisCloudProDatabase_qpf_missingRediSearchModule(t *testing

config := formatDatabaseConfig(name, testCloudAccountName, password, "4x", `modules = [{ name = "RediBloom" }]`)

testErrorCase(t, config, regexp.MustCompile("query_performance_factor\" requires the \"modules\" list to contain \"RediSearch"))
testErrorCase(t, config, regexp.MustCompile("DATABASE_QUERY_PERFORMANCE_FACTOR_SEARCH_IS_REQUIRED.*RediSearch.*required"))
}

func TestAccResourceRedisCloudProDatabase_qpf_invalidQueryPerformanceFactors(t *testing.T) {
Expand Down
2 changes: 1 addition & 1 deletion provider/resource_rediscloud_pro_database_redis_8_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ func TestAccResourceRedisCloudProDatabase_Redis8_Upgrade(t *testing.T) {
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttr(resourceName, "name", "example"),
resource.TestCheckResourceAttr(resourceName, "protocol", "redis"),
resource.TestCheckResourceAttr(resourceName, "dataset_size_in_gb", "3"),
resource.TestCheckResourceAttr(resourceName, "dataset_size_in_gb", "1"),
resource.TestCheckResourceAttr(resourceName, "replication", "false"),
resource.TestCheckResourceAttr(resourceName, "support_oss_cluster_api", "false"),
resource.TestCheckResourceAttr(resourceName, "resp_version", "resp3"),
Expand Down
32 changes: 32 additions & 0 deletions provider/resource_rediscloud_pro_database_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -274,3 +274,35 @@ func TestAccResourceRedisCloudProDatabase_respversion(t *testing.T) {
},
})
}

func TestAccResourceRedisCloudProDatabase_autoMinorVersionUpgrade(t *testing.T) {

utils.AccRequiresEnvVar(t, "EXECUTE_TESTS")

name := acctest.RandomWithPrefix(testResourcePrefix)
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 auto_minor_version_upgrade set to false
{
Config: fmt.Sprintf(utils.GetTestConfig(t, "./pro/testdata/pro_database_auto_minor_version_upgrade.tf"), testCloudAccountName, name, "false"),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttr(resourceName, "name", "auto-minor-version-upgrade-test"),
resource.TestCheckResourceAttr(resourceName, "auto_minor_version_upgrade", "false"),
),
},
// Test database update with auto_minor_version_upgrade set to true
{
Config: fmt.Sprintf(utils.GetTestConfig(t, "./pro/testdata/pro_database_auto_minor_version_upgrade.tf"), testCloudAccountName, name, "true"),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttr(resourceName, "auto_minor_version_upgrade", "true"),
),
},
},
})
}
Loading
Loading