Skip to content

Commit 409fb97

Browse files
Adding maintenance_version to Redis cluster and Memorystore Instance (#15387) (#10896)
[upstream:7889a12257b8462e23d5056513e913e0c8df0c8d] Signed-off-by: Modular Magician <[email protected]>
1 parent 00215db commit 409fb97

9 files changed

+255
-0
lines changed

.changelog/15387.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
```release-note:enhancement
2+
compute: added `maintenance_version` field to `google_redis_cluster` resource
3+
```
4+
5+
```release-note:enhancement
6+
memorystore: added `maintenance_version` field to `google_memorystore_instance` resource
7+
```

google-beta/services/memorystore/resource_memorystore_instance.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,12 @@ resolution and up to nine fractional digits.`,
400400
},
401401
},
402402
},
403+
"maintenance_version": {
404+
Type: schema.TypeString,
405+
Optional: true,
406+
Description: `This field can be used to trigger self service update to indicate the desired maintenance version. The input to this field can be determined by the available_maintenance_versions field.
407+
*Note*: This field can only be specified when updating an existing cluster to a newer version. Downgrades are currently not supported!`,
408+
},
403409
"managed_backup_source": {
404410
Type: schema.TypeList,
405411
Optional: true,
@@ -602,6 +608,11 @@ projects/{network_project}/global/networks/{network_id}.`,
602608
Description: `All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Terraform, other clients and services.`,
603609
Elem: &schema.Schema{Type: schema.TypeString},
604610
},
611+
"effective_maintenance_version": {
612+
Type: schema.TypeString,
613+
Computed: true,
614+
Description: `This field represents the actual maintenance version of the cluster.`,
615+
},
605616
"endpoints": {
606617
Type: schema.TypeList,
607618
Computed: true,
@@ -1017,6 +1028,12 @@ func resourceMemorystoreInstanceCreate(d *schema.ResourceData, meta interface{})
10171028
} else if v, ok := d.GetOkExists("maintenance_policy"); !tpgresource.IsEmptyValue(reflect.ValueOf(maintenancePolicyProp)) && (ok || !reflect.DeepEqual(v, maintenancePolicyProp)) {
10181029
obj["maintenancePolicy"] = maintenancePolicyProp
10191030
}
1031+
maintenanceVersionProp, err := expandMemorystoreInstanceMaintenanceVersion(d.Get("maintenance_version"), d, config)
1032+
if err != nil {
1033+
return err
1034+
} else if v, ok := d.GetOkExists("maintenance_version"); !tpgresource.IsEmptyValue(reflect.ValueOf(maintenanceVersionProp)) && (ok || !reflect.DeepEqual(v, maintenanceVersionProp)) {
1035+
obj["maintenanceVersion"] = maintenanceVersionProp
1036+
}
10201037
engineVersionProp, err := expandMemorystoreInstanceEngineVersion(d.Get("engine_version"), d, config)
10211038
if err != nil {
10221039
return err
@@ -1245,6 +1262,12 @@ func resourceMemorystoreInstanceRead(d *schema.ResourceData, meta interface{}) e
12451262
if err := d.Set("maintenance_schedule", flattenMemorystoreInstanceMaintenanceSchedule(res["maintenanceSchedule"], d, config)); err != nil {
12461263
return fmt.Errorf("Error reading Instance: %s", err)
12471264
}
1265+
if err := d.Set("maintenance_version", flattenMemorystoreInstanceMaintenanceVersion(res["maintenanceVersion"], d, config)); err != nil {
1266+
return fmt.Errorf("Error reading Instance: %s", err)
1267+
}
1268+
if err := d.Set("effective_maintenance_version", flattenMemorystoreInstanceEffectiveMaintenanceVersion(res["effectiveMaintenanceVersion"], d, config)); err != nil {
1269+
return fmt.Errorf("Error reading Instance: %s", err)
1270+
}
12481271
if err := d.Set("engine_version", flattenMemorystoreInstanceEngineVersion(res["engineVersion"], d, config)); err != nil {
12491272
return fmt.Errorf("Error reading Instance: %s", err)
12501273
}
@@ -1346,6 +1369,12 @@ func resourceMemorystoreInstanceUpdate(d *schema.ResourceData, meta interface{})
13461369
} else if v, ok := d.GetOkExists("maintenance_policy"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, maintenancePolicyProp)) {
13471370
obj["maintenancePolicy"] = maintenancePolicyProp
13481371
}
1372+
maintenanceVersionProp, err := expandMemorystoreInstanceMaintenanceVersion(d.Get("maintenance_version"), d, config)
1373+
if err != nil {
1374+
return err
1375+
} else if v, ok := d.GetOkExists("maintenance_version"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, maintenanceVersionProp)) {
1376+
obj["maintenanceVersion"] = maintenanceVersionProp
1377+
}
13491378
engineVersionProp, err := expandMemorystoreInstanceEngineVersion(d.Get("engine_version"), d, config)
13501379
if err != nil {
13511380
return err
@@ -1415,6 +1444,10 @@ func resourceMemorystoreInstanceUpdate(d *schema.ResourceData, meta interface{})
14151444
updateMask = append(updateMask, "maintenancePolicy")
14161445
}
14171446

