@@ -14,17 +14,20 @@ import (
14
14
)
15
15
16
16
const (
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
28
31
)
29
32
30
33
type attrVals struct {
@@ -42,35 +45,60 @@ func ClusterToAdvancedCluster(config []byte) ([]byte, error) {
42
45
if err != nil {
43
46
return nil , err
44
47
}
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 )
63
50
if err != nil {
64
51
return nil , err
65
52
}
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
+ }
70
60
}
71
61
return parser .Bytes (), nil
72
62
}
73
63
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
+
74
102
// fillFreeTierCluster is the entry point to convert clusters in free tier
75
103
func fillFreeTierCluster (resourceb * hclwrite.Body ) error {
76
104
resourceb .SetAttributeValue (nClusterType , cty .StringVal (valClusterType ))
@@ -301,6 +329,23 @@ func getAutoScalingOpt(opt map[string]hclwrite.Tokens) hclwrite.Tokens {
301
329
return hcl .TokensObject (fileb )
302
330
}
303
331
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
+
304
349
func checkDynamicBlock (body * hclwrite.Body ) error {
305
350
for _ , block := range body .Blocks () {
306
351
if block .Type () == "dynamic" {
0 commit comments