Skip to content

Commit 233999e

Browse files
authored
chore: Moves bi_connector_config and advanced_configuration in TPF to blocks (#2909)
* remove advanced_configuration and bi_connector_config from conversion * use blocks * change model from object to list * use list in conversions * fix error: produced an unexpected new value: .advanced_configuration: block count changed from 0 to 1. * Revert "fix error: produced an unexpected new value: .advanced_configuration: block count changed from 0 to 1." This reverts commit e950e93. * restrictResourceModel * restrictResourceModel * simplify restrictResourceModel * newAdminFromSingleList * enable test again * SingleListTFToSDK * feedback for overrideAttributesWithPlanValue
1 parent c7d23b4 commit 233999e

15 files changed

+208
-199
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package conversion
2+
3+
import (
4+
"context"
5+
6+
"github.com/hashicorp/terraform-plugin-framework/diag"
7+
"github.com/hashicorp/terraform-plugin-framework/types"
8+
)
9+
10+
func SingleListTFToSDK[TFModel, SDKRequest any](ctx context.Context, diags *diag.Diagnostics, input *types.List, fnTransform func(tf TFModel) SDKRequest) SDKRequest {
11+
var resp SDKRequest
12+
if input == nil || input.IsUnknown() || input.IsNull() || len(input.Elements()) == 0 {
13+
return resp
14+
}
15+
elements := make([]TFModel, len(input.Elements()))
16+
diags.Append(input.ElementsAs(ctx, &elements, false)...)
17+
if diags.HasError() {
18+
return resp
19+
}
20+
return fnTransform(elements[0])
21+
}

internal/service/advancedclustertpf/model_ClusterDescription20240805.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,17 +70,17 @@ func NewTFModel(ctx context.Context, input *admin.ClusterDescription20240805, ti
7070
}
7171
}
7272

73-
func NewBiConnectorConfigObjType(ctx context.Context, input *admin.BiConnector, diags *diag.Diagnostics) types.Object {
73+
func NewBiConnectorConfigObjType(ctx context.Context, input *admin.BiConnector, diags *diag.Diagnostics) types.List {
7474
if input == nil {
75-
return types.ObjectNull(BiConnectorConfigObjType.AttrTypes)
75+
return types.ListNull(BiConnectorConfigObjType)
7676
}
7777
tfModel := TFBiConnectorModel{
7878
Enabled: types.BoolValue(conversion.SafeValue(input.Enabled)),
7979
ReadPreference: types.StringValue(conversion.SafeValue(input.ReadPreference)),
8080
}
81-
objType, diagsLocal := types.ObjectValueFrom(ctx, BiConnectorConfigObjType.AttrTypes, tfModel)
81+
listType, diagsLocal := types.ListValueFrom(ctx, BiConnectorConfigObjType, []TFBiConnectorModel{tfModel})
8282
diags.Append(diagsLocal...)
83-
return objType
83+
return listType
8484
}
8585

8686
func NewConnectionStringsObjType(ctx context.Context, input *admin.ClusterConnectionStrings, diags *diag.Diagnostics) types.Object {

internal/service/advancedclustertpf/model_ClusterDescriptionProcessArgs20240805.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func AddAdvancedConfig(ctx context.Context, tfModel *TFModel, input *admin.Clust
4646
TransactionLifetimeLimitSeconds: types.Int64Value(conversion.SafeValue(input.TransactionLifetimeLimitSeconds)),
4747
}
4848
}
49-
objType, diagsLocal := types.ObjectValueFrom(ctx, AdvancedConfigurationObjType.AttrTypes, advancedConfig)
49+
listType, diagsLocal := types.ListValueFrom(ctx, AdvancedConfigurationObjType, []TFAdvancedConfigurationModel{advancedConfig})
5050
diags.Append(diagsLocal...)
51-
tfModel.AdvancedConfiguration = objType
51+
tfModel.AdvancedConfiguration = listType
5252
}