1447+
if d.HasChange("maintenance_version") {
1448+
updateMask = append(updateMask, "maintenanceVersion")
1449+
}
1450+
14181451
if d.HasChange("engine_version") {
14191452
updateMask = append(updateMask, "engineVersion")
14201453
}
@@ -2053,6 +2086,14 @@ func flattenMemorystoreInstanceMaintenanceScheduleScheduleDeadlineTime(v interfa
20532086
return v
20542087
}
20552088

2089+
func flattenMemorystoreInstanceMaintenanceVersion(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
2090+
return v
2091+
}
2092+
2093+
func flattenMemorystoreInstanceEffectiveMaintenanceVersion(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
2094+
return v
2095+
}
2096+
20562097
func flattenMemorystoreInstanceEngineVersion(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
20572098
return v
20582099
}
@@ -2883,6 +2924,10 @@ func expandMemorystoreInstanceMaintenancePolicyWeeklyMaintenanceWindowStartTimeN
28832924
return v, nil
28842925
}
28852926

2927+
func expandMemorystoreInstanceMaintenanceVersion(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
2928+
return v, nil
2929+
}
2930+
28862931
func expandMemorystoreInstanceEngineVersion(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
28872932
return v, nil
28882933
}

google-beta/services/memorystore/resource_memorystore_instance_generated_meta.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ fields:
3535
- api_field: 'discoveryEndpoints.port'
3636
- field: 'effective_labels'
3737
provider_only: true
38+
- api_field: 'effectiveMaintenanceVersion'
3839
- api_field: 'endpoints.connections.pscAutoConnection.connectionType'
3940
- api_field: 'endpoints.connections.pscAutoConnection.forwardingRule'
4041
- api_field: 'endpoints.connections.pscAutoConnection.ipAddress'
@@ -63,6 +64,7 @@ fields:
6364
- api_field: 'maintenanceSchedule.endTime'
6465
- api_field: 'maintenanceSchedule.scheduleDeadlineTime'
6566
- api_field: 'maintenanceSchedule.startTime'
67+
- api_field: 'maintenanceVersion'
6668
- api_field: 'managedBackupSource.backup'
6769
- api_field: 'managedServerCa.caCerts.certificates'
6870
- api_field: 'mode'

