
    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
Z
d dlmZ d dlmZ d dlmZmZmZ d	Zd
Zd Zd Zd"dZd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#ee#e"e!e dZ$d#dZ%dZ&d Z'd Z(d Z)d  Z*e+d!k(  r e*        yy)$    )absolute_importdivisionprint_functionaV
  
module: scaleway_compute
short_description: Scaleway compute management module
author: Remy Leone (@remyleone)
description:
  - This module manages compute instances on Scaleway.
extends_documentation_fragment:
  - community.general.scaleway
  - community.general.attributes

attributes:
  check_mode:
    support: full
  diff_mode:
    support: none

options:

  public_ip:
    type: str
    description:
      - Manage public IP on a Scaleway server.
      - Could be Scaleway IP address UUID.
      - V(dynamic) Means that IP is destroyed at the same time the host is destroyed.
      - V(absent) Means no public IP at all.
    default: absent

  enable_ipv6:
    description:
      - Enable public IPv6 connectivity on the instance.
    default: false
    type: bool

  image:
    type: str
    description:
      - Image identifier used to start the instance with.
    required: true

  name:
    type: str
    description:
      - Name of the instance.
  organization:
    type: str
    description:
      - Organization identifier.
      - Exactly one of O(project) and O(organization) must be specified.
  project:
    type: str
    description:
      - Project identifier.
      - Exactly one of O(project) and O(organization) must be specified.
    version_added: 4.3.0

  state:
    type: str
    description:
      - Indicate desired state of the instance.
    default: present
    choices:
      - present
      - absent
      - running
      - restarted
      - stopped

  tags:
    type: list
    elements: str
    description:
      - List of tags to apply to the instance (5 max).
    required: false
    default: []

  region:
    type: str
    description:
      - Scaleway compute zone.
    required: true
    choices:
      - ams1
      - EMEA-NL-EVS
      - par1
      - EMEA-FR-PAR1
      - par2
      - EMEA-FR-PAR2
      - waw1
      - EMEA-PL-WAW1

  commercial_type:
    type: str
    description:
      - Commercial name of the compute node.
    required: true

  wait:
    description:
      - Wait for the instance to reach its desired state before returning.
    type: bool
    default: false

  wait_timeout:
    type: int
    description:
      - Time to wait for the server to reach the expected state.
    required: false
    default: 300

  wait_sleep_time:
    type: int
    description:
      - Time to wait before every attempt to check the state of the server.
    required: false
    default: 3

  security_group:
    type: str
    description:
      - Security group unique identifier.
      - If no value provided, the default security group or current security group will be used.
    required: false
ar  
- name: Create a server
  community.general.scaleway_compute:
    name: foobar
    state: present
    image: 89ee4018-f8c3-4dc4-a6b5-bca14f985ebe
    project: 951df375-e094-4d26-97c1-ba548eeb9c42
    region: ams1
    commercial_type: VC1S
    tags:
      - test
      - www

- name: Create a server attached to a security group
  community.general.scaleway_compute:
    name: foobar
    state: present
    image: 89ee4018-f8c3-4dc4-a6b5-bca14f985ebe
    project: 951df375-e094-4d26-97c1-ba548eeb9c42
    region: ams1
    commercial_type: VC1S
    security_group: 4a31b633-118e-4900-bd52-facf1085fc8d
    tags:
      - test
      - www

- name: Destroy it right after
  community.general.scaleway_compute:
    name: foobar
    state: absent
    image: 89ee4018-f8c3-4dc4-a6b5-bca14f985ebe
    project: 951df375-e094-4d26-97c1-ba548eeb9c42
    region: ams1
    commercial_type: VC1S

N)AnsibleModule)now)SCALEWAY_LOCATIONscaleway_argument_specScaleway)stoppedstoppingstartingrunninglocked)r   r   pendingc                     | j                  d|z        }|j                  sUd|d| j                  j                  j                  d      d|j                  }| j                  j                  |       y y )Nz	images/%spathzError in getting image z on api_urlz : msg)getokmoduleparamsjson	fail_json)compute_apiimage_idresponser   s       v/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/modules/scaleway_compute.pycheck_image_idr"      se    K($:;H;;8@+BTBTB[B[B_B_`iBjltlylyz$$$-     c                    | j                   j                  d|d   z         | j                  d|d   z        }|j                  dk(  ry|j                  s8d|j                  d|j
                  }| j                   j                  |	       	 | j                   j                  d
