Skip to content

Commit c4d2c7d

Browse files
committed
check only one block in getDynamicBlock
1 parent 0b66033 commit c4d2c7d

File tree

3 files changed

+19
-21
lines changed

3 files changed

+19
-21
lines changed

internal/convert/adv2v2.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,10 @@ func convertRepSpecs(resourceb *hclwrite.Body, diskSizeGB hclwrite.Tokens) error
121121
}
122122

123123
func convertRepSpecsWithDynamicBlock(resourceb *hclwrite.Body, diskSizeGB hclwrite.Tokens) (dynamicBlock, error) {
124-
dSpec, err := getDynamicBlock(resourceb, nRepSpecs)
124+
dSpec, err := getDynamicBlock(resourceb, nRepSpecs, true)
125125
if err != nil || !dSpec.IsPresent() {
126126
return dynamicBlock{}, err
127127
}
128-
if len(collectBlocks(resourceb, nRepSpecs)) > 0 {
129-
return dynamicBlock{}, errDynamicBlockAlone
130-
}
131128
transformReferences(dSpec.content.Body(), nRepSpecs, nSpec)
132129
dConfig, err := convertConfigsWithDynamicBlock(dSpec.content.Body(), diskSizeGB, true)
133130
if err != nil {
@@ -141,13 +138,10 @@ func convertRepSpecsWithDynamicBlock(resourceb *hclwrite.Body, diskSizeGB hclwri
141138
// convertConfigsWithDynamicBlock is used for processing dynamic blocks in region_configs
142139
func convertConfigsWithDynamicBlock(specbSrc *hclwrite.Body, diskSizeGB hclwrite.Tokens,
143140
insideDynamicRepSpec bool) (dynamicBlock, error) {
144-
d, err := getDynamicBlock(specbSrc, nConfig)
141+
d, err := getDynamicBlock(specbSrc, nConfig, true)
145142
if err != nil || !d.IsPresent() {
146143
return dynamicBlock{}, err
147144
}
148-
if len(collectBlocks(specbSrc, nConfig)) > 0 {
149-
return dynamicBlock{}, errDynamicBlockAlone
150-
}
151145
configBody := d.content.Body()
152146
transformReferences(configBody, getResourceName(d.block), nRegion)
153147
regionConfigBody := hclwrite.NewEmptyFile().Body()

internal/convert/clu2adv.go

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func convertResource(block *hclwrite.Block) (bool, error) {
7575
}
7676

7777
func isFreeTierCluster(resourceb *hclwrite.Body) bool {
78-
d, _ := getDynamicBlock(resourceb, nRepSpecs)
78+
d, _ := getDynamicBlock(resourceb, nRepSpecs, true)
7979
return resourceb.FirstMatchingBlock(nRepSpecs, nil) == nil && !d.IsPresent()
8080
}
8181

@@ -221,13 +221,10 @@ func fillRepSpecs(resourceb *hclwrite.Body, root attrVals) error {
221221

222222
// fillRepSpecsWithDynamicBlock used for dynamic blocks in replication_specs
223223
func fillRepSpecsWithDynamicBlock(resourceb *hclwrite.Body, root attrVals) (dynamicBlock, error) {
224-
dSpec, err := getDynamicBlock(resourceb, nRepSpecs)
224+
dSpec, err := getDynamicBlock(resourceb, nRepSpecs, true)
225225
if err != nil || !dSpec.IsPresent() {
226226
return dynamicBlock{}, err
227227
}
228-
if len(collectBlocks(resourceb, nRepSpecs)) > 0 {
229-
return dynamicBlock{}, errDynamicBlockAlone
230-
}
231228
transformReferences(dSpec.content.Body(), nRepSpecs, nSpec)
232229
dConfig, err := fillConfigsWithDynamicRegion(dSpec.content.Body(), root, true)
233230
if err != nil {
@@ -242,13 +239,10 @@ func fillRepSpecsWithDynamicBlock(resourceb *hclwrite.Body, root attrVals) (dyna
242239

243240
// fillConfigsWithDynamicRegion is used for dynamic blocks in region_configs
244241
func fillConfigsWithDynamicRegion(specbSrc *hclwrite.Body, root attrVals, changeReferences bool) (dynamicBlock, error) {
245-
d, err := getDynamicBlock(specbSrc, nConfigSrc)
242+
d, err := getDynamicBlock(specbSrc, nConfigSrc, true)
246243
if err != nil || !d.IsPresent() {
247244
return dynamicBlock{}, err
248245
}
249-
if len(collectBlocks(specbSrc, nConfigSrc)) > 0 {
250-
return dynamicBlock{}, errDynamicBlockAlone
251-
}
252246
repSpecb := hclwrite.NewEmptyFile().Body()
253247
if zoneName := hcl.GetAttrExpr(specbSrc.GetAttribute(nZoneName)); zoneName != "" {
254248
repSpecb.SetAttributeRaw(nZoneName, hcl.TokensFromExpr(zoneName))

internal/convert/shared.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,13 @@ func (d dynamicBlock) IsPresent() bool {
5656
}
5757

5858
// getDynamicBlock finds and returns a dynamic block with the given name from the body
59-
func getDynamicBlock(body *hclwrite.Body, name string) (dynamicBlock, error) {
59+
func getDynamicBlock(body *hclwrite.Body, name string, checkAlone bool) (dynamicBlock, error) {
60+
var db dynamicBlock
61+
staticBlockCount := 0
6062
for _, block := range body.Blocks() {
63+
if block.Type() == name {
64+
staticBlockCount++
65+
}
6166
if block.Type() != nDynamic || name != getResourceName(block) {
6267
continue
6368
}
@@ -70,9 +75,14 @@ func getDynamicBlock(body *hclwrite.Body, name string) (dynamicBlock, error) {
7075
if content == nil {
7176
return dynamicBlock{}, fmt.Errorf("dynamic block %s: block %s not found", name, nContent)
7277
}
73-
return dynamicBlock{forEach: forEach, block: block, content: content}, nil
78+
if !db.IsPresent() {
79+
db = dynamicBlock{forEach: forEach, block: block, content: content}
80+
}
81+
}
82+
if checkAlone && db.IsPresent() && staticBlockCount > 0 {
83+
return dynamicBlock{}, errDynamicBlockAlone
7484
}
75-
return dynamicBlock{}, nil
85+
return db, nil
7686
}
7787

7888
func checkDynamicBlock(body *hclwrite.Body) error {
@@ -185,7 +195,7 @@ func fillTagsLabelsOpt(resourceb *hclwrite.Body, name string) error {
185195
}
186196

187197
func extractTagsLabelsDynamicBlock(resourceb *hclwrite.Body, name string) (hclwrite.Tokens, error) {
188-
d, err := getDynamicBlock(resourceb, name)
198+
d, err := getDynamicBlock(resourceb, name, false)
189199
if err != nil || !d.IsPresent() {
190200
return nil, err
191201
}

0 commit comments

Comments
 (0)