Skip to content

Commit 8261d23

Browse files
Merge pull request #640 from RedisLabs/feat/OPCR-17-implement-database-redis-version
OPCR-17 implement database redis version
2 parents a065767 + e193e4d commit 8261d23

File tree

4 files changed

+113
-47
lines changed

4 files changed

+113
-47
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module github.com/RedisLabs/terraform-provider-rediscloud
33
go 1.22.4
44

55
require (
6-
github.com/RedisLabs/rediscloud-go-api v0.31.0
6+
github.com/RedisLabs/rediscloud-go-api v0.32.0
77
github.com/bflad/tfproviderlint v0.31.0
88
github.com/hashicorp/go-cty v1.5.0
99
github.com/hashicorp/terraform-plugin-sdk/v2 v2.36.1

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc
44
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
55
github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk=
66
github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
7-
github.com/RedisLabs/rediscloud-go-api v0.31.0 h1:hFdR7nrJcCVQN8h3DeXtP0g4zVQP6X5wtS5FoinG8bo=
8-
github.com/RedisLabs/rediscloud-go-api v0.31.0/go.mod h1:3/oVb71rv2OstFRYEc65QCIbfwnJTgZeQhtPCcdHook=
7+
github.com/RedisLabs/rediscloud-go-api v0.32.0 h1:gjOt+8nyMR8MZ5spCz6BXDDdOZrzf7NJJUw4lz8OCGE=
8+
github.com/RedisLabs/rediscloud-go-api v0.32.0/go.mod h1:3/oVb71rv2OstFRYEc65QCIbfwnJTgZeQhtPCcdHook=
99
github.com/agext/levenshtein v1.2.2 h1:0S/Yg6LYmFJ5stwQeRp6EeOcCbj7xiqQSdNelsXvaqE=
1010
github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
1111
github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec=

provider/resource_rediscloud_pro_database.go

Lines changed: 40 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package provider
33
import (
44
"context"
55
"fmt"
6+
"github.com/RedisLabs/terraform-provider-rediscloud/provider/utils"
67
"regexp"
78
"strconv"
89
"strings"
@@ -235,6 +236,11 @@ func resourceRedisCloudProDatabase() *schema.Resource {
235236
return
236237
},
237238
},
239+
"redis_version": {
240+
Description: "Defines the Redis database version. If omitted, the Redis version will be set to the default version",
241+
Type: schema.TypeString,
242+
Optional: true,
243+
},
238244
"modules": {
239245
Description: "Modules to be provisioned in the database",
240246
Type: schema.TypeSet,
@@ -346,23 +352,9 @@ func resourceRedisCloudProDatabase() *schema.Resource {
346352
func resourceRedisCloudProDatabaseCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
347353
api := meta.(*apiClient)
348354

349-
subId := d.Get("subscription_id").(int)
350-
355+
subId := *utils.GetInt(d, "subscription_id")
351356
subscriptionMutex.Lock(subId)
352357

353-
name := d.Get("name").(string)
354-
protocol := d.Get("protocol").(string)
355-
supportOSSClusterAPI := d.Get("support_oss_cluster_api").(bool)
356-
respVersion := d.Get("resp_version").(string)
357-
dataPersistence := d.Get("data_persistence").(string)
358-
dataEviction := d.Get("data_eviction").(string)
359-
password := d.Get("password").(string)
360-
replication := d.Get("replication").(bool)
361-
throughputMeasurementBy := d.Get("throughput_measurement_by").(string)
362-
throughputMeasurementValue := d.Get("throughput_measurement_value").(int)
363-
averageItemSizeInBytes := d.Get("average_item_size_in_bytes").(int)
364-
queryPerformanceFactor := d.Get("query_performance_factor").(string)
365-
366358
createModules := make([]*databases.Module, 0)
367359
modules := d.Get("modules").(*schema.Set)
368360
for _, module := range modules.List() {
@@ -394,48 +386,52 @@ func resourceRedisCloudProDatabaseCreate(ctx context.Context, d *schema.Resource
394386
}
395387

396388
createDatabase := databases.CreateDatabase{
397-
Name: redis.String(name),
398-
Protocol: redis.String(protocol),
399-
SupportOSSClusterAPI: redis.Bool(supportOSSClusterAPI),
400-
DataPersistence: redis.String(dataPersistence),
401-
DataEvictionPolicy: redis.String(dataEviction),
402-
Replication: redis.Bool(replication),
389+
Name: utils.GetString(d, "name"),
390+
Protocol: utils.GetString(d, "protocol"),
391+
SupportOSSClusterAPI: utils.GetBool(d, "support_oss_cluster_api"),
392+
DataPersistence: utils.GetString(d, "data_persistence"),
393+
DataEvictionPolicy: utils.GetString(d, "data_eviction"),
394+
Replication: utils.GetBool(d, "replication"),
403395
ThroughputMeasurement: &databases.CreateThroughputMeasurement{
404-
By: redis.String(throughputMeasurementBy),
405-
Value: redis.Int(throughputMeasurementValue),
396+
By: utils.GetString(d, "throughput_measurement_by"),
397+
Value: utils.GetInt(d, "throughput_measurement_value"),
406398
},
407399
Modules: createModules,
408400
Alerts: createAlerts,
409401
RemoteBackup: buildBackupPlan(d.Get("remote_backup").([]interface{}), d.Get("periodic_backup_path")),
410402
}
411403

412-
if queryPerformanceFactor != "" {
413-
createDatabase.QueryPerformanceFactor = redis.String(queryPerformanceFactor)
414-
}
404+
utils.SetStringIfNotEmpty(d, "query_performance_factor", func(s *string) {
405+
createDatabase.QueryPerformanceFactor = s
406+
})
415407

416-
if password != "" {
417-
createDatabase.Password = redis.String(password)
418-
}
408+
utils.SetStringIfNotEmpty(d, "redis_version", func(s *string) {
409+
createDatabase.RedisVersion = s
410+
})
419411

420-
if averageItemSizeInBytes > 0 {
421-
createDatabase.AverageItemSizeInBytes = &averageItemSizeInBytes
422-
}
412+
utils.SetStringIfNotEmpty(d, "password", func(s *string) {
413+
createDatabase.Password = s
414+
})
423415

424-
if v, ok := d.GetOk("dataset_size_in_gb"); ok {
425-
createDatabase.DatasetSizeInGB = redis.Float64(v.(float64))
426-
}
416+
utils.SetIntIfPositive(d, "average_item_size_in_bytes", func(i *int) {
417+
createDatabase.AverageItemSizeInBytes = i
418+
})
427419

428-
if v, ok := d.GetOk("memory_limit_in_gb"); ok {
429-
createDatabase.MemoryLimitInGB = redis.Float64(v.(float64))
430-
}
420+
utils.SetFloat64(d, "dataset_size_in_gb", func(f *float64) {
421+
createDatabase.DatasetSizeInGB = f
422+
})
431423

432-
if v, ok := d.GetOk("port"); ok {
433-
createDatabase.PortNumber = redis.Int(v.(int))
434-
}
424+
utils.SetFloat64(d, "memory_limit_in_gb", func(f *float64) {
425+
createDatabase.MemoryLimitInGB = f
426+
})
435427

436-
if respVersion != "" {
437-
createDatabase.RespVersion = redis.String(respVersion)
438-
}
428+
utils.SetInt(d, "port", func(i *int) {
429+
createDatabase.PortNumber = i
430+
})
431+
432+
utils.SetStringIfNotEmpty(d, "resp_version", func(s *string) {
433+
createDatabase.RespVersion = s
434+
})
439435

440436
// Confirm sub is ready to accept a db request
441437
if err := waitForSubscriptionToBeActive(ctx, subId, api); err != nil {

provider/utils/utils.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package utils
2+
3+
import (
4+
"github.com/RedisLabs/rediscloud-go-api/redis"
5+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
6+
)
7+
8+
// GetString safely retrieves a string value from schema.ResourceData.
9+
func GetString(d *schema.ResourceData, key string) *string {
10+
if v, ok := d.GetOk(key); ok {
11+
return redis.String(v.(string))
12+
}
13+
return redis.String("")
14+
}
15+
16+
// GetBool safely retrieves a bool value from schema.ResourceData.
17+
func GetBool(d *schema.ResourceData, key string) *bool {
18+
if v, ok := d.GetOk(key); ok {
19+
return redis.Bool(v.(bool))
20+
}
21+
return redis.Bool(false)
22+
}
23+
24+
// GetInt safely retrieves an int value from schema.ResourceData.
25+
func GetInt(d *schema.ResourceData, key string) *int {
26+
if v, ok := d.GetOk(key); ok {
27+
return redis.Int(v.(int))
28+
}
29+
return redis.Int(0)
30+
}
31+
32+
func SetStringIfNotEmpty(d *schema.ResourceData, key string, setter func(*string)) {
33+
if v, ok := d.GetOk(key); ok {
34+
if s, valid := v.(string); valid && s != "" {
35+
setter(redis.String(s))
36+
}
37+
}
38+
}
39+
40+
func SetIntIfPositive(d *schema.ResourceData, key string, setter func(*int)) {
41+
if v, ok := d.GetOk(key); ok {
42+
if i, valid := v.(int); valid && i > 0 {
43+
setter(redis.Int(i))
44+
}
45+
}
46+
}
47+
48+
func SetInt(d *schema.ResourceData, key string, setter func(*int)) {
49+
if v, ok := d.GetOk(key); ok {
50+
if i, valid := v.(int); valid {
51+
setter(redis.Int(i))
52+
}
53+
}
54+
}
55+
56+
func SetFloat64(d *schema.ResourceData, key string, setter func(*float64)) {
57+
if v, ok := d.GetOk(key); ok {
58+
if f, valid := v.(float64); valid {
59+
setter(redis.Float64(f))
60+
}
61+
}
62+
}
63+
64+
func SetBool(d *schema.ResourceData, key string, setter func(*bool)) {
65+
if v, ok := d.GetOk(key); ok {
66+
if b, valid := v.(bool); valid {
67+
setter(redis.Bool(b))
68+
}
69+
}
70+
}

0 commit comments

Comments
 (0)