
    Vh=Z                    J   d Z ddlmZ ddl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mZ ddlmZmZmZmZmZ ddlmZ ddlmZmZmZ dd	lmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, dd
l-m.Z. d#dZ/d$dZ0d%dZ1d&dZ2 G d de      Z3 G d de      Z4 G d de      Z5 G d de      Z6 ejn                  d       G d d             Z8 G d dejr                        Z:	 	 	 	 	 	 	 	 d'dZ;	 	 	 	 	 	 	 	 d(dZ<d)dZ=	 	 	 	 	 	 d*d Z>	 	 	 	 	 	 	 	 d+d!Z?	 	 	 	 	 	 d,d"Z@y)-zUProvides compatibility with first-generation host delegation options in ansible-test.    )annotationsN   )CONTROLLER_PYTHON_VERSIONSSUPPORTED_PYTHON_VERSIONS)ApplicationErrordisplayfilter_argssorted_versionsstr_to_version)docker_available)docker_completionremote_completionfilter_completion)ControllerConfigControllerHostConfigDockerConfigFallbackDetailFallbackReason
HostConfigHostContextHostSettingsNativePythonConfigNetworkInventoryConfigNetworkRemoteConfigOriginConfigPosixRemoteConfigVirtualPythonConfigWindowsInventoryConfigWindowsRemoteConfig)data_contextc                    | |v r| S dS )zqIf a Python version is given and is in the given version list, return that Python version, otherwise return None.N )versionversionss     Q/home/dcms/DCMS/lib/python3.12/site-packages/ansible_test/_internal/cli/compat.pyfilter_pythonr&   ;   s    )73t3    c                "    t        | t              S )zsIf a Python version is given and is supported by the controller, return that Python version, otherwise return None.)r&   r   )r#   s    r%   controller_pythonr)   @   s    "<==r'   c                     d} t        t                     j                         D cg c]!  }|j                  s|j                  | k(  s |# }}t        |d d      d   }|j                  S c c}w )z7Return the remote fallback platform for the controller.freebsdc                ,    t        | j                        S N)r   r#   )values    r%   <lambda>z0get_fallback_remote_controller.<locals>.<lambda>I   s    N5==4Q r'   T)keyreverser   )r   r   valuescontroller_supportedplatformsortedname)r4   item
candidatesfallbacks       r%   get_fallback_remote_controllerr:   E   s    H#45F5H#I#P#P#R  O4VZVoVotx  uB  uB  FN  uN$  OJ  Oj&Q[_`abcH== Os   A,A,A,c                :    | dk(  rd} d| j                  dd       S )z=Return a command-line option name from the given option name.targetstargetz--_-)replacer6   s    r%   get_option_namerB   M   s(    yS#&'((r'   c                  $     e Zd ZdZd fdZ xZS )PythonVersionUnsupportedErrorzQA Python version was requested for a context which does not support that version.c           
     T    t         |   d| d| ddj                  |              y )NzPython z" is not supported by environment `z$`. Supported Python version(s) are: z, super__init__join)selfcontextr#   r$   	__class__s       r%   rH   z&PythonVersionUnsupportedError.__init__X   sM    77)+MgYVz{  |E  |E  FN  |O  {P  Q  	Rr'   )rK   strr#   rM   r$   c.Iterable[str]returnNone__name__
