Skip to content

Commit db91f27

Browse files
committed
implement error handling
1 parent 48f37d1 commit db91f27

11 files changed

+212
-2
lines changed

internal/convert/adv2v2.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ func convertRepSpecs(resourceb *hclwrite.Body, diskSizeGB hclwrite.Tokens) error
8585
return err
8686
}
8787
if dConfig.IsPresent() {
88+
if len(collectBlocks(blockb, nConfig)) > 0 {
89+
return errDynamicBockAlone
90+
}
8891
transformReferences(dConfig.content.Body(), getResourceName(dConfig.block), nRegion)
8992
copyAttributesSorted(dConfig.content.Body(), dConfig.content.Body().Attributes())
9093
processAllSpecs(dConfig.content.Body(), diskSizeGB)
@@ -129,6 +132,9 @@ func convertRepSpecsWithDynamicBlock(resourceb *hclwrite.Body, diskSizeGB hclwri
129132
if err != nil || !dSpec.IsPresent() {
130133
return dynamicBlock{}, err
131134
}
135+
if len(collectBlocks(resourceb, nRepSpecs)) > 0 {
136+
return dynamicBlock{}, errDynamicBockAlone
137+
}
132138
transformReferences(dSpec.content.Body(), nRepSpecs, nSpec)
133139
dConfig, err := convertConfigsWithDynamicBlock(dSpec.content.Body(), diskSizeGB)
134140
if err != nil {
@@ -144,6 +150,9 @@ func convertConfigsWithDynamicBlock(specbSrc *hclwrite.Body, diskSizeGB hclwrite
144150
if err != nil {
145151
return dynamicBlock{}, err
146152
}
153+
if len(collectBlocks(specbSrc, nConfig)) > 0 {
154+
return dynamicBlock{}, errDynamicBockAlone
155+
}
147156
configBody := d.content.Body()
148157
transformReferences(configBody, getResourceName(d.block), nRegion)
149158
regionConfigBody := hclwrite.NewEmptyFile().Body()

internal/convert/clu2adv.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,9 @@ func fillRepSpecsWithDynamicBlock(resourceb *hclwrite.Body, root attrVals) (dyna
225225
if err != nil || !dSpec.IsPresent() {
226226
return dynamicBlock{}, err
227227
}
228+
if len(collectBlocks(resourceb, nRepSpecs)) > 0 {
229+
return dynamicBlock{}, errDynamicBockAlone
230+
}
228231
transformReferences(dSpec.content.Body(), nRepSpecs, nSpec)
229232
dConfig, err := fillConfigsWithDynamicRegion(dSpec.content.Body(), root, true)
230233
if err != nil {
@@ -243,6 +246,9 @@ func fillConfigsWithDynamicRegion(specbSrc *hclwrite.Body, root attrVals, change
243246
if err != nil || !d.IsPresent() {
244247
return dynamicBlock{}, err
245248
}
249+
if len(collectBlocks(specbSrc, nConfigSrc)) > 0 {
250+
return dynamicBlock{}, errDynamicBockAlone
251+
}
246252
repSpecb := hclwrite.NewEmptyFile().Body()
247253
if zoneName := hcl.GetAttrExpr(specbSrc.GetAttribute(nZoneName)); zoneName != "" {
248254
repSpecb.SetAttributeRaw(nZoneName, hcl.TokensFromExpr(zoneName))

internal/convert/shared.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package convert
22

33
import (
4+
"errors"
45
"fmt"
56
"slices"
67
"strings"
@@ -9,6 +10,10 @@ import (
910
"github.com/mongodb-labs/atlas-cli-plugin-terraform/internal/hcl"
1011
)
1112

13+
var (
14+
errDynamicBockAlone = errors.New("dynamic block must be the only block, see docs for more information")
15+
)
16+
1217
// hasVariableNumShards checks if any block has a variable (non-literal) num_shards attribute
1318
func hasVariableNumShards(blocks []*hclwrite.Block) bool {
1419
for _, block := range blocks {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
resource "mongodbatlas_advanced_cluster" "multiple_blocks" {
2+
project_id = var.project_id
3+
name = var.cluster_name
4+
cluster_type = var.cluster_type
5+
replication_specs {
6+
num_shards = var.replication_specs.num_shards
7+
dynamic "region_configs" {
8+
for_each = var.replication_specs.region_configs
9+
content {
10+
priority = region_configs.value.priority
11+
provider_name = region_configs.value.provider_name
12+
region_name = region_configs.value.region_name
13+
electable_specs {
14+
instance_size = region_configs.value.instance_size
15+
node_count = region_configs.value.electable_node_count
16+
}
17+
}
18+
}
19+
region_configs { # inline block is not allowed with dynamic blocks
20+
priority = 0
21+
provider_name = "AWS"
22+
region_name = "US_EAST_1"
23+
read_only_specs {
24+
instance_size = var.instance_size
25+
node_count = 1
26+
}
27+
}
28+
}
29+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
resource "mongodbatlas_advanced_cluster" "multiple_blocks" {
2+
project_id = var.project_id
3+
name = var.cluster_name
4+
cluster_type = var.cluster_type
5+
dynamic "replication_specs" {
6+
for_each = var.replication_specs
7+
content {
8+
num_shards = replication_specs.value.num_shards
9+
dynamic "region_configs" {
10+
for_each = replication_specs.value.region_configs
11+
content {
12+
priority = region_configs.value.priority
13+
provider_name = region_configs.value.provider_name
14+
region_name = region_configs.value.region_name
15+
electable_specs {
16+
instance_size = region_configs.value.instance_size
17+
node_count = region_configs.value.electable_node_count
18+
}
19+
}
20+
}
21+
}
22+
}
23+
replication_specs { # inline block is not allowed with dynamic blocks
24+
region_configs {
25+
priority = 7
26+
provider_name = "AWS"
27+
region_name = "EU_WEST_1"
28+
electable_specs {
29+
instance_size = "M10"
30+
node_count = 3
31+
}
32+
}
33+
}
34+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
resource "mongodbatlas_advanced_cluster" "multiple_blocks" {
2+
project_id = var.project_id
3+
name = var.cluster_name
4+
cluster_type = var.cluster_type
5+
dynamic "replication_specs" {
6+
for_each = var.replication_specs
7+
content {
8+
num_shards = replication_specs.value.num_shards
9+
dynamic "region_configs" {
10+
for_each = replication_specs.value.region_configs
11+
content {
12+
priority = region_configs.value.priority
13+
provider_name = region_configs.value.provider_name
14+
region_name = region_configs.value.region_name
15+
electable_specs {
16+
instance_size = region_configs.value.instance_size
17+
node_count = region_configs.value.electable_node_count
18+
}
19+
}
20+
}
21+
region_configs { # inline block is not allowed with dynamic blocks
22+
priority = 0
23+
provider_name = "AWS"
24+
region_name = "US_EAST_1"
25+
read_only_specs {
26+
instance_size = var.instance_size
27+
node_count = 1
28+
}
29+
}
30+
}
31+
}
32+
}

internal/convert/testdata/adv2v2/errors.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,8 @@
22
"configuration_file_error": "failed to parse Terraform config file",
33
"replication_specs_missing_region_configs": "replication_specs must have at least one region_configs",
44
"missing_replication_specs": "must have at least one replication_specs",
5-
"dynamic_unsupported_tag": "dynamic blocks are not supported for advanced_configuration"
5+
"dynamic_unsupported_tag": "dynamic blocks are not supported for advanced_configuration",
6+
"dynamic_regions_config_invalid_multiple_blocks": "dynamic block must be the only block",
7+
"dynamic_replication_specs_invalid_multiple_blocks": "dynamic block must be the only block",
8+
"dynamic_replication_specs_invalid_multiple_config_blocks": "dynamic block must be the only block"
69
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
resource "mongodbatlas_cluster" "multiple_blocks" {
2+
project_id = var.project_id
3+
name = "cluster"
4+
cluster_type = "SHARDED"
5+
provider_name = "AWS"
6+
provider_instance_size_name = "M10"
7+
replication_specs {
8+
num_shards = var.replication_specs.num_shards
9+
dynamic "regions_config" {
10+
for_each = var.replication_specs.regions_config
11+
content {
12+
region_name = regions_config.value.region_name
13+
electable_nodes = regions_config.value.electable_nodes
14+
priority = regions_config.value.prio
15+
read_only_nodes = regions_config.value.read_only_nodes
16+
}
17+
}
18+
regions_config { # inline block is not allowed with dynamic blocks
19+
region_name = "US_EAST_1"
20+
read_only_nodes = 1
21+
}
22+
}
23+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Based on https://github.com/mongodb/terraform-provider-mongodbatlas/blob/master/examples/migrate_cluster_to_advanced_cluster/module_maintainer/v1/main.tf
2+
resource "mongodbatlas_cluster" "this" {
3+
project_id = var.project_id
4+
name = var.cluster_name
5+
auto_scaling_disk_gb_enabled = var.auto_scaling_disk_gb_enabled
6+
cluster_type = var.cluster_type
7+
disk_size_gb = var.disk_size
8+
mongo_db_major_version = var.mongo_db_major_version
9+
provider_instance_size_name = var.instance_size
10+
provider_name = var.provider_name
11+
dynamic "replication_specs" {
12+
for_each = var.replication_specs
13+
content {
14+
num_shards = replication_specs.value.num_shards
15+
zone_name = replication_specs.value.zone_name
16+
dynamic "regions_config" {
17+
for_each = replication_specs.value.regions_config
18+
content {
19+
electable_nodes = regions_config.value.electable_nodes
20+
priority = regions_config.value.priority
21+
read_only_nodes = regions_config.value.read_only_nodes
22+
region_name = regions_config.value.region_name
23+
}
24+
}
25+
}
26+
}
27+
replication_specs { # inline block is not allowed with dynamic blocks
28+
num_shards = 1
29+
regions_config {
30+
region_name = "US_EAST_1"
31+
electable_nodes = 3
32+
priority = 7
33+
}
34+
}
35+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Based on https://github.com/mongodb/terraform-provider-mongodbatlas/blob/master/examples/migrate_cluster_to_advanced_cluster/module_maintainer/v1/main.tf
2+
resource "mongodbatlas_cluster" "this" {
3+
project_id = var.project_id
4+
name = var.cluster_name
5+
auto_scaling_disk_gb_enabled = var.auto_scaling_disk_gb_enabled
6+
cluster_type = var.cluster_type
7+
disk_size_gb = var.disk_size
8+
mongo_db_major_version = var.mongo_db_major_version
9+
provider_instance_size_name = var.instance_size
10+
provider_name = var.provider_name
11+
dynamic "replication_specs" {
12+
for_each = var.replication_specs
13+
content {
14+
num_shards = replication_specs.value.num_shards
15+
zone_name = replication_specs.value.zone_name
16+
dynamic "regions_config" {
17+
for_each = replication_specs.value.regions_config
18+
content {
19+
electable_nodes = regions_config.value.electable_nodes
20+
priority = regions_config.value.priority
21+
read_only_nodes = regions_config.value.read_only_nodes
22+
region_name = regions_config.value.region_name
23+
}
24+
}
25+
regions_config { # inline block is not allowed with dynamic blocks
26+
region_name = "US_EAST_1"
27+
read_only_nodes = 1
28+
}
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)