
    Vh<                       d dl mZ d dlmZ d dlmZ d dlmZ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 d d	lmZ d d
lmZ d dl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#  e#       Z$dgZ% G d dee!e      Z&y)    )annotations)	constants)context)AnsibleParserErrorAnsibleAssertionError)	to_native)is_sequence)binary_typestring_types	text_type)NonInheritableFieldAttribute)Base)Block)CollectionSearch)load_list_of_blocksload_list_of_roles)Role)Task)Taggable)DisplayPlayc                  l    e Zd ZdZ eddedd      Z eddd      Z edded	      Z ed
dd      Z	 edd      Z
 eded      Z eded      Z eded      Z eded      Z eded      Z eded      Z eded      Z ed ej(                  d      d      Z edd      Z eded      Z edej2                  d      Z edd      Z fdZd Zd Zd Ze d,d       Z! f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.d' Z/d( Z0 fd)Z1 fd*Z2 fd+Z3 xZ4S )-r   z
    A play is a language feature that represents a list of roles and/or
    task/handler blocks to execute on a given set of hosts.

    Usage:

       Play.load(datastructure) -> Play
       Play.something(...)
    listT)isarequiredlistofalways_post_validatepriorityboolN)r   defaultr   )r   r!   r   r   intstring)r   r!   c   )r   r!   r   FZ   force_handlerspercent)r   r   c                P   t         t        |           d | _        d | _        g | _        i | _        t        t        j                  j                  dg             xs t        d      | _        t        t        j                  j                  dg             | _        i | _        i | _        y )Ntags)all	skip_tags)superr   __init___included_conditional_included_path_removed_hosts
role_cachesetr   CLIARGSget	frozenset	only_tagsr,   _action_groups_group_actions)self	__class__s    E/home/dcms/DCMS/lib/python3.12/site-packages/ansible/playbook/play.pyr.   zPlay.__init__U   s    dD"$%)"" W__00<=T8ATW__00bAB      c                "    | j                         S N)get_namer:   s    r<   __repr__zPlay.__repr__c   s    }}r=   c                    d| j                   v r|st        d      t        |      rF|D ]@  }|t        d      t        |t        t
        f      r't        dj                  |             y t        |t        t
        f      st        d      y y )Nhostsz6Hosts list cannot be empty. Please check your playbookzFHosts list cannot contain values of 'None'. Please check your playbookz5Hosts list contains an invalid host value: '{host!s}')hostzDHosts list must be a sequence or string. Please check your playbook.)_dsr   r	   
isinstancer
   r   format)r:   	attributenamevalueentrys        r<   _validate_hostszPlay._validate_hostsf   s    dhh()abb5!" }E}01yzz'Y/GH01h1o1ouz1o1{||	}  Y'?@()opp A r=   c                    | j                   r| j                   S t        | j                        r,dj                  | j                        | _         | j                   S | j                  xs d| _         | j                   S )z return the name of the Play , )rJ   r	   rD   joinrA   s    r<   r@   zPlay.get_namew   s[    9999tzz",DI yy 

