Skip to content

Commit d9d52c6

Browse files
Add auto-numbering for ACL rules without explicit rule_number
- Implement assignRuleNumbers() function for sequential auto-numbering - Rules without rule_number get assigned sequential numbers starting from 1 - If a rule has explicit rule_number, numbering continues from that value - Integrated into Create, Update, and ports migration flows - Preserves config file order (TypeList maintains order naturally)
1 parent 16915b6 commit d9d52c6

File tree

1 file changed

+47
-4
lines changed

1 file changed

+47
-4
lines changed

cloudstack/resource_cloudstack_network_acl_rule.go

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func resourceCloudStackNetworkACLRule() *schema.Resource {
5151
oldRulesList := oldRules.([]interface{})
5252
newRulesList := newRules.([]interface{})
5353

54-
log.Printf("[DEBUG] CustomizeDiff: checking %d old rules -> %d new rules for migration", len(oldRulesList), len(newRulesList))
54+
log.Printf("[DEBUG] CustomizeDiff: checking %d old rules -> %d new rules", len(oldRulesList), len(newRulesList))
5555

5656
// Check if ANY old rule uses deprecated 'ports' field
5757
hasDeprecatedPorts := false
@@ -202,6 +202,38 @@ func resourceCloudStackNetworkACLRule() *schema.Resource {
202202
}
203203
}
204204

205+
// assignRuleNumbers assigns rule numbers to rules that don't have them
206+
// Rules are numbered sequentially starting from 1
207+
// If a rule has an explicit rule_number, numbering continues from that value
208+
func assignRuleNumbers(rules []interface{}) []interface{} {
209+
result := make([]interface{}, len(rules))
210+
nextNumber := 1
211+
212+
for i, rule := range rules {
213+
ruleMap := make(map[string]interface{})
214+
// Copy the rule
215+
for k, v := range rule.(map[string]interface{}) {
216+
ruleMap[k] = v
217+
}
218+
219+
// Check if rule_number is set
220+
if ruleNum, ok := ruleMap["rule_number"].(int); ok && ruleNum > 0 {
221+
// Rule has explicit number, use it and continue from there
222+
nextNumber = ruleNum + 1
223+
log.Printf("[DEBUG] Rule at index %d has explicit rule_number=%d", i, ruleNum)
224+
} else {
225+
// Auto-assign sequential number
226+
ruleMap["rule_number"] = nextNumber
227+
log.Printf("[DEBUG] Auto-assigned rule_number=%d to rule at index %d", nextNumber, i)
228+
nextNumber++
229+
}
230+
231+
result[i] = ruleMap
232+
}
233+
234+
return result
235+
}
236+
205237
func resourceCloudStackNetworkACLRuleCreate(d *schema.ResourceData, meta interface{}) error {
206238
log.Printf("[DEBUG] Entering resourceCloudStackNetworkACLRuleCreate with acl_id=%s", d.Get("acl_id").(string))
207239

@@ -217,7 +249,11 @@ func resourceCloudStackNetworkACLRuleCreate(d *schema.ResourceData, meta interfa
217249
rules := make([]interface{}, 0)
218250

219251
log.Printf("[DEBUG] Processing %d rules", len(nrs))
220-
err := createNetworkACLRules(d, meta, &rules, nrs)
252+
253+
// Assign rule numbers to rules that don't have them
254+
rulesWithNumbers := assignRuleNumbers(nrs)
255+
256+
err := createNetworkACLRules(d, meta, &rules, rulesWithNumbers)
221257
if err != nil {
222258
log.Printf("[ERROR] Failed to create network ACL rules: %v", err)
223259
return err
@@ -740,7 +776,11 @@ func resourceCloudStackNetworkACLRuleUpdate(d *schema.ResourceData, meta interfa
740776
}
741777

742778
log.Printf("[DEBUG] Rule list changed, performing efficient updates")
743-
err := updateNetworkACLRules(d, meta, oldRules, newRules)
779+
780+
// Assign rule numbers to new rules that don't have them
781+
newRulesWithNumbers := assignRuleNumbers(newRules)
782+
783+
err := updateNetworkACLRules(d, meta, oldRules, newRulesWithNumbers)
744784
if err != nil {
745785
return err
746786
}
@@ -1416,8 +1456,11 @@ func performPortsMigration(d *schema.ResourceData, meta interface{}, oldRules, n
14161456
rulesToCreate = append(rulesToCreate, cleanRule)
14171457
}
14181458

1459+
// Assign rule numbers to new rules that don't have them
1460+
rulesToCreateWithNumbers := assignRuleNumbers(rulesToCreate)
1461+
14191462
var createdRules []interface{}
1420-
err := createNetworkACLRules(d, meta, &createdRules, rulesToCreate)
1463+
err := createNetworkACLRules(d, meta, &createdRules, rulesToCreateWithNumbers)
14211464
if err != nil {
14221465
return fmt.Errorf("failed to create new rules during migration: %v", err)
14231466
}

0 commit comments

Comments
 (0)