@@ -26,11 +26,16 @@ const (
2626 nameInstanceSize = "instance_size"
2727 nameClusterType = "cluster_type"
2828 namePriority = "priority"
29+ nameNumShards = "num_shards"
30+ nameBackupEnabled = "backup_enabled"
31+ nameCloudBackup = "cloud_backup"
32+ nameDiskSizeGB = "disk_size_gb"
2933
3034 valClusterType = "REPLICASET"
3135 valPriority = 7
3236
3337 errFreeCluster = "free cluster (because no " + nameReplicationSpecs + ")"
38+ errRepSpecs = "setting " + nameReplicationSpecs
3439)
3540
3641// ClusterToAdvancedCluster transforms all mongodbatlas_cluster definitions in a
@@ -74,17 +79,17 @@ func fillFreeTier(body *hclwrite.Body) error {
7479 regionConfig := hclwrite .NewEmptyFile ()
7580 regionConfigBody := regionConfig .Body ()
7681 setAttrInt (regionConfigBody , "priority" , valPriority )
77- if err := moveAttribute ( nameProviderRegionName , nameRegionName , body , regionConfigBody , errFreeCluster ); err != nil {
82+ if err := moveAttr ( body , regionConfigBody , nameProviderRegionName , nameRegionName , errFreeCluster ); err != nil {
7883 return err
7984 }
80- if err := moveAttribute ( nameProviderName , nameProviderName , body , regionConfigBody , errFreeCluster ); err != nil {
85+ if err := moveAttr ( body , regionConfigBody , nameProviderName , nameProviderName , errFreeCluster ); err != nil {
8186 return err
8287 }
83- if err := moveAttribute ( nameBackingProviderName , nameBackingProviderName , body , regionConfigBody , errFreeCluster ); err != nil {
88+ if err := moveAttr ( body , regionConfigBody , nameBackingProviderName , nameBackingProviderName , errFreeCluster ); err != nil {
8489 return err
8590 }
8691 electableSpec := hclwrite .NewEmptyFile ()
87- if err := moveAttribute ( nameProviderInstanceSizeName , nameInstanceSize , body , electableSpec .Body (), errFreeCluster ); err != nil {
92+ if err := moveAttr ( body , electableSpec .Body (), nameProviderInstanceSizeName , nameInstanceSize , errFreeCluster ); err != nil {
8893 return err
8994 }
9095 regionConfigBody .SetAttributeRaw (nameElectableSpecs , tokensObject (electableSpec ))
@@ -96,17 +101,54 @@ func fillFreeTier(body *hclwrite.Body) error {
96101}
97102
98103func fillReplicationSpecs (body * hclwrite.Body ) error {
104+ diskSizeGBOptional , _ := extractAttr (body , nameDiskSizeGB , errRepSpecs )
105+ providerName , err := extractAttr (body , nameProviderName , errRepSpecs )
106+ if err != nil {
107+ return nil
108+ }
109+
110+ srcReplicationSpecs := body .FirstMatchingBlock (nameReplicationSpecs , nil )
111+ // srcRegionsConfig := srcReplicationSpecs.Body().FirstMatchingBlock(nameRegionConfigs, nil)
112+ // regionName := srcRegionsConfig.Body().GetAttribute(nameRegionName)
113+
114+ body .RemoveAttribute (nameNumShards ) // num_shards in root is not relevant, only in replication_specs
115+ // ok moveAttr to fail as cloud_backup is optional
116+ _ = moveAttr (body , body , nameCloudBackup , nameBackupEnabled , errRepSpecs )
117+
118+ electableSpec := hclwrite .NewEmptyFile ()
119+
120+ regionConfig := hclwrite .NewEmptyFile ()
121+ regionConfigBody := regionConfig .Body ()
122+ regionConfigBody .SetAttributeRaw (nameElectableSpecs , tokensObject (electableSpec ))
123+
124+ replicationSpec := hclwrite .NewEmptyFile ()
125+ replicationSpec .Body ().SetAttributeRaw (nameRegionConfigs , tokensArrayObject (regionConfig ))
126+ body .SetAttributeRaw (nameReplicationSpecs , tokensArrayObject (replicationSpec ))
127+
128+ _ , _ = diskSizeGBOptional , providerName
129+
130+ body .RemoveBlock (srcReplicationSpecs )
99131 return nil
100132}
101133
102- func moveAttribute (fromAttrName , toAttrName string , fromBody , toBody * hclwrite.Body , errPrefix string ) error {
103- attr := fromBody .GetAttribute (fromAttrName )
134+ // moveAttr deletes an attribute from fromBody and adds it to toBody.
135+ func moveAttr (fromBody , toBody * hclwrite.Body , fromAttrName , toAttrName , errPrefix string ) error {
136+ tokens , err := extractAttr (fromBody , fromAttrName , errPrefix )
137+ if err == nil {
138+ toBody .SetAttributeRaw (toAttrName , tokens )
139+ }
140+ return err
141+ }
142+
143+ // extractAttr deletes an attribute and returns it value.
144+ func extractAttr (body * hclwrite.Body , attrName , errPrefix string ) (hclwrite.Tokens , error ) {
145+ attr := body .GetAttribute (attrName )
104146 if attr == nil {
105- return fmt .Errorf ("%s: attribute %s not found" , errPrefix , fromAttrName )
147+ return nil , fmt .Errorf ("%s: attribute %s not found" , errPrefix , attrName )
106148 }
107- fromBody . RemoveAttribute ( fromAttrName )
108- toBody . SetAttributeRaw ( toAttrName , attr . Expr (). BuildTokens ( nil ) )
109- return nil
149+ tokens := attr . Expr (). BuildTokens ( nil )
150+ body . RemoveAttribute ( attrName )
151+ return tokens , nil
110152}
111153
112154func setAttrInt (body * hclwrite.Body , attrName string , number int ) {
0 commit comments