Skip to content

Commit bfd5e5c

Browse files
committed
proxmox_firewall: Merge state present and update
1 parent 0741d0c commit bfd5e5c

File tree

1 file changed

+38
-114
lines changed

1 file changed

+38
-114
lines changed

plugins/modules/proxmox_firewall.py

Lines changed: 38 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,13 @@
3030
type: str
3131
choices:
3232
- present
33-
- update
3433
- absent
35-
force:
34+
default: present
35+
update:
3636
description:
37-
- If state is present and if 1 or more rule already exists at given pos force will update them
38-
- If state is update and if 1 or more rule doesn't exist force will create
37+
- If O(state=present) and if 1 or more rule/alias already exists it will update them
3938
type: bool
40-
default: false
39+
default: truw
4140
level:
4241
description:
4342
- Level at which the firewall rule applies.
@@ -239,7 +238,8 @@
239238
api_host: "{{ pc.proxmox.api_host }}"
240239
validate_certs: no
241240
level: cluster
242-
state: update
241+
state: present
242+
update: True
243243
rules:
244244
- type: out
245245
action: ACCEPT
@@ -307,7 +307,8 @@
307307
api_token_secret: "{{ vault.proxmox.api_token_secret }}"
308308
api_host: "{{ pc.proxmox.api_host }}"
309309
validate_certs: no
310-
state: update
310+
state: present
311+
update: True
311312
aliases:
312313
- name: test1
313314
cidr: '10.10.1.0/28'
@@ -347,8 +348,8 @@
347348

