
    VhA@                        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 d d	lmZ  ej(                  d
dd      5  d dlZddd       e	j,                  d    dk  Z G d d      Zd Zedk(  r e        yy# 1 sw Y   6xY w)    )absolute_importdivisionprint_functionaa  
module: jenkins_node
short_description: Manage Jenkins nodes
version_added: 10.0.0
description:
  - Manage Jenkins nodes with Jenkins REST API.
requirements:
  - "python-jenkins >= 0.4.12"
author:
  - Connor Newton (@phyrwork)
extends_documentation_fragment:
  - community.general.attributes
attributes:
  check_mode:
    support: partial
    details:
      - Check mode is unable to show configuration changes for a node that is not yet present.
  diff_mode:
    support: none
options:
  url:
    description:
      - URL of the Jenkins server.
    default: http://localhost:8080
    type: str
  name:
    description:
      - Name of the Jenkins node to manage.
    required: true
    type: str
  user:
    description:
      - User to authenticate with the Jenkins server.
    type: str
  token:
    description:
      - API token to authenticate with the Jenkins server.
    type: str
  state:
    description:
      - Specifies whether the Jenkins node should be V(present) (created), V(absent) (deleted), V(enabled) (online) or V(disabled)
        (offline).
    default: present
    choices: ['enabled', 'disabled', 'present', 'absent']
    type: str
  num_executors:
    description:
      - When specified, sets the Jenkins node executor count.
    type: int
  labels:
    description:
      - When specified, sets the Jenkins node labels.
    type: list
    elements: str
  offline_message:
    description:
      - Specifies the offline reason message to be set when configuring the Jenkins node state.
      - If O(offline_message) is given and requested O(state) is not V(disabled), an error will be raised.
      - Internally O(offline_message) is set using the V(toggleOffline) API, so updating the message when the node is already
        offline (current state V(disabled)) is not possible. In this case, a warning will be issued.
    type: str
    version_added: 10.0.0
a  
- name: Create a Jenkins node using token authentication
  community.general.jenkins_node:
    url: http://localhost:8080
    user: jenkins
    token: 11eb751baabb66c4d1cb8dc4e0fb142cde
    name: my-node
    state: present

- name: Set number of executors on Jenkins node
  community.general.jenkins_node:
    name: my-node
    state: present
    num_executors: 4

- name: Set labels on Jenkins node
  community.general.jenkins_node:
    name: my-node
    state: present
    labels:
      - label-1
      - label-2
      - label-3

- name: Set Jenkins node offline with offline message.
  community.general.jenkins_node:
    name: my-node
    state: disabled
    offline_message: >-
      This node is offline for some reason.
a  
url:
  description: URL used to connect to the Jenkins server.
  returned: success
  type: str
  sample: https://jenkins.mydomain.com
user:
  description: User used for authentication.
  returned: success
  type: str
  sample: jenkins
name:
  description: Name of the Jenkins node.
  returned: success
  type: str
  sample: my-node
state:
  description: State of the Jenkins node.
  returned: success
  type: str
  sample: present
created:
  description: Whether or not the Jenkins node was created by the task.
  returned: success
  type: bool
deleted:
  description: Whether or not the Jenkins node was deleted by the task.
  returned: success
  type: bool
disabled:
  description: Whether or not the Jenkins node was disabled by the task.
  returned: success
  type: bool
enabled:
  description: Whether or not the Jenkins node was enabled by the task.
  returned: success
  type: bool
configured:
  description: Whether or not the Jenkins node was configured by the task.
  returned: success
  type: bool
N)ElementTree)AnsibleModule)	to_native)depszpython-jenkinsz3python-jenkins is required to interact with Jenkinsz&https://opendev.org/jjb/python-jenkins)reasonurl   c                   8    e Zd Zd Zd Zd Zd	dZd Zd Zd Z	y)
JenkinsNodec                 4   || _         |j                  d   | _        |j                  d   | _        |j                  d   | _        |j                  d   | _        |j                  d   | _        |j                  d   | _        |j                  d   | _        |j                  d   | _	        | j                  I| j                  j                         | _	        | j                  d	k7  r| j                   j                  d
       | j                  @| j                  D ]1  }d|v s| j                   j                  dj                  |             3 | j                         | _        d| j                  | j
                  | j                  | j                  dddddg d| _        y )Nnamestatetokenuserr   num_executorslabelsoffline_messagedisabledz6can not set offline message when state is not disabled z4labels must not contain spaces: got invalid label {}F)changedr   r   r   r   createddeletedr   enabled
