Skip to content

Commit bd36f66

Browse files
Monitobremyleone
andauthored
fix(rdb-acl): set information on schema (#1270)
Co-authored-by: Rémy Léone <[email protected]>
1 parent 9c253f1 commit bd36f66

File tree

1 file changed

+59
-2
lines changed

1 file changed

+59
-2
lines changed

scaleway/resource_rdb_acl.go

+59-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ package scaleway
33
import (
44
"bytes"
55
"context"
6+
"fmt"
67
"net"
78
"sort"
89

10+
"github.com/hashicorp/terraform-plugin-log/tflog"
911
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1012
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1113
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
@@ -120,7 +122,17 @@ func resourceScalewayRdbACLRead(ctx context.Context, d *schema.ResourceData, met
120122
id := newRegionalID(region, instanceID).String()
121123
d.SetId(id)
122124
_ = d.Set("instance_id", id)
123-
_ = d.Set("acl_rules", rdbACLRulesFlatten(res.Rules))
125+
if aclRulesRaw, ok := d.GetOk("acl_rules"); ok {
126+
aclRules, mergeErrors := rdbACLRulesFlattenFromSchema(res.Rules, aclRulesRaw.([]interface{}))
127+
if len(mergeErrors) > 0 {
128+
for _, w := range mergeErrors {
129+
tflog.Warn(ctx, fmt.Sprintf("%s", w))
130+
}
131+
}
132+
_ = d.Set("acl_rules", aclRules)
133+
} else {
134+
_ = d.Set("acl_rules", rdbACLRulesFlatten(res.Rules))
135+
}
124136

125137
return nil
126138
}
@@ -218,6 +230,52 @@ func rdbACLExpand(data []interface{}) ([]*rdb.ACLRuleRequest, error) {
218230
return res, nil
219231
}
220232

233+
func rdbACLRulesFlattenFromSchema(rules []*rdb.ACLRule, dataFromSchema []interface{}) ([]map[string]interface{}, []error) {
234+
var res []map[string]interface{}
235+
var errors []error
236+
ruleMap := make(map[string]*rdb.ACLRule)
237+
for _, rule := range rules {
238+
ruleMap[rule.IP.String()] = rule
239+
}
240+
241+
ruleMapFromSchema := map[string]struct{}{}
242+
for _, ruleFromSchema := range dataFromSchema {
243+
currentRule := ruleFromSchema.(map[string]interface{})
244+
ip, err := expandIPNet(currentRule["ip"].(string))
245+
if err != nil {
246+
errors = append(errors, err)
247+
}
248+
249+
aclRule := ruleMap[ip.String()]
250+
ruleMapFromSchema[ip.String()] = struct{}{}
251+
r := map[string]interface{}{
252+
"ip": aclRule.IP.String(),
253+
"description": aclRule.Description,
254+
}
255+
res = append(res, r)
256+
}
257+
258+
return append(res, mergeDiffToSchema(ruleMapFromSchema, ruleMap)...), errors
259+
}
260+
261+
func mergeDiffToSchema(rulesFromSchema map[string]struct{}, ruleMap map[string]*rdb.ACLRule) []map[string]interface{} {
262+
var res []map[string]interface{}
263+
264+
for ruleIP, info := range ruleMap {
265+
_, ok := rulesFromSchema[ruleIP]
266+
// check if new rule has been added on config
267+
if !ok {
268+
r := map[string]interface{}{
269+
"ip": info.IP.String(),
270+
"description": info.Description,
271+
}
272+
res = append(res, r)
273+
}
274+
}
275+
276+
return res
277+
}
278+
221279
func rdbACLRulesFlatten(rules []*rdb.ACLRule) []map[string]interface{} {
222280
var res []map[string]interface{}
223281
for _, rule := range rules {
@@ -233,6 +291,5 @@ func rdbACLRulesFlatten(rules []*rdb.ACLRule) []map[string]interface{} {
233291
ipJ, _, _ := net.ParseCIDR(res[j]["ip"].(string))
234292
return bytes.Compare(ipI, ipJ) < 0
235293
})
236-
237294
return res
238295
}

0 commit comments

Comments
 (0)