|d   d|j
                  d   d          |j
                  d   d   S # t        $ r, | j                   j                  d|j
                  z  	       Y y w xY w)Nzfetch_state of server: %sid
servers/%sr   i  absentzError during state fetching: () r   zServer z in state: serverstatezCould not fetch state in %s)r   debugr   status_coder   r   r   KeyErrorr   r)   r    r   s       r!   fetch_stater/      s    86$<GHL6$<$?@Hs";;8@8L8Lhmm\$$$-X  VD\8==YaKbcjKk!lm}}X&w// X$$)F)V$WXs   AC 2D
	D
c                 d   || j                   j                  d   }|sy | j                   j                  d   }| j                   j                  d   }t               }|t        j                  |      z   }t               |k  r| j                   j                  d       t        | |      t        vrD| j                   j                  d       | j                   j                  dt        | |      z         y t        j                  |       t               |k  r| j                   j                  d	       y )
Nwaitwait_timeoutwait_sleep_time)secondsz<We are going to wait for the server to finish its transitionz6It seems that the server is not in transition anymore.zServer in state: %sz.Server takes too long to finish its transitionr   )r   r   r   datetime	timedeltar+   r/   SCALEWAY_TRANSITIONS_STATEStimesleepr   )r   r)   r1   r2   r3   startends          r!   !wait_to_complete_state_transitionr<      s   |!!((0%%,,^<L!((//0ABOEE
($$\:
:C
%#+  !_`{F+3NN$$%]^$$%:[V\=]%]^

?# %#+ 	$$)Y$Zr#   c                    |dv rddiS |dv rddiS | j                  d      }|j                  s8d|j                  d|j                  }| j                  j                  |	       g }	 |j                  d   }|D cg c]  }|d   	 }}||v rd|iS y # t        $ r, | j                  j                  d
|j                  z  	       Y Ow xY wc c}w )N)r'   dynamic_ip_requiredF)dynamic	allocatedTipsz$Error during public IP validation: (r(   r   z,Error in getting the IP information from: %sr%   	public_ip)r   r   r,   r   r   r   r-   )r   rB   r    r   ip_listiplookups          r!   public_ip_payloadrF      s    K%u-- ,,%t,, u%H;;>F>R>RT\TaTab$$$-Gi--& "))2bh)F)FY'' 	  i$$)WZbZgZg)g$hi *s   )B <C2CCc                    | j                   j                  d       d }|d   |d   |d   |d   |d   |d   d}|d	   r|d	   |d	<   |d
   r|d
   |d
<   |d   r|d   |d<   | j                  d|      }|j                  s8d|j                  d|j
                  }| j                   j                  |       	 |j
                  d   }t        | |       |S # t        $ r, | j                   j                  d|j
                  z         Y Cw xY w)NzStarting a create_serverenable_ipv6tagscommercial_typeimager>   name)rH   rI   rJ   rK   r>   rL   projectorganizationsecurity_groupserversr   datazError during server creation: (r(   r   r)   0Error in getting the server information from: %sr   r)   )	r   r+   postr   r,   r   r   r-   r<   )r   r)   target_serverrR   r    r   s         r!   create_serverrW     s?   78M!-06N%&78G_#)*?#@6ND i +Yn%n5^!'(8!9YT:H;;9A9M9Mx}}]$$$-m h/ &+mT  m$$)[^f^k^k)k$lms   8C 2D