internal/service/advancedclustertpf/model_to_ClusterDescription20240805.go

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,21 +45,16 @@ func NewAtlasReq(ctx context.Context, input *TFModel, diags *diag.Diagnostics) *
4545
VersionReleaseSystem: conversion.NilForUnknown(input.VersionReleaseSystem, input.VersionReleaseSystem.ValueStringPointer()),
4646
}
4747
}
48-
func newBiConnector(ctx context.Context, input types.Object, diags *diag.Diagnostics) *admin.BiConnector {
49-
var resp *admin.BiConnector
50-
if input.IsUnknown() || input.IsNull() {
51-
return resp
52-
}
53-
item := &TFBiConnectorModel{}
54-
if localDiags := input.As(ctx, item, basetypes.ObjectAsOptions{}); len(localDiags) > 0 {
55-
diags.Append(localDiags...)
56-
return resp
57-
}
58-
return &admin.BiConnector{
59-
Enabled: conversion.NilForUnknown(item.Enabled, item.Enabled.ValueBoolPointer()),
60-
ReadPreference: conversion.NilForUnknown(item.ReadPreference, item.ReadPreference.ValueStringPointer()),
61-
}
48+
49+
func newBiConnector(ctx context.Context, input types.List, diags *diag.Diagnostics) *admin.BiConnector {
50+
return conversion.SingleListTFToSDK(ctx, diags, &input, func(tf TFBiConnectorModel) *admin.BiConnector {
51+
return &admin.BiConnector{
52+
Enabled: conversion.NilForUnknown(tf.Enabled, tf.Enabled.ValueBoolPointer()),
53+
ReadPreference: conversion.NilForUnknown(tf.ReadPreference, tf.ReadPreference.ValueStringPointer()),
54+
}
55+
})
6256
}
57+
6358
func newComponentLabel(ctx context.Context, input types.Set, diags *diag.Diagnostics) *[]admin.ComponentLabel {
6459
if input.IsUnknown() {
6560
return nil

internal/service/advancedclustertpf/model_to_ClusterDescriptionProcessArgs20240805.go

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,23 @@ import (
55

66
"github.com/hashicorp/terraform-plugin-framework/diag"
77
"github.com/hashicorp/terraform-plugin-framework/types"
8-
"github.com/hashicorp/terraform-plugin-framework/types/basetypes"
98
"github.com/mongodb/terraform-provider-mongodbatlas/internal/common/conversion"
109
"go.mongodb.org/atlas-sdk/v20241113003/admin"
1110
)
1211

13-
func NewAtlasReqAdvancedConfiguration(ctx context.Context, objInput *types.Object, diags *diag.Diagnostics) *admin.ClusterDescriptionProcessArgs20240805 {
14-
var resp *admin.ClusterDescriptionProcessArgs20240805
15-
if objInput == nil || objInput.IsUnknown() || objInput.IsNull() {
16-
return resp
17-
}
18-
input := &TFAdvancedConfigurationModel{}
19-
if localDiags := objInput.As(ctx, input, basetypes.ObjectAsOptions{}); len(localDiags) > 0 {
20-
diags.Append(localDiags...)
21-
return resp
22-
}
23-
return &admin.ClusterDescriptionProcessArgs20240805{
24-
ChangeStreamOptionsPreAndPostImagesExpireAfterSeconds: conversion.NilForUnknown(input.ChangeStreamOptionsPreAndPostImagesExpireAfterSeconds, conversion.Int64PtrToIntPtr(input.ChangeStreamOptionsPreAndPostImagesExpireAfterSeconds.ValueInt64Pointer())),
25-
DefaultWriteConcern: conversion.NilForUnknown(input.DefaultWriteConcern, input.DefaultWriteConcern.ValueStringPointer()),
26-
JavascriptEnabled: conversion.NilForUnknown(input.JavascriptEnabled, input.JavascriptEnabled.ValueBoolPointer()),
27-
MinimumEnabledTlsProtocol: conversion.NilForUnknown(input.MinimumEnabledTlsProtocol, input.MinimumEnabledTlsProtocol.ValueStringPointer()),
28-
NoTableScan: conversion.NilForUnknown(input.NoTableScan, input.NoTableScan.ValueBoolPointer()),
29-
OplogMinRetentionHours: conversion.NilForUnknown(input.OplogMinRetentionHours, input.OplogMinRetentionHours.ValueFloat64Pointer()),
30-
OplogSizeMB: conversion.NilForUnknown(input.OplogSizeMb, conversion.Int64PtrToIntPtr(input.OplogSizeMb.ValueInt64Pointer())),
31-
SampleRefreshIntervalBIConnector: conversion.NilForUnknown(input.SampleRefreshIntervalBiconnector, conversion.Int64PtrToIntPtr(input.SampleRefreshIntervalBiconnector.ValueInt64Pointer())),
32-
SampleSizeBIConnector: conversion.NilForUnknown(input.SampleSizeBiconnector, conversion.Int64PtrToIntPtr(input.SampleSizeBiconnector.ValueInt64Pointer())),
33-
TransactionLifetimeLimitSeconds: conversion.NilForUnknown(input.TransactionLifetimeLimitSeconds, input.TransactionLifetimeLimitSeconds.ValueInt64Pointer()),
34-
}
12+
func NewAtlasReqAdvancedConfiguration(ctx context.Context, input *types.List, diags *diag.Diagnostics) *admin.ClusterDescriptionProcessArgs20240805 {
13+
return conversion.SingleListTFToSDK(ctx, diags, input, func(tf TFAdvancedConfigurationModel) *admin.ClusterDescriptionProcessArgs20240805 {
14+
return &admin.ClusterDescriptionProcessArgs20240805{
15+
ChangeStreamOptionsPreAndPostImagesExpireAfterSeconds: conversion.NilForUnknown(tf.ChangeStreamOptionsPreAndPostImagesExpireAfterSeconds, conversion.Int64PtrToIntPtr(tf.ChangeStreamOptionsPreAndPostImagesExpireAfterSeconds.ValueInt64Pointer())),
16+
DefaultWriteConcern: conversion.NilForUnknown(tf.DefaultWriteConcern, tf.DefaultWriteConcern.ValueStringPointer()),
17+
JavascriptEnabled: conversion.NilForUnknown(tf.JavascriptEnabled, tf.JavascriptEnabled.ValueBoolPointer()),
18+
MinimumEnabledTlsProtocol: conversion.NilForUnknown(tf.MinimumEnabledTlsProtocol, tf.MinimumEnabledTlsProtocol.ValueStringPointer()),
19+
NoTableScan: conversion.NilForUnknown(tf.NoTableScan, tf.NoTableScan.ValueBoolPointer()),
20+
OplogMinRetentionHours: conversion.NilForUnknown(tf.OplogMinRetentionHours, tf.OplogMinRetentionHours.ValueFloat64Pointer()),
21+
OplogSizeMB: conversion.NilForUnknown(tf.OplogSizeMb, conversion.Int64PtrToIntPtr(tf.OplogSizeMb.ValueInt64Pointer())),
22+
SampleRefreshIntervalBIConnector: conversion.NilForUnknown(tf.SampleRefreshIntervalBiconnector, conversion.Int64PtrToIntPtr(tf.SampleRefreshIntervalBiconnector.ValueInt64Pointer())),
23+
SampleSizeBIConnector: conversion.NilForUnknown(tf.SampleSizeBiconnector, conversion.Int64PtrToIntPtr(tf.SampleSizeBiconnector.ValueInt64Pointer())),
24+
TransactionLifetimeLimitSeconds: conversion.NilForUnknown(tf.TransactionLifetimeLimitSeconds, tf.TransactionLifetimeLimitSeconds.ValueInt64Pointer()),
25+
}
26+
})
3527
}

internal/service/advancedclustertpf/model_to_ClusterDescriptionProcessArgsLegacy.go

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,16 @@ import (
55

66
"github.com/hashicorp/terraform-plugin-framework/diag"
77
"github.com/hashicorp/terraform-plugin-framework/types"
8-
"github.com/hashicorp/terraform-plugin-framework/types/basetypes"
98
"github.com/mongodb/terraform-provider-mongodbatlas/internal/common/conversion"
109
admin20240530 "go.mongodb.org/atlas-sdk/v20240530005/admin"
1110
)
1211

13-
func NewAtlasReqAdvancedConfigurationLegacy(ctx context.Context, objInput *types.Object, diags *diag.Diagnostics) *admin20240530.ClusterDescriptionProcessArgs {
14-
var resp *admin20240530.ClusterDescriptionProcessArgs
15-
if objInput == nil || objInput.IsUnknown() || objInput.IsNull() {
16-
return resp
17-
}
18-
input := &TFAdvancedConfigurationModel{}
19-
if localDiags := objInput.As(ctx, input, basetypes.ObjectAsOptions{}); len(localDiags) > 0 {
20-
diags.Append(localDiags...)
21-
return resp
22-
}
23-
// Choosing to only handle legacy fields in the old API
24-
return &admin20240530.ClusterDescriptionProcessArgs{
25-
DefaultReadConcern: conversion.NilForUnknown(input.DefaultReadConcern, input.DefaultReadConcern.ValueStringPointer()),
26-
FailIndexKeyTooLong: conversion.NilForUnknown(input.FailIndexKeyTooLong, input.FailIndexKeyTooLong.ValueBoolPointer()),
27-
}
12+
func NewAtlasReqAdvancedConfigurationLegacy(ctx context.Context, input *types.List, diags *diag.Diagnostics) *admin20240530.ClusterDescriptionProcessArgs {
13+
return conversion.SingleListTFToSDK(ctx, diags, input, func(tf TFAdvancedConfigurationModel) *admin20240530.ClusterDescriptionProcessArgs {
14+
// Choosing to only handle legacy fields in the old API
15+
return &admin20240530.ClusterDescriptionProcessArgs{
16+
DefaultReadConcern: conversion.NilForUnknown(tf.DefaultReadConcern, tf.DefaultReadConcern.ValueStringPointer()),
17+
FailIndexKeyTooLong: conversion.NilForUnknown(tf.FailIndexKeyTooLong, tf.FailIndexKeyTooLong.ValueBoolPointer()),
18+
}
19+
})
2820
}

internal/service/advancedclustertpf/resource.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ func (r *rs) Create(ctx context.Context, req resource.CreateRequest, resp *resou
7777
}
7878
model := r.createCluster(ctx, &plan, diags)
7979
if model != nil {
80+
overrideAttributesWithPlanValue(model, &plan)
8081
diags.Append(resp.State.Set(ctx, model)...)
8182
}
8283
}
@@ -90,6 +91,7 @@ func (r *rs) Read(ctx context.Context, req resource.ReadRequest, resp *resource.
9091
}
9192
model := r.readCluster(ctx, diags, &state, &resp.State)
9293
if model != nil {
94+
overrideAttributesWithPlanValue(model, &state)
9395
diags.Append(resp.State.Set(ctx, model)...)
9496
}
9597
}
@@ -167,6 +169,7 @@ func (r *rs) Update(ctx context.Context, req resource.UpdateRequest, resp *resou
167169
} else {
168170
modelOut.AdvancedConfiguration = state.AdvancedConfiguration
169171
}
172+
overrideAttributesWithPlanValue(modelOut, &plan)
170173
diags.Append(resp.State.Set(ctx, modelOut)...)
171174
}
172175

@@ -464,7 +467,6 @@ func getBasicClusterModel(ctx context.Context, diags *diag.Diagnostics, client *
464467
if diags.HasError() {
465468
return nil, nil
466469
}
467-
overrideAttributesWithPrevStateValue(modelIn, modelOut)
468470
return modelOut, extraInfo
469471
}
470472

internal/service/advancedclustertpf/resource_compatiblity.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
"go.mongodb.org/atlas-sdk/v20241113003/admin"
1414
)
1515

16-
func overrideAttributesWithPrevStateValue(modelIn, modelOut *TFModel) {
16+
func overrideAttributesWithPlanValue(modelOut, modelIn *TFModel) {
1717
beforeVersion := conversion.NilForUnknown(modelIn.MongoDBMajorVersion, modelIn.MongoDBMajorVersion.ValueStringPointer())
1818
if beforeVersion != nil && !modelIn.MongoDBMajorVersion.Equal(modelOut.MongoDBMajorVersion) {
1919
modelOut.MongoDBMajorVersion = types.StringPointerValue(beforeVersion)
@@ -22,6 +22,13 @@ func overrideAttributesWithPrevStateValue(modelIn, modelOut *TFModel) {
2222
if retainBackups != nil && !modelIn.RetainBackupsEnabled.Equal(modelOut.RetainBackupsEnabled) {
2323
modelOut.RetainBackupsEnabled = types.BoolPointerValue(retainBackups)
2424
}
25+
// Blocks can't be included if not in the config
26+
if modelIn.AdvancedConfiguration.IsNull() {
27+
modelOut.AdvancedConfiguration = types.ListNull(AdvancedConfigurationObjType)
28+
}
29+
if modelIn.BiConnectorConfig.IsNull() {
30+
modelOut.BiConnectorConfig = types.ListNull(BiConnectorConfigObjType)
31+
}
2532
}
2633

2734
func findNumShardsUpdates(ctx context.Context, state, plan *TFModel, diags *diag.Diagnostics) map[string]int64 {

internal/service/advancedclustertpf/resource_test_cases_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ func replicasetAdvConfigUpdate(t *testing.T) *resource.TestCase {
333333
clusterName = acc.RandomClusterName()
334334
fullUpdate = `
335335
backup_enabled = true
336-
bi_connector_config = {
336+
bi_connector_config {
337337
enabled = true
338338
}
339339
# config_server_management_mode = "ATLAS_MANAGED" UNSTABLE: After applying this test step, the non-refresh plan was not empty
@@ -354,7 +354,7 @@ func replicasetAdvConfigUpdate(t *testing.T) *resource.TestCase {
354354
# termination_protection_enabled = true # must be reset to false to enable delete
355355
version_release_system = "CONTINUOUS"
356356
357-
advanced_configuration = {
357+
advanced_configuration {
358358
change_stream_options_pre_and_post_images_expire_after_seconds = 100
359359
default_read_concern = "available"
360360
default_write_concern = "majority"
@@ -385,10 +385,11 @@ func replicasetAdvConfigUpdate(t *testing.T) *resource.TestCase {
385385
Config: configBasic(projectID, clusterName, fullUpdate),
386386
Check: resource.ComposeAggregateTestCheckFunc(
387387
resource.TestCheckResourceAttr(resourceName, "mongo_db_major_version", "8.0"),
388-
resource.TestCheckResourceAttr(resourceName, "advanced_configuration.change_stream_options_pre_and_post_images_expire_after_seconds", "100"),
388+
resource.TestCheckResourceAttr(resourceName, "advanced_configuration.0.change_stream_options_pre_and_post_images_expire_after_seconds", "100"),
389389
),
390390
},
391-
acc.TestStepImportCluster(resourceName),
391+
// These ignored fields are blocks so can't be included if not in the config
392+
acc.TestStepImportCluster(resourceName, "advanced_configuration", "bi_connector_config"),
392393
},
393394
}
394395
}

0 commit comments

Comments
 (0)