B
    `U                 @   s  d Z ddlmZmZmZ e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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mZm Z  dd	l!m"Z" dd
l#m$Z$m%Z% ddl&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA ddlBmCZC ddlDmEZE ddlFmGZG ddlHmIZI ddlJmKZK ddlLmMZM dd ZNdd ZOdd ZPdd ZQdd ZRdd ZSd d! ZTd"d# ZUdS )$z/Delegate test execution to another environment.    )absolute_importdivisionprint_functionN   )types)	make_dirs)SUPPORTED_PYTHON_VERSIONSHTTPTESTER_HOSTScreate_shell_commandrun_httptesterstart_httptesterget_python_interpreterget_python_version)
TestConfigEnvironmentConfigIntegrationConfigWindowsIntegrationConfigNetworkIntegrationConfigShellConfigSanityConfigUnitsConfig)AnsibleCoreCI)ManagePosixCIManageWindowsCI)ApplicationErrorcommon_environmentdisplayANSIBLE_BIN_PATHANSIBLE_TEST_DATA_ROOTANSIBLE_LIB_ROOTANSIBLE_TEST_ROOTtempdir)run_command
ResultTypecreate_interpreter_wrapperget_docker_completionget_remote_completion)docker_exec
docker_getdocker_pull
docker_put	docker_rm
docker_rundocker_availabledocker_network_disconnectget_docker_networks!get_docker_preferred_network_nameget_docker_hostnameis_docker_user_defined_network)get_cloud_providers)IntegrationTarget)data_context)create_payload)create_virtual_environment)get_ci_providerc             C   s@   t | tsdS | jr&t| t | j n| jr<t| t | j dS )z"
    :type args: CommonConfig
    N)
isinstancer   dockerr   r%   
docker_rawremoter&   )args r>   P/home/dcms/DCMS/lib/python3.7/site-packages/ansible_test/_internal/delegation.pycheck_delegation_argsi   s    
r@   c          	   C   s   t | trt j| j_ttjj	 t
jddtjj	dJ}tj	tjjtj	|j| _| j| j zt| |||S d| _X W dQ R X nt| |||S dS )z
    :type args: EnvironmentConfig
    :type exclude: list[str]
    :type require: list[str]
    :type integration_targets: tuple[IntegrationTarget]
    :rtype: bool
    z	metadata-z.json)prefixsuffixdirN)r9   r   r8   codemetadataZci_providerr   r#   TMPpathtempfileNamedTemporaryFileosjoinrelative_pathbasenamenamemetadata_pathZto_filedelegate_command)r=   excluderequireintegration_targetsZmetadata_fdr>   r>   r?   delegatev   s    
rT   c             C   sL   | j rt| ||| dS | jr0t| ||| dS | jrHt| ||| dS dS )z
    :type args: EnvironmentConfig
    :type exclude: list[str]
    :type require: list[str]
    :type integration_targets: tuple[IntegrationTarget]
    :rtype: bool
    TF)venvdelegate_venvr:   delegate_dockerr<   delegate_remote)r=   rQ   rR   rS   r>   r>   r?   rP      s    rP   c          
      s   j r jf}nt} jrDtdd |D }|rDtdd|   jrPdndt	fdd|D }t	 fdd|
 D }|std	d
d
d}t }x8|
 D ],\}	}
ttj|
ddtj|d|	  qW tj|d j }t |tt jj|||}t tr4 jr4 js4|ddg7 }t }t ^}tttj|d tttj|d |j|tjj |d  |d t ||d W dQ R X W dQ R X dS )zRDelegate ansible-test execution to a virtual environment using venv or virtualenv.c             s   s   | ]}d |j kr|jV  qdS )zneeds/httptester/N)aliasesrN   ).0targetr>   r>   r?   	<genexpr>   s    z delegate_venv.<locals>.<genexpr>zUUse --docker or --remote to enable httptester for tests marked "needs/httptester": %sz, z-ssp c          	   3   s.   | ]&}|t jtjjd d| f fV  qdS )Z
delegationz
python%s%sN)rJ   rG   rK   r#   rF   )rZ   version)rB   r>   r?   r\      s    c             3   s*   | ]"\}}t  || jr||fV  qd S )N)r7   venv_system_site_packages)rZ   r^   rG   )r=   r>   r?   r\      s    z,No usable virtual environment support found.r   )z--venvz--venv-system-site-packagesbinpythonzpython%sz--coverage-labelrU   ansibleZansible_testPATH)rc   
PYTHONPATH)envN) ra   python_versionr   
httptestersortedr   warningrK   r_   dictitemsr   r!   r$   rJ   rG   generate_commandr   r5   contentrootr9   r   coveragecoverage_labelr   symlinkr   r    updatepathsepr"   )r=   rQ   rR   rS   versionsZneeds_httptesterZvenvsoptionsZinject_pathr^   rG   python_interpretercmdre   Zlibrary_pathr>   )r=   rB   r?   rV      s@    

(rV   c       !      C   sf  | j }| j}t| tr| j}n| jo4tdd |D }|rFt| | j t| | d}d}d}	dddd}
t| t | j	}d}t
j|d	}t jjrt
j|t jjj}n|}t
j|t jj}t| |t
j|d
||
||}t| tr"| jr"| js"| j	}tdd|}|dd| g7 }t| tr@| js@|d g }t| tsdt| trn| jrn|d tjddd}zt| |j |rt | }nd}ddddt!|"  g}| j#r|$d| j# d| j# g d}| j%dkr |dd| j% g7 }t& dkst
j'|r.|dd||f g7 }|rv|d d!g7 }t(| }t)|svx"t*D ]}|d"d||f g7 }qXW t| trt+| }x|D ]}||, 7 }qW t-| ||d#d }| j.rd$}n|/ }t0| |t
jt1d%d&d' t2| |d(d'g t0| ||jd) t2| |d*d+d)d,dg t| t3r>| j4s>|d-dg7 }t| t3rDt
j|t5j6j7t
j|t5j8j7g}t2| |d.d/g|  t2| |d0d1g|  t2| |d0d2dg t2| |d0d3t
j|| j9g t2| |d4d5d6g t2| ||d7d8g |d# t:| |}|dk	r"x&|D ]}t;| || q
W n
t<=d9 |d7d:g7 }|d;d5g7 }zt2| |||d# d<}	W dt
j>t
jt jj?t jj}t
j>|}t
j@|}t
jd|d }tA| tjd=ddL} t2| |d*d>|d?t5jBjd,||g tC| ||| j tD| d*d+| jd,|g W dQ R X X W d|r(tE| | |rV| jFd@ksL| jFdAkrV|	rVtE| | X W dQ R X dS )Bz
    :type args: EnvironmentConfig
    :type exclude: list[str]
    :type require: list[str]
    :type integration_targets: tuple[IntegrationTarget]
    c             s   s   | ]}d |j kV  qdS )zneeds/httptester/N)rY   )rZ   r[   r>   r>   r?   r\      s    z"delegate_docker.<locals>.<genexpr>NFr   r   )z--dockerz--docker-privilegedz--docker-utilz/rootrb   r`   z[^a-zA-Z0-9]+-z--coverage-labelz	docker-%sz--allow-destructivez-itzansible-source-z.tgz)rA   rB   z--detachz--volumez /sys/fs/cgroup:/sys/fs/cgroup:roz--privileged=%sz--memory=%dz--memory-swap=%dz/var/run/docker.sockdefaultz--security-optz