348349
def get_proxmox_args():
349350
return dict(
350-
state=dict(type="str", choices=["present", "absent", "update"], required=False),
351-
force=dict(type="bool", default=False),
351+
state=dict(type="str", choices=["present", "absent"], default="present"),
352+
update=dict(type="bool", default=True),
352353
level=dict(type="str", choices=["cluster", "node", "vm", "vnet", "group"], default="cluster", required=False),
353354
node=dict(type="str", required=False),
354355
vmid=dict(type="int", required=False),
@@ -419,7 +420,7 @@ def __init__(self, module):
419420
self.params = module.params
420421

421422
def validate_params(self):
422-
if self.params.get('state') in ['present', 'update']:
423+
if self.params.get('state') == 'present':
423424
if self.params.get('group_conf') != bool(self.params.get('rules') or self.params.get('aliases')):
424425
return True
425426
else:
@@ -433,14 +434,12 @@ def validate_params(self):
433434
self.module.fail_json(
434435
msg="When State is absent either group_conf should be true or pos/aliases must be present but not both"
435436
)
436-
else:
437-
return True
438437

439438
def run(self):
440439
self.validate_params()
441440

442441
state = self.params.get("state")
443-
force = self.params.get("force")
442+
update = self.params.get("update")
444443
level = self.params.get("level")
445444
aliases = self.params.get("aliases")
446445
rules = self.params.get("rules")
@@ -478,48 +477,38 @@ def run(self):
478477

479478
if state == "present":
480479
if group_conf:
481-
self.create_group(group=group, comment=self.params.get('comment'))
482-
if rules is not None:
483-
self.create_fw_rules(rules_obj=rules_obj, rules=rules, force=force)
484-
if aliases is not None:
485-
self.create_aliases(firewall_obj=firewall_obj, level=level, aliases=aliases, force=force)
486-
elif state == "update":
487-
if group_conf:
488-
self.create_group(group=group, comment=self.params.get('comment'))
480+
self.group_present(group=group, comment=self.params.get('comment'))
489481
if rules is not None:
490-
self.update_fw_rules(rules_obj=rules_obj, rules=rules, force=force)
482+
self.fw_rules_present(rules_obj=rules_obj, rules=rules, update=update)
491483
if aliases is not None:
492-
self.update_aliases(firewall_obj=firewall_obj, level=level, aliases=aliases, force=force)
484+
self.aliases_present(firewall_obj=firewall_obj, level=level, aliases=aliases, update=update)
493485
elif state == "absent":
494486
if self.params.get('pos'):
495-
self.delete_fw_rule(rules_obj=rules_obj, pos=self.params.get('pos'))
487+
self.fw_rule_absent(rules_obj=rules_obj, pos=self.params.get('pos'))
496488
if group_conf:
497-
self.delete_group(group_name=group)
489+
self.group_absent(group_name=group)
498490
if aliases is not None:
499-
self.delete_aliases(firewall_obj=firewall_obj, level=level, aliases=aliases)
491+
self.aliases_absent(firewall_obj=firewall_obj, aliases=aliases)
500492

501493

502-
def create_aliases(self, firewall_obj, level, aliases, force=False):
494+
def aliases_present(self, firewall_obj, level, aliases, update):
503495
if firewall_obj is None or level not in ['cluster', 'vm']:
504496
self.module.fail_json(
505497
msg='Aliases can only be created at cluster or VM level'
506498
)
507499

508500
aliases_to_create, aliases_to_update = compare_list_of_dicts(
509-
existing_list=self.get_aliases(firewall_obj=firewall_obj, level=level),
501+
existing_list=self.get_aliases(firewall_obj=firewall_obj),
510502
new_list=aliases,
511503
uid='name',
512504
params_to_ignore=['digest', 'ipversion']
513505
)
514506

515507
if len(aliases_to_create) == 0 and len(aliases_to_update) == 0:
516-
self.module.exit_json(
517-
changed=False,
518-
msg='No need to create/update any aliases'
519-
)
520-
elif len(aliases_to_update) > 0 and not force:
508+
self.module.exit_json(changed=False, msg='No need to create/update any aliases')
509+
elif len(aliases_to_update) > 0 and not update:
521510
self.module.fail_json(
522-
msg=f"Need to update aliases - {[x['name'] for x in aliases_to_update]} but force is false"
511+
msg=f"Need to update aliases - {[x['name'] for x in aliases_to_update]} but update is false"
523512
)
524513

525514
for alias in aliases_to_create:
@@ -529,51 +518,18 @@ def create_aliases(self, firewall_obj, level, aliases, force=False):
529518
self.module.fail_json(
530519
msg=f"Failed to create Alias {alias['name']} - {e}"
531520
)
532-
if len(aliases_to_update) > 0 and force:
533-
self.update_aliases(firewall_obj=firewall_obj, level=level, aliases=aliases_to_update, force=False)
534-
else:
535-
self.module.exit_json(
536-
changed=True,
537-
msg="Aliases created"
538-
)
539-
540-
def update_aliases(self, firewall_obj, level, aliases, force=False):
541-
aliases_to_create, aliases_to_update = compare_list_of_dicts(
542-
existing_list=self.get_aliases(firewall_obj=firewall_obj, level=level),
543-
new_list=aliases,
544-
uid='name',
545-
params_to_ignore=['digest', 'ipversion']
546-
)
547-
548-
if len(aliases_to_update) == 0 and len(aliases_to_create) == 0:
549-
self.module.exit_json(
550-
changed=False,
551-
msg='No need to create/update any alias.'
552-
553-
)
554-
elif len(aliases_to_create) > 0 and not force:
555-
self.module.fail_json(
556-
msg=f"Need to create new alias - {[x['name'] for x in aliases_to_create]} But force is false"
557-
)
558-
559521
for alias in aliases_to_update:
560522
try:
561-
alias_obj = getattr(firewall_obj().aliases(), alias['name'])
562-
alias_obj().put(**alias)
523+
firewall_obj().aliases(alias['name']).put(**alias)
563524
except Exception as e:
564525
self.module.fail_json(
565526
msg=f"Failed to update Alias {alias['name']} - {e}"
566527
)
567-
if len(aliases_to_update) > 0 and force:
568-
self.update_aliases(firewall_obj=firewall_obj, level=level, aliases=aliases_to_update, force=False)
569-
else:
570-
self.module.exit_json(
571-
changed=True,
572-
msg="Aliases updated"
573-
)
574528

575-
def delete_aliases(self, firewall_obj, level, aliases):
576-
existing_aliases = set([x.get('name') for x in self.get_aliases(firewall_obj=firewall_obj, level=level)])
529+
self.module.exit_json(changed=True, msg="Aliases created/updated")
530+
531+
def aliases_absent(self, firewall_obj, aliases):
532+
existing_aliases = set([x.get('name') for x in self.get_aliases(firewall_obj=firewall_obj)])
577533
aliases = set([x.get('name') for x in aliases])
578534
aliases_to_delete = list(existing_aliases.intersection(aliases))
579535

@@ -595,7 +551,7 @@ def delete_aliases(self, firewall_obj, level, aliases):
595551
msg="Successfully deleted aliases"
596552
)
597553

