
    Vhj4                       d Z ddlmZ ddlmZ ddlZddlZddl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mZmZmZmZmZ dd	lmZmZmZmZmZmZ dd
l m!Z!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/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9 ejt                  dd       Z;ddZ<ddZ=ddZ>ddZ?	 	 	 	 	 	 	 	 	 	 	 	 	 	 d dZ@	 	 	 	 	 	 	 	 	 	 d!dZAy)"z/Delegate test execution to another environment.    )annotationsN   )STATUS_HOST_CONNECTION_ERROR)STANDARD_LOCALE)	make_dirs)CommonConfigEnvironmentConfigIntegrationConfigShellConfig
TestConfigUnitsConfig)SubprocessErrordisplayfilter_argsANSIBLE_LIB_ROOTANSIBLE_TEST_ROOTOutputStream)
ResultType"process_scoped_temporary_directory)get_ansible_bin_path)support_container_contextContainerDatabase)data_context)create_payload)get_ci_provider)OriginConfigPythonConfig)
ConnectionDockerConnectionSshConnectionLocalConnection)	HostState)serialize_content_configc              #    K   t        t        j                  j                         |j                  j
                  }~t        j                  dt        j                  j                        5 }| j                  j                  t        j                  j                  |d             |j                  t        j                  j                  |d             t        | t        j                  j                  |d             t        j                  j                  t        j                  j                  t        j                  j                  |            | _        	 d d| _        	 ddd       y# d| _        w xY w# 1 sw Y   yxY ww)z<Context manager for serialized host state during delegation.zhost-)prefixdirzsettings.datz	state.datz
config.datN)r   r   TMPpathcontroller_profilepythontempfileTemporaryDirectoryhost_settings	serializeosjoinr#   relative_pathbasename	host_path)args
host_stater*   host_dirs       Q/home/dcms/DCMS/lib/python3.12/site-packages/ansible_test/_internal/delegation.pydelegation_contextr8   X   s	     jnn!!" **11F		$	$G9L9L	M 
"QY$$RWW\\(N%KLRWW\\(K@A rww||Hl'KLjnn&B&BBGGDTDTU]D^_	"!DN
" 
" "DN
" 
"s7   A*F,C-E;E/E;&	F/	E88E;;F Fc                   t        | t              sJ t        | |      5  t        | t              r t	               j
                  | j                  _        t        t        j                  j                         t        j                  ddt        j                  j                        5 }t        j                  j                  t        j                  j                   t        j                  j#                  |j$                              | _        | j                  j)                  | j&                         	 t+        | |||       d| _        	 ddd       nt+        | |||       ddd       y# d| _        w xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z:Delegate execution of ansible-test to another environment.z	metadata-z.json)r%   suffixr&   N)
isinstancer	   r8   r   r   codemetadataci_providerr   r   r'   r(   r+   NamedTemporaryFiler/   r0   r1   r2   namemetadata_pathto_filedelegate_command)r4   r5   excluderequiremetadata_fds        r7   delegaterG   n   s2   d-...	D*	- AdJ'(7(9(>(>DMM%jnn))*,,KU_UcUcUhUhi .mx%'WW\\*..2N2NPRPWPWP`P`alaqaqPr%s"%%d&8&89.$T:wH)-D&. . T:w@A A *.D&. .A As=   BF 'B
E42E( E4F (	E11E44E=	9F  F	c           	     	   |j                   j                         }|j                   j                         }t        | j                  t
               }|rt               j                  j                  rGt        j                  j                  |t               j                  j                  j                        }n t        j                  j                  |d      }t        j                  j                  |dd      }t        j                  dd      5 }	t        | |	j                          |j#                  ||	       ddd       n|}t%        |       }t'        | |j                   j(                  ||||      }
