@@ -14,17 +14,20 @@ import (
1414)
1515
1616const (
17- resourceType = "resource"
18- cluster = "mongodbatlas_cluster"
19- advCluster = "mongodbatlas_advanced_cluster"
20- valClusterType = "REPLICASET"
21- valMaxPriority = 7
22- valMinPriority = 1
23- errFreeCluster = "free cluster (because no " + nRepSpecs + ")"
24- errRepSpecs = "setting " + nRepSpecs
25- errConfigs = "setting " + nConfig
26- errPriority = "setting " + nPriority
27- errNumShards = "setting " + nNumShards
17+ resourceType = "resource"
18+ dataSourceType = "data"
19+ cluster = "mongodbatlas_cluster"
20+ advCluster = "mongodbatlas_advanced_cluster"
21+ clusterPlural = "mongodbatlas_clusters"
22+ advClusterPlural = "mongodbatlas_advanced_clusters"
23+ valClusterType = "REPLICASET"
24+ valMaxPriority = 7
25+ valMinPriority = 1
26+ errFreeCluster = "free cluster (because no " + nRepSpecs + ")"
27+ errRepSpecs = "setting " + nRepSpecs
28+ errConfigs = "setting " + nConfig
29+ errPriority = "setting " + nPriority
30+ errNumShards = "setting " + nNumShards
2831)
2932
3033type attrVals struct {
@@ -42,35 +45,60 @@ func ClusterToAdvancedCluster(config []byte) ([]byte, error) {
4245 if err != nil {
4346 return nil , err
4447 }
45- for _ , resource := range parser .Body ().Blocks () {
46- labels := resource .Labels ()
47- resourceName := labels [0 ]
48- if resource .Type () != resourceType || resourceName != cluster {
49- continue
50- }
51- resourceb := resource .Body ()
52- if errDyn := checkDynamicBlock (resourceb ); errDyn != nil {
53- return nil , errDyn
54- }
55- labels [0 ] = advCluster
56- resource .SetLabels (labels )
57-
58- if resourceb .FirstMatchingBlock (nRepSpecs , nil ) != nil {
59- err = fillCluster (resourceb )
60- } else {
61- err = fillFreeTierCluster (resourceb )
62- }
48+ for _ , block := range parser .Body ().Blocks () {
49+ converted , err := convertResource (block )
6350 if err != nil {
6451 return nil , err
6552 }
66-
67- resourceb .AppendNewline ()
68- hcl .AppendComment (resourceb , "Generated by atlas-cli-plugin-terraform." )
69- hcl .AppendComment (resourceb , "Please confirm that all references to this resource are updated." )
53+ converted = converted || convertDataSource (block )
54+ if converted {
55+ blockb := block .Body ()
56+ blockb .AppendNewline ()
57+ hcl .AppendComment (blockb , "Generated by atlas-cli-plugin-terraform." )
58+ hcl .AppendComment (blockb , "Please confirm that all references to this resource are updated." )
59+ }
7060 }
7161 return parser .Bytes (), nil
7262}
7363
64+ func convertResource (block * hclwrite.Block ) (bool , error ) {
65+ if block .Type () != resourceType || getResourceName (block ) != cluster {
66+ return false , nil
67+ }
68+ setResourceName (block , advCluster )
69+ blockb := block .Body ()
70+ if errDyn := checkDynamicBlock (blockb ); errDyn != nil {
71+ return false , errDyn
72+ }
73+
74+ var err error
75+ if blockb .FirstMatchingBlock (nRepSpecs , nil ) != nil {
76+ err = fillCluster (blockb )
77+ } else {
78+ err = fillFreeTierCluster (blockb )
79+ }
80+ if err != nil {
81+ return false , err
82+ }
83+ return true , nil
84+ }
85+
86+ func convertDataSource (block * hclwrite.Block ) bool {
87+ if block .Type () != dataSourceType {
88+ return false
89+ }
90+ convertMap := map [string ]string {
91+ cluster : advCluster ,
92+ clusterPlural : advClusterPlural ,
93+ }
94+ if newName , found := convertMap [getResourceName (block )]; found {
95+ setResourceName (block , newName )
96+ block .Body ().SetAttributeValue (nUseRepSpecsPerShard , cty .True )
97+ return true
98+ }
99+ return false
100+ }
101+
74102// fillFreeTierCluster is the entry point to convert clusters in free tier
75103func fillFreeTierCluster (resourceb * hclwrite.Body ) error {
76104 resourceb .SetAttributeValue (nClusterType , cty .StringVal (valClusterType ))
@@ -301,6 +329,23 @@ func getAutoScalingOpt(opt map[string]hclwrite.Tokens) hclwrite.Tokens {
301329 return hcl .TokensObject (fileb )
302330}
303331
332+ func setResourceName (resource * hclwrite.Block , name string ) {
333+ labels := resource .Labels ()
334+ if len (labels ) == 0 {
335+ return
336+ }
337+ labels [0 ] = name
338+ resource .SetLabels (labels )
339+ }
340+
341+ func getResourceName (resource * hclwrite.Block ) string {
342+ labels := resource .Labels ()
343+ if len (labels ) == 0 {
344+ return ""
345+ }
346+ return labels [0 ]
347+ }
348+
304349func checkDynamicBlock (body * hclwrite.Body ) error {
305350 for _ , block := range body .Blocks () {
306351 if block .Type () == "dynamic" {
0 commit comments