
    Vh!                         d dl mZmZmZ eZdZdZdZd dl	Z	d dl
mZ ddlmZmZ  G d	 d
e      Zd Zedk(  r e        yy)    )absolute_importdivisionprint_functionu  
---
module: reserved_ip
short_description: Manages reserved IPs on Vultr
description:
  - Create, attach, detach and remove reserved IPs.
version_added: "1.0.0"
author:
  - "René Moser (@resmo)"
options:
  label:
    description:
      - Label of the reserved IP.
    required: true
    aliases: [ name ]
    type: str
  instance_name:
    description:
      - Name of the Instance the reserved IP should be attached to.
      - Mutually exclusive with I(instance_id).
    type: str
  instance_id:
    description:
      - ID of the Instance the reserved IP should be attached to.
      - Mutually exclusive with I(instance_name).
    type: str
  region:
    description:
      - Region of the reserved IP will be related to.
    type: str
    required: true
  ip_type:
    description:
      - Type of the IP.
    type: str
    choices: [ v4, v6 ]
    required: true
  state:
    description:
      - State of the reserved IP.
    default: present
    choices: [ present, absent ]
    type: str
extends_documentation_fragment:
  - vultr.cloud.vultr_v2
a  
- name: Ensure a reserved IP present and attached to an instance
  vultr.cloud.reserved_ip:
    label: my attached IP
    region: ewr
    ip_type: v4
    instance_name: web-01

- name: Ensure a reserved IP is detached
  vultr.cloud.reserved_ip:
    label: my reserved IP
    region: ewr
    ip_type: v4
    instance_id: ""

- name: Ensure a reserved IP is absent
  vultr.cloud.reserved_ip:
    label: my attached IP
    region: ewr
    ip_type: v4
    state: absent
a  
---
vultr_api:
  description: Response from Vultr API with a few additions/modification.
  returned: success
  type: dict
  contains:
    api_timeout:
      description: Timeout used for the API requests.
      returned: success
      type: int
      sample: 60
    api_retries:
      description: Amount of max retries for the API requests.
      returned: success
      type: int
      sample: 5
    api_retry_max_delay:
      description: Exponential backoff delay in seconds between retries up to this max delay value.
      returned: success
      type: int
      sample: 12
    api_endpoint:
      description: Endpoint used for the API requests.
      returned: success
      type: str
      sample: "https://api.vultr.com/v2"
vultr_reserved_ip:
  description: Response from Vultr API.
  returned: success
  type: dict
  contains:
    id:
      description: ID of the reserved IP.
      returned: success
      type: str
      sample: cb676a46-66fd-4dfb-b839-443f2e6c0b60
    label:
      description: Name of the reserved IP.
      returned: success
      type: str
      sample: example.com
    region:
      description: Region of the reserved IP is related to.
      returned: success
      type: str
      sample: ewr
    ip_type:
      description: Type of the reserved IP.
      returned: success
      type: str
      sample: v4
    subnet:
      description: Subnet of the reserved IP.
      returned: success
      type: str
      sample: v4
    subnet_size:
      description: Size of the subnet of the reserved IP.
      returned: success
      type: int
      sample: 32
    instance_id:
      description: ID of the Instance the reserved IP is attached to.
      returned: success
      type: str
      sample: cb676a46-66fd-4dfb-b839-443f2e6c0b
N)AnsibleModule   )AnsibleVultrvultr_argument_specc                   8     e Zd Zd Zd ZddZ fdZd Z xZS )AnsibleVultrReservedIpc                 .    | j                         | _        y )N)get_instance_idinstance_id)selfs    k/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/vultr/cloud/plugins/modules/reserved_ip.py	configurez AnsibleVultrReservedIp.configure   s    //1    c                    | j                   j                  d   }||S | j                   j                  d   }|t        |      dk(  ry	 t        j                  |      }| j                  d|z        xs
 t               }|r|d   s| j                   j                  d|z  	       t        |d         d
