
    Vh                       d dl mZ dZdZdZd dlmZmZmZ d dlm	Z	m
Z
 d dlm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 e	r$ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl m!Z!  G d de      Z"d Z#e$dk(  r e#        yy)    )annotationsa  
---
module: server

short_description: Create and manage cloud servers on the Hetzner Cloud.


description:
    - Create, update and manage cloud servers on the Hetzner Cloud.

author:
    - Lukas Kaemmerling (@LKaemmerling)

options:
    id:
        description:
            - ID of the Hetzner Cloud Server to manage.
            - Only required if no server O(name) is given
        type: int
    name:
        description:
            - Name of the Hetzner Cloud Server to manage.
            - Only required if no server O(id) is given or a server does not exist.
        type: str
    server_type:
        description:
            - Hetzner Cloud Server Type (name or ID) of the server.
            - Required if server does not exist.
        type: str
    ssh_keys:
        description:
            - List of Hetzner Cloud SSH Keys (name or ID) to create the server with.
            - Only used during the server creation.
        type: list
        elements: str
    volumes:
        description:
            - List of Hetzner Cloud Volumes (name or ID) that should be attached to the server.
            - Only used during the server creation.
        type: list
        elements: str
    firewalls:
        description:
            - List of Hetzner Cloud Firewalls (name or ID) that should be attached to the server.
        type: list
        elements: str
    image:
        description:
            - Hetzner Cloud Image (name or ID) to create the server from.
            - Required if server does not exist or when O(state=rebuild).
        type: str
    image_allow_deprecated:
        description:
            - Allows the creation of servers with deprecated images.
        type: bool
        default: false
        aliases: [allow_deprecated_image]
    location:
        description:
            - Hetzner Cloud Location (name or ID) to create the server in.
            - Required if no O(datacenter) is given and server does not exist.
            - Only used during the server creation.
        type: str
    datacenter:
        description:
            - Hetzner Cloud Datacenter (name or ID) to create the server in.
            - Required if no O(location) is given and server does not exist.
            - Only used during the server creation.
        type: str
    backups:
        description:
            - Enable or disable Backups for the given Server.
        type: bool
    upgrade_disk:
        description:
            - Resize the disk size, when resizing a server.
            - If you want to downgrade the server later, this value should be False.
        type: bool
        default: false
    enable_ipv4:
        description:
            - Enables the public ipv4 address.
        type: bool
        default: true
    enable_ipv6:
        description:
            - Enables the public ipv6 address.
        type: bool
        default: true
    ipv4:
        description:
            - Hetzner Cloud Primary IPv4 (name or ID) to use.
            - If omitted and O(enable_ipv4=true), a new ipv4 Primary IP will automatically be created.
        type: str
    ipv6:
        description:
            - Hetzner Cloud Primary IPv6 (name or ID) to use.
            - If omitted and O(enable_ipv6=true), a new ipv6 Primary IP will automatically be created.
        type: str
    private_networks:
        description:
            - List of Hetzner Cloud Networks (name or ID) the server should be attached to.
            - If None, private networks are left as they are (e.g. if previously added by hcloud_server_network),
              if it has any other value (including []), only those networks are attached to the server.
        type: list
        elements: str
    force:
        description:
            - Force the update of the server.
            - May power off the server if update is applied.
        type: bool
        default: false
        aliases: [force_upgrade]
    user_data:
        description:
            - User Data to be passed to the server on creation.
            - Only used during the server creation.
        type: str
    rescue_mode:
        description:
            - Add the Hetzner rescue system type you want the server to be booted into.
        type: str
    labels:
        description:
            - User-defined labels (key-value pairs).
        type: dict
    delete_protection:
        description:
            - Protect the Server for deletion.
            - Needs to be the same as O(rebuild_protection).
        type: bool
    rebuild_protection:
        description:
            - Protect the Server for rebuild.
            - Needs to be the same as O(delete_protection).
        type: bool
    placement_group:
        description:
            - Hetzner Cloud Placement Group (name or ID) to create the server in.
        type: str
    state:
        description:
            - State of the server.
        default: present
        choices: [ absent, present, created, restarted, started, stopped, rebuild ]
        type: str