Dc                     t        | |d      S )Nrebootr   r)   actionperform_actionrT   s     r!   restart_serverr^   7  s    k&RRr#   c                     t        | |d      S )NpoweroffrZ   r\   rT   s     r!   stop_serverra   ;  s    k&TTr#   c                     t        | |d      S )NpoweronrZ   r\   rT   s     r!   start_serverrd   ?  s    k&SSr#   c                     | j                  d|d   z  d|i      }|j                  s;d|d|j                  d|j                  }| j                  j                  |       t        | |	       |S )
Nzservers/%s/actionr%   r[   rQ   zError during server z: (r(   r   rT   )rU   r   r,   r   r   r   r<   )r   r)   r[   r    r   s        r!   r]   r]   C  sq    %86$<%G&.%7   9H;;398;O;OQYQ^Q^_$$$-%+fMOr#   c                    | j                   j                  d       | j                  d|d   z        }|j                  s8d|j                  d|j
                  }| j                   j                  |       t        | |       |S )	NzStarting remove server strategyr&   r%   r   zError during server deletion: (r(   r   rT   )r   r+   deleter   r,   r   r   r<   r.   s       r!   remove_serverrh   O  st    >?!!|fTl'B!CH;;9A9M9Mx}}]$$$-%+fMOr#   c                 F   | j                   j                  d       d}t        | |d      }|s,d}| j                   j                  r|ddifS t	        | |      }n|d	   }t        | ||
      r2d}| j                   j                  r|dd|d   z  ifS t        | ||
      }||fS )NzStarting present strategyF   r   wished_serverper_pageTstatuszA server would be created.rT   r   r   rV   rl   &Server %s attributes would be changed.r%   )r   r+   find