google-beta/services/memorystore/resource_memorystore_instance_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1786,3 +1786,64 @@ data "google_project" "project" {
17861786
}
17871787
`, context)
17881788
}
1789+
1790+
func TestAccMemorystoreInstance_memorystoreInstanceMaintenanceVersion(t *testing.T) {
1791+
t.Parallel()
1792+
1793+
context := map[string]interface{}{
1794+
"random_suffix": acctest.RandString(t, 10),
1795+
"location": "us-central1",
1796+
}
1797+
1798+
acctest.VcrTest(t, resource.TestCase{
1799+
PreCheck: func() { acctest.AccTestPreCheck(t) },
1800+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
1801+
CheckDestroy: testAccCheckMemorystoreInstanceDestroyProducer(t),
1802+
Steps: []resource.TestStep{
1803+
{
1804+
Config: testAccMemorystoreInstance_memorystoreInstanceMaintenanceVersionDeploy(context),
1805+
},
1806+
{
1807+
ResourceName: "google_memorystore_instance.instance-ms",
1808+
ImportState: true,
1809+
ImportStateVerify: true,
1810+
},
1811+
{
1812+
Config: testAccMemorystoreInstance_memorystoreInstanceMaintenanceVersionUpdate(context),
1813+
},
1814+
{
1815+
ResourceName: "google_memorystore_instance.instance-ms",
1816+
ImportState: true,
1817+
ImportStateVerify: true,
1818+
},
1819+
},
1820+
})
1821+
}
1822+
1823+
func testAccMemorystoreInstance_memorystoreInstanceMaintenanceVersionDeploy(context map[string]interface{}) string {
1824+
return acctest.Nprintf(`
1825+
resource "google_memorystore_instance" "instance-ms" {
1826+
instance_id = "tf-test-ms-instance%{random_suffix}"
1827+
shard_count = 1
1828+
location = "%{location}"
1829+
node_type = "SHARED_CORE_NANO"
1830+
deletion_protection_enabled = false
1831+
transit_encryption_mode = "SERVER_AUTHENTICATION"
1832+
}
1833+
1834+
`, context)
1835+
}
1836+
1837+
func testAccMemorystoreInstance_memorystoreInstanceMaintenanceVersionUpdate(context map[string]interface{}) string {
1838+
return acctest.Nprintf(`
1839+
resource "google_memorystore_instance" "instance-ms" {
1840+
instance_id = "tf-test-ms-instance%{random_suffix}"
1841+
shard_count = 1
1842+
location = "%{location}"
1843+
node_type = "SHARED_CORE_NANO"
1844+
deletion_protection_enabled = false
1845+
# maintenance_version = "MEMORYSTORE_20241206_00_00"
1846+
transit_encryption_mode = "SERVER_AUTHENTICATION"
1847+
}
1848+
`, context)
1849+
}

google-beta/services/redis/resource_redis_cluster.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,12 @@ resolution and up to nine fractional digits.`,
369369
},
370370
},
371371
},
372+
"maintenance_version": {
373+
Type: schema.TypeString,
374+
Optional: true,
375+
Description: `This field can be used to trigger self service update to indicate the desired maintenance version. The input to this field can be determined by the available_maintenance_versions field.
376+
*Note*: This field can only be specified when updating an existing cluster to a newer version. Downgrades are currently not supported!`,
377+
},
372378
"managed_backup_source": {
373379
Type: schema.TypeList,
374380
Optional: true,
@@ -594,6 +600,11 @@ projects/{network_project_id}/global/networks/{network_id}.`,
594600
},
595601
},
596602
},
603+
"effective_maintenance_version": {
604+
Type: schema.TypeString,
605+
Computed: true,
606+
Description: `This field represents the actual maintenance version of the cluster.`,
607+
},
597608
"maintenance_schedule": {
598609
Type: schema.TypeList,
599610
Computed: true,
@@ -856,6 +867,12 @@ func resourceRedisClusterCreate(d *schema.ResourceData, meta interface{}) error
856867
} else if v, ok := d.GetOkExists("maintenance_policy"); !tpgresource.IsEmptyValue(reflect.ValueOf(maintenancePolicyProp)) && (ok || !reflect.DeepEqual(v, maintenancePolicyProp)) {
857868
obj["maintenancePolicy"] = maintenancePolicyProp
858869
}
870+
maintenanceVersionProp, err := expandRedisClusterMaintenanceVersion(d.Get("maintenance_version"), d, config)
871+
if err != nil {
872+
return err
873+
} else if v, ok := d.GetOkExists("maintenance_version"); !tpgresource.IsEmptyValue(reflect.ValueOf(maintenanceVersionProp)) && (ok || !reflect.DeepEqual(v, maintenanceVersionProp)) {
874+
obj["maintenanceVersion"] = maintenanceVersionProp
875+
}
859876
crossClusterReplicationConfigProp, err := expandRedisClusterCrossClusterReplicationConfig(d.Get("cross_cluster_replication_config"), d, config)
860877
if err != nil {
861878
return err
@@ -1055,6 +1072,12 @@ func resourceRedisClusterRead(d *schema.ResourceData, meta interface{}) error {
10551072
if err := d.Set("maintenance_schedule", flattenRedisClusterMaintenanceSchedule(res["maintenanceSchedule"], d, config)); err != nil {
10561073
return fmt.Errorf("Error reading Cluster: %s", err)
10571074
}
1075+
if err := d.Set("maintenance_version", flattenRedisClusterMaintenanceVersion(res["maintenanceVersion"], d, config)); err != nil {
1076+
return fmt.Errorf("Error reading Cluster: %s", err)
1077+
}
1078+
if err := d.Set("effective_maintenance_version", flattenRedisClusterEffectiveMaintenanceVersion(res["effectiveMaintenanceVersion"], d, config)); err != nil {
1079+
return fmt.Errorf("Error reading Cluster: %s", err)
1080+
}
10581081
if err := d.Set("cross_cluster_replication_config", flattenRedisClusterCrossClusterReplicationConfig(res["crossClusterReplicationConfig"], d, config)); err != nil {
10591082
return fmt.Errorf("Error reading Cluster: %s", err)
10601083
}
@@ -1141,6 +1164,12 @@ func resourceRedisClusterUpdate(d *schema.ResourceData, meta interface{}) error
11411164
} else if v, ok := d.GetOkExists("maintenance_policy"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, maintenancePolicyProp)) {
11421165
obj["maintenancePolicy"] = maintenancePolicyProp
11431166
}
1167+
maintenanceVersionProp, err := expandRedisClusterMaintenanceVersion(d.Get("maintenance_version"), d, config)
1168+
if err != nil {
1169+
return err
1170+
} else if v, ok := d.GetOkExists("maintenance_version"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, maintenanceVersionProp)) {
1171+
obj["maintenanceVersion"] = maintenanceVersionProp
1172+
}
11441173
crossClusterReplicationConfigProp, err := expandRedisClusterCrossClusterReplicationConfig(d.Get("cross_cluster_replication_config"), d, config)
11451174
if err != nil {
11461175
return err
@@ -1204,6 +1233,10 @@ func resourceRedisClusterUpdate(d *schema.ResourceData, meta interface{}) error
12041233
updateMask = append(updateMask, "maintenancePolicy")
12051234
}
12061235

1236+
if d.HasChange("maintenance_version") {
1237+
updateMask = append(updateMask, "maintenanceVersion")
1238+
}
1239+
12071240
if d.HasChange("cross_cluster_replication_config") {
12081241
updateMask = append(updateMask, "crossClusterReplicationConfig")
12091242
}
@@ -1900,6 +1933,14 @@ func flattenRedisClusterMaintenanceScheduleScheduleDeadlineTime(v interface{}, d
19001933
return v
19011934
}
19021935

1936+
func flattenRedisClusterMaintenanceVersion(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1937+
return v
1938+
}
1939+
1940+
func flattenRedisClusterEffectiveMaintenanceVersion(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1941+
return v
1942+
}
1943+
19031944
func flattenRedisClusterCrossClusterReplicationConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
19041945
if v == nil {
19051946
return nil
@@ -2601,6 +2642,10 @@ func expandRedisClusterMaintenancePolicyWeeklyMaintenanceWindowStartTimeNanos(v
26012642
return v, nil
26022643
}
26032644

2645+
func expandRedisClusterMaintenanceVersion(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
2646+
return v, nil
2647+
}
2648+
26042649
func expandRedisClusterCrossClusterReplicationConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
26052650
if v == nil {
26062651
return nil, nil

google-beta/services/redis/resource_redis_cluster_generated_meta.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ fields:
2424
- api_field: 'discoveryEndpoints.address'
2525
- api_field: 'discoveryEndpoints.port'
2626
- api_field: 'discoveryEndpoints.pscConfig.network'
27+
- api_field: 'effectiveMaintenanceVersion'
2728
- api_field: 'gcsSource.uris'
2829
- api_field: 'kmsKey'
2930
- api_field: 'maintenancePolicy.createTime'
@@ -37,6 +38,7 @@ fields:
3738
- api_field: 'maintenanceSchedule.endTime'
3839
- api_field: 'maintenanceSchedule.scheduleDeadlineTime'
3940
- api_field: 'maintenanceSchedule.startTime'
41+
- api_field: 'maintenanceVersion'
4042
- api_field: 'managedBackupSource.backup'
4143
- api_field: 'managedServerCa.caCerts.certificates'
4244
- field: 'name'

google-beta/services/redis/resource_redis_cluster_test.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,3 +1357,80 @@ resource "google_compute_network" "consumer_net" {
13571357
}
13581358
`, context)
13591359
}
1360+
1361+
func TestAccRedisCluster_redisClusterMaintenanceVersion(t *testing.T) {
1362+
t.Parallel()
1363+
1364+
context := map[string]interface{}{
1365+
"random_suffix": acctest.RandString(t, 10),
1366+
"location": "us-central1",
1367+
}
1368+
1369+
acctest.VcrTest(t, resource.TestCase{
1370+
PreCheck: func() { acctest.AccTestPreCheck(t) },
1371+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
1372+
CheckDestroy: testAccCheckRedisClusterDestroyProducer(t),
1373+
Steps: []resource.TestStep{
1374+
{
1375+
Config: testAccRedisCluster_redisClusterMaintenanceVersionDeploy(context),
1376+
},
1377+
{
1378+
ResourceName: "google_redis_cluster.cluster-ms",
1379+
ImportState: true,
1380+
ImportStateVerify: true,
1381+
},
1382+
{
1383+
Config: testAccRedisCluster_redisClusterMaintenanceVersionUpdate(context),
1384+
},
1385+
{
1386+
ResourceName: "google_redis_cluster.cluster-ms",
1387+
ImportState: true,
1388+
ImportStateVerify: true,
1389+
},
1390+
},
1391+
})
1392+
}
1393+
1394+
func testAccRedisCluster_redisClusterMaintenanceVersionDeploy(context map[string]interface{}) string {
1395+
return acctest.Nprintf(`
1396+
resource "google_redis_cluster" "cluster-ms" {
1397+
name = "tf-test-ms-cluster%{random_suffix}"
1398+
shard_count = 1
1399+
region = "%{location}"
1400+
replica_count = 1
1401+
node_type = "REDIS_SHARED_CORE_NANO"
1402+
transit_encryption_mode = "TRANSIT_ENCRYPTION_MODE_SERVER_AUTHENTICATION"
1403+
authorization_mode = "AUTH_MODE_DISABLED"
1404+
redis_configs = {
1405+
maxmemory-policy = "volatile-ttl"
1406+
}
1407+
deletion_protection_enabled = false
1408+
1409+
zone_distribution_config {
1410+
mode = "MULTI_ZONE"
1411+
}
1412+
}
1413+
`, context)
1414+
}
1415+
1416+
func testAccRedisCluster_redisClusterMaintenanceVersionUpdate(context map[string]interface{}) string {
1417+
return acctest.Nprintf(`
1418+
resource "google_redis_cluster" "cluster-ms" {
1419+
name = "tf-test-ms-cluster%{random_suffix}"
1420+
shard_count = 1
1421+
region = "%{location}"
1422+
replica_count = 1
1423+
node_type = "REDIS_SHARED_CORE_NANO"
1424+
transit_encryption_mode = "TRANSIT_ENCRYPTION_MODE_SERVER_AUTHENTICATION"
1425+
authorization_mode = "AUTH_MODE_DISABLED"
1426+
# maintenance_version = "REDISCLUSTER_20251008.00_p00"
1427+
redis_configs = {
1428+
maxmemory-policy = "volatile-ttl"
1429+
}
1430+
deletion_protection_enabled = false
1431+
zone_distribution_config {
1432+
mode = "MULTI_ZONE"
1433+
}
1434+
}
1435+
`, context)
1436+
}

0 commit comments

Comments
 (0)