Skip to content

Commit ff3fc22

Browse files
committed
use config in dynamic blocks from individual
1 parent 3f93627 commit ff3fc22

File tree

4 files changed

+54
-14
lines changed

4 files changed

+54
-14
lines changed

internal/convert/convert.go

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,6 @@ func fillReplicationSpecs(resourceb *hclwrite.Body, root attrVals) error {
201201
break
202202
}
203203
specbSrc := specSrc.Body()
204-
// ok to fail as zone_name is optional
205-
_ = hcl.MoveAttr(specbSrc, specb, nZoneName, nZoneName, errRepSpecs)
206204
d, err := fillRegionConfigsDynamicBlock(specbSrc, root)
207205
if err != nil {
208206
return err
@@ -212,6 +210,8 @@ func fillReplicationSpecs(resourceb *hclwrite.Body, root attrVals) error {
212210
resourceb.SetAttributeRaw(nRepSpecs, d.tokens)
213211
return nil
214212
}
213+
// ok to fail as zone_name is optional
214+
_ = hcl.MoveAttr(specbSrc, specb, nZoneName, nZoneName, errRepSpecs)
215215
shards := specbSrc.GetAttribute(nNumShards)
216216
if shards == nil {
217217
return fmt.Errorf("%s: %s not found", errRepSpecs, nNumShards)
@@ -316,6 +316,11 @@ func fillRegionConfigsDynamicBlock(specbSrc *hclwrite.Body, root attrVals) (dyna
316316
if err != nil || !d.IsPresent() {
317317
return dynamicBlock{}, err
318318
}
319+
shards := specbSrc.GetAttribute(nNumShards)
320+
if shards == nil {
321+
return dynamicBlock{}, fmt.Errorf("%s: %s not found", errRepSpecs, nNumShards)
322+
}
323+
zoneName := hcl.GetAttrExpr(specbSrc.GetAttribute(nZoneName))
319324
const nRegion = "region"
320325
configSrc := d.content
321326
configSrcb := configSrc.Body()
@@ -326,13 +331,32 @@ func fillRegionConfigsDynamicBlock(specbSrc *hclwrite.Body, root attrVals) (dyna
326331
expr := replaceDynamicBlockExpr(attr, name, oldPrefix, nRegion)
327332
configSrcb.SetAttributeRaw(name, hcl.TokensFromExpr(expr))
328333
}
329-
330334
region, err := getRegionConfig(configSrc, root)
331335
if err != nil {
332336
return dynamicBlock{}, err
333337
}
334-
335-
d.tokens = hcl.EncloseBrackets(hcl.EncloseNewLines(hcl.TokensObject(region.Body())))
338+
forOuter := fmt.Sprintf("for i in range(%s) :", hcl.GetAttrExpr(shards))
339+
repSpec := hclwrite.NewEmptyFile()
340+
repSpecb := repSpec.Body()
341+
if zoneName != "" {
342+
repSpecb.SetAttributeRaw(nZoneName, hcl.TokensFromExpr(zoneName))
343+
}
344+
config := region.BuildTokens(nil)
345+
config = append(config, hcl.TokenNewLine())
346+
config = hcl.EncloseBraces(config, true)
347+
config = append(config, hcl.TokensFromExpr("if region.priority == priority")...)
348+
forRegion := hcl.TokensFromExpr(fmt.Sprintf("for region in %s :", hcl.GetAttrExpr(d.forEach)))
349+
forRegion = append(forRegion, config...)
350+
351+
priorityContent := hcl.EncloseBrackets(hcl.EncloseNewLines(forRegion))
352+
priorityBlock := hcl.TokensFromExpr("for priority in range(7, 0, -1) : ")
353+
priorityBlock = append(priorityBlock, priorityContent...)
354+
repSpecb.SetAttributeRaw(nConfig, hcl.TokensFuncFlatten(priorityBlock))
355+
356+
tokens := hcl.TokensFromExpr(forOuter)
357+
tokens = append(tokens, hcl.EncloseBraces(repSpec.BuildTokens(nil), true)...)
358+
tokens = hcl.EncloseBrackets(hcl.EncloseNewLines(tokens))
359+
d.tokens = tokens
336360
return d, nil
337361
}
338362

internal/convert/testdata/clu2adv/dynamic_regions_config.in.tf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ resource "mongodbatlas_cluster" "dynamic_regions_config" {
66
provider_instance_size_name = "M10"
77
replication_specs {
88
num_shards = var.replication_specs.num_shards
9+
zone_name = "Zone 1"
910
dynamic "regions_config" {
1011
for_each = var.replication_specs.regions_config
1112
content {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ resource "mongodbatlas_advanced_cluster" "dynamic_regions_config" {
44
cluster_type = "SHARDED"
55
replication_specs = [
66
for i in range(var.replication_specs.num_shards) : {
7+
zone_name = "Zone 1"
78
region_configs = flatten([
89
for priority in range(7, 0, -1) : [
910
for region in var.replication_specs.regions_config : {

internal/hcl/hcl.go

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ func PopAttr(body *hclwrite.Body, attrName, errPrefix string) (hclwrite.Tokens,
3333

3434
// GetAttrExpr returns the expression of an attribute as a string.
3535
func GetAttrExpr(attr *hclwrite.Attribute) string {
36+
if attr == nil {
37+
return ""
38+
}
3639
return strings.TrimSpace(string(attr.Expr().BuildTokens(nil).Bytes()))
3740
}
3841

@@ -77,6 +80,10 @@ func GetAttrString(attr *hclwrite.Attribute, errPrefix string) (string, error) {
7780
return val.AsString(), nil
7881
}
7982

83+
func TokenNewLine() *hclwrite.Token {
84+
return &hclwrite.Token{Type: hclsyntax.TokenNewline, Bytes: []byte("\n")}
85+
}
86+
8087
// TokensArray creates an array of objects.
8188
func TokensArray(bodies []*hclwrite.Body) hclwrite.Tokens {
8289
tokens := make([]hclwrite.Tokens, 0)
@@ -93,9 +100,9 @@ func TokensArraySingle(body *hclwrite.Body) hclwrite.Tokens {
93100

94101
// TokensObject creates an object.
95102
func TokensObject(body *hclwrite.Body) hclwrite.Tokens {
96-
tokens := hclwrite.Tokens{tokenNewLine}
103+
tokens := hclwrite.Tokens{TokenNewLine()}
97104
tokens = append(tokens, RemoveLeadingNewline(body.BuildTokens(nil))...)
98-
return EncloseBraces(tokens)
105+
return EncloseBraces(tokens, false)
99106
}
100107

101108
// TokensFromExpr creates the tokens for an expression provided as a string.
@@ -105,7 +112,7 @@ func TokensFromExpr(expr string) hclwrite.Tokens {
105112

106113
// TokensObjectFromExpr creates an object with an expression.
107114
func TokensObjectFromExpr(expr string) hclwrite.Tokens {
108-
return EncloseBraces(EncloseNewLines(TokensFromExpr(expr)))
115+
return EncloseBraces(EncloseNewLines(TokensFromExpr(expr)), false)
109116
}
110117

111118
// TokensFuncMerge creates the tokens for the HCL merge function.
@@ -115,6 +122,12 @@ func TokensFuncMerge(tokens ...hclwrite.Tokens) hclwrite.Tokens {
115122
return append(ret, EncloseParens(params)...)
116123
}
117124

125+
// TokensFuncFlatten creates the tokens for the HCL flatten function.
126+
func TokensFuncFlatten(tokens hclwrite.Tokens) hclwrite.Tokens {
127+
ret := TokensFromExpr("flatten")
128+
return append(ret, EncloseParens(EncloseBrackets(EncloseNewLines(tokens)))...)
129+
}
130+
118131
// RemoveLeadingNewline removes the first newline if it exists to make the output prettier.
119132
func RemoveLeadingNewline(tokens hclwrite.Tokens) hclwrite.Tokens {
120133
if len(tokens) > 0 && tokens[0].Type == hclsyntax.TokenNewline {
@@ -140,8 +153,6 @@ func GetParser(config []byte) (*hclwrite.File, error) {
140153
return parser, nil
141154
}
142155

143-
var tokenNewLine = &hclwrite.Token{Type: hclsyntax.TokenNewline, Bytes: []byte("\n")}
144-
145156
// joinTokens joins multiple tokens with commas and newlines.
146157
func joinTokens(tokens ...hclwrite.Tokens) hclwrite.Tokens {
147158
ret := hclwrite.Tokens{}
@@ -150,7 +161,7 @@ func joinTokens(tokens ...hclwrite.Tokens) hclwrite.Tokens {
150161
if i < len(tokens)-1 {
151162
ret = append(ret,
152163
&hclwrite.Token{Type: hclsyntax.TokenComma, Bytes: []byte(",")},
153-
tokenNewLine)
164+
TokenNewLine())
154165
}
155166
}
156167
return ret
@@ -164,8 +175,11 @@ func EncloseParens(tokens hclwrite.Tokens) hclwrite.Tokens {
164175
}
165176

166177
// EncloseBraces encloses tokens with curly braces, { }.
167-
func EncloseBraces(tokens hclwrite.Tokens) hclwrite.Tokens {
178+
func EncloseBraces(tokens hclwrite.Tokens, initialNewLine bool) hclwrite.Tokens {
168179
ret := hclwrite.Tokens{{Type: hclsyntax.TokenOBrace, Bytes: []byte("{")}}
180+
if initialNewLine {
181+
ret = append(ret, TokenNewLine())
182+
}
169183
ret = append(ret, tokens...)
170184
return append(ret, &hclwrite.Token{Type: hclsyntax.TokenCBrace, Bytes: []byte("}")})
171185
}
@@ -179,7 +193,7 @@ func EncloseBrackets(tokens hclwrite.Tokens) hclwrite.Tokens {
179193

180194
// EncloseNewLines encloses tokens with newlines at the beginning and end.
181195
func EncloseNewLines(tokens hclwrite.Tokens) hclwrite.Tokens {
182-
ret := hclwrite.Tokens{tokenNewLine}
196+
ret := hclwrite.Tokens{TokenNewLine()}
183197
ret = append(ret, tokens...)
184-
return append(ret, tokenNewLine)
198+
return append(ret, TokenNewLine())
185199
}

0 commit comments

Comments
 (0)