__module____qualname____doc__rH   __classcell__rL   s   @r%   rD   rD   U   s    [R Rr'   rD   c                  $     e Zd ZdZd fdZ xZS )PythonVersionUnspecifiedErrorzfA Python version was not specified for a context which is unknown, thus the Python version is unknown.c                ,    t         |   d| d       y )NEnvironment `z` is unknown. Use a predefined environment instead. Alternatively, to use an unknown environment, use the `--python` option to specify a Python version.rG   rH   rJ   rK   rL   s     r%   rH   z&PythonVersionUnspecifiedError.__init___   s#    G9 %s t	
r'   rK   rM   rO   rP   rQ   rW   s   @r%   rY   rY   \   s    p
 
r'   rY   c                  $     e Zd ZdZd fdZ xZS )ControllerNotSupportedErrorzOption(s) were specified which do not provide support for the controller and would be ignored because they are irrelevant for the target.c                ,    t         |   d| d       y )Nr[   z@` does not provide a Python version supported by the controller.r\   r]   s     r%   rH   z$ControllerNotSupportedError.__init__i   s    =	1qrsr'   r^   rQ   rW   s   @r%   r`   r`   f   s     Tt tr'   r`   c                  $     e Zd ZdZd fdZ xZS )OptionsConflictErrorz;Option(s) were specified which conflict with other options.c                n    t         |   ddj                  |       ddj                  |       d       y )Nz	Options ` z#` cannot be combined with options `z`.rF   )rJ   firstsecondrL   s      r%   rH   zOptionsConflictError.__init__p   s8    9SXXe_$55XY\YaYabhYiXjjlmnr'   )rf   rN   rg   rN   rO   rP   rQ   rW   s   @r%   rc   rc   m   s    Eo or'   rc   T)frozenc                  >   e Zd ZU dZdZded<   dZded<   dZded<   dZded<   dZ	ded	<   dZ
ded
<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   edd       Zedd       Zedd       Zd dZy)!LegacyHostOptionszhLegacy host options used prior to the availability of separate controller and target host configuration.Nt.Optional[str]pythonpython_interpreterzt.Optional[bool]localvenvvenv_system_site_packagesremoteremote_providerremote_archdockerdocker_privilegeddocker_seccompzt.Optional[int]docker_memoryzt.Optional[list[str]]windowsr4   z!t.Optional[list[tuple[str, str]]]platform_collectionplatform_connection	inventoryc           	         t        j                  t              D ci c]$  }|j                  t	        | |j                  d      & }}|d   dk(  rd|d<   t        di |S c c}w )z4Create legacy host options from the given namespace.Nrl   defaultr"   )dataclassesfieldsrj   r6   getattr)	namespacefieldkwargss      r%   createzLegacyHostOptions.create   sf     Q\PbPbctPuvu%**giTBBvv(y(#F8 *6** ws   )Ac                    t        j                  t              D ]/  }t        | |j                        st        | |j                         1 y)z:Purge legacy host options fields from the given namespace.N)r~   r   rj   hasattrr6   delattr)r   r   s     r%   purge_namespacez!LegacyHostOptions.purge_namespace   s;     !''(9: 	/Ey%**-	5::.	/r'   c                    t        j                  t              }|D ci c]=  }t        |j                        |j
                  t        j                  t           u rdnd? }}t        | |      S c c}w )z@Purge legacy host options from the given command line arguments.r      )
r~   r   rj   rB   r6   typetOptionalboolr	   )argsr   r   filterss       r%   
purge_argszLegacyHostOptions.purge_args   se     1<0B0BCT0Ux~"ot?5::#>UZZSTS]S]^bScEcij#j""4)) #@s   AA.c                l     t        j                         }t        t         fd|D                    }|S )z0Return a tuple of the command line options used.c              3  v   K   | ]0  }t        |j                        st        |j                         2 y wr-   )r   r6   rB   ).0r   rJ   s     r%   	<genexpr>z5LegacyHostOptions.get_options_used.<locals>.<genexpr>   s,     luRYZ^`e`j`jRkuzz:ls   99)r~   r   tupler5   )rJ   r   optionss   `  r%   get_options_usedz"LegacyHostOptions.get_options_used   s-    0;0B0B40Hlllmr'   )r   2t.Union[argparse.Namespace, types.SimpleNamespace]rO   rj   )r   r   rO   rP   )r   	list[str]rO   r   )rO   ztuple[str, ...])rR   rS   rT   rU   rl   __annotations__rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   r4   ry   rz   r{   staticmethodr   r   r   r   r"   r'   r%   rj   rj   t   s    r"FO"*.."E"!D
!26/6"FO"'+O_+#'K'"FO"*.'.&*NO*%)M?)%)G")&*H#*=A:A=A:A!%I%+ + / / * *r'   rj   c                  F   e Zd ZdZ ej
                         Z ej
                         Z ej
                         Z ej
                         Z	 ej
                         Z
 ej
                         Z ej
                         Zedd       Zedd       Zedd       Zedd       Zy)