kD  r| j                   j                  d|z  	       |d   d   d   S y # t
        $ r" t        j                  j	                  |      }Y w xY w)Nr   instance_namer    z/instances?label=%spath	instanceszNo instance with name found: %s)msg   z*More then one instance with name found: %sid)
moduleparamslenurllibquoteAttributeErrorparse	api_querydict	fail_json)r   r   r   label	resourcess        r   r   z&AnsibleVultrReservedIp.get_instance_id   s   kk((7"**?;$=!Q&:]3
 ,AE,IJTdfIIk$:%%*Km*[%\9[)*Q.%%*VYf*f%g[)!,T22' % " :**=9:s   	C! !(DDc                 4   | j                  | j                        xs
 t               }t               }|| j                     D ]S  }|d   | j
                  j                  d   k7  r#|d   | j
                  j                  d   k7  rC|j                  |       U |S )Nr   ip_typeregion)r#   resource_pathr$   listressource_result_key_pluralr   r   append)r   r   
result_keyquery_paramsr'   resources_filteredresources          r   
query_listz!AnsibleVultrReservedIp.query_list   s    NN(:(:N;Etv	!V!$"B"BC 	0H	"dkk&8&8&CC!T[[%7%7%AA%%h/	0 "!r   c                 P   t         |          xs
 t               }|r| j                  r|| j                  j
                  sf| j                  | j                  d|| j                     dddt        | j                               | j                  || j                           }|S )N/attachPOSTr   r   methoddataresource_id)
supercreater$   r   r   
check_moder#   r+   resource_key_idquery_by_id)r   r2   	__class__s     r   r?   zAnsibleVultrReservedIp.create   s    7>#-tv((;;)) ** !5!56 	 "$*:*:;  	  ++AUAU8V+Wr   c                    | j                   |S |d   r| j                   sd| j                  d<   | j                  j                  sf| j	                  | j
                  d|| j                     dddt        | j                                | j                  || j                     	      }|S | j                   r|d   | j                   k7  rd| j                  d<   | j                  j                  sf| j	                  | j
                  d|| j                     dd
dt        | j                                | j                  || j                     	      }|S )Nr   Tchangedr5   detachr7   r8   r9   r<   r6   )	r   resultr   r@   r#   r+   rA   r$   rB   )r   r2   s     r   updatezAnsibleVultrReservedIp.update   s@   #O m$T-=-=%)DKK	";;))'+'9'98DDXDX;Y[cd!$*:*:;    ++AUAU8V+W  (="9T=M=M"M%)DKK	";;))'+'9'98DDXDX;Y[cd!$*:*:;    ++AUAU8V+Wr   )NNN)	__name__
__module____qualname__r   r   r3   r?   rH   __classcell__)rC   s   @r   r   r      s    236"&r   r   c                     t               } | j                  t        t        dddg      t        d      t        d      t        ddddg      t        dd	      t        dd
dgd
                   t        | ddgfd      }t	        |dddg dd      }|j
                  j                  d      dk(  r|j                          y |j                          y )NstrTname)typerequiredaliases)rP   v4v6)rP   rQ   choices)rP   rQ   presentabsent)rP   rU   default)r&   r   r   r)   r*   stater   r   )argument_specmutually_exclusivesupports_check_modevultr_reserved_ipz/reserved-ipsreserved_ip)r*   r)   r&   r&   )r   	namespacer+   ressource_result_key_singularresource_create_param_keysresource_key_namerY   )	r	   rH   r$   r   r   r   getrW   rV   )rZ   r   vultrs      r   mainre      s    ')MED6(C%(E*edT4LIUT2EIx+@)T	
	 #*O<> F #%%&3#A!E }}!X-r   __main__)
__future__r   r   r   rP   __metaclass__DOCUMENTATIONEXAMPLESRETURNr   ansible.module_utils.basicr   module_utils.vultr_v2r   r	   r   re   rI    r   r   <module>ro      s_    A @-^.C
J  4 E]\ ]@D zF r   