extends_documentation_fragment:
- hetzner.hcloud.hcloud

a  
- name: Create a basic server
  hetzner.hcloud.server:
    name: my-server
    server_type: cx22
    image: ubuntu-22.04
    state: present

- name: Create a basic server with ssh key
  hetzner.hcloud.server:
    name: my-server
    server_type: cx22
    image: ubuntu-22.04
    location: fsn1
    ssh_keys:
      - me@myorganisation
    state: present

- name: Resize an existing server
  hetzner.hcloud.server:
    name: my-server
    server_type: cx32
    upgrade_disk: true
    state: present

- name: Ensure the server is absent (remove if needed)
  hetzner.hcloud.server:
    name: my-server
    state: absent

- name: Ensure the server is started
  hetzner.hcloud.server:
    name: my-server
    state: started

- name: Ensure the server is stopped
  hetzner.hcloud.server:
    name: my-server
    state: stopped

- name: Ensure the server is restarted
  hetzner.hcloud.server:
    name: my-server
    state: restarted

- name: Ensure the server is will be booted in rescue mode and therefore restarted
  hetzner.hcloud.server:
    name: my-server
    rescue_mode: linux64
    state: restarted

- name: Ensure the server is rebuild
  hetzner.hcloud.server:
    name: my-server
    image: ubuntu-22.04
    state: rebuild

- name: Add server to placement group
  hetzner.hcloud.server:
    name: my-server
    placement_group: my-placement-group
    force: true
    state: present

- name: Remove server from placement group
  hetzner.hcloud.server:
    name: my-server
    placement_group:
    state: present

- name: Add server with private network only
  hetzner.hcloud.server:
    name: my-server
    enable_ipv4: false
    enable_ipv6: false
    private_networks:
      - my-network
      - 4711
    state: present
