399
399
from ansible_collections .community .proxmox .plugins .module_utils .proxmox import (
400
400
proxmox_auth_argument_spec ,
401
401
ansible_to_proxmox_bool ,
402
+ compare_list_of_dicts ,
402
403
ProxmoxAnsible
403
404
)
404
405
@@ -491,10 +492,11 @@ def run(self):
491
492
group = self .params .get ("group" )
492
493
group_conf = self .params .get ("group_conf" )
493
494
494
- for rule in rules :
495
- rule ['icmp-type' ] = rule .get ('icmp_type' )
496
- rule ['enable' ] = ansible_to_proxmox_bool (rule .get ('enable' ))
497
- del rule ['icmp_type' ]
495
+ if rules is not None :
496
+ for rule in rules :
497
+ rule ['icmp-type' ] = rule .get ('icmp_type' )
498
+ rule ['enable' ] = ansible_to_proxmox_bool (rule .get ('enable' ))
499
+ del rule ['icmp_type' ]
498
500
499
501
if level == "vm" :
500
502
vm = self .get_vm (vmid = self .params .get ('vmid' ))
@@ -616,54 +618,25 @@ def delete_fw_rule(self, rules_obj, pos):
616
618
msg = f'Failed to delete firewall rule at pos { pos } : { e } '
617
619
)
618
620
619
- def check_rules (self , existing_rules , new_rules ):
620
- rules_to_update = []
621
- new_rules = [{k : v for k , v in item .items () if v is not None } for item in new_rules ]
622
-
623
- if existing_rules is None :
624
- rules_to_create = new_rules
625
- rules_to_update = list ()
626
- return rules_to_create , rules_to_update
627
-
628
- existing_rules = {x ['pos' ]: x for x in existing_rules }
629
- new_rules = {x ['pos' ]: x for x in new_rules }
630
-
631
- common_pos = set (existing_rules .keys ()).intersection (set (new_rules .keys ()))
632
- pos_to_create = set (new_rules .keys ()) - set (existing_rules .keys ())
633
- rules_to_create = [new_rules [pos ] for pos in pos_to_create ]
634
-
635
- params_to_ignore = ['digest' , 'ipversion' ]
636
-
637
- for pos in common_pos :
638
- # If new rule has a parameter that is not present in existing rule we need to update
639
- if set (new_rules [pos ].keys ()) - set (existing_rules [pos ].keys ()) != set ():
640
- rules_to_update .append (new_rules [pos ])
641
- continue
642
-
643
- # If existing rule param value doesn't match new rule param OR
644
- # If existing rule has a param that is not present in new rule except for params in params_to_ignore
645
- for existing_rule_param , existing_parm_value in existing_rules [pos ].items ():
646
- if (existing_rule_param not in params_to_ignore and
647
- new_rules [pos ].get (existing_rule_param ) != existing_parm_value ):
648
- rules_to_update .append (new_rules [pos ])
649
-
650
- return rules_to_create , rules_to_update
651
-
652
621
def update_fw_rules (self , rules_obj , rules , force ):
653
622
existing_rules = self .get_fw_rules (rules_obj )
654
- rules_to_create , rules_to_update = self .check_rules (existing_rules = existing_rules , new_rules = rules )
623
+ rules_to_create , rules_to_update = compare_list_of_dicts (
624
+ existing_list = existing_rules ,
625
+ new_list = rules ,
626
+ uid = 'pos' ,
627
+ params_to_ignore = ['digest' , 'ipversion' ]
628
+ )
655
629
656
- if len (rules_to_update ) == 0 :
657
- if len (rules_to_create ) == 0 :
658
- self .module .exit_json (
659
- changed = False ,
660
- msg = 'No need to update any FW rules.'
630
+ if len (rules_to_update ) == 0 and len (rules_to_create ) == 0 :
631
+ self .module .exit_json (
632
+ changed = False ,
633
+ msg = 'No need to update any FW rules.'
661
634
662
- )
663
- elif len (rules_to_create ) > 0 and not force :
664
- self .module .fail_json (
665
- msg = f"Need to create new rules for pos - { [x ['pos' ] for x in rules_to_create ]} But force is false"
666
- )
635
+ )
636
+ elif len (rules_to_create ) > 0 and not force :
637
+ self .module .fail_json (
638
+ msg = f"Need to create new rules for pos - { [x ['pos' ] for x in rules_to_create ]} But force is false"
639
+ )
667
640
668
641
for rule in rules_to_update :
669
642
try :
@@ -684,7 +657,12 @@ def update_fw_rules(self, rules_obj, rules, force):
684
657
685
658
def create_fw_rules (self , rules_obj , rules , force ):
686
659
existing_rules = self .get_fw_rules (rules_obj = rules_obj )
687
- rules_to_create , rules_to_update = self .check_rules (existing_rules = existing_rules , new_rules = rules )
660
+ rules_to_create , rules_to_update = compare_list_of_dicts (
661
+ existing_list = existing_rules ,
662
+ new_list = rules ,
663
+ uid = 'pos' ,
664
+ params_to_ignore = ['digest' , 'ipversion' ]
665
+ )
688
666
689
667
if len (rules_to_create ) == 0 and len (rules_to_update ) == 0 :
690
668
self .module .exit_json (
0 commit comments