configuredwarnings)moduleparamsr   r   r   r   r   r   r   r   strip	fail_jsonformatget_jenkins_instanceinstanceresult)selfr   labels      r/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/modules/jenkins_node.py__init__zJenkinsNode.__init__   s_   MM&)	]]7+
]]7+
MM&)	=='#]]?;mmH-%}}->?+#'#7#7#=#=#?D zzZ'%%&^_;;" p%<KK))*`*g*ghm*nop 11388IIIIZZ
    c                    	 | j                   rA| j                  r5t        j                  | j                  | j                   | j                        S | j                   r6| j                  s*t        j                  | j                  | j                         S t        j                  | j                        S # t
        $ r2}| j                  j                  dt        |      z         Y d }~y d }~ww xY w)Nz'Unable to connect to Jenkins server, %s)msg)	r   r   jenkinsJenkinsr   	Exceptionr   r"   r   )r'   es     r)   r$   z JenkinsNode.get_jenkins_instance   s    	`yyTZZtxxDJJGG4::txx;;txx00 	`KK!!&OR[\]R^&^!__	`s%   AB0 AB0 B0 0	C+9(C&&C+c                    |s"| j                   j                  st        d      y d}| j                  j	                  | j
                        }t        j                  |      }| j                  s|j                  d      }|t        j                  |d      }|j                  "t        |j                        | j                  k7  rt        | j                        |_        d}| j                  |j                  d      }|t        j                  |d      }g }|j                  r|j                  j                         }|| j                  k7  r"dj!                  | j                        |_        d}|rYt"        rt        j$                  |      }nt        j$                  |d      }| j                  j'                  | j
                  |       || j(                  d	<   |rd| j(                  d
<   y y )Nz5configure_node present is False outside of check modeFnumExecutorsTr(   r   unicode)encodingr   r   )r   
check_moder0   r%   get_node_configr   et
fromstringr   find
SubElementtextintstrr   splitjoinIS_PYTHON_2tostringreconfig_noder&   )r'   presentr   datarootelemr   s          r)   configure_nodezJenkinsNode.configure_node   s    ;;)) WXX
}},,TYY7}}T")99^,D|}}T>:yy C		Nd6H6H$H 2 23	!
;;"99W%D|}}T73Fyy*$HHT[[1	!
{{4({{4)<MM''		48$.L!%)DKK	" r+   c                      fd} j                   j                   j                        }d}|s! j                  j                  s	 |        d}d}|r j                  |       | j                  d<   |rd j                  d<   |S )zAssert node present.

        Args:
            configure: If True, run node configuration after asserting node present.

        Returns:
            True if the node is present, False otherwise (i.e. is check mode).
        c                     	 j                   j                  j                  t        j                         y # t        j
                  $ r} j                   j                  j                        s;j                  j                  dt        |       z  t        j                                j                  d   j                  d       Y d } ~ y d } ~ ww xY w)N)launcherzCreate node failed: %sr-   	exceptionr   zzsuppressed 401 Not Authorized on redirect after node created: see https://review.opendev.org/c/jjb/python-jenkins/+/931707)r%   create_noder   r.   LAUNCHER_SSHJenkinsExceptionnode_existsr   r"   r   	traceback
format_excr&   appendr1   r'   s    r)   rN   z-JenkinsNode.present_node.<locals>.create_node  s    ))$))g>R>R)S++ 
 }}00;KK)).FST.Uajauauaw)x J'.. Q 
s   59 CA>CCFTr   r   )r%   rQ   r   r   r6   rH   r&   )r'   	configurerN   rD   r   s   `    r)   present_nodezJenkinsNode.present_node  s{    	 --++DII6;;))G(!(I%)DKK	"r+   c                       fd} j                   j                   j                        }d}|r j                  j                  s |        d}| j
                  d<   |rd j
                  d<   y y )Nc                     	 j                   j                  j                         y # t        j                  $ r} j                   j                  j                        r;j                  j                  dt        |       z  t        j                                j                  d   j                  d       Y d } ~ y d } ~ ww xY w)NzDelete node failed: %srL   r   zzsuppressed 401 Not Authorized on redirect after node deleted: see https://review.opendev.org/c/jjb/python-jenkins/+/931707)r%   delete_noder   r.   rP   rQ   r   r"   r   rR   rS   r&   rT   rU   s    r)   rZ   z,JenkinsNode.absent_node.<locals>.delete_node2  s    ))$))4++ 
 ==,,TYY7KK)).FST.Uajauauaw)x J'.. Q 