check_moderW   #server_attributes_should_be_changedserver_change_attributes)r   rl   changedquery_resultsrV   s        r!   present_strategyrw   [  s    89G[XYZM((X'CDDD%+mT%a(*{R_9FH((X'OR_`dRe'efff0[Xe  vC  DM!!r#   c                    | j                   j                  d       d}d }t        | |d      }|s|ddifS |d   }d}| j                   j                  r|dd	|d
   z  ifS t	        | |      dk7  rt        | |d       t        | |      }|j                  sBdj                  |j                  |j                        }| j                   j                  |       t        | |d       t	        | |      dk7  rt        | |      }|j                  sBdj                  |j                  |j                        }| j                   j                  |       |dd|d
   z  ifS )NzStarting absent strategyFrj   rk   rn   zServer already absent.r   TzServer %s would be made absent.r%   rT   r   )r   r)   r1   z;Error while stopping a server before removing it [{0}: {1}]r   z&Error while removing server [{0}: {1}]zServer %s deleted)r   r+   rq   rr   r/   r<   ra   r   formatr,   r   r   rh   )r   rl   ru   rV   rv   r    err_msgs          r!   absent_strategyr{   u  sm   78GM[XYZM#;<<<%a(G$$#D}UYGZ#Z[[[ +m
D	
Q)k-^bc;}M{{SZZ[c[o[o[c[h[hjG((W(5)k-^bc +m
D	
Q ]KH;;:AA(BVBVX`XeXef$$$1X2]45HHIIIr#   c                    | j                   j                  d       d}t        | |d      }|s,d}| j                   j                  r|ddifS t	        | |      }n|d	   }t        | ||
      r2d}| j                   j                  r|dd|d   z  ifS t        | ||
      }t        | |      }|dvr| j                   j                  d|z         d}| j                   j                  r|dd|d   z  ifS t        | |      }|j                  sBdj                  |j                  |j                        }| j                   j                  |       ||fS )NzStarting running strategyFrj   rk   Trn   z+A server would be created before being run.rT   r   ro   z8Server %s attributes would be changed before running it.r%   )r   r   z%running_strategy: Server in state: %srp   z%Error while running server [{0}: {1}]r   )r   r+   rq   rr   rW   rs   rt   r/   rd   r   ry   r,   r   r   )r   rl   ru   rv   rV   current_stater    r   s           r!   running_strategyr~     sv   89G[XYZM((X'TUUU%+mT%a(*{R_9FH((X'adqrvdw'wxxx0[Xe  vC  DKNM33  !H=!XY((X'OR_`dRe'efffKN{{9@@AUAUW_WdWdeC((S(1M!!r#   c                    | j                   j                  d       t        | |d      }d}|s,| j                   j                  r|ddifS t	        | |      }d}n|d	   }| j                   j                  d
       t        | ||      r2d}| j                   j                  r|dd|d   z  ifS t        | ||      }t        | |       t        | |      }|dvr| j                   j                  d|z         d}| j                   j                  r|dd|d   z  ifS t        | |      }| j                   j                  |j                         | j                   j                  |j                         |j                  sBdj                  |j                  |j                        }| j                   j                  |       ||fS )NzStarting stop strategyrj   rk   Frn   z/A server would be created before being stopped.rT   Tr   z!stop_strategy: Servers are found.ro   z9Server %s attributes would be changed before stopping it.r%   r   z"stop_strategy: Server in state: %szServer %s would be stopped.z&Error while stopping server [{0}: {1}]r   )r   r+   rq   rr   rW   rs   rt   r<   r/   ra   r   r   ry   r,   r   )r   rl   rv   ru   rV   r}   r    r   s           r!   stop_strategyr     s   56[XYZMG((X'XYYY%+mT%a(@A*{R_9FH((UXefjXkkm m m 1[Xe  vC  D%+mTKNML(  !E!UV((X'D}UYGZ'Z[[[;}M  /  -{{:AA(BVBVX`XeXefC((S(1M!!r#   c                    | j                   j                  d       d}t        | |d      }|s,d}| j                   j                  r|ddifS t	        | |      }n|d	   }t        | ||
      r2d}| j                   j                  r|dd|d   z  ifS t        | ||
      }d}| j                   j                  r|dd|d   z  ifS t        | |       t        | |      dv rht        | |      }t        | |       |j                  sBdj                  |j                  |j                        }| j                   j                  |       t        | |      dv rht        | |      }t        | |       |j                  sBdj                  |j                  |j                        }| j                   j                  |       ||fS )NzStarting restart strategyFrj   rk   Trn   z0A server would be created before being rebooted.rT   r   ro   z:Server %s attributes would be changed before rebooting it.r%   zServer %s would be rebooted.)r   z:Error while restarting server that was running [{0}: {1}].r   r   z:Error while restarting server that was stopped [{0}: {1}].)r   r+   rq   rr   rW   rs   rt   r<   r/   r^   r   ry   r,   r   r   )r   rl   ru   rv   rV   r    r   s          r!   restart_strategyr     s   89G[XYZM((X'YZZZ%+mT%a(*{9F9FH ((VYfgkYlln n n 1[Xe  vC  DG$$#AMRVDW#WXXX%+mT{=A\Q!k-P)k-X{{NUUV^VjVjV^VcVceC((S(1{=A\Q!k-P)k-X{{NUUV^VjVjV^VcVceC((S(1M!!r#   )present	restartedr   r   r'   c                    | j                   j                  d       | j                  d|d   |d      }|j                  s8d|j                  d|j
                  }| j                   j                  |       |j
                  d   }|S )	NzGetting inside findrP   rL   )rL   rm   )r   zError during server search: (r(   r   )r   r+   r   r   r,   r   r   )r   rl   rm   r    r   search_resultss         r!   rq   rq   .  s    23y-:O>F2H IH ;;7?7K7KX]][$$$-]]9-Nr#   )ipv6rI   rL   r>   rO   c                 ~   | j                   j                  d       | j                   j                  d|z         | j                   j                  d|z         t        D ci c]  }||v r||v r|||   ||   f }}| j                   j                  d|z         	 t        D ]j  }||v s||v st        ||   t              r*||   r%d||   j                         v r||   d   ||   k7  r yt        ||   t              r^||   ||   k7  sj y yc c}w # t        $ r | j                   j                  d	       Y y w xY w)