a  
hcloud_server:
    description: The server instance
    returned: Always
    type: complex
    contains:
        id:
            description: Numeric identifier of the server
            returned: always
            type: int
            sample: 1937415
        name:
            description: Name of the server
            returned: always
            type: str
            sample: my-server
        created:
            description: Point in time when the Server was created (in ISO-8601 format)
            returned: always
            type: str
            sample: "2023-11-06T13:36:56+00:00"
        status:
            description: Status of the server
            returned: always
            type: str
            sample: running
        server_type:
            description: Name of the server type of the server
            returned: always
            type: str
            sample: cx22
        ipv4_address:
            description: Public IPv4 address of the server
            returned: always
            type: str
            sample: 116.203.104.109
        ipv6:
            description: IPv6 network of the server
            returned: always
            type: str
            sample: 2a01:4f8:1c1c:c140::/64
        private_networks:
            description: List of private networks the server is attached to (name or ID)
            returned: always
            type: list
            elements: str
            sample: ['my-network', 'another-network', '4711']
        private_networks_info:
            description: List of private networks the server is attached to (dict with name and ip)
            returned: always
            type: list
            elements: dict
            sample: [{'name': 'my-network', 'ip': '192.168.1.1'}, {'name': 'another-network', 'ip': '10.185.50.40'}]
        location:
            description: Name of the location of the server
            returned: always
            type: str
            sample: fsn1
        placement_group:
            description: Placement Group of the server
            type: str
            returned: always
            sample: 4711
            version_added: "1.5.0"
        datacenter:
            description: Name of the datacenter of the server
            returned: always
            type: str
            sample: fsn1-dc14
        rescue_enabled:
            description: True if rescue mode is enabled, Server will then boot into rescue system on next reboot
            returned: always
            type: bool
            sample: false
        backup_window:
            description: Time window (UTC) in which the backup will run, or null if the backups are not enabled
            returned: always
            type: bool
            sample: 22-02
        labels:
            description: User-defined labels (key-value pairs)
            returned: always
            type: dict
        delete_protection:
            description: True if server is protected for deletion
            type: bool
            returned: always
            sample: false
            version_added: "0.1.0"
        rebuild_protection:
            description: True if server is protected for rebuild
            type: bool
            returned: always
            sample: false
            version_added: "0.1.0"
)datetime	timedeltatimezone)TYPE_CHECKINGLiteral)AnsibleModule   )AnsibleHCloud)HCloudException)FirewallResource)BoundServerServerServerCreatePublicNetwork)BoundAction)BoundFirewall)BoundNetwork)BoundPlacementGroup)	PrimaryIP)
ServerTypec                       e Zd ZU dZdZded<   d Zd Zd ZddZ	ddZ
dd	Zdd
ZddZddZddZddZddZd Zd Zd Zd Zd Zd Zd Ze fd       Z xZS )AnsibleHCloudServerhcloud_serverNzBoundServer | Nonec                   i dt        | j                  j                        d| j                  j                  d| j                  j                  j                         d| j                  j                  j                  *| j                  j                  j                  j                  nd d| j                  j                  j                  *| j                  j                  j                  j                  nd d| j                  j                  D cg c]  }|j                  j                   c}d| j                  j                  D cg c]%  }|j                  j                  |j                  d' c}d	| j                  j                   | j                  j                  j                  nd d
| j                  j                  j                  d| j                  j                  j                  d| j                  j                  j                  j                  d| j                  j                    | j                  j                   j                  nd d| j                  j"                  d| j                  j$                  d| j                  j&                  d| j                  j(                  d   d| j                  j(                  d   d| j                  j*                  iS c c}w c c}w )Nidnamecreatedipv4_addressipv6private_networksprivate_networks_info)r   ipimageserver_type
datacenterlocationplacement_grouprescue_enabledbackup_windowlabelsdelete_protectiondeleterebuild_protectionrebuildstatus)strr   r   r   r   	isoformat
public_netipv4r"   r   private_netnetworkr#   r$   r%   r&   r'   r(   r)   r*   
protectionr/   )selfnets     i/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/hetzner/hcloud/plugins/modules/server.py_prepare_resultz#AnsibleHCloudServer._prepare_resultn  s   
#d((++,
D&&++
 t))11;;=
 9=9K9K9V9V9[9[9g""--2255mq
 T=O=O=Z=Z=_=_=kD&&116699qu
 T=O=O=[=[ \c!1!1 \
 $DHDVDVDbDb&=@))8&
 d6H6H6N6N6ZT''--22`d
 4--99>>
 $,,77<<
 **55>>CC
  ;?;M;M;];];i""2277os#
& d00??'
( T//==)
* d((//+
,  !3!3!>!>x!H-
. !$"4"4"?"?	"J/
0 d((//1
 	
 !]&s   K(
*K-c                   	 | j                   j                  j                  d      N| j                  j                  j                  | j                   j                  j                  d            | _        y | j                  j                  j                  | j                   j                  j                  d            | _        y # t        $ r}| j                  |       Y d }~y d }~ww xY w)Nr   r   )
moduleparamsgetclientservers	get_by_idr   get_by_namer   fail_json_hcloud)r7   	exceptions     r9   _get_serverzAnsibleHCloudServer._get_server  s    	-{{!!%%d+7%)[[%8%8%B%B4;;CUCUCYCYZ^C_%`"%)[[%8%8%D%DT[[EWEWE[E[\bEc%d" 	-!!),,	-s   A2C 5AC 	C'C""C'c                L   | j                   j                  g d       | j                         }| j                  |      }| j                   j                  j                  d      | j                   j                  j                  d      ||| j                   j                  j                  d      t        | j                   j                  j                  d      | j                   j                  j                  d            d	}| j                   j                  j                  d
      8| j                  d| j                   j                  j                  d
            |d