t        |t*              r|j,                  }nd}g }t        | t.              rO| j                  j0                  r9t3        d | j4                  D              r| j6                  s|j9                  d	       t;        | |      5 }|r4|j=                  d
t?        j@                  |jC                               g       t        | tD              rlt        |tF              r[d}t        j                  j                  |tH        jJ                  jL                        t        j                  j                  |tH        jN                  jL                        g}|jQ                  ddg|z   d       |jQ                  ddg|z   d       |jQ                  dd|gd       |jQ                  d|dgd       |jQ                  tS        |
|ddgz         d       |jU                         }|jW                         }||D ]  }	 |jY                  |        nt]        j^                  d       |j=                  ddg       ||_0        d}d}	 | jb                  r| jd                  stf        jh                  nd}|jQ                  tS        |
|      d| jd                  |       d}	 |rtm        | |||       |s+|tn        k(  r"|jp                  D ]  }|js                           	 ddd       y# 1 sw Y   xY w# tZ        $ r t]        j^                  d|d       Y w xY w# tZ        $ r}|jj                  } d}~ww xY w# |rtm        | |||       |s,|tn        k(  r"|jp                  D ]  }|js                           w w w xY w# 1 sw Y   yxY w)z4Delegate execution based on the provided host state.ansiblebinzansible-source-.tgzr%   r:   chdirsrcNc              3  4   K   | ]  }|j                     y w)N)
is_managed).0targets     r7   	<genexpr>z#delegate_command.<locals>.<genexpr>   s     QhnRXRcRcQs   z--allow-destructivez--containerspytestmkdirz-pT)capturechmod777755useraddz--create-homez--requirements-modeonlyFzUnable to disconnect network "zr" (this is normal under podman). Tests will not be isolated from the network. Network-related tests may misbehave.zNetwork disconnection is not supported (this is normal under podman). Tests will not be isolated from the network. Network-related tests may misbehave.skipr   )rW   interactiveoutput_stream):r)    get_origin_controller_connectionget_working_directoryr;   
controllerr   r   content
collectionr/   r(   r0   	directoryr+   r?   r   r@   extract_archiver   generate_commandr*   r    settingsr
   rQ   alltargetsallow_destructiveappendr   extendjsondumpsto_dictr   r   r   JUNITr1   COVERAGEruninsert_optionsinspectget_network_namesdisconnect_networkr   r   warninguserdisplay_stderrr^   r   ORIGINALstatusdownload_resultsr   target_profileson_target_failure)r4   r5   rD   rE   conworking_directoryhost_delegationcontent_rootansible_bin_pathpayload_filecommandsshoptions
containerspytest_userwritable_dirs	containernetworksnetworksuccessr|   r_   exrS   s                           r7   rC   rC      s\   

'
'
H
H
JC"55KKM$T__lCCO>!!,,77<<(9<>;Q;Q;\;\;f;fgL77<<(99EL77<<(99eL((0A&Q 	KUa4!2!23&7\J	K 	K )/5tZ%B%B%I%IK[]ikrt{|G#}%llG$)*t/I/IcQrvr~r~QN%%NN01	"4	- >/NNNDJJz7I7I7K,LMN dK(Z=M-N"K \:+;+;+I+IJ\:+>+>+L+LMM
 GGWdOm3TGBGGWe$}4dGCGGWe%67GFGGY_=tGLGGN7G7Lf6U,UV`eGfI 224H#' G..w7  !t u NN16:;"CH	/
 6:5H5HQUQaQaL11gkMGGN7G4eQUQaQaq~GG
  sL'Bv)EE(88 /F,,./{>/ >/)	K 	K` +  -462  	YYF	  sL'Bv)EE(88 /F,,./  F7y>/ >/so   *Q?E0S+0Q!6S+8AR
=S+Q!"RS+RS+
	R%R  R%%R((A S((S++S4c                    g }| D ]9  }|r$|j                  d      r|j                  |       d}|j                  |       ; |S )zRInsert addition command line options into the given command and return the result.--N)
startswithrm   rl   )r   r   resultargs       r7   rt   rt      sH    F s~~d+MM'"Gc M    c                l   t         j                  j                  |t               j                  j
                        }t         j                  j                  t         j                  j                  t               j                  j                  t               j                  j
                              }t         j                  j                  |      }t         j                  j                  |      }t        |       t        j                  dd      5 }	 |j                  |||t        j                  j                         |j!                  d       t#        |       }	|	j%                  ||       ddd       y# t&        $ r%}
|r t)        j*                  d|
        Y d}
