Skip to content

Commit 196a474

Browse files
chore: Enable ISS autoscaling support in advancedclustertpf implementation (#2973)
* remove duplicate code associated to sdk model conversion * removing duplicate sdk conversion functions going from 2024-08-05 to 2024-10-23 * enable autoscaling acceptance tests * make use of latest API if new sharding config is used, refactor update to avoid using both 2023-02-01 and 2024-05-30 API * adjust golden file of mocked test with autoscaling * range fix and renaming model sdk version conversion file * adjust file pattern for triggering advanced_cluster on common file changes * ensure pausing is done after other patch changes, while resuming before other changes
1 parent 96b3a06 commit 196a474

13 files changed

+140
-395
lines changed

.github/workflows/acceptance-tests-runner.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ jobs:
254254
filters: |
255255
advanced_cluster:
256256
- 'internal/service/advancedcluster/!(*_test).go' # matches any adv_cluster file change except test files
257-
- 'internal/service/advancedclustertpf/common.go'
257+
- 'internal/service/advancedclustertpf/common*.go'
258258
advanced_cluster_tpf:
259259
- 'internal/service/advancedclustertpf/*.go'
260260
- 'internal/service/advancedcluster/*_test.go'

internal/service/advancedcluster/model_advanced_cluster.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1024,7 +1024,7 @@ func expandAdvancedReplicationSpecOldSDK(tfMap map[string]any) *admin20240530.Re
10241024
apiObject := &admin20240530.ReplicationSpec{
10251025
NumShards: conversion.Pointer(tfMap["num_shards"].(int)),
10261026
ZoneName: conversion.StringPtr(tfMap["zone_name"].(string)),
1027-
RegionConfigs: convertRegionConfigSliceToOldSDK(expandRegionConfigs(tfMap["region_configs"].([]any), nil)),
1027+
RegionConfigs: advancedclustertpf.ConvertRegionConfigSlice20241023to20240530(expandRegionConfigs(tfMap["region_configs"].([]any), nil)),
10281028
}
10291029
if tfMap["id"].(string) != "" {
10301030
apiObject.Id = conversion.StringPtr(tfMap["id"].(string))

internal/service/advancedcluster/model_sdk_version_conversion.go

Lines changed: 0 additions & 233 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package advancedcluster
22

33
import (
44
admin20240530 "go.mongodb.org/atlas-sdk/v20240530005/admin"
5-
admin20240805 "go.mongodb.org/atlas-sdk/v20240805005/admin"
65
"go.mongodb.org/atlas-sdk/v20241113004/admin"
76

87
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
@@ -52,235 +51,3 @@ func convertLabelSliceToOldSDK(slice []admin.ComponentLabel, err diag.Diagnostic
5251
}
5352
return results, nil
5453
}
55-
56-
func convertRegionConfigSliceToOldSDK(slice *[]admin.CloudRegionConfig20240805) *[]admin20240530.CloudRegionConfig {
57-
if slice == nil {
58-
return nil
59-
}
60-
cloudRegionSlice := *slice
61-
results := make([]admin20240530.CloudRegionConfig, len(cloudRegionSlice))
62-
for i := range len(cloudRegionSlice) {
63-
cloudRegion := cloudRegionSlice[i]
64-
results[i] = admin20240530.CloudRegionConfig{
65-
ElectableSpecs: convertHardwareSpecToOldSDK(cloudRegion.ElectableSpecs),
66-
Priority: cloudRegion.Priority,
67-
ProviderName: cloudRegion.ProviderName,
68-
RegionName: cloudRegion.RegionName,
69-
AnalyticsAutoScaling: convertAdvancedAutoScalingSettingsToOldSDK(cloudRegion.AnalyticsAutoScaling),
70-
AnalyticsSpecs: convertDedicatedHardwareSpecToOldSDK(cloudRegion.AnalyticsSpecs),
71-
AutoScaling: convertAdvancedAutoScalingSettingsToOldSDK(cloudRegion.AutoScaling),
72-
ReadOnlySpecs: convertDedicatedHardwareSpecToOldSDK(cloudRegion.ReadOnlySpecs),
73-
BackingProviderName: cloudRegion.BackingProviderName,
74-
}
75-
}
76-
return &results
77-
}
78-
79-
func convertHardwareSpecToOldSDK(hwspec *admin.HardwareSpec20240805) *admin20240530.HardwareSpec {
80-
if hwspec == nil {
81-
return nil
82-
}
83-
return &admin20240530.HardwareSpec{
84-
DiskIOPS: hwspec.DiskIOPS,
85-
EbsVolumeType: hwspec.EbsVolumeType,
86-
InstanceSize: hwspec.InstanceSize,
87-
NodeCount: hwspec.NodeCount,
88-
}
89-
}
90-
91-
func convertAdvancedAutoScalingSettingsToOldSDK(settings *admin.AdvancedAutoScalingSettings) *admin20240530.AdvancedAutoScalingSettings {
92-
if settings == nil {
93-
return nil
94-
}
95-
return &admin20240530.AdvancedAutoScalingSettings{
96-
Compute: convertAdvancedComputeAutoScalingToOldSDK(settings.Compute),
97-
DiskGB: convertDiskGBAutoScalingToOldSDK(settings.DiskGB),
98-
}
99-
}
100-
101-
func convertAdvancedComputeAutoScalingToOldSDK(settings *admin.AdvancedComputeAutoScaling) *admin20240530.AdvancedComputeAutoScaling {
102-
if settings == nil {
103-
return nil
104-
}
105-
return &admin20240530.AdvancedComputeAutoScaling{
106-
Enabled: settings.Enabled,
107-
MaxInstanceSize: settings.MaxInstanceSize,
108-
MinInstanceSize: settings.MinInstanceSize,
109-
ScaleDownEnabled: settings.ScaleDownEnabled,
110-
}
111-
}
112-
113-
func convertDiskGBAutoScalingToOldSDK(settings *admin.DiskGBAutoScaling) *admin20240530.DiskGBAutoScaling {
114-
if settings == nil {
115-
return nil
116-
}
117-
return &admin20240530.DiskGBAutoScaling{
118-
Enabled: settings.Enabled,
119-
}
120-
}
121-
122-
func convertDedicatedHardwareSpecToOldSDK(spec *admin.DedicatedHardwareSpec20240805) *admin20240530.DedicatedHardwareSpec {
123-
if spec == nil {
124-
return nil
125-
}
126-
return &admin20240530.DedicatedHardwareSpec{
127-
NodeCount: spec.NodeCount,
128-
DiskIOPS: spec.DiskIOPS,
129-
EbsVolumeType: spec.EbsVolumeType,
130-
InstanceSize: spec.InstanceSize,
131-
}
132-
}
133-
134-
func ConvertClusterDescription20241023to20240805(clusterDescription *admin.ClusterDescription20240805) *admin20240805.ClusterDescription20240805 {
135-
return &admin20240805.ClusterDescription20240805{
136-
Name: clusterDescription.Name,
137-
ClusterType: clusterDescription.ClusterType,
138-
ReplicationSpecs: convertReplicationSpecs20241023to20240805(clusterDescription.ReplicationSpecs),
139-
BackupEnabled: clusterDescription.BackupEnabled,
140-
BiConnector: convertBiConnector20241023to20240805(clusterDescription.BiConnector),
141-
EncryptionAtRestProvider: clusterDescription.EncryptionAtRestProvider,
142-
Labels: convertLabels20241023to20240805(clusterDescription.Labels),
143-
Tags: convertTag20241023to20240805(clusterDescription.Tags),
144-
MongoDBMajorVersion: clusterDescription.MongoDBMajorVersion,
145-
PitEnabled: clusterDescription.PitEnabled,
146-
RootCertType: clusterDescription.RootCertType,
147-
TerminationProtectionEnabled: clusterDescription.TerminationProtectionEnabled,
148-
VersionReleaseSystem: clusterDescription.VersionReleaseSystem,
149-
GlobalClusterSelfManagedSharding: clusterDescription.GlobalClusterSelfManagedSharding,
150-
ReplicaSetScalingStrategy: clusterDescription.ReplicaSetScalingStrategy,
151-
RedactClientLogData: clusterDescription.RedactClientLogData,
152-
ConfigServerManagementMode: clusterDescription.ConfigServerManagementMode,
153-
}
154-
}
155-
156-
func convertReplicationSpecs20241023to20240805(replicationSpecs *[]admin.ReplicationSpec20240805) *[]admin20240805.ReplicationSpec20240805 {
157-
if replicationSpecs == nil {
158-
return nil
159-
}
160-
result := make([]admin20240805.ReplicationSpec20240805, len(*replicationSpecs))
161-
for i, replicationSpec := range *replicationSpecs {
162-
result[i] = admin20240805.ReplicationSpec20240805{
163-
Id: replicationSpec.Id,
164-
ZoneName: replicationSpec.ZoneName,
165-
ZoneId: replicationSpec.ZoneId,
166-
RegionConfigs: convertCloudRegionConfig20241023to20240805(replicationSpec.RegionConfigs),
167-
}
168-
}
169-
return &result
170-
}
171-
172-
func convertCloudRegionConfig20241023to20240805(cloudRegionConfig *[]admin.CloudRegionConfig20240805) *[]admin20240805.CloudRegionConfig20240805 {
173-
if cloudRegionConfig == nil {
174-
return nil
175-
}
176-
result := make([]admin20240805.CloudRegionConfig20240805, len(*cloudRegionConfig))
177-
for i, regionConfig := range *cloudRegionConfig {
178-
result[i] = admin20240805.CloudRegionConfig20240805{
179-
ProviderName: regionConfig.ProviderName,
180-
RegionName: regionConfig.RegionName,
181-
BackingProviderName: regionConfig.BackingProviderName,
182-
Priority: regionConfig.Priority,
183-
ElectableSpecs: convertHardwareSpec20241023to20240805(regionConfig.ElectableSpecs),
184-
ReadOnlySpecs: convertDedicatedHardwareSpec20241023to20240805(regionConfig.ReadOnlySpecs),
185-
AnalyticsSpecs: convertDedicatedHardwareSpec20241023to20240805(regionConfig.AnalyticsSpecs),
186-
AutoScaling: convertAdvancedAutoScalingSettings20241023to20240805(regionConfig.AutoScaling),
187-
AnalyticsAutoScaling: convertAdvancedAutoScalingSettings20241023to20240805(regionConfig.AnalyticsAutoScaling),
188-
}
189-
}
190-
return &result
191-
}
192-
193-
func convertAdvancedAutoScalingSettings20241023to20240805(advancedAutoScalingSettings *admin.AdvancedAutoScalingSettings) *admin20240805.AdvancedAutoScalingSettings {
194-
if advancedAutoScalingSettings == nil {
195-
return nil
196-
}
197-
return &admin20240805.AdvancedAutoScalingSettings{
198-
Compute: convertAdvancedComputeAutoScaling20241023to20240805(advancedAutoScalingSettings.Compute),
199-
DiskGB: convertDiskGBAutoScaling20241023to20240805(advancedAutoScalingSettings.DiskGB),
200-
}
201-
}
202-
203-
func convertDiskGBAutoScaling20241023to20240805(diskGBAutoScaling *admin.DiskGBAutoScaling) *admin20240805.DiskGBAutoScaling {
204-
if diskGBAutoScaling == nil {
205-
return nil
206-
}
207-
return &admin20240805.DiskGBAutoScaling{
208-
Enabled: diskGBAutoScaling.Enabled,
209-
}
210-
}
211-
212-
func convertAdvancedComputeAutoScaling20241023to20240805(advancedComputeAutoScaling *admin.AdvancedComputeAutoScaling) *admin20240805.AdvancedComputeAutoScaling {
213-
if advancedComputeAutoScaling == nil {
214-
return nil
215-
}
216-
return &admin20240805.AdvancedComputeAutoScaling{
217-
Enabled: advancedComputeAutoScaling.Enabled,
218-
MaxInstanceSize: advancedComputeAutoScaling.MaxInstanceSize,
219-
MinInstanceSize: advancedComputeAutoScaling.MinInstanceSize,
220-
ScaleDownEnabled: advancedComputeAutoScaling.ScaleDownEnabled,
221-
}
222-
}
223-
224-
func convertHardwareSpec20241023to20240805(hardwareSpec *admin.HardwareSpec20240805) *admin20240805.HardwareSpec20240805 {
225-
if hardwareSpec == nil {
226-
return nil
227-
}
228-
return &admin20240805.HardwareSpec20240805{
229-
DiskSizeGB: hardwareSpec.DiskSizeGB,
230-
NodeCount: hardwareSpec.NodeCount,
231-
DiskIOPS: hardwareSpec.DiskIOPS,
232-
EbsVolumeType: hardwareSpec.EbsVolumeType,
233-
InstanceSize: hardwareSpec.InstanceSize,
234-
}
235-
}
236-
237-
func convertDedicatedHardwareSpec20241023to20240805(hardwareSpec *admin.DedicatedHardwareSpec20240805) *admin20240805.DedicatedHardwareSpec20240805 {
238-
if hardwareSpec == nil {
239-
return nil
240-
}
241-
return &admin20240805.DedicatedHardwareSpec20240805{
242-
DiskSizeGB: hardwareSpec.DiskSizeGB,
243-
NodeCount: hardwareSpec.NodeCount,
244-
DiskIOPS: hardwareSpec.DiskIOPS,
245-
EbsVolumeType: hardwareSpec.EbsVolumeType,
246-
InstanceSize: hardwareSpec.InstanceSize,
247-
}
248-
}
249-
250-
func convertBiConnector20241023to20240805(biConnector *admin.BiConnector) *admin20240805.BiConnector {
251-
if biConnector == nil {
252-
return nil
253-
}
254-
return &admin20240805.BiConnector{
255-
ReadPreference: biConnector.ReadPreference,
256-
Enabled: biConnector.Enabled,
257-
}
258-
}
259-
260-
func convertLabels20241023to20240805(labels *[]admin.ComponentLabel) *[]admin20240805.ComponentLabel {
261-
if labels == nil {
262-
return &[]admin20240805.ComponentLabel{}
263-
}
264-
result := make([]admin20240805.ComponentLabel, len(*labels))
265-
for i, label := range *labels {
266-
result[i] = admin20240805.ComponentLabel{
267-
Key: label.Key,
268-
Value: label.Value,
269-
}
270-
}
271-
return &result
272-
}
273-
274-
func convertTag20241023to20240805(tags *[]admin.ResourceTag) *[]admin20240805.ResourceTag {
275-
if tags == nil {
276-
return &[]admin20240805.ResourceTag{}
277-
}
278-
result := make([]admin20240805.ResourceTag, len(*tags))
279-
for i, tag := range *tags {
280-
result[i] = admin20240805.ResourceTag{
281-
Key: tag.Key,
282-
Value: tag.Value,
283-
}
284-
}
285-
return &result
286-
}

internal/service/advancedcluster/resource_advanced_cluster.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ func resourceCreate(ctx context.Context, d *schema.ResourceData, meta any) diag.
513513
// With old sharding config we call older API (2024-08-05) to avoid cluster having asymmetric autoscaling mode. Old sharding config can only represent symmetric clusters.
514514
if isUsingOldShardingConfiguration(d) {
515515
var cluster20240805 *admin20240805.ClusterDescription20240805
516-
cluster20240805, _, err = connV220240805.ClustersApi.CreateCluster(ctx, projectID, ConvertClusterDescription20241023to20240805(params)).Execute()
516+
cluster20240805, _, err = connV220240805.ClustersApi.CreateCluster(ctx, projectID, advancedclustertpf.ConvertClusterDescription20241023to20240805(params)).Execute()
517517
if err != nil {
518518
return diag.FromErr(fmt.Errorf(errorCreate, err))
519519
}

internal/service/advancedcluster/resource_advanced_cluster_test.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,11 +275,11 @@ func TestAccClusterAdvancedCluster_unpausedToPaused(t *testing.T) {
275275
Check: checkSingleProviderPaused(true, clusterName, false),
276276
},
277277
{
278-
Config: configSingleProviderPaused(t, true, projectID, clusterName, true, instanceSize),
278+
Config: configSingleProviderPaused(t, true, projectID, clusterName, true, anotherInstanceSize), // allows pausing and other change in same apply
279279
Check: checkSingleProviderPaused(true, clusterName, true),
280280
},
281281
{
282-
Config: configSingleProviderPaused(t, true, projectID, clusterName, true, anotherInstanceSize),
282+
Config: configSingleProviderPaused(t, true, projectID, clusterName, true, instanceSize),
283283
ExpectError: regexp.MustCompile("CANNOT_UPDATE_PAUSED_CLUSTER"),
284284
},
285285
acc.TestStepImportCluster(resourceName),
@@ -1084,7 +1084,6 @@ func TestAccClusterAdvancedCluster_pinnedFCVWithVersionUpgradeAndDowngrade(t *te
10841084
}
10851085

10861086
func TestAccAdvancedCluster_oldToNewSchemaWithAutoscalingEnabled(t *testing.T) {
1087-
acc.SkipIfAdvancedClusterV2Schema(t)
10881087
projectID, clusterName := acc.ProjectIDExecutionWithCluster(t, 8)
10891088

10901089
resource.ParallelTest(t, resource.TestCase{
@@ -1105,7 +1104,6 @@ func TestAccAdvancedCluster_oldToNewSchemaWithAutoscalingEnabled(t *testing.T) {
11051104
}
11061105

11071106
func TestAccAdvancedCluster_oldToNewSchemaWithAutoscalingDisabledToEnabled(t *testing.T) {
1108-
acc.SkipIfAdvancedClusterV2Schema(t)
11091107
projectID, clusterName := acc.ProjectIDExecutionWithCluster(t, 8)
11101108

11111109
resource.ParallelTest(t, resource.TestCase{

internal/service/advancedcluster/testdata/TestAccMockableAdvancedCluster_shardedAddAnalyticsAndAutoScaling.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ steps:
181181
diff_requests:
182182
- path: /api/atlas/v2/groups/{groupId}/clusters/{clusterName}
183183
method: PATCH
184-
version: '2024-08-05'
184+
version: '2024-10-23'
185185
text: "{\n \"replicationSpecs\": [\n {\n \"regionConfigs\": [\n {\n \"analyticsSpecs\": {\n \"diskIOPS\": 2000,\n \"ebsVolumeType\": \"PROVISIONED\",\n \"instanceSize\": \"M30\",\n \"nodeCount\": 1\n },\n \"autoScaling\": {\n \"compute\": {},\n \"diskGB\": {\n \"enabled\": true\n }\n },\n \"electableSpecs\": {\n \"diskIOPS\": 2000,\n \"ebsVolumeType\": \"PROVISIONED\",\n \"instanceSize\": \"M30\",\n \"nodeCount\": 3\n },\n \"priority\": 7,\n \"providerName\": \"AWS\",\n \"regionName\": \"EU_WEST_1\"\n }\n ],\n \"zoneName\": \"ZoneName managed by Terraform\"\n },\n {\n \"regionConfigs\": [\n {\n \"analyticsSpecs\": {\n \"diskIOPS\": 1000,\n \"ebsVolumeType\": \"PROVISIONED\",\n \"instanceSize\": \"M30\",\n \"nodeCount\": 1\n },\n \"autoScaling\": {\n \"compute\": {},\n \"diskGB\": {\n \"enabled\": true\n }\n },\n \"electableSpecs\": {\n \"diskIOPS\": 1000,\n \"ebsVolumeType\": \"PROVISIONED\",\n \"instanceSize\": \"M30\",\n \"nodeCount\": 3\n },\n \"priority\": 7,\n \"providerName\": \"AWS\",\n \"regionName\": \"EU_WEST_1\"\n }\n ],\n \"zoneName\": \"ZoneName managed by Terraform\"\n }\n ]\n}"
186186
responses:
187187
- response_index: 58
@@ -245,7 +245,7 @@ steps:
245245
text: "{\n \"changeStreamOptionsPreAndPostImagesExpireAfterSeconds\": null,\n \"chunkMigrationConcurrency\": null,\n \"customOpensslCipherConfigTls12\": [],\n \"defaultMaxTimeMS\": null,\n \"defaultWriteConcern\": null,\n \"javascriptEnabled\": true,\n \"minimumEnabledTlsProtocol\": \"TLS1_2\",\n \"noTableScan\": false,\n \"oplogMinRetentionHours\": null,\n \"oplogSizeMB\": null,\n \"queryStatsLogVerbosity\": 1,\n \"sampleRefreshIntervalBIConnector\": null,\n \"sampleSizeBIConnector\": null,\n \"tlsCipherConfigMode\": \"DEFAULT\",\n \"transactionLifetimeLimitSeconds\": null\n}"
246246
- path: /api/atlas/v2/groups/{groupId}/clusters/{clusterName}
247247
method: PATCH
248-
version: '2024-08-05'
248+
version: '2024-10-23'
249249
text: "{\n \"replicationSpecs\": [\n {\n \"regionConfigs\": [\n {\n \"analyticsSpecs\": {\n \"diskIOPS\": 2000,\n \"ebsVolumeType\": \"PROVISIONED\",\n \"instanceSize\": \"M30\",\n \"nodeCount\": 1\n },\n \"autoScaling\": {\n \"compute\": {},\n \"diskGB\": {\n \"enabled\": true\n }\n },\n \"electableSpecs\": {\n \"diskIOPS\": 2000,\n \"ebsVolumeType\": \"PROVISIONED\",\n \"instanceSize\": \"M30\",\n \"nodeCount\": 3\n },\n \"priority\": 7,\n \"providerName\": \"AWS\",\n \"regionName\": \"EU_WEST_1\"\n }\n ],\n \"zoneName\": \"ZoneName managed by Terraform\"\n },\n {\n \"regionConfigs\": [\n {\n \"analyticsSpecs\": {\n \"diskIOPS\": 1000,\n \"ebsVolumeType\": \"PROVISIONED\",\n \"instanceSize\": \"M30\",\n \"nodeCount\": 1\n },\n \"autoScaling\": {\n \"compute\": {},\n \"diskGB\": {\n \"enabled\": true\n }\n },\n \"electableSpecs\": {\n \"diskIOPS\": 1000,\n \"ebsVolumeType\": \"PROVISIONED\",\n \"instanceSize\": \"M30\",\n \"nodeCount\": 3\n },\n \"priority\": 7,\n \"providerName\": \"AWS\",\n \"regionName\": \"EU_WEST_1\"\n }\n ],\n \"zoneName\": \"ZoneName managed by Terraform\"\n }\n ]\n}"
250250
responses:
251251
- response_index: 58

0 commit comments

Comments
 (0)