TargetModez,Type of provisioning to use for the targets.c                d    | t         j                  t         j                  t         j                  fv S )zUReturn True if only one host (the controller) should be used, otherwise return False.)r   SANITYUNITS
NO_TARGETSrJ   s    r%   one_hostzTargetMode.one_host   s(     
)):+;+;Z=R=RSSSr'   c                d    | t         j                  t         j                  t         j                  fv S )zReturn True if no fallback is acceptable for the controller (due to options not applying to the target), otherwise return False.)r   WINDOWS_INTEGRATIONNETWORK_INTEGRATIONr   r   s    r%   no_fallbackzTargetMode.no_fallback   s)     
66
8V8VXbXmXmnnnr'   c                F    | t         j                  t         j                  fv S )zEReturn True if multiple Python versions are allowed, otherwise False.)r   r   r   r   s    r%   multiple_pythonszTargetMode.multiple_pythons   s      
)):+;+;<<<r'   c                    | t         j                  t         j                  t         j                  t         j                  fv S )z6Return True if this mode uses Python, otherwise False.)r   POSIX_INTEGRATIONr   r   SHELLr   s    r%   
has_pythonzTargetMode.has_python   s1     
44j6G6GIYIY[e[k[klllr'   N)rO   r   )rR   rS   rT   rU   enumautor   r   r   r   r   r   r   propertyr   r   r   r   r"   r'   r%   r   r      s    6#$))+#$))+!		TYY[FDIIKEDIIKEJT T o o = = m mr'   r   c           	     b   t         j                  |      }|j                  |       g d}|j                         }|D cg c]	  }|| v s| }}|r|rt	        ||      t        ||      \  }}	}
|
rM|j                  r"t        j                  |
j                  d       nt        j                  |
j                         |t        j                  t        j                  fv xr t        |       }n{|j                  xs
 t!               }d}
|t        j"                  k(  rg }	d}nI|j$                  r|j$                  }	d}n.t'        ||      }	|t        j                  t        j                  fv }||_        |	|_        |rht)        j*                  t,        t.           |	      }t1        t-        t3        t4              |D ch c]  }|j6                  j8                   c}z
              }ng }|j;                  |       }t=        ||D ci c]  }|d c}      }t?        ||	|||
      }|S c c}w c c}w c c}w )zTConvert pre-split host arguments in the given namespace to their split counterparts.)z--controllerz--targetz--target-pythonz--target-posixz--target-windowsz--target-networkr   )	verbosityNF)
controllerr<   skipped_python_versionsfiltered_argscontroller_fallback) rj   r   r   r   rc   get_legacy_host_configr   r   infomessagewarningr   r   r   native_pythonr   r   r   r<   default_targetsr   castlistr   r
   setr   rl   r#   r   r	   r   )argvr   modeold_optionsnew_optionsused_old_optionsr6   used_new_optionsr   r<   r   used_default_pythonscontrol_targetsr=   r   r   host_settingss                    r%   convert_legacy_argsr      s     $**40K%K #335)4EEE&'79IJJ3I$P[3\0
G0}}088AF 3 ; ;<#
(9(9:;K;K'LLoUbcnUoQo__6
":(((G#( \\llG#( %dJ7G#'J,=,=z?O?O+P#P  DODL&&&6!7A"1$s;T7U  ~M  YNsyY_YfYfYnYn  YN  8N  3O  #P"$**40MK/PDa/PQM  7#/M c FD YN
 0Qs   	H"	H"7H'?
H,
c                V    t        |      }|rt        |      g}|S t        | |      }|S )z0Return the configuration for controller targets.rl   )r   r   r   )r   r   r   rl   r<   s        r%   controller_targetsr     s:     7#F #623 N "$
3Nr'   c                v    | j                   s| j                  syt        | j                   | j                        S )z[Return a NativePythonConfig for the given version if it is not None, otherwise return None.N)r#   path)rl   rm   r   )r   s    r%   r   r   #  s+    >>'"<"<gnn7;U;UVVr'   c           
        d}d}t               }d}|j                  rt        |j                        s|j                  s0t	        t        |j                  xs d|j                              }nDd| d|j                   t        j                  f}t	        t        d|j                              }| t        j                  t        j                  fv rt        |      }|rt        |      g}n|j                  t        |            }| t        j                  k(  rY|D 	cg c]L  }	t        t        |	j                  j                   |	j                  j"                  |j                  	            N }
}	nIt%        j&                  t(        t*           |      }
n&t        t        |j                  xs d|j                              g}
n|j,                  rt/        t1                     j3                  |j,                        }|r|j                  rF|j                  |j4                  vr.t7        d
|j,                   |j                  |j4                        |j8                  rt        |j                        s|j                  sPt;        |j,                  t        |      |j<                  |j>                  |j@                        }tC        | ||      }
nd|j,                   d
|j,                   d|j                   t        j                  f}t;        |j,                        }tC        | ||      }
nd| d
|j,                   t        jD                  f}t;        |      }t;        |j,                  t        |      |j<                  |j>                  |j@                        g}
n|j                  stG        d
|j,                         t        |j                        rPt;        |j,                  t        |      |j<                  |j>                  |j@                        }tC        | ||      }
nd| d
|j,                   d|j                   t        j                  f}t;        |      }t;        |j,                  t        |      |j<                  |j>                  |j@                        g}
n|jH                  rt/        tK                     j3                  |jH                        }d\  }}|r|j                  rF|j                  |j4                  vr.t7        d|jH                   |j                  |j4                        |j8                  rt        |j                        s|j                  sEtM        |jH                  t        |      |jN                  |jP                        }tC        | ||      }
nXd|jH                   d|jH                   d|j                   t        j                  f}tM        |jH                  |jN                  |jP                        }tC        | ||      }
nd|jH                   t        jD                  }}d}tM        |jH                  t        |      |jN                  |jP                        g}
n| t        jR                  k(  r|jH                  jU                  d      ry|j                  r*|j                  tV        vrtY        d|j                         t	        t        |            }t[        |jH                  |jN                  |jP                        g}
n|j                  stG        d|jH                         t        |j                        rDtM        |jH                  t        |      |jN                  |jP                        }tC        | ||      }
ned|jH                   d|j                   t        j                  }}d}tM        |jH                  t        |      |jN                  |jP                        g}
|st]               rd| ||f}t;        |      }nd| ||f}tM        |      }n{t        |j                        s|j                  s#t	        t        |            }tC        | ||      }
n7dd|j                   t        j                  f}t	               }tC        | ||      }
|r2|\  }}}| j^                  rtY        |      ta        |d| d| d      }nd}| jb                  r te        d |
D              rtY        |d         | t        jf                  k(  rg }
nti        | ||
      }