(bDIyyr=   c                l    t               }|r|j                         |_        |j                  | ||      S )N)variable_managerloader)r   copyvars	load_data)datarS   rT   rV   ps        r<   loadz	Play.load   s/    FYY[AF{{42B6{RRr=   c                    t        |t              st        d|dt        |            d|v rd|v rt	        d|      |d   |d<   |d= t
        t        |   |      S )zH
        Adjusts play datastructure to cleanup old/legacy items
        zwhile preprocessing data (z!), ds should be a dict but was a userremote_userzkboth 'user' and 'remote_user' are set for this play. The use of 'user' is deprecated, and should be removedobj)rG   dictr   typer   r-   r   preprocess_data)r:   dsr;   s     r<   rb   zPlay.preprocess_data   s{    
 "d#'moquvxqy(z{{
 R< "( *bgik k !#6
B}6
T4044r=   c                    	 t        || | j                  | j                        S # t        $ r)}t	        dt        |      z  | j                  |      d}~ww xY w)
        Loads a list of blocks from a list which may be mixed tasks/blocks.
        Bare tasks outside of a block are given an implicit block.
        rc   playrS   rT   z9A malformed block was encountered while loading tasks: %sr_   orig_excN)r   _variable_manager_loaderAssertionErrorr   r   rF   r:   attrrc   es       r<   _load_taskszPlay._load_tasks   sf    
	K&"4$J`J`imiuiuvv 	K$%`clmnco%ouyu}u}  IJ  K  K	Ks   "% 	A$AAc                    	 t        || | j                  | j                        S # t        $ r}t	        d| j
                  |      d}~ww xY w)re   rf   z9A malformed block was encountered while loading pre_tasksrh   Nr   rj   rk   rl   r   rF   rm   s       r<   _load_pre_taskszPlay._load_pre_tasks   sP    
	|&"4$J`J`imiuiuvv 	|$%`fjfnfnyz{{	|   "% 	AAAc                    	 t        || | j                  | j                        S # t        $ r}t	        d| j
                  |      d}~ww xY w)re   rf   z:A malformed block was encountered while loading post_tasksrh   Nrr   rm   s       r<   _load_post_taskszPlay._load_post_tasks   sP    
	}&"4$J`J`imiuiuvv 	}$%agkgogoz{||	}rt   c           
         	 | j                  | j                  t        || d| j                  | j                        d      S # t
        $ r}t        d| j                  |      d}~ww xY w)z
        Loads a list of blocks from a list which may be mixed handlers/blocks.
        Bare handlers outside of a block are given an implicit block.
        T)rc   rg   use_handlersrS   rT   )prependz8A malformed block was encountered while loading handlersrh   N)_extend_valuehandlersr   rj   rk   rl   r   rF   rm   s       r<   _load_handlerszPlay._load_handlers   s    
	{%%#r4Z^ZpZpy}  zF  zF  G &  
  	{$%_eiememxyzz	{s   ?A 	A(A##A(c                N   |g }	 t        || | j                  | j                  | j                        }g }|D ](  }|j                  t        j                  ||              * || j                  dd | j                  S # t        $ r}t        d| j                  |      d}~ww xY w)z
        Loads and returns a list of RoleInclude objects from the datastructure
        list of role definitions and creates the Role from those objects
        N)rg   rS   rT   collection_search_listz-A malformed role declaration was encountered.rh   rg   r   )r   rj   rk   collectionsrl   r   rF   appendr   rZ   roles)r:   rn   rc   role_includesro   r   ris          r<   _load_roleszPlay._load_roles   s     :B	p.rtOeOe6:ll[_[k[kmM
  	3BLL2D12	3 

2Azz  	p$%TZ^ZbZbmnoo	ps   .A> >	B$BB$c                    ddl m}  ||      }g }|D|D ]?  }d|vrt        d|      |D ]  }|dvst        d|z  |       |j                  |       A |S )Nr   )preprocess_varsrJ   z6Invalid vars_prompt data structure, missing 'name' keyr^   )	rJ   promptr!   privateconfirmencrypt	salt_sizesaltunsafez>Invalid vars_prompt data structure, found unsupported key '%s')ansible.vars.managerr   r   r   )r:   rn   rc   r   new_dsvars_promptsprompt_datakeys           r<   _load_vars_promptzPlay._load_vars_prompt   s    8 $% 1,,-ekmnn& AC"01qtw1w}  A  AA ##K01 r=   c                    g }t        | j                        dkD  r?| j                  D ]0  }|j                  r|j                  |j	                  |              2 |S )a|  
        Handles the role compilation step, returning a flat list of tasks
        with the lowest level dependencies first. For example, if a role R
        has a dependency D1, which also has a dependency D2, the tasks from
        D2 are merged first, followed by D1, and lastly by the tasks from
        the parent role R last. This is done for all roles in the Play.
        r   r   )lenr   from_includeextendcompiler:   
block_listrs      r<   _compile_roleszPlay._compile_roles   sY     
tzz?QZZ 8 >>!!!)))"678 r=   c                    g }t        | j                        dkD  r?| j                  D ]0  }|j                  r|j                  |j	                  |              2 |S )z
        Handles the role handler compilation step, returning a flat list of Handlers
        This is done for all roles in the Play.
        r   r   )r   r   r   r   get_handler_blocksr   s      r<   compile_roles_handlerszPlay.compile_roles_handlers	  s\     
tzz?QZZ C>>!!!"6"6D"6"ABC
 r=   c                   t        j                  ddi| | j                  | j                        }|j                  D ]	  }d|_         g }| j                  rt               }d|_        d|j                  d<   d|_        |j                  | j                         t        |       }| j                  xs |g|_        |g|_        |j                  |       | j                         | j                  z   }t        |       }|xs |g|_        |g|_        |j                  |       t        |       }| j                   xs |g|_        |g|_        |j                  |       |S |j#                  | j                         |j                  |       |j#                  | j                                |j#                  | j                         |j                  |       |j#                  | j                          |j                  |       |S )z
        Compiles and returns the task list for this play, compiled from the
        roles (which are themselves compiled recursively) and/or the list of
        tasks specified in the play.
        metaflush_handlers)rX   rg   rS   rT   Tnoop_raw_paramsr   )r   rZ   rj   rk   blockimplicitr'   r   actionargs