<   | j                   j                  j                  d      =| j                  d| j                   j                  j                  d            |d   _        | j                   j                  j                  d      =| j                  d| j                   j                  j                  d            |d   _	        | j                   j                  j                  d      F| j                   j                  j                  d      D cg c]  }| j                  d|       c}|d<   | j                   j                  j                  d      F| j                   j                  j                  d      D cg c]  }| j                  d|       c}|d<   | j                   j                  j                  d      F| j                   j                  j                  d      D cg c]  }| j                  d|       c}|d<   | j                   j                  j                  d      F| j                   j                  j                  d      D cg c]  }| j                  d|       c}|d<   | j                   j                  j                  d      1| j                   j                  j                  d      d |d<   d |d<   n| j                   j                  j                  d      ^| j                   j                  j                  d      9| j                  d| j                   j                  j                  d            |d<   n| j                   j                  j                  d      ]| j                   j                  j                  d      8| j                  d| j                   j                  j                  d            |d<   | j                   j                  j                  d      dk(  s(| j                   j                  j                  d      dk(  rd|d<   | j                   j                  s	  | j                  j                  j                  d&i |}|j                  | j                  d<   |j                   j#                  d        |j$                  D ]  }|j#                  d         | j                   j                  j                  d!      }|r!| j'                          | j)                  |       | j                   j                  j                  d"      }|r:| j'                          | j*                  j-                         }|j#                          | j                   j                  j                  d#      }	| j                   j                  j                  d$      }
|	?|
=| j'                          | j*                  j/                  |	|
%      }|j#                          | j5                          | j'                          y c c}w c c}w c c}w c c}w # t0        $ r}| j3                  |       Y d }~Td }~ww xY w)'N)r   r$   r#   required_paramsr   r*   	user_dataenable_ipv4enable_ipv6)rJ   rK   )r   r*   r$   r#   rI   r2   r'   placement_groupsr3   primary_ipsr2   r   r    networksssh_keysvolumes	firewallsr&   r%   	locationsdatacentersstatestoppedr   Fstart_after_createroot_passwordij  max_retriesrescue_modebackupsr+   r-   r,   r.    )r<   fail_on_missing_params_get_server_type
_get_imager=   r>   r   _client_get_by_name_or_idr3   r   
check_moder?   r@   createrW   resultactionwait_until_finishednext_actionsrE   _set_rescue_moder   enable_backupchange_protectionr   rC   _mark_as_changed)r7   r$   r#   r=   
name_or_idrespre   rZ   r[   r+   r-   rD   s               r9   _create_serverz"AnsibleHCloudServer._create_server  s^   **;[*\++-, KK&&**62kk((,,X6&++//<3 KK..22=A KK..22=A

 ;;!!"34@(,(F(F"DKK$6$6$:$:;L$M)F$% ;;!!&)5(,(F(F}VZVaVaVhVhVlVlmsVt(uF< %;;!!&)5(,(F(F}VZVaVaVhVhVlVlmsVt(uF< %;;!!"45A #'++"4"4"8"89K"L" ..z:F"F:
 ;;!!*-9 #'++"4"4"8"8"D" ..z:F"F:
 ;;!!),8 #'++"4"4"8"8"C! ..y*E!F9
 ;;!!+.: #'++"4"4"8"8"E# ..{JG#F;
 ;;!!*-5$++:L:L:P:PQ]:^:f!%F:#'F< [[##J/;@R@R@V@VWc@d@l!%!?!?T[[M_M_McMcdnMo!pF:[[##J/7DKK<N<N<R<RS_<`<l#'#A#A-QUQ\Q\QcQcQgQghtQu#vF< ;;!!'*i74;;;M;M;Q;QRY;Z^g;g+0F'({{%%#11t{{**11;F;/3/A/AO, //C/@"// @F ..3.?@ #kk0044]C$$&))+6++,,00;$$&!//==?F..0$(KK$6$6$:$:;N$O!%)[[%7%7%;%;<P%Q"$05G5S$$&!//AA0 2 B F ..0 	S""!#h # 1%%i001s1   0]+]0]51]:F2]? ?	^#^^#c                   | j                   j                  j                  | j                  j                  j                  d      |j                  d      }|H| j                   j                  j                  | j                  j                  j                  d            }|j                  |j                  t        d      z   }| j                  j                  j                  d      r=| j                  j                  d|j                   d|j                  d	       d
       |S | j                  j                  d|j                   d|j                  d	       d       |S )Nr#   T)r   architectureinclude_deprecatedZ   )daysimage_allow_deprecatedz-You try to use a deprecated image. The image z% will continue to be available until %Y-%m-%d.z@. If you want to use this image use image_allow_deprecated=true.)msg)r?   imagesget_by_name_and_architecturer<   r=   r>   rp   rA   
deprecatedr   warnr   strftime	fail_json)r7   r$   r#   available_untils       r9   r`   zAnsibleHCloudServer._get_image  sJ   ""??##''0$11# @ 

 =KK&&001C1C1G1G1PQE'#..1CCO{{!!%%&>?  CEJJ< P66E6N6Nz6Z5[[\^  %%G

| T::I:R:RS]:^9_ `YY &      c                    | j                  d| j                  j                  j                  d            }| j	                  |       |S )Nserver_typesr$   )ra   r<   r=   r>   !_check_and_warn_deprecated_server)r7   r$   s     r9   r_   z$AnsibleHCloudServer._get_server_type  s>    44^T[[EWEWE[E[\iEjk..{;r   c                   |j                   y |j                   j                  t        j                  t        j
                        k  r*| j                  j                  d|j                   d       y |j                   j                  j                  d      }| j                  j                  d|j                   d| d       y )NzAttention: The server plan a   is deprecated and can no longer be ordered. Existing servers of that plan will continue to work as before and no action is required on your part. It is possible to migrate this server to another server plan by setting the server_type parameter on the hetzner.hcloud.server module.ru   z? is deprecated and will no longer be available for order as of z. Existing servers of that plan will continue to work as before and no action is required on your part. It is possible to migrate this server to another server plan by setting the server_type parameter on the hetzner.hcloud.server module.)
deprecationunavailable_afterr   nowr   utcr<   r{   r   r|   )r7   r$   server_type_unavailable_dates      r9   r   z5AnsibleHCloudServer._check_and_warn_deprecated_server  s    ""*""44x||HLL7QQKK-k.>.>-? @Q Q ,7+B+B+T+T+]+]^h+i(KK-k.>.>-? @::V9W XQQr   c                
   	 | j                   j                  }| j                  j                  j	                  d      }|[|| j                   j
                  k7  rB| j                  j                  s| j                   j                  |       | j                          | j                  j                  j	                  d      }|rP| j                   j                  du r8| j                  j                  s| j                  |       | j                          nj|sh| j                   j                  du rP| j                  j                  s*| j                   j                         }|j                          | j                          | j                  j                  j	                  d      }|rg| j                   j                  Q| j                  j                  s*| j                   j                         }|j                          | j                          nj|h|sf| j                   j                  P| j                  j                  s*| j                   j                         }|j                          | j                          | j                  j                  j	                  d      | j!                          | j                  j                  j	                  d      | j#                          | j                  j                  j	                  d	      | j%                  d	       | j                  j                  j	                  d
      | j%                  d
       | j                  j                  j	                  d      | j'                          | j                  j                  j	                  d      | j)                          | j                  j                  ss| j                  j                  j	                  d      dk(  r|t*        j,                  k(  s(| j                  j                  j	                  d      dk(  r| j/                          | j                  j                  j	                  d      }| j                  j                  j	                  d      }|||| j                   j0                  d   k7  s|| j                   j0                  d   k7  rS| j                  j                  s-| j                   j3                  ||      }|j                          | j                          | j5                          y # t6        $ r}| j9                  |       Y d }~y d }~ww xY w)Nr*   )r*   rZ   FTr[   rQ   r'   r3   r   r    r$   rT   presentstartedr+   r-   r,   r.   r\   )r   r/   r<   r=   r>   r*   rb   updaterk   r(   rh   disable_rescuerf   r)   ri   disable_backup_update_server_firewalls_update_server_placement_group_update_server_ip_update_server_networks_update_server_server_typer   STATUS_RUNNINGstart_serverr6   rj   rE   r   rC   )	r7   previous_server_statusr*   rZ   re   r[   r+   r-   rD   s	            r9   _update_serverz"AnsibleHCloudServer._update_server3  s   G	-%)%7%7%>%>"[[''++H5F!f0B0B0I0I&I{{--&&--V-<%%'++,,00?Kt11@@EI{{--))+6%%' T%7%7%F%F$%N{{--!//>>@F..0%%'kk((,,Y7G4--;;C{{--!//==?F..0%%'$W9K9K9Y9Y9e{{--!//>>@F..0%%'{{!!%%k2>--/{{!!%%&78D335{{!!%%f-9&&v.{{!!%%f-9&&v.{{!!%%&89E,,.{{!!%%m4@//1;;))##''0I=BX\b\q\qBq;;%%))'2i?!!# $ 2 2 6 67J K!%!3!3!7!78L!M!-2D2P!T%7%7%B%B8%LL%););)F)Fy)QQ{{--!//AA0 2 B F ..0%%' 	-!!),,	-s   T#T& &	U
/UU
c                6   | j                   j                  }| j                  j                  j	                  d      }||j                  |      ry |r| j                  d|      }|P| j                  j                  s*| j                   j                         }|j                          | j                          |sy | j                          | j                  j                  s+| j                   j                        }|j                          | j                          y )Nr'   rL   )r   r'   r<   r=   r>   has_id_or_namera   rb   remove_from_placement_grouprf   rk   stop_server_if_forcedadd_to_placement_group)r7   currentwantedr'   re   s        r9   r   z2AnsibleHCloudServer._update_server_placement_group}  s    .2.@.@.P.P##''(9: 7#9#9&#A "<<=OQWXO ;;))++GGI**,!!#  	""${{%%''>>OF&&(r   c                    | j                   j                  }| j                  j                  j	                  d      }|j                  |      r&| j                  | j                   j                         y | j                          | j                  j                  sf| j                  j                  j	                  d      }| j                   j                  | j                         |      }|j                  |rdnd       | j                          y )Nr$   upgrade_disk)r$   r   z   &   rX   )r   r$   r<   r=   r>   r   r   r   rb   change_typer_   rf   rk   )r7   r   r   r   re   s        r9   r   z.AnsibleHCloudServer._update_server_server_type  s    "00<<##''6 !!&)2243E3E3Q3QR""${{%%;;--11.AL''33 113) 4 F &&,3B&Or   c                    t        | j                  j                  d|       }| j                  j                  j                  |      }| j                  j                  j                  d|       }||j                  |      r|ry |r| j                  d|      }|k| j                          | j                  j                  s5| j                  j                  j                  |      }|j                          | j                          |r|sy | j                          | j                  j                  sL| j                  j                  j                  | j                  j                   d      }|j                          | j                          y )Nprimary_enable_rM   server)assignee_idassignee_type)getattrr   r2   r<   r=   r>   r   ra   r   rb   r?   rM   unassignrf   rk   assignr   )r7   kindr   r   enable
primary_ipre   s          r9   r   z%AnsibleHCloudServer._update_server_ip  sU   $+D,>,>,I,IXVZU[K\$]##''-##'''$(89 7#9#9&#Af 77vNJ &&(;;))0099'B**,!!# V 	""${{%%[[,,33 ..11& 4 F
 &&(r   c                n   | j                   j                  D cg c]  }|j                   }}| j                  j                  j                  d      D cg c]  }| j                  d|       }}|D ch c]  }|j                   }}|D ch c]  }|j                   }}g }|D ]b  }|j                  |v r| j                          | j                  j                  r9|j                  | j                   j                  |             d |D ]  }	|	j                           g }|D ]b  }
|
j                  |v r| j                          | j                  j                  r9|j                  | j                   j                  |
             d |D ]  }	|	j                           y c c}w c c}w c c}w c c}w )Nr    rN   )r   r4   r5   r<   r=   r>   ra   r   rk   rb   appenddetach_from_networkrf   attach_to_network)r7   itemr   rl   r   current_ids
wanted_idsactionscurrent_networkre   wanted_networks              r9   r   z+AnsibleHCloudServer._update_server_networks  s   @D@R@R@^@^&_t||&_&_ #kk00445GH&
 **:zB&
 &

 ,334tww33*01$dgg1
1 &(& 	TO!!Z/!!#{{%%NN4--AA/RS	T  	)F&&(	) &($ 	QN  K/!!#{{%%NN4--??OP	Q  	)F&&(	)I '`&

 41s   F#F(4F-F2c           
        | j                   j                  j                  D cg c]  }|j                   }}| j                  j
                  j                  d      D cg c]  }| j                  d|       }}|D ch c]  }|j                   }}|D ch c]  }|j                   }}g }|D ]  }|j                  |v r| j                          | j                  j                  r9|j                  | j                  j                  j                  |t        d| j                         g              |D ]  }	|	j                           g }|D ]  }