s   %) CA>B??CFTr   r   )r%   rQ   r   r   r6   r&   )r'   rZ   rD   r   s   `   r)   absent_nodezJenkinsNode.absent_node1  se    	 --++DII6;;))G!(I%)DKK	" r+   c                       fd j                         }d}|r/ fd}        }|rC j                  j                  s |        d}n# j                  j                  st        d      d}| j                  d<   |rd j                  d<   y y )Nc                  T     j                   j                   j                        d   S )Noffliner%   get_node_infor   )r'   s   r)   get_offlinez-JenkinsNode.enabled_node.<locals>.get_offlineN  s!    ==..tyy9)DDr+   Fc                  V   	 j                   j                  j                         y # t        j                  $ rl}         }|r;j
                  j                  dt        |       z  t        j                                j                  d   j                  d       Y d } ~ y d } ~ ww xY w)NzEnable node failed: %srL   r   zzsuppressed 401 Not Authorized on redirect after node enabled: see https://review.opendev.org/c/jjb/python-jenkins/+/931707)r%   enable_noder   r.   rP   r   r"   r   rR   rS   r&   rT   )r1   r^   ra   r'   s     r)   rc   z-JenkinsNode.enabled_node.<locals>.enable_nodeV  s    MM--dii8//  *mG--2JYWX\2Yeneyeye{-| KK
+22 U s   %) B(A"B##B(Tz3enabled_node present is False outside of check moder   r   )rW   r   r6   r0   r&   )r'   rD   r   rc   r^   ra   s   `    @r)   enabled_nodezJenkinsNode.enabled_nodeM  s    	E ##%" "mG{{--M ;;)) UVVG!(I%)DKK	" r+   c                      fd j                  d      }d}d}|r}        \  } j                  > j                  k7  r/|r j                  d   j                  d       n j                  d} fd}|sC j                  j
                  s |        d}n# j                  j
                  st        d      d}|rd}| j                  d<   |rd j                  d	<    j                  |       y )
Nc                  j    j                   j                  j                        } | d   }| d   }||fS )Nr^   offlineCauseReasonr_   )infor^   r   r'   s      r)   get_offline_infoz3JenkinsNode.disabled_node.<locals>.get_offline_infoz  s:    ==..tyy9D9oG"#78OO++r+   Fr   z5unable to change offline message when already offlineTc                  ^   	 j                   j                  j                         y # t        j                  $ ro}         \  }}|s;j
                  j                  dt        |       z  t        j                                j                  d   j                  d       Y d } ~ y d } ~ ww xY w)NzDisable node failed: %srL   r   z{suppressed 401 Not Authorized on redirect after node disabled: see https://review.opendev.org/c/jjb/python-jenkins/+/931707)r%   disable_noder   r.   rP   r   r"   r   rR   rS   r&   rT   )r1   r^   _offline_messageri   r   r'   s      r)   rk   z/JenkinsNode.disabled_node.<locals>.disable_node  s    MM..tyy/J//  1A0B-G-"--2KiXYl2Zfofzfzf|-} KK
+22 V s   &* B,A%B''B,z4disabled_node present is False outside of check moder   r   )rW   r   r&   rT   r   r6   r0   rH   )r'   rD   r   r   r^   rk   ri   r   s   `     @@r)   disabled_nodezJenkinsNode.disabled_nodey  s    	, ##E*'7'9$G_##/D4H4HO4[ KK
+22O '+&:&:O"G" {{-- N
 ;;)) VWWHG"*J%)DKK	"G$r+   N)T)
__name__
__module____qualname__r*   r$   rH   rW   r[   rd   rm    r+   r)   r   r      s+    $
L	`**X(T*8**XI%r+   r   c                  8   t        t        t        dd      t        d      t               t        d      t        g dd	      t        d
      t        dd      t        d            d      } t        j                  |        t	        |       }| j
                  j                  d      }|dk(  r|j                          n<|dk(  r|j                          n&|dk(  r|j                          n|j                           | j                  di |j                   y )NTr>   )requiredtypezhttp://localhost:8080)default)no_log)r   r   rD   absentrD   )choicesru   r=   )rt   list)rt   elements)r   r   r   r   r   r   r   r   )argument_specsupports_check_moder   r   r   rq   )r   dictr	   validater   r    getrd   rm   rW   r[   	exit_jsonr&   )r   jenkins_noder   s      r)   mainr     s    t%045d#KU^_E*Ve4 e,	
 !F 	MM&v&LMMg&E	!!#	*	""$	)	!!#  "F+|**+r+   __main__)
__future__r   r   r   rt   __metaclass__DOCUMENTATIONEXAMPLESRETURNsysrR   	xml.etreer   r8   ansible.module_utils.basicr   +ansible.module_utils.common.text.convertersr   :ansible_collections.community.general.plugins.module_utilsr	   declarer.   version_inforA   r   r   rn   rq   r+   r)   <module>r      s    A @>@@)
V   ' 4 A KT\\@0 
  q!Q&Y% Y%x,@ zF O
 s   BB