set_loader	pre_tasksalwaysr   r   tasks
post_tasksr   )r:   flush_blocktaskr   	noop_taskbr   s          r<   r   zPlay.compile  s    jj*+!33<<	
  %% 	!D DM	! 
I%I,2INN=)!%I  .4 Ann3AG#}AHa '')DJJ6E4 A*	{AG#}AHa 4 Aoo4)AG#}AHa $..)+&$--/0$**%+&$//*+&r=   c                6    | j                   j                         S r?   )rV   rU   rA   s    r<   get_varszPlay.get_varsQ  s    yy~~r=   c                    | j                   g S t        | j                   t              s| j                   gS | j                   S r?   )
vars_filesrG   r   rA   s    r<   get_vars_fileszPlay.get_vars_filesT  s6    ??"IDOOT2OO$$r=   c                     | j                   d d  S r?   )r{   rA   s    r<   get_handlerszPlay.get_handlers[  s    }}Qr=   c                     | j                   d d  S r?   )r   rA   s    r<   	get_roleszPlay.get_roles^  s    zz!}r=   c                   g }| j                   | j                  z   | j                  z   D ]Y  }t        |t              r6|j                  |j                  |j                  z   |j                  z          I|j                  |       [ |S r?   )	r   r   r   rG   r   r   r   rescuer   )r:   tasklistr   s      r<   	get_taskszPlay.get_tasksa  sk    NNTZZ/$//A 	&D$&

T[[ 84;; FG%		&
 r=   c                    t         t        |          }g }| j                         D ]!  }|j	                  |j                                # ||d<   | j
                  |d<   | j                  |d<   | j                  |d<   |S )Nr   included_pathaction_groupsgroup_actions)r-   r   	serializer   r   r0   r8   r9   )r:   rX   r   roler;   s       r<   r   zPlay.serializej  s~    T4*,NN$ 	+DLL)*	+W $ 3 3_ $ 3 3_ $ 3 3_r=   c                n   t         t        |   |       |j                  dd       | _        |j                  di       | _        |j                  di       | _        d|v rX|j                  dg       }g }|D ].  }t               }|j                  |       |j                  |       0 t        | d|       |d= y y )Nr   r   r   r   )
r-   r   deserializer5   r0   r8   r9   r   r   setattr)r:   rX   	role_datar   r   r   r;   s         r<   r   zPlay.deserializew  s    dD%d+"hh="hh;"hh;d?"-IE!  Fd#Q 
 D'5)W r=   c                    t         t        |          }| j                  j                         |_        | j                  |_        | j
                  |_        | j                  |_        | j                  |_        |S r?   )r-   r   rU   r2   r/   r0   r8   r9   )r:   new_mer;   s     r<   rU   z	Play.copy  sd    tT') OO002'+'A'A$ $ 3 3 $ 3 3 $ 3 3r=   )NNN)5__name__
__module____qualname____doc__r   r   rD   gather_factsgather_subsetgather_timeout	fact_pathr   r   vars_promptr   r{   r   r   r   r   cliargs_deferred_getr'   max_fail_percentageserialCDEFAULT_STRATEGYstrategyorderr.   rB   rM   r@   staticmethodrZ   rb   rp   rs   rv   r|   r   r   r   r   r   r   r   r   r   r   r   r   rU   __classcell__)r;   s   @r<   r   r   *   s    )Vd<nr}  AE 0FD_cdL0VTR^uyzM1eT`deN,4HI .&$QSTJ.64^cdK )VTBOE ,rRH,PRSI-&$QSTJ(VTBOE 2fFbgFbFbcsFt  LP  QN69[_`)fdY]^F+!BTBTkopH(XDQE!q"
 S S5.K|}{. * 6p  " r=   N)'
__future__r   ansibler   r   r   ansible.errorsr   r   +ansible.module_utils.common.text.convertersr   'ansible.module_utils.common.collectionsr	   ansible.module_utils.sixr
   r   r   ansible.playbook.attributer   ansible.playbook.baser   ansible.playbook.blockr   !ansible.playbook.collectionsearchr   ansible.playbook.helpersr   r   ansible.playbook.roler   ansible.playbook.taskr   ansible.playbook.taggabler   ansible.utils.displayr   display__all__r    r=   r<   <module>r      s]   $ # "  D A ? I I C & ( > L & & . )
) (e4+ er=   