B
    `"-                 @   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
mZmZmZmZ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 G dd dZG dd dZG dd dZdS )z'Access Ansible Core CI remote services.    )absolute_importdivisionprint_functionN   )SubprocessErrorApplicationError	cmd_quotedisplayANSIBLE_TEST_DATA_ROOT)intercept_commandget_network_settingsrun_command)AnsibleCoreCI)ansible_environment)ShellConfig)create_payloadc               @   sJ   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdddZ	dd Z
dS )ManageWindowsCIz@Manage access to a Windows instance provided by Ansible Core CI.c             C   s\   || _ d| j jjg| _tdddddd}x.t|D ]"}|  jdd	||| f g7  _q2W d
S )z.
        :type core_ci: AnsibleCoreCI
        z-iyesnoz	/dev/null      )	BatchModeStrictHostKeyCheckingUserKnownHostsFileServerAliveIntervalServerAliveCountMaxz-oz%s=%sN)core_cissh_keykeyssh_argsdictsorted)selfr   ssh_options
ssh_option r%   O/home/dcms/DCMS/lib/python3.7/site-packages/ansible_test/_internal/manage_ci.py__init__*   s    zManageWindowsCI.__init__c             C   s   dS )zxUsed in delegate_remote to setup the host, no action is required for Windows.
        :type python_version: str
        Nr%   )r"   python_versionr%   r%   r&   setup<   s    zManageWindowsCI.setupc          
   C   s   dd| j jj d| j jj d| j jj d| j jj dg}d| j j }t| j j}dd	d
dd| |dd	|g}xLt
ddD ]>}yt| j j|d|dd dS  tk
r   td Y qzX qzW td| j j| j j| j jf dS )z-Wait for instance to respond to ansible ping.zansible_connection=winrmzansible_host=%szansible_user=%szansible_password=%szansible_port=%sz+ansible_winrm_server_cert_validation=ignorez
windows_%sansiblez-mzansible.windows.win_pingz-iz%s,z-e r   x   pingT)envdisable_coverageN
   z&Timeout waiting for %s/%s instance %s.)r   
connectionhostnameusernamepasswordportversionr   argsjoinranger   r   timesleepr   platforminstance_id)r"   
extra_varsnamer.   cmddummyr%   r%   r&   waitA   s"    zManageWindowsCI.waitc             C   s&   |  d| jjj| jjj|f | dS )z<
        :type remote: str
        :type local: str
        z%s@%s:%sN)scpr   r1   r3   r2   )r"   remotelocalr%   r%   r&   download[   s    zManageWindowsCI.downloadc             C   s&   |  |d| jjj| jjj|f  dS )z<
        :type local: str
        :type remote: str
        z%s@%s:%sN)rC   r   r1   r3   r2   )r"   rE   rD   r%   r%   r&   uploadb   s    zManageWindowsCI.uploadNTc             C   sx   |sg }|r| d t|tr4ddd |D }t| jjddg| j | ddd	| jjj	| jjj
f g |g  d
S )zv
        :type command: str | list[str]
        :type options: list[str] | None
        :type force_pty: bool
        z-ttr+   c             s   s   | ]}t |V  qd S )N)r   ).0cr%   r%   r&   	<genexpr>u   s    z&ManageWindowsCI.ssh.<locals>.<genexpr>sshz-qz-p22z%s@%sN)append
isinstancelistr8   r   r   r7   r   r1   r3   r2   )r"   commandoptionsZ	force_ptyr%   r%   r&   rK   i   s    

.zManageWindowsCI.sshc          
   C   sr   x\t ddD ]N}y*t| jjdg| j dddd||g  dS  tk
rX   td Y qX qW td	||f dS )
z7
        :type src: str
        :type dst: str
        r   r0   rC   z-PrL   z-qz-rNzFailed transfer: %s -> %s)	r9   r   r   r7   r   r   r:   r;   r   )r"   srcdstrA   r%   r%   r&   rC   ~   s    
zManageWindowsCI.scp)NT)__name__
__module____qualname____doc__r'   r)   rB   rF   rG   rK   rC   r%   r%   r%   r&   r   (   s   
r   c               @   s    e Zd ZdZdd Zdd ZdS )ManageNetworkCIz@Manage access to a network instance provided by Ansible Core CI.c             C   s
   || _ dS )z.
        :type core_ci: AnsibleCoreCI
        N)r   )r"   r   r%   r%   r&   r'      s    zManageNetworkCI.__init__c             C   s6  t | jj| jj| jj}d| jjj d| jjj d| jjj	 gdd |j
 D  }d| jj| jjddf }t| jj}d	d
d|jr|jd nd| jjf ddd| jjjdd| dd||g}xNtddD ]@}yt| jj|d|dd dS  tk
r   td Y qX qW td| jj| jj| jjf dS )z-Wait for instance to respond to ansible ping.zansible_host=%szansible_port=%szansible_ssh_private_key_file=%sc             S   s   g | ]\}}d ||f qS )z%s=%sr%   )rH   r   valuer%   r%   r&   
<listcomp>   s    z(ManageNetworkCI.wait.<locals>.<listcomp>z%s-%s.-r*   z-mz%s%s_command z-az
commands=?z-uz-iz%s,z-er+   r   Z   r-   T)r.   r/   Nr0   z&Timeout waiting for %s/%s instance %s.)r   r   r7   r<   r6   r1   r2   r5   r   r   Zinventory_varsitemsreplacer   Z
collectionr3   r8   r9   r   r   r:   r;   r   r=   )r"   settingsr>   r?   r.   r@   rA   r%   r%   r&   rB      s,     

zManageNetworkCI.waitN)rT   rU   rV   rW   r'   rB   r%   r%   r%   r&   rX      s   rX   c               @   sZ   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dddZdd ZdS )ManagePosixCIz>Manage access to a POSIX instance provided by Ansible Core CI.c             C   s*  || _ d| j jjg| _tdddddd}x.t|D ]"}|  jdd	||| f g7  _q2W | j jd
kr| j jdkrddddg| _n,| j jdkrddddg| _nt	d| j j nx| j jdkrdddddg| _nZ| j jdkrdddg| _n@| j jdks| j jdkrddddg| _n| j jdkr&g | _dS )z.
        :type core_ci: AnsibleCoreCI
        z-ir   r   z	/dev/nullr   r   )r   r   r   r   r   z-oz%s=%sZfreebsdZawsZsuz-lrootz-cZazureZsudoz-inshz$provider %s has not been implementedZmacoszPATH=/usr/local/bin:$PATHZosxrhelcentosZbash)aixZibmiN)
r   r   r   r   r    r!   r<   ZproviderbecomeNotImplementedError)r"   r   r#   r$   r%   r%   r&   r'      s0    "zManagePosixCI.__init__c             C   sL   |   }tjd| dd t| jjtr6| jjjr6|S | | | 	  |S )zStart instance and wait for it to become ready and respond to an ansible ping.
        :type python_version: str
        :rtype: str
        zRemote working directory: %sr   )	verbosity)
rB   r	   inforN   r   r7   r   raw	configureupload_source)r"   r(   pwdr%   r%   r&   r)      s    

zManagePosixCI.setupc          	   C   s   xt ddD ]r}yN| jdddd }| jjjr2dS |  d }|d	s\td
||f |S  t	k
r|   t
d Y qX qW td| jj| jj| jjf dS )z$Wait for instance to respond to SSH.r   r^   ro   T)capturer   z/pwd/zGUnexpected current working directory "%s" from "pwd" command output:
%sr0   z&Timeout waiting for %s/%s instance %s.N)r9   rK   r   r7   explainstrip
splitlines
startswith	Exceptionr   r:   r;   r   r<   r6   r=   )r"   rA   stdoutro   r%   r%   r&   rB      s    

zManagePosixCI.waitc             C   s2   |  tjtddd | d| jj|f  dS )zMConfigure remote host for testing.
        :type python_version: str
        r)   z	remote.shz/tmpz/chmod +x /tmp/remote.sh && /tmp/remote.sh %s %sN)rG   ospathr8   r
   rK   r   r<   )r"   r(   r%   r%   r&   rm     s    zManagePosixCI.configurec          	   C   sj   t jdddR}d}tj|tj|j}t| jj	|j | 
|j| | d||f  W dQ R X dS )zUpload and extract source.zansible-source-z.tgz)prefixsuffixz/tmpzZrm -rf ~/ansible ~/ansible_collections && cd ~/ && gunzip --stdout %s | tar oxf - && rm %sN)tempfileNamedTemporaryFilery   rz   r8   basenamer?   r   r   r7   rG   rK   )r"   Zlocal_source_fdZremote_source_dirZremote_source_pathr%   r%   r&   rn     s    zManagePosixCI.upload_sourcec             C   s&   |  d| jjj| jjj|f | dS )z<
        :type remote: str
        :type local: str
        z%s@%s:%sN)rC   r   r1   r3   r2   )r"   rD   rE   r%   r%   r&   rF     s    zManagePosixCI.downloadc             C   s&   |  |d| jjj| jjj|f  dS )z<
        :type local: str
        :type remote: str
        z%s@%s:%sN)rC   r   r1   r3   r2   )r"   rE   rD   r%   r%   r&   rG   %  s    zManagePosixCI.uploadNFc             C   s   |sg }t |tr&ddd |D }| jr4t|n|}t| jjdddg| j | dt	| jj
jd| jj
j| jj
jf g | j |g |d	S )
z
        :type command: str | list[str]
        :type options: list[str] | None
        :type capture: bool
        :rtype: str | None, str | None
        r+   c             s   s   | ]}t |V  qd S )N)r   )rH   rI   r%   r%   r&   rJ   7  s    z$ManagePosixCI.ssh.<locals>.<genexpr>rK   z-ttz-qz-pz%s@%s)rp   )rN   rO   r8   rh   r   r   r   r7   r   strr1   r5   r3   r2   )r"   rP   rQ   rp   r%   r%   r&   rK   ,  s    
zManagePosixCI.sshc          
   C   s|   xft ddD ]X}y4t| jjdg| j dt| jjjdd||g  dS  tk
rb   t	
d Y qX qW td||f dS )	z7
        :type src: str
        :type dst: str
        r   r0   rC   z-Pz-qz-rNzFailed transfer: %s -> %s)r9   r   r   r7   r   r   r1   r5   r   r:   r;   r   )r"   rR   rS   rA   r%   r%   r&   rC   A  s    
zManagePosixCI.scp)NF)rT   rU   rV   rW   r'   r)   rB   rm   rn   rF   rG   rK   rC   r%   r%   r%   r&   rb      s   "
rb   )rW   
__future__r   r   r   type__metaclass__ry   r}   r:   utilr   r   r   r	   r
   Zutil_commonr   r   r   r   r   Zansible_utilr   configr   payloadr   r   rX   rb   r%   r%   r%   r&   <module>   s   g,