Skip to content

Commit 637d6ec

Browse files
committed
convert placement_configs to typeSet
1 parent e796037 commit 637d6ec

File tree

6 files changed

+44
-20
lines changed

6 files changed

+44
-20
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
### Fixed
1010
- Add missing attributes for `oci_file_storage_mount_target` import [Github issue #1037](https://github.com/terraform-providers/terraform-provider-oci/issues/1037)
1111
- Fixed the diff for `whitelisted_ips` arguments order in `oci_database_autonomous_database` resource [Issue #1050](https://github.com/terraform-providers/terraform-provider-oci/issues/1050)
12+
- Fixed the `placement_configs` order mismatch in `oci_containerengine_node_pool` [GitHub issue #1045](https://github.com/terraform-providers/terraform-provider-oci/issues/1045)
1213

1314
## 3.74.0 (May 06, 2020)
1415

examples/container_engine/regional_subnet/cluster.tf

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,13 @@ resource "oci_containerengine_node_pool" "test_node_pool" {
5151

5252
node_config_details {
5353
placement_configs {
54-
availability_domain = "${data.oci_identity_availability_domain.ad1.name}"
55-
subnet_id = "${oci_core_subnet.node_pool_regional_subnet_1.id}"
54+
availability_domain = "${data.oci_identity_availability_domain.ad2.name}"
55+
subnet_id = "${oci_core_subnet.node_pool_regional_subnet_2.id}"
5656
}
5757

5858
placement_configs {
59-
availability_domain = "${data.oci_identity_availability_domain.ad2.name}"
60-
subnet_id = "${oci_core_subnet.node_pool_regional_subnet_2.id}"
59+
availability_domain = "${data.oci_identity_availability_domain.ad1.name}"
60+
subnet_id = "${oci_core_subnet.node_pool_regional_subnet_1.id}"
6161
}
6262

6363
size = 4

oci/containerengine_node_pool_data_source.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func (s *ContainerengineNodePoolDataSourceCrud) SetData() error {
8989
}
9090

9191
if s.Res.NodeConfigDetails != nil {
92-
s.D.Set("node_config_details", []interface{}{NodePoolNodeConfigDetailsToMap(s.Res.NodeConfigDetails)})
92+
s.D.Set("node_config_details", []interface{}{NodePoolNodeConfigDetailsToMap(s.Res.NodeConfigDetails, true)})
9393
} else {
9494
s.D.Set("node_config_details", nil)
9595
}

oci/containerengine_node_pool_resource.go

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,20 @@
33
package oci
44

55
import (
6+
"bytes"
67
"context"
78
"fmt"
89
"log"
910
"strings"
1011
"time"
1112

12-
"github.com/terraform-providers/terraform-provider-oci/httpreplay"
13-
13+
"github.com/hashicorp/terraform/helper/hashcode"
1414
"github.com/hashicorp/terraform/helper/resource"
1515
"github.com/hashicorp/terraform/helper/schema"
1616
"github.com/hashicorp/terraform/helper/validation"
1717

18+
"github.com/terraform-providers/terraform-provider-oci/httpreplay"
19+
1820
oci_common "github.com/oracle/oci-go-sdk/common"
1921
oci_containerengine "github.com/oracle/oci-go-sdk/containerengine"
2022
)
@@ -99,8 +101,9 @@ func ContainerengineNodePoolResource() *schema.Resource {
99101
Schema: map[string]*schema.Schema{
100102
// Required
101103
"placement_configs": {
102-
Type: schema.TypeList,
104+
Type: schema.TypeSet,
103105
Required: true,
106+
Set: placementConfigsHashCodeForSets,
104107
Elem: &schema.Resource{
105108
Schema: map[string]*schema.Schema{
106109
// Required
@@ -742,7 +745,7 @@ func (s *ContainerengineNodePoolResourceCrud) SetData() error {
742745
}
743746

744747
if s.Res.NodeConfigDetails != nil {
745-
s.D.Set("node_config_details", []interface{}{NodePoolNodeConfigDetailsToMap(s.Res.NodeConfigDetails)})
748+
s.D.Set("node_config_details", []interface{}{NodePoolNodeConfigDetailsToMap(s.Res.NodeConfigDetails, false)})
746749
} else {
747750
s.D.Set("node_config_details", nil)
748751
}
@@ -802,10 +805,11 @@ func (s *ContainerengineNodePoolResourceCrud) mapToCreateNodePoolNodeConfigDetai
802805
result := oci_containerengine.CreateNodePoolNodeConfigDetails{}
803806

804807
if placementConfigs, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "placement_configs")); ok {
805-
interfaces := placementConfigs.([]interface{})
808+
set := placementConfigs.(*schema.Set)
809+
interfaces := set.List()
806810
tmp := make([]oci_containerengine.NodePoolPlacementConfigDetails, len(interfaces))
807811
for i := range interfaces {
808-
stateDataIndex := i
812+
stateDataIndex := placementConfigsHashCodeForSets(interfaces[i])
809813
fieldKeyFormatNextLevel := fmt.Sprintf("%s.%d.%%s", fmt.Sprintf(fieldKeyFormat, "placement_configs"), stateDataIndex)
810814
converted, err := s.mapToNodePoolPlacementConfigDetails(fieldKeyFormatNextLevel)
811815
if err != nil {
@@ -826,14 +830,18 @@ func (s *ContainerengineNodePoolResourceCrud) mapToCreateNodePoolNodeConfigDetai
826830
return result, nil
827831
}
828832

829-
func NodePoolNodeConfigDetailsToMap(obj *oci_containerengine.NodePoolNodeConfigDetails) map[string]interface{} {
833+
func NodePoolNodeConfigDetailsToMap(obj *oci_containerengine.NodePoolNodeConfigDetails, datasource bool) map[string]interface{} {
830834
result := map[string]interface{}{}
831835

832836
placementConfigs := []interface{}{}
833837
for _, item := range obj.PlacementConfigs {
834838
placementConfigs = append(placementConfigs, NodePoolPlacementConfigDetailsToMap(item))
835839
}
836-
result["placement_configs"] = placementConfigs
840+
if datasource {
841+
result["placement_configs"] = placementConfigs
842+
} else {
843+
result["placement_configs"] = schema.NewSet(placementConfigsHashCodeForSets, placementConfigs)
844+
}
837845

838846
if obj.Size != nil {
839847
result["size"] = int(*obj.Size)
@@ -1034,23 +1042,38 @@ func NodeSourceOptionToMap(obj *oci_containerengine.NodeSourceOption) map[string
10341042
return result
10351043
}
10361044

1045+
func placementConfigsHashCodeForSets(v interface{}) int {
1046+
var buf bytes.Buffer
1047+
m := v.(map[string]interface{})
1048+
if availabilityDomain, ok := m["availability_domain"]; ok && availabilityDomain != "" {
1049+
buf.WriteString(fmt.Sprintf("%v-", availabilityDomain))
1050+
}
1051+
if subnetId, ok := m["subnet_id"]; ok && subnetId != "" {
1052+
buf.WriteString(fmt.Sprintf("%v-", subnetId))
1053+
}
1054+
return hashcode.String(buf.String())
1055+
}
1056+
10371057
func (s *ContainerengineNodePoolResourceCrud) mapToUpdateNodePoolNodeConfigDetails(fieldKeyFormat string) (oci_containerengine.UpdateNodePoolNodeConfigDetails, error) {
10381058
result := oci_containerengine.UpdateNodePoolNodeConfigDetails{}
10391059

10401060
result.PlacementConfigs = []oci_containerengine.NodePoolPlacementConfigDetails{}
10411061
if placementConfigs, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "placement_configs")); ok {
1042-
interfaces := placementConfigs.([]interface{})
1062+
set := placementConfigs.(*schema.Set)
1063+
interfaces := set.List()
10431064
tmp := make([]oci_containerengine.NodePoolPlacementConfigDetails, len(interfaces))
10441065
for i := range interfaces {
1045-
stateDataIndex := i
1066+
stateDataIndex := placementConfigsHashCodeForSets(interfaces[i])
10461067
fieldKeyFormatNextLevel := fmt.Sprintf("%s.%d.%%s", fmt.Sprintf(fieldKeyFormat, "placement_configs"), stateDataIndex)
10471068
converted, err := s.mapToNodePoolPlacementConfigDetails(fieldKeyFormatNextLevel)
10481069
if err != nil {
10491070
return result, err
10501071
}
10511072
tmp[i] = converted
10521073
}
1053-
result.PlacementConfigs = tmp
1074+
if len(tmp) != 0 || s.D.HasChange(fmt.Sprintf(fieldKeyFormat, "placement_configs")) {
1075+
result.PlacementConfigs = tmp
1076+
}
10541077
}
10551078

10561079
if size, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "size")); ok {

oci/containerengine_node_pool_resource_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ func TestResourceContainerengineNodePool_regionalsubnet(t *testing.T) {
164164
resource.TestCheckResourceAttr(resourceName, "name", "name"),
165165
resource.TestCheckResourceAttr(resourceName, "node_config_details.#", "1"),
166166
resource.TestCheckResourceAttr(resourceName, "node_config_details.0.placement_configs.#", "1"),
167-
resource.TestCheckResourceAttrSet(resourceName, "node_config_details.0.placement_configs.0.availability_domain"),
168-
resource.TestCheckResourceAttrSet(resourceName, "node_config_details.0.placement_configs.0.subnet_id"),
167+
CheckResourceSetContainsElementWithProperties(resourceName, "node_config_details.0.placement_configs", nil, []string{"availability_domain"}),
168+
CheckResourceSetContainsElementWithProperties(resourceName, "node_config_details.0.placement_configs", nil, []string{"subnet_id"}),
169169
resource.TestCheckResourceAttr(resourceName, "node_config_details.0.size", "2"),
170170
resource.TestCheckResourceAttr(resourceName, "node_image_name", "Oracle-Linux-7.4"),
171171
resource.TestCheckResourceAttr(resourceName, "node_metadata.%", "1"),
@@ -196,7 +196,7 @@ func TestResourceContainerengineNodePool_regionalsubnet(t *testing.T) {
196196
resource.TestCheckResourceAttr(resourceName, "name", "name2"),
197197
resource.TestCheckResourceAttr(resourceName, "node_config_details.#", "1"),
198198
resource.TestCheckResourceAttr(resourceName, "node_config_details.0.placement_configs.#", "1"),
199-
resource.TestCheckResourceAttrSet(resourceName, "node_config_details.0.placement_configs.0.subnet_id"),
199+
CheckResourceSetContainsElementWithProperties(resourceName, "node_config_details.0.placement_configs", nil, []string{"subnet_id"}),
200200
resource.TestCheckResourceAttr(resourceName, "node_config_details.0.size", "4"),
201201
resource.TestCheckResourceAttr(resourceName, "node_image_name", "Oracle-Linux-7.4"),
202202
resource.TestCheckResourceAttr(resourceName, "node_metadata.%", "1"),

oci/containerengine_node_pools_data_source.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ func (s *ContainerengineNodePoolsDataSourceCrud) SetData() error {
134134
}
135135

136136
if r.NodeConfigDetails != nil {
137-
nodePool["node_config_details"] = []interface{}{NodePoolNodeConfigDetailsToMap(r.NodeConfigDetails)}
137+
nodePool["node_config_details"] = []interface{}{NodePoolNodeConfigDetailsToMap(r.NodeConfigDetails, true)}
138138
} else {
139139
nodePool["node_config_details"] = nil
140140
}

0 commit comments

Comments
 (0)