@@ -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+
205237func 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