Nz/Checking if server attributes should be changedzCurrent Server: %szWished Server: %szDebug dict %sr%   TFz4Error while checking if attributes should be changedr   )r   r+   PATCH_MUTABLE_SERVER_ATTRIBUTES
isinstancedictkeysAttributeErrorr   )r   rV   rl   x
debug_dictkeys         r!   rs   rs   F  su   NO1MAB0=@A 1!}"4 	
M!mA.//J 
 _z9:a2 	 Cm#}(<mC0$7M#<NSW[hil[m[r[r \ T#C(.-2DD#M#$6=-PSBTXefiXjBj	  !"  a$$)_$`as<    DD )D .<D +D ?D D D %D<;D<c                    | j                   j                  d       t               }t        D ]  }||v s||v st	        ||   t              rGd||   v r@||   r;||   j                         D ci c]  }|dk7  s	|||   |    }}||   |d<   |||<   gt	        ||   t              r{||   ||<    | j                  d|d   z  |      }|j                  s8d|j                  d|j                  }| j                   j                  |       	 |j                  d   }t        | |
       |S c c}w # t        $ r, | j                   j                  d	|j                  z         Y Hw xY w)Nz#Starting patching server attributesr%   r&   rQ   z*Error during server attributes patching: (r(   r   r)   rS   rT   )r   r+   r   r   r   r   patchr   r,   r   r   r-   r<   )	r   rV   rl   patch_payloadr   r   key_dictr    r   s	            r!   rt   rt   _  s   BCFM. 
8-C=$8-,d3c@R8RWdehWi>KC>P>U>U>We[\`d[dA}S1!44ee!.s!3%-c"c 2D9%23%7c"
8   l]45H&H&3 ! 5H;;DLDXDXZbZgZgh$$$-m h/ &+mT) f  m$$)[^f^k^k)k$lms   -
D-8D-D2 22E'&E'c           
      4   | j                   d   }| j                   d   | j                   d   | j                   d   | j                   d   | j                   d   | j                   d   | j                   d   | j                   d	   | j                   d
   d	}t        |   d   | j                   d<   t        |       }t        ||d          t	        || j                   d         }|j                  |       t        |d      ||      \  }}| j                  ||       y )Nregionr*   rK   rL   rJ   rH   rI   rN   rM   rO   )	r*   rK   rL   rJ   rH   rI   rN   rM   rO   api_endpointr   )r   rB   )r   rB   )r   rl   )ru   r   )r   r	   r   r"   rF   updatestate_strategy	exit_json)r   r   rl   r   
ip_payloadru   summarys          r!   corer     s   ]]8$Fw'w'f%!==):;}}]3f%n5==+ --(89
M  18HFMM)&)K;g 67 #{fmmT_F`aJ$%mG&<=+ersGW
W'2r#   c                  $   t               } | j                  t        t        d      t               t        dt        t	        j
                                     t        d      t        dd      t        d      t        t        t        j                               d	
      t        ddg       t               t               t        dd      t        dd      t        dd      t                            t        | ddgdg      }t        |       y )NT)required)r   choicesFbool)defaulttyper'   )r   r   )r   r   liststr)r   elementsr   )r   r   inti,     )rK   rL   r   rJ   rH   rB   r*   rI   rN   rM   r1   r2   r3   rO   )rN   rM   )argument_specsupports_check_modemutually_exclusiverequired_one_of)	r
   r   r   r   r	   r   r   r   r   )r   r   s     r!   mainr     s    *,MD!VT40A0F0F0H+IJd+V4x(4 3 3 56	Jvr:Vvu-uc2%3v   # '
 (
	F 	Lr#   __main__)N)rj   ),
__future__r   r   r   r   __metaclass__DOCUMENTATIONEXAMPLESRETURNr5   r8   ansible.module_utils.basicr   Cansible_collections.community.general.plugins.module_utils.datetimer   Cansible_collections.community.general.plugins.module_utils.scalewayr	   r
   r   SCALEWAY_SERVER_STATESr7   r"   r/   r<   rF   rW   r^   ra   rd   r]   rh   rw   r{   r~   r   r   r   rq   r   rs   rt   r   r   __name__ r#   r!   <module>r      s    A @zx"H
   4 S D  D  .X$[,(4!HSUT		"4"JJ$"N/"d/"f  !# a2@36@ zF r#   