~
2d}
~
ww xY w# 1 sw Y   yxY w)	z-Download results from a delegated controller.zansible-test-result-rK   rL   )rN   r@   dstrD   r   rM   z8Failed to download results while handling an exception: N)r/   r(   r0   r   rc   results_pathdirnamerootr2   r   r+   r?   create_archiver   r'   r@   seekr!   rf   r   r   rx   )r4   r   r   r   remote_results_rootlocal_test_rootremote_test_rootremote_results_nameresult_file	local_conr   s              r7   r}   r}      sX   '',,|\^5K5K5X5XYggoobggll<>3I3I3N3NP\P^PfPfPsPs&tuOww':;''**+>?o		$	$,B6	R NVa	N%5<OU`jtjxjxj}j}~ Q'-I%%O%MN N  	] OOVWYVZ[\\	]N Ns6   F*-E9/F*9	F'F"F*"F''F**F3c           	     :   t         j                  j                  |d      g}|j                  g|z   }t        |      }t	        | j
                  t              rt        |       }t        j                  t        t         j                  j                  |d             t        j                  t        t         j                  j                  |d             |j                  |       n|j                  t               t	        | t              r3t         j                  j                  d      }	|	|j                  |	       t!        |      D 
cg c]  }
|
d	||
    }}
d
g|z   |z   }|t#        t%        | | j&                  j(                  ||            z  }|S c c}
w )z8Generate the command necessary to delegate ansible-test.zansible-test)ANSIBLE_TEST_CONTENT_ROOTrI   ansible_test)
PYTHONPATH)LC_ALLTERM)r   =z/usr/bin/env)r/   r(   r0   dictr;   rb   r   r   symlinkr   r   updater   r   environgetsortedlistfilter_optionsr-   filtered_args)r4   r*   r   r   rD   rE   cmdenv_varslibrary_pathtermkeyenv_argss               r7   rg   rg     sR    77<<(.9
:C;;-#
C".H $//<0 :$?


#RWW\\,	%JK


$bggll<&PQ# 	 	
 	" 	 	

 $$zz~~f%OOO&:@:JK33.KHK
X
%
+C4tT%7%7%E%EwPWXYYCJ Ls   Fc              #    K   ddt        | j                        fdd| j                  rdndfddd| j                   fd	d| j                  fg}t        | t              r0|j                  d
ddddddddd| j                  fdd|fdd|fdg       g }t        ||D ci c]	  \  }}}|| c}}}      D ]  }	|	dk(  s|r|j                  |	       |	 ! |D ]_  \  }}
}|s
t        |t              r| t        |t               r||gE d{    <t        |t              sM|D ]  }||gE d{     a | j                  E d{    |E d{    yc c}}}w 7 Q7 07 7 w)z[Return an iterable that filters out unwanted CLI options and injects new ones as requested.z
--truncater   z--coloryesno)z--redactr   Fz--no-redactr   z--host-path)z	--changedr   F)z	--trackedr   F)z--untrackedr   F)z--ignore-committedr   F)z--ignore-stagedr   F)z--ignore-unstagedr   F)z--changed-fromr   F)z--changed-pathr   Fz
--metadataz	--excludez	--require)z--base-branchr   Fr   N)strtruncatecolorredactr3   r;   r   rm   rA   r   rl   boolr   delegate_args)r4   argvrD   rE   replacepass_through_argsoptioncountreplacementr   _countitems               r7   r   r   C  s     
q#dmm,-	A

u5	t{{?+	4>>*QG $
###%,)+((1d001!W%!W%'
 	 $&4RY!Z!Z4NFE;&%-!Z[ $;+$$S)	 (/ 
*#k4(LS),,,T*# *"D>))*
* !!!!   ) "[ - *! s[   BE%E(A#E%EE%"E%.E/E%E!	E%E#E%E%!E%#E%)r4   r	   r5   r"   returnzc.Iterator[None])
r4   r   r5   r"   rD   	list[str]rE   r   r   None)
r4   r	   r5   r"   rD   r   rE   r   r   r   )r   r   r   r   r   r   )
r4   r	   r   r   r   r   r   r   r   r   )r4   r	   r*   r   r   r   r   r   rD   r   rE   r   r   r   )
r4   r	   r   r   rD   r   rE   r   r   zc.Iterable[str])B__doc__
__future__r   collections.abcabcc
contextlibrn   r/   r+   typingt	constantsr   locale_utilr   ior   configr   r	   r
   r   r   r   utilr   r   r   r   r   r   util_commonr   r   ansible_utilr   r   r   r   datar   payloadr   cir   host_configsr   r   connectionsr   r   r    r!   provisioningr"   content_configr#   contextmanagerr8   rG   rC   rt   r}   rg   r    r   r7   <module>r      s$   5 "    	    


 
 " "*A,`/FN41
11 1 	1
 1 1 1h5!
5!
5! 5! 	5!
 5!r   