seccomp=%s	localhostz%s:%sz--envzHTTPTESTER=1z--link)ru   test_idsetupz	docker.shz/root/docker.shz	/bin/bashz/root/test.tgztarZoxzfz-Cz--pythonmkdirz-pchmodZ777Z755Z644ZuseraddZpytestz--create-homez--requirements-modeonlyzNetwork disconnection is not supported (this is normal under podman). Tests will not be isolated from the network. Network-related tests may misbehave.skipz--userTzansible-result-Zczfz	--excludealwayssuccess)Gr:   Zdocker_privilegedr9   r   rg   anyr)   r   r%   r;   rJ   rG   rK   r5   rm   
collection	directoryresults_pathrl   r   ro   rp   resubr   allow_destructiveappendZdebug_strategyrH   rI   r6   rN   r   strlowerZdocker_memoryextendZdocker_seccompr1   existsr0   r2   r	   r3   Zget_docker_run_optionsr,   explainstripr*   r   r'   r   ra   r#   ZJUNITrL   ZCOVERAGErO   r/   r.   r   ri   dirnamern   rM   r   rF   r(   r"   r+   Zdocker_terminate)!r=   rQ   rR   rS   Z
test_imageZ
privilegeduse_httptesterhttptester_idr{   r   ru   rv   pwdansible_rootcontent_rootremote_results_rootrw   Zimage_labelcmd_optionsZlocal_source_fdZtest_optionsZdocker_socketnetworkhostcloud_platformscloud_platformZwritable_dirsZnetworkslocal_test_rootZremote_test_rootremote_results_nameZremote_temp_fileZlocal_result_fdr>   r>   r?   rW      s    



 








" &
rW   c             C   sB  | j }t| |j|j| j| j|jd}d}d}t| trD| j	}| j
}n| j	oZtdd |D }|rtt sttd d}d}	g }
d}z|  |rt| \}	}
|  t| t | j}|jdkrt|}|| dg}n$|rt|}|| td	g}n t|}||}d
di}t| t | j}tj|d}t jjrZtj|t jjj }n|}t!| |tj|d||||}|	r|dg7 }t| t"r| j#r| j$s|dd|j|jf g7 }t| t%r| j&s|'d t| t(r| j)s|ddg7 }t| t%r.t*| }x|D ]}|
|+ 7 }
qW z|,||
 d}W dd}|jdkrXd}t| trp| j