|
j                  |v r| j                          | j                  j                  r9|j                  | j                  j                  j!                  |
t        d| j                         g              |D ]  }	|	j                           y c c}w c c}w c c}w c c}w )NrQ   r   )typer   )r   r2   rQ   firewallr<   r=   r>   ra   r   rk   rb   extendr?   remove_from_resourcesr   rf   apply_to_resources)r7   r   r   rl   r   r   r   r   current_firewallre   wanted_firewalls              r9   r   z,AnsibleHCloudServer._update_server_firewalls  s   BFBTBTB_B_BiBi'j$'j'j #kk0044[A'
 **;
C'
 '

 ,334tww33*01$dgg1
1 &( ' 	""j0!!#{{%%NN%%;;$%8D<N<NOP	  	)F&&(	) &(% 	O!![0!!#{{%%NN%%88#%8D<N<NOP	  	)F&&(	)] (k'

 41s   G/G4>G9G>c           	        | j                   j                  j                  d      r|| j                  j	                  || j                   j                  j                  d      D cg c]1  }| j
                  j                  j                  |      j                  3 c}      }n| j                  j	                  |      }|j                  j                          |j                  | j                  d<   y c c}w )NrO   )r   rO   )r   rW   )r<   r=   r>   r   enable_rescuer?   rO   rB   r   re   rf   rW   rd   )r7   rZ   ssh_key_namerm   s       r9   rh   z$AnsibleHCloudServer._set_rescue_mode3  s    ;;!!*-%%33  )-(:(:(>(>z(J$ KK((44\BEE 4 D %%333ED'')'+'9'9O$s   #6C2
c                   	 | j                   r| j                   j                  t        j                  k7  re| j                  j
                  s?| j                  j                  j                  | j                         }|j                          | j                          | j                          y y # t        $ r}| j                  |       Y d }~y d }~ww xY wN)r   r/   r   r   r<   rb   r?   r@   power_onrf   rk   rE   r   rC   r7   re   rD   s      r9   r   z AnsibleHCloudServer.start_serverA  s    		-!!%%,,0E0EE;;11!%!4!4!=!=d>P>P!Q224))+  " "  	-!!),,	-   B(B, ,	C5CCc                   	 | j                   r| j                   j                  t        j                  k7  re| j                  j
                  s?| j                  j                  j                  | j                         }|j                          | j                          | j                          y y # t        $ r}| j                  |       Y d }~y d }~ww xY wr   )r   r/   r   
STATUS_OFFr<   rb   r?   r@   	power_offrf   rk   rE   r   rC   r   s      r9   stop_serverzAnsibleHCloudServer.stop_serverM  s    		-!!%%,,0A0AA;;11!%!4!4!>!>t?Q?Q!R224))+  " "  	-!!),,	-r   c                   | j                   j                  }|t        j                  k(  r| j                  j
                  s| j                  j                  j                  d      s(| j                  j                  j                  d      dk(  r| j                          |S | j                  j                  d| j                   j                   d       y )NforcerT   rU   z'You can not upgrade a running instance z2. You need to stop the instance or use force=true.)r   r/   r   r   r<   rb   r=   r>   r   r{   r   )r7   r   s     r9   r   z)AnsibleHCloudServer.stop_server_if_forcedY  s    !%!3!3!:!:!V%:%::4;;CYCY{{!!%%g.$++2D2D2H2H2QU^2^  "--KK9$:L:L:Q:Q9R SC C
 r   c                V   | j                          | j                  | j                          y | j                          | j                  j                  dg       	 | j                  j                  sq| j                  | j                  j                        }| j                  j                  j                  | j                  |      }|j                  j                  d       | j                          | j                          y # t        $ r}| j!                  |       Y d }~y d }~ww xY w)Nr#   rG      rX   )rE   r   rn   r   r<   r^   rb   r`   r$   r?   r@   r.   re   rf   rk   r   rC   )r7   r#   rm   rD   s       r9   rebuild_serverz"AnsibleHCloudServer.rebuild_serverg  s    %!! KK..y.I