||
|fS c c}	w )a  
    Returns controller and target host configs derived from the provided legacy host options.
    The goal is to match the original behavior, by using non-split testing whenever possible.
    When the options support the controller, use the options for the controller and use ControllerConfig for the targets.
    When the options do not support the controller, use the options for the targets and use a default controller config influenced by the options.
    zvenv/defaultr}   N)r#   system_site_packagesr   zorigin:python=z--venv --python controller_config)r#   r   r   z	--docker )r6   rl   
privilegedseccompmemoryzdocker:z
 --python rA   )NNz	--remote )r6   rl   providerarchzremote:r6   r   r   windows/z	--python zorigin:python=defaultzUsing `--controller z	` since `z"` does not support the controller.)reasonr   c              3  >   K   | ]  }t        |t                 y wr-   )
isinstancer   )r   r=   s     r%   r   z)get_legacy_host_config.<locals>.<genexpr>  s     \&F4D!EE\s   r   )5r:   ro   r)   rl   r   r   rp   r   PYTHONr   r   r   r   r   get_default_targetsr   r#   r   r   r   r   r   rt   r   r   getsupported_pythonsrD   r3   r   ru   rv   rw   r   ENVIRONMENTrY   rq   r   r   rr   rs   r   
startswithr   r`   r   r   r   r   r   anyr   handle_non_posix_targets)r   r   venv_fallbackdocker_fallbackremote_fallbackr   r   rl   r   r=   r<   docker_configremote_configrK   r   controller_optionfallback_details                    r%   r   r   +  s    #MO46OGK
 ||W^^,GNN%-@Id[d  |C  |]  |]  .^  _J$2=/"BFVW^WeWeVfDgiwi~i~"~%-@ip  jK  jK  .L  MJJ%%z'7'788"7+F#36#B"C","@"@_iAj"k
 z''' O^_ EK ,3Fv}}OdOdkqkxkxk}k}\c\}\}4 @ _ _ &&j!1?C'/B7>>Kf]fX_XyXy0{ | }G	)*;*=>BB7>>R~~'..8W8W"W3i?O4PRYR`R`bo  cB  cB  C  C11$W^^4GNN!-7>>-X_J`9@9R9R\c\r\r  |C  |Q  |Q"RJ0w
