
    Vh                        d dl mZ dZdZdZd dlmZ ddlmZ ddl	m
Z
 dd	lmZmZmZ dd
lmZ  G d de      Zd Zedk(  r e        yy)    )annotationsaQ  
---
module: firewall_resource
short_description: Manage Resources a Hetzner Cloud Firewall is applied to.

description:
    - Add and Remove Resources a Hetzner Cloud Firewall is applied to.

author:
    - Jonas Lammler (@jooola)

version_added: 2.5.0
options:
    firewall:
        description:
            - Name or ID of the Hetzner Cloud Firewall.
        type: str
        required: true
    servers:
        description:
            - List of Server Name or ID.
        type: list
        elements: str
    label_selectors:
        description:
            - List of Label Selector.
        type: list
        elements: str
    state:
        description:
            - State of the firewall resources.
        default: present
        choices: [absent, present]
        type: str

extends_documentation_fragment:
    - hetzner.hcloud.hcloud
a  
- name: Apply a firewall to a list of servers
  hetzner.hcloud.firewall_resource:
    firewall: my-firewall
    servers:
      - my-server
      - 3456789
    state: present

- name: Remove a firewall from a list of servers
  hetzner.hcloud.firewall_resource:
    firewall: my-firewall
    servers:
      - my-server
      - 3456789
    state: absent

- name: Apply a firewall to resources using label selectors
  hetzner.hcloud.firewall_resource:
    firewall: my-firewall
    label_selectors:
      - env=prod
    state: present

- name: Remove a firewall from resources using label selectors
  hetzner.hcloud.firewall_resource:
    firewall: my-firewall
    label_selectors:
      - env=prod
    state: absent
a  
hcloud_firewall_resource:
    description: The Resources a Hetzner Cloud Firewall is applied to.
    returned: always
    type: dict
    contains:
        firewall:
            description:
                - Name of the Hetzner Cloud Firewall.
            type: str
            sample: my-firewall
        servers:
            description:
                - List of Server Name.
            type: list
            elements: str
            sample: [my-server1, my-server2]
        label_selectors:
            description:
                - List of Label Selector.
            type: list
            elements: str
            sample: [env=prod]
)AnsibleModule   )AnsibleHCloud)HCloudException)BoundFirewallFirewallResourceFirewallResourceLabelSelector)BoundServerc                  \     e Zd ZU dZdZded<   d Zd Zd
dZd Z	d Z
e fd	       Z xZS )AnsibleHCloudFirewallResourcehcloud_firewall_resourceNzBoundFirewall | Nonec                   g }g }| j                   j                  D ]  }|j                  t        j                  k(  r&|j                  |j                  j                         F|j                  t        j                  k(  sd|j                  |j                  j                          | j                   j                  ||dS )N)firewallserverslabel_selectors)r   
applied_totyper	   TYPE_SERVERappendservernameTYPE_LABEL_SELECTORlabel_selectorselector)selfr   r   resources       t/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/hetzner/hcloud/plugins/modules/firewall_resource.py_prepare_resultz-AnsibleHCloudFirewallResource._prepare_resultz   s    55@@ 	IH}} 0 < <<x334"2"F"FF&&x'>'>'G'GH		I 55::.
 	
    c                    	 | j                  d| j                  j                  j                  d            | _        y # t
        $ r}| j                  |       Y d }~y d }~ww xY w)N	firewallsr   )_client_get_by_name_or_idmoduleparamsgetr   r   fail_json_hcloud)r   	exceptions     r   _get_firewallz+AnsibleHCloudFirewallResource._get_firewall   sX    	-,0,J,J""&&z2-D)  	-!!),,	-s   := 	A!AA!c           	     Z   | j                         }g }| j                  j                  j                  d      }|r[|D ]V  }	 | j	                  d|      } |j                  |d         s-|j                  t        t        j                  |             X | j                  j                  j                  d      }|rH|D ]C  }	 ||	|d         s|j                  t        t        j                  t        |	                   E |S # t
        $ r}| j                  |       Y d }~d }~ww xY w)Nr   )r   r   r   )r   )r   r   )r   r$   r%   r&   r#   r   r'   r   r   r	   r   r   r
   )
r   operatorbefore	resourcesr   server_paramr   r(   r   r   s
             r   _diff_firewall_resourcesz6AnsibleHCloudFirewallResource._diff_firewall_resources   s"   %%',.	$(KK$6$6$:$:9$E ' 5*.*H*HT`*aF FKK	):;$$(!1!=!=#) ++,,001BC"1 NF3D,EF$$(!1!E!E+HR`+a - ' 5)))445s    D	D*D%%D*c                4   | j                          | j                  d       }|rt| j                  j                  sM| j                  j                  |      }|D ]  }|j                           | j                  j                          | j                          y y )Nc                
    | |vS N )to_addr,   s     r   <lambda>zJAnsibleHCloudFirewallResource.present_firewall_resources.<locals>.<lambda>   s    6#7 r    r-   )	r)   r/   r$   
check_moder   apply_to_resourceswait_until_finishedreload_mark_as_changedr   r-   actionsactions       r   present_firewall_resourcesz8AnsibleHCloudFirewallResource.present_firewall_resources   s    117
	 ;;))77JJU^J_% 1F..01 --446!!# r    c                4   | j                          | j                  d       }|rt| j                  j                  sM| j                  j                  |      }|D ]  }|j                           | j                  j                          | j                          y y )Nc                
    | |v S r2   r3   )	to_remover,   s     r   r5   zIAnsibleHCloudFirewallResource.absent_firewall_resources.<locals>.<lambda>   s    i6&9 r    r6   )	r)   r/   r$   r7   r   remove_from_resourcesr9   r:   r;   r<   s       r   absent_firewall_resourcesz7AnsibleHCloudFirewallResource.absent_firewall_resources   s    119
	 ;;))77MMXaMb% 1F..01 --446!!# r    c                h    t        dddddddddddgddd	t        | 	         d
dggd      S )NstrT)r   requiredlist)r   elementsabsentpresent)choicesdefault)r   r   r   stater   r   )argument_specrequired_one_ofsupports_check_mode)r   superbase_module_arguments)cls	__class__s    r   define_modulez+AnsibleHCloudFirewallResource.define_module   s`    %*=$*>,2#F ()4(		 '/1	 ():;< $
 	
r    )returnzlist[FirewallResource])__name__
__module____qualname__	representr   __annotations__r   r)   r/   r?   rD   classmethodrV   __classcell__)rU   s   @r   r   r   u   sB    *I5929
- D$$ 
 
r    r   c                    t         j                         } t        |       }| j                  j                  d      }|dk(  r|j	                          n|dk(  r|j                           | j                  di |j                          y )NrN   rJ   rK   r3   )r   rV   r%   r&   rD   r?   	exit_json
get_result)r$   hcloudrN   s      r   mainrc      sr    *88:F*62FMMg&E((*	)	))+F+v((*+r    __main__N)
__future__r   DOCUMENTATIONEXAMPLESRETURNansible.module_utils.basicr   module_utils.hcloudr   module_utils.vendor.hcloudr   $module_utils.vendor.hcloud.firewallsr   r	   r
   "module_utils.vendor.hcloud.serversr   r   rc   rX   r3   r    r   <module>rn      sc    #%N@
2 5 / 8 
 =l
M l
^
, zF r    