1{{-- OOD,>,>,J,JKE;;..66t7I7I5QDKK333D%%'  "" 1%%i001s   B'D 	D(D##D(c                ~    | j                          | j                  | j                          y | j                          y r   )rE   r   rn   r   )r7   s    r9   present_serverz"AnsibleHCloudServer.present_server|  s2    %!!r   c                d   	 | j                          | j                  e| j                  j                  s?| j                  j
                  j                  | j                        }|j                          | j                          d | _        y # t        $ r}| j                  |       Y d }~y d }~ww xY wr   )rE   r   r<   rb   r?   r@   r,   rf   rk   r   rC   r   s      r9   delete_serverz!AnsibleHCloudServer.delete_server  s    		-!!-{{--![[00778J8JKF..0%%'!%D 	-!!),,	-s   BB 	B/B**B/c                   t        t        d1i dddidddidddiddd	d
gddddidddidddidddidddd	ddddddddddddidddiddd	ddddddddddddidddid ddd d!d"dd	d#gd$d#d%d&gd'd(ddid)ddid*ddid+ddid,g d-d.d/t        |          ddggddggd)d*ggd0      S )2Nr   r   intr   r0   r#   rt   boolFallow_deprecated_image)r   defaultaliasesr$   r&   r%   rI   rO   list)r   elementsno_logrP   )r   r   rQ   r*   dictr[   r   )r   r   rJ   TrK   r3   r   r    )r   r   r   r   force_upgradezhetzner.hcloudz5.0.0)collection_namer   version)r   r   r   deprecated_aliasesrZ   r+   r-   r'   rT   )absentr   r   	restartedr   rU   r.   r   )choicesr   )argument_specrequired_one_ofmutually_exclusiverequired_togethersupports_check_moder]   )r	   r   superbase_module_arguments)cls	__class__s    r9   define_modulez!AnsibleHCloudServer.define_module  s    %E?%e_% uo% 175VnUo'p	%
 $UO% !%% #E?% "5/% #)euM% "(U;% $*u=% '%  (% '-?% &,=%  &,=!%" e_#%$ e_%%& +1ePT!U'%* #$ /0,<obij+	)%8 $UO9%: $*6"2;%< %+F#3=%> "(?%B  n( '/1I%L #F^,!+\ :; 35IJK $U+
 +	
r   )r$   r   )returnr   )r$   r   r   None)r   r   )r   zLiteral['ipv4', 'ipv6']r   r   )__name__
__module____qualname__	representr   __annotations__r:   rE   rn   r`   r_   r   r   r   r   r   r   r   rh   r   r   r   r   r   r   classmethodr   __classcell__)r   s   @r9   r   r   i  s    I(,M%,
8-gR4.H-T < 4" H&)P0)d:
-
-1*"
- ,
 ,
r   r   c                    t         j                         } t        |       }| j                  j                  d      }|dk(  r|j	                          n|dk(  r!|j                          |j                          n|dk(  r|j                          n|dk(  r!|j                          |j                          nq|dk(  r!|j                          |j                          nK|dk(  r1|j                          |j                          |j                          n|dk(  r|j                           | j                  d	i |j                          y )
NrT   r   r   r   r   rU   r   r.   r]   )r   r   r=   r>   r   r   r   r   r   	exit_json
get_result)r<   hcloudrT   s      r9   mainr     s    ..0F (FMMg&E	)		)		)		)		+		)	F+v((*+r   __main__N)%
__future__r   DOCUMENTATIONEXAMPLESRETURNr   r   r   typingr   r   ansible.module_utils.basicr	   module_utils.hcloudr   module_utils.vendor.hcloudr   $module_utils.vendor.hcloud.firewallsr   "module_utils.vendor.hcloud.serversr   r   r   "module_utils.vendor.hcloud.actionsr   r   #module_utils.vendor.hcloud.networksr   +module_utils.vendor.hcloud.placement_groupsr   &module_utils.vendor.hcloud.primary_ipsr   'module_utils.vendor.hcloud.server_typesr   r   r   r   r]   r   r9   <module>r     s    #UnOb_
B 3 2 ) 4 / 8 C  @DBQBDS	
- S	
l,8 zF r   