Skip to content

Commit dbde632

Browse files
committed
pass tests
1 parent ab86332 commit dbde632

File tree

3 files changed

+41
-20
lines changed

3 files changed

+41
-20
lines changed

internal/convert/const_names.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,5 @@ const (
5555
nForEach = "for_each"
5656
nContent = "content"
5757
nRegion = "region"
58+
nSpec = "spec"
5859
)

internal/convert/convert.go

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ func fillReplicationSpecs(resourceb *hclwrite.Body, root attrVals) error {
216216
break
217217
}
218218
specbSrc := specSrc.Body()
219-
d, err := fillReplicationSpecsWithDynamicRegionConfigs(specbSrc, root)
219+
d, err := fillReplicationSpecsWithDynamicRegionConfigs(specbSrc, root, false)
220220
if err != nil {
221221
return err
222222
}
@@ -328,15 +328,24 @@ func fillBlockOpt(resourceb *hclwrite.Body, name string) {
328328

329329
// fillReplicationSpecsWithDynamicBlock used for dynamic blocks in replication_specs
330330
func fillReplicationSpecsWithDynamicBlock(resourceb *hclwrite.Body, root attrVals) (dynamicBlock, error) {
331-
d, err := getDynamicBlock(resourceb, nRepSpecs)
332-
if err != nil || !d.IsPresent() {
331+
dSpec, err := getDynamicBlock(resourceb, nRepSpecs)
332+
if err != nil || !dSpec.IsPresent() {
333333
return dynamicBlock{}, err
334334
}
335-
return d, nil
335+
transformDynamicBlockReferences(dSpec.content.Body(), nRepSpecs, nSpec)
336+
dConfig, err := fillReplicationSpecsWithDynamicRegionConfigs(dSpec.content.Body(), root, true)
337+
if err != nil {
338+
return dynamicBlock{}, err
339+
}
340+
forSpec := hcl.TokensFromExpr(fmt.Sprintf("for %s in %s : ", nSpec, hcl.GetAttrExpr(dSpec.forEach)))
341+
forSpec = append(forSpec, dConfig.tokens...)
342+
tokens := hcl.TokensFuncFlatten(forSpec)
343+
dSpec.tokens = tokens
344+
return dSpec, nil
336345
}
337346

338347
// fillReplicationSpecsWithDynamicRegionConfigs is used for dynamic blocks in region_configs
339-
func fillReplicationSpecsWithDynamicRegionConfigs(specbSrc *hclwrite.Body, root attrVals) (dynamicBlock, error) {
348+
func fillReplicationSpecsWithDynamicRegionConfigs(specbSrc *hclwrite.Body, root attrVals, transformRegionReferences bool) (dynamicBlock, error) {
340349
d, err := getDynamicBlock(specbSrc, nConfigSrc)
341350
if err != nil || !d.IsPresent() {
342351
return dynamicBlock{}, err
@@ -346,7 +355,11 @@ func fillReplicationSpecsWithDynamicRegionConfigs(specbSrc *hclwrite.Body, root
346355
if zoneName := hcl.GetAttrExpr(specbSrc.GetAttribute(nZoneName)); zoneName != "" {
347356
repSpecb.SetAttributeRaw(nZoneName, hcl.TokensFromExpr(zoneName))
348357
}
349-
regionFor, err := getDynamicBlockRegionConfigsRegionArray(d, root)
358+
forEach := hcl.GetAttrExpr(d.forEach)
359+
if transformRegionReferences {
360+
forEach = replaceDynamicBlockReferences(forEach, nRepSpecs, nSpec)
361+
}
362+
regionFor, err := getDynamicBlockRegionConfigsRegionArray(forEach, d.content, root)
350363
if err != nil {
351364
return dynamicBlock{}, err
352365
}
@@ -545,33 +558,36 @@ func replaceDynamicBlockExpr(attr *hclwrite.Attribute, blockName, attrName strin
545558

546559
// getDynamicBlockRegionConfigsRegionArray returns the region array for a dynamic block in replication_specs.
547560
// e.g. [ for region in var.replication_specs.regions_config : { ... } if priority == region.priority ]
548-
func getDynamicBlockRegionConfigsRegionArray(d dynamicBlock, root attrVals) (hclwrite.Tokens, error) {
549-
transformDynamicBlockReferences(d.content.Body())
550-
priorityStr := hcl.GetAttrExpr(d.content.Body().GetAttribute(nPriority))
561+
func getDynamicBlockRegionConfigsRegionArray(forEach string, configSrc *hclwrite.Block, root attrVals) (hclwrite.Tokens, error) {
562+
transformDynamicBlockReferences(configSrc.Body(), nConfigSrc, nRegion)
563+
priorityStr := hcl.GetAttrExpr(configSrc.Body().GetAttribute(nPriority))
551564
if priorityStr == "" {
552565
return nil, fmt.Errorf("%s: %s not found", errRepSpecs, nPriority)
553566
}
554-
region, err := getRegionConfig(d.content, root, true)
567+
region, err := getRegionConfig(configSrc, root, true)
555568
if err != nil {
556569
return nil, err
557570
}
558-
tokens := hcl.TokensFromExpr(fmt.Sprintf("for %s in %s :", nRegion, hcl.GetAttrExpr(d.forEach)))
571+
tokens := hcl.TokensFromExpr(fmt.Sprintf("for %s in %s :", nRegion, forEach))
559572
tokens = append(tokens, hcl.EncloseBraces(region.BuildTokens(nil), true)...)
560573
tokens = append(tokens, hcl.TokensFromExpr(fmt.Sprintf("if %s == %s", nPriority, priorityStr))...)
561574
return hcl.EncloseBracketsNewLines(tokens), nil
562575
}
563576

564-
// transformDynamicBlockReferences changes value references in all attributes, e.g. regions_config.value.electable_nodes to region.electable_nodes
565-
func transformDynamicBlockReferences(configSrcb *hclwrite.Body) {
577+
func transformDynamicBlockReferences(configSrcb *hclwrite.Body, blockName, varName string) {
566578
for name, attr := range configSrcb.Attributes() {
567-
expr := hcl.GetAttrExpr(attr)
568-
expr = strings.ReplaceAll(expr,
569-
fmt.Sprintf("%s.%s.", nConfigSrc, nValue),
570-
fmt.Sprintf("%s.", nRegion))
579+
expr := replaceDynamicBlockReferences(hcl.GetAttrExpr(attr), blockName, varName)
571580
configSrcb.SetAttributeRaw(name, hcl.TokensFromExpr(expr))
572581
}
573582
}
574583

584+
// replaceDynamicBlockReferences changes value references, e.g. regions_config.value.electable_nodes to region.electable_nodes
585+
func replaceDynamicBlockReferences(expr, blockName, varName string) string {
586+
return strings.ReplaceAll(expr,
587+
fmt.Sprintf("%s.%s.", blockName, nValue),
588+
fmt.Sprintf("%s.", varName))
589+
}
590+
575591
func sortConfigsByPriority(configs []*hclwrite.Body) []*hclwrite.Body {
576592
for _, config := range configs {
577593
if _, err := hcl.GetAttrInt(config.GetAttribute(nPriority), errPriority); err != nil {

internal/convert/testdata/clu2adv/dynamic_replication_specs.out.tf

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,15 @@ resource "mongodbatlas_advanced_cluster" "this" {
1212
cluster_type = var.cluster_type
1313
mongo_db_major_version = var.mongo_db_major_version
1414

15+
1516
replication_specs = flatten([
1617
for spec in var.replication_specs : [
17-
for i in range(var.replication_specs.num_shards) : {
18-
zone_name = var.zone_name
18+
for i in range(spec.num_shards) : {
19+
zone_name = spec.zone_name
1920
region_configs = flatten([
2021
# Regions must be sorted by priority in descending order.
2122
for priority in range(7, 0, -1) : [
22-
for region in var.replication_specs.regions_config : {
23+
for region in spec.regions_config : {
2324
provider_name = var.provider_name
2425
region_name = region.region_name
2526
priority = region.priority
@@ -33,6 +34,9 @@ resource "mongodbatlas_advanced_cluster" "this" {
3334
instance_size = var.instance_size
3435
disk_size_gb = var.disk_size
3536
}
37+
auto_scaling = {
38+
disk_gb_enabled = var.auto_scaling_disk_gb_enabled
39+
}
3640
} if priority == region.priority
3741
]
3842
])

0 commit comments

Comments
 (0)