@@ -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
330330func 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+
575591func sortConfigsByPriority (configs []* hclwrite.Body ) []* hclwrite.Body {
576592 for _ , config := range configs {
577593 if _ , err := hcl .GetAttrInt (config .GetAttribute (nPriority ), errPriority ); err != nil {
0 commit comments