KG,3GNN3C*D	RYR`R`Qaaklslzlzk{F|  M  T  T  +T'!-7>>!BJ0w
KG(//@&AYw~~N^C_aoa{a{&{#)?
'W^^MRYDZ3:3L3LV]VlVlu|  vK  vKL M >>3i?O4PQQ 0)w~~mT[F\5<5N5NX_XnXnw~  xM  xMN
,T7JG(//@&AYw~~N^^hipiwiwhxCy  |J  |Q  |Q  'Q#)?
'W^^MRYDZ3:3L3LV]VlVlu|  vK  vKL M	)*;*=>BB7>>R$~~'..8W8W"W3i?O4PRYR`R`bo  cB  cB  C  C11$W^^4GNN!2}]dOepw  qH  qH8?8K8K"MJ0w
KG,3GNN3C*D	RYR`R`Qaaklslzlzk{F|  M  T  T  +T'!2QXQhQhov  pC  pC  "DJ0w
KG$-gnn-=">@Z@Z!
,'..W^I_jq  kB  kB  IP  I\  I\  ]  ^Z%%%'..*C*CJ*O~~'..8R"R1Ignn=M2NOO%]7-CDJ*I`I`gngzgz{|G>>3i?O4PQQ 0.GNN=Y`Kals  mD  mD  KR  K^  K^  _
,T7JG$-gnn-=ZGW"XZhZoZo!
,'..W^I_jq  kB  kB  IP  I\  I\  ]  ^!(//@&A7F&R#)?
(//@&A7F&R#.OD
 W^^,GNN%]7-CDJ(w
CG"9Yw~~FV;WYgYnYn"n%J(w
CG-@*7F-g66(*+<*=YwiOqr

 }}\T[\\)*=a*@AAz$$$*4'Bw//{_s   "Ae
c                   | t         j                  k(  rc|j                  r>|j                  D cg c]'  }t        d| |j                  |j
                        ) }}|S t        |j                        g}|S | t         j                  k(  r|j                  r|j                  D cg c]$  }t        ||j                  |j
                        & }}|j                  xs g D ]#  \  }}|D ]  }|j                  |k(  s||_         % |j                  xs g D ]#  \  }}|D ]  }|j                  |k(  s||_         % t        j                   t"        t$           |      }|S t'        |j                        g}|S c c}w c c}w )zCReturn a list of non-POSIX targets if the target mode is non-POSIX.r   r   r   )r   r   rx   r   rr   rs   r   r{   r   r4   r   ry   
collectionrz   
connectionr   r   r   r   r   )	r   r   r<   r#   r4   network_targetsr   entryr   s	            r%   r   r     s    z---??&-oo7" +(7)0DwOfOfmt  nA  nA  B 7G 7, N' .73D3DEFG& N% 
//	/ OV  O_  O_  `  CK27KbKbipi|i|}  `O  `(/(C(C(Ir 6$*, 6E~~1+5(66
 )0(C(C(Ir 6$*, 6E~~1+5(66
 ffT*-?G N .73D3DEFGN-7 `s   ,E7$)E<c                   | t         j                  k(  rft        t        j                  j                  t        j                  j                  t               j                  j                  d                  g}|S | t         j                  k(  rft        t        j                  j                  t        j                  j                  t               j                  j                  d                  g}|S | j                  r<t        j                  t        t            |j#                  t%        |                  }|S t'               g}|S )z;Return a list of default targets for the given target mode.zinventory.winrmr   zinventory.networkingr   )r   r   r   osr   abspathrI   r    contentintegration_pathr   r   r   r   r   r   r   r   r   r   )r   r   r<   s      r%   r   r     s    z---)rwwrww||LNLbLbLsLs  vG  @H  0I  J  K N 
//	/)rwwrww||LNLbLbLsLs  vL  @M  0N  O  P N 
		&&j):+I+I+hrJs+tu N $%&Nr'   )r#   rk   r$   zt.Optional[c.Sequence[str]]rO   rk   )r#   rk   rO   rk   )rO   rM   )r6   rM   rO   rM   )r   r   r   r   r   r   rO   r   )r   r   r   rj   r   r   rO   list[HostConfig])r   rj   rO   zt.Optional[NativePythonConfig])r   r   r   rj   rO   zItuple[ControllerHostConfig, list[HostConfig], t.Optional[FallbackDetail]])r   r   r   rj   r<   r   rO   r   )r   r   r   r   rO   r   )ArU   
__future__r   argparsecollections.abcabccr~   r   r   typestypingr   	constantsr   r   utilr   r   r	   r
   r   docker_utilr   
completionr   r   r   host_configsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   datar    r&   r)   r:   rB   rD   rY   r`   rc   	dataclassrj   Enumr   r   r   r   r   r   r   r"   r'   r%   <module>r     s   [ "     	  
      &
4
>
)R$4 R
$4 
t"2 to+ o d#2 2 $2jm m@D
D
<D D 	DN
 % 	$Wc0
c0c0 Oc0L
  	B
$ r'   