rpd}|r |r tj-tjt jj.t jj/}tj|t jj/}tj0|}tjd|}|jdkrdnd}|,d1||| |2|| X W d| j3dks$| j3dkr,|r,|4  |	r<t5| |	 X dS )z
    :type args: EnvironmentConfig
    :type exclude: list[str]
    :type require: list[str]
    :type integration_targets: tuple[IntegrationTarget]
    )ZstageZproviderarchFc             s   s   | ]}d |j kV  qdS )zneeds/httptester/N)rY   )rZ   r[   r>   r>   r?   r\     s    z"delegate_remote.<locals>.<genexpr>z>Assuming --disable-httptester since `docker` is not available.NZwindowszpowershell.exeZbashz--remoter   rb   r`   z--inject-httptesterz--coverage-labelzremote-%s-%sz--allow-destructivez--pythonry   Tz/tmp)aixZibmiz-hrz-az@rm -rf {0} && mkdir {0} && cp {1} {2}/* {0}/ && chmod -R a+r {0}r   r   )6Zparsed_remoter   platformr^   Zremote_stageZremote_providerr   r9   r   rg   rawr   r-   r   ri   startr   waitr   r&   r<   r   r|   r   r
   r   rJ   rG   rK   r5   rm   r   r   rl   r   ro   rp   r   r   r   r   ra   r3   Zget_remote_ssh_optionssshr   rn   r   rM   formatdownloadZremote_terminatestopr+   )r=   rQ   rR   rS   r<   core_cir   r   r   r   Zssh_optionsr   rf   Zmanagerw   r   ru   rv   r   r   r   r   r   r   r   Zremote_temp_pathZcp_optsr>   r>   r?   rX     s    










"rX   c       
         s   d|d< t j|dg}|r&|g| }td|d  fddt D }dg| | }|tt| tjdd	 |||7 }|d| j	rd
ndg7 }| j
r|dg7 }t| trt|}n*t| tr| jpt  }	|	r|d|	g7 }|S )z
    :type args: EnvironmentConfig
    :type python_interpreter: str | None
    :type ansible_bin_path: str
    :type content_root: str
    :type options: dict[str, int]
    :type exclude: list[str]
    :type require: list[str]
    :rtype: list[str]
    r   z--colorzansible-testzen_US.UTF-8)LC_ALLZANSIBLE_TEST_CONTENT_ROOTc                s   g | ]}d | | f qS )z%s=%sr>   )rZ   key)env_varsr>   r?   
<listcomp>)  s    z$generate_command.<locals>.<listcomp>z/usr/bin/envNyesnoz--requirementsz--base-branch)rJ   rG   rK   rj   rh   listfilter_optionssysargvcolorrequirementsr9   r   r
   r   base_branchr8   Zget_base_branch)
r=   rv   Zansible_bin_pathr   ru   rQ   rR   rw   Zenv_argsr   r>   )r   r?   rl     s(    
"



rl   c       
      c   s  |  }d|d< d|d< d|d< d|d< t| trV|dddddddddddd nt| trn|ddi t| tr|ddd	 t| ttfr|d
di d}xb|D ]Z}|ds|r|d8 }qd}|	dd}|d }||kr|| t
| d }q|V  qW x| jD ]}|V  qW x|D ]}	dV  |	V  q*W x|D ]}	dV  |	V  qFW t| tr~| jr~dV  | jV  dV  d| j V  | jrdV  ndV  t| tr| jrdV  | jsdV  dS )z
    :type args: EnvironmentConfig
    :type argv: list[str]
    :type options: dict[str, int]
    :type exclude: list[str]
    :type require: list[str]
    :rtype: collections.Iterable[str]
    r   z--requirementsr   z
--truncatez--redactz--no-redact)z	--changedz	--trackedz--untrackedz--ignore-committedz--ignore-stagedz--ignore-unstagedz--changed-fromz--changed-pathz
--metadataz	--excludez	--requirez--base-branch)z--no-temp-unicodez--no-pip-checkz--inventoryrx   =z	--excludez	--requirez
--metadataz%dz--no-temp-unicodez--no-pip-checkN)copyr9   r   rr   r   r   r   r   
startswithsplitlenZdelegate_argsrO   truncateZredactZno_temp_unicodeZ	pip_check)
r=   r   ru   rQ   rR   	remainingargpartsr   r[   r>   r>   r?   r   >  s|    	










r   )V__doc__
__future__r   r   r   type__metaclass__rJ   r   r   rH   r]   r   tior   executorr   r	   r
   r   r   r   r   configr   r   r   r   r   r   r   r   r   r   Z	manage_cir   r   utilr   r   r   r   r   r   r    r!   Zutil_commonr"   r#   r$   r%   r&   Zdocker_utilr'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   Zcloudr3   r[   r4   datar5   payloadr6   rU   r7   cir8   r@   rT   rP   rV   rW   rX   rl   r   r>   r>   r>   r?   <module>   s<   $
((8< 3z0