598-
def create_group(self, group, comment=None):
554+
def group_present(self, group, comment=None):
599555
if group in self.get_groups():
600556
self.module.exit_json(
601557
changed=False, group=group, msg=f"security group {group} already exists"
@@ -610,7 +566,7 @@ def create_group(self, group, comment=None):
610566
msg=f'Failed to create security group: {e}'
611567
)
612568

613-
def delete_group(self, group_name):
569+
def group_absent(self, group_name):
614570
if group_name not in self.get_groups():
615571
self.module.exit_json(
616572
changed=False, group=group_name, msg=f"security group {group_name} already doesn't exists"
@@ -626,7 +582,7 @@ def delete_group(self, group_name):
626582
msg=f'Failed to delete security group {group_name}: {e}'
627583
)
628584

629-
def delete_fw_rule(self, rules_obj, pos):
585+
def fw_rule_absent(self, rules_obj, pos):
630586
try:
631587
for item in self.get_fw_rules(rules_obj):
632588
if item.get('pos') == pos:
@@ -647,24 +603,20 @@ def delete_fw_rule(self, rules_obj, pos):
647603
msg=f'Failed to delete firewall rule at pos {pos}: {e}'
648604
)
649605

650-
def update_fw_rules(self, rules_obj, rules, force):
651-
existing_rules = self.get_fw_rules(rules_obj)
606+
def fw_rules_present(self, rules_obj, rules, update):
607+
existing_rules = self.get_fw_rules(rules_obj=rules_obj)
652608
rules_to_create, rules_to_update = compare_list_of_dicts(
653609
existing_list=existing_rules,
654610
new_list=rules,
655611
uid='pos',
656612
params_to_ignore=['digest', 'ipversion']
657613
)
658614

659-
if len(rules_to_update) == 0 and len(rules_to_create) == 0:
660-
self.module.exit_json(
661-
changed=False,
662-
msg='No need to update any FW rules.'
663-
664-
)
665-
elif len(rules_to_create) > 0 and not force:
615+
if len(rules_to_create) == 0 and len(rules_to_update) == 0:
616+
self.module.exit_json(changed=False, msg='No need to create/update any rule')
617+
elif len(rules_to_update) > 0 and not update:
666618
self.module.fail_json(
667-
msg=f"Need to create new rules for pos - {[x['pos'] for x in rules_to_create]} But force is false"
619+
msg=f"Need to update rules at pos - {[x['pos'] for x in rules_to_update]} but update is false"
668620
)
669621

670622
for rule in rules_to_update:
@@ -677,32 +629,6 @@ def update_fw_rules(self, rules_obj, rules, force):
677629
self.module.fail_json(
678630
msg=f'Failed to update firewall rule at pos {rule["pos"]}: {e}'
679631
)
680-
681-
if len(rules_to_create) > 0:
682-
self.create_fw_rules(rules_obj=rules_obj, rules=rules_to_create, force=False)
683-
self.module.exit_json(
684-
changed=True, msg='successfully updated firewall rules'
685-
)
686-
687-
def create_fw_rules(self, rules_obj, rules, force):
688-
existing_rules = self.get_fw_rules(rules_obj=rules_obj)
689-
rules_to_create, rules_to_update = compare_list_of_dicts(
690-
existing_list=existing_rules,
691-
new_list=rules,
692-
uid='pos',
693-
params_to_ignore=['digest', 'ipversion']
694-
)
695-
696-
if len(rules_to_create) == 0 and len(rules_to_update) == 0:
697-
self.module.exit_json(
698-
changed=False,
699-
msg='No need to create/update any rule'
700-
)
701-
elif len(rules_to_update) > 0 and not force:
702-
self.module.fail_json(
703-
msg=f"Need to update rules at pos - {[x['pos'] for x in rules_to_update]} but force is false"
704-
)
705-
706632
for rule in rules_to_create:
707633
try:
708634
rules_obj().post(**rule)
@@ -712,10 +638,8 @@ def create_fw_rules(self, rules_obj, rules, force):
712638
self.module.fail_json(
713639
msg=f'Failed to create firewall rule {rule}: {e}'
714640
)
715-
if len(rules_to_update) > 0 and force:
716-
self.update_fw_rules(rules_obj=rules_obj, rules=rules_to_update, force=False)
717641
self.module.exit_json(
718-
changed=True, msg='successfully created firewall rules'
642+
changed=True, msg='successfully created/updated firewall rules'
719643
)
720644

721645
def move_rule_to_correct_pos(self, rules_obj, rule):

0 commit comments

Comments
 (0)