Skip to content

Commit e61ef7a

Browse files
committed
moveAttribute & extractAttr
1 parent f499c7e commit e61ef7a

File tree

3 files changed

+59
-17
lines changed

3 files changed

+59
-17
lines changed

internal/hcl/hcl.go

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

98103
func 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

112154
func setAttrInt(body *hclwrite.Body, attrName string, number int) {

internal/hcl/testdata/clu2adv/autoscaling.in.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ resource "mongodbatlas_cluster" "autoscaling" {
33
name = var.cluster_name
44
disk_size_gb = 100
55
num_shards = 1
6-
76
cluster_type = "REPLICASET"
7+
88
replication_specs {
99
num_shards = 1
1010
regions_config {

internal/hcl/testdata/clu2adv/autoscaling.out.tf

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
resource "mongodbatlas_advanced_cluster" "autoscaling" {
22
project_id = var.project_id
33
name = var.cluster_name
4-
cluster_type = "REPLICASET"
5-
backup_enabled = true
6-
4+
cluster_type = "REPLICASET"
5+
76
lifecycle { // To simulate if there a new instance size name to avoid scale cluster down to original value
87
# Note that provider_instance_size_name won't exist in advanced_cluster so it's an error to refer to it,
98
# but plugin doesn't help here.
109
ignore_changes = [provider_instance_size_name]
1110
}
12-
11+
backup_enabled = true
12+
1313
replication_specs = [{
1414
region_configs = [{
15+
provider_name = "AWS"
1516
region_name = "US_WEST_2"
1617
priority = 7
17-
provider_name = "AWS"
1818
auto_scaling = {
1919
disk_gb_enabled = true
2020
compute_enabled = true
@@ -29,7 +29,7 @@ resource "mongodbatlas_advanced_cluster" "autoscaling" {
2929
}
3030
}]
3131
}]
32-
32+
3333
# Generated by atlas-cli-plugin-terraform.
3434
# Please confirm that all references to this resource are updated.
3535
}

0 commit comments

Comments
 (0)