
    Vh:                    p   d 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Z	ddl
mZmZ ddlmZmZ ddlmZmZ ddlmZmZmZmZmZmZ  G d	 d
e      Z G d dej6                        Zedd       Z G d dej6                        Z G d deej6                        Z G d deej6                        Z y)z!Support code for CI environments.    )annotationsN   )to_bytesto_text)read_text_filewrite_text_file)CommonConfig
TestConfig)ApplicationErrordisplayget_subclassesimport_pluginsraw_commandcachec                      e Zd ZdZy)ChangeDetectionNotSupportedz<Exception for cases where change detection is not supported.N)__name__
__module____qualname____doc__     R/home/dcms/DCMS/lib/python3.12/site-packages/ansible_test/_internal/ci/__init__.pyr   r   $   s    Fr   r   c                     e Zd ZdZdZeej                  dd              Ze	ej                  dd              Z
e	ej                  dd              Zej                  dd       Zej                  dd       Zej                  dd       Zej                  dd	       Zej                  dd
       Zej                  dd       Zy)
CIProviderz#Base class for CI provider plugins.i  c                      y)zMReturn True if this provider is supported in the current running environment.Nr   r   r   r   is_supportedzCIProvider.is_supported-       r   c                     y)z0Return a unique code representing this provider.Nr   selfs    r   codezCIProvider.code2   r   r   c                     y)z*Return descriptive name for this provider.Nr   r    s    r   namezCIProvider.name7   r   r   c                     y)z6Return a resource prefix specific to this CI provider.Nr   r    s    r   generate_resource_prefixz#CIProvider.generate_resource_prefix<   r   r   c                     y)z*Return the base commit or an empty string.Nr   r!   argss     r   get_base_commitzCIProvider.get_base_commit@   r   r   c                     y)zInitialize change detection.Nr   r(   s     r   detect_changeszCIProvider.detect_changesD   r   r   c                     y)z,Return True if Ansible Core CI is supported.Nr   r    s    r   supports_core_ci_authz CIProvider.supports_core_ci_authH   r   r   c                     y)z2Return authentication details for Ansible Core CI.Nr   r    s    r   prepare_core_ci_authzCIProvider.prepare_core_ci_authL   r   r   c                     y)z4Return details about git in the current environment.Nr   r(   s     r   get_git_detailszCIProvider.get_git_detailsP   r   r   N)returnboolr3   str)r)   r	   r3   r6   )r)   r
   r3   zt.Optional[list[str]])r3   dict[str, t.Any])r)   r	   r3   zt.Optional[dict[str, t.Any]])r   r   r   r   prioritystaticmethodabcabstractmethodr   propertyr"   r$   r&   r*   r,   r.   r0   r2   r   r   r   r   r   (   s   -H\  \ ?  ? 9  9 	E E 	9 9 	+ + 	; ; 	A A 	C Cr   r   )	metaclassc                     d} t        d       t        t        t              d       }|D ]  }|j	                         s |       }  n | j
                  r"t        j                  d| j                  z         | S )z:Return a CI provider instance for the current environment.Ncic                2    | j                   | j                  fS )N)r8   r   )subclasss    r   <lambda>z!get_ci_provider.<locals>.<lambda>\   s    (J[J[]e]n]nIo r   )keyzDetected CI provider: %s)	r   sortedr   r   r   r"   r   infor$   )provider
candidates	candidates      r   get_ci_providerrI   U   sl     H4z28opJ 	!!# {H
 }}/(--?@Or   c                      e Zd ZdZddZd	dZej                  d
d       Zej                  dd       Z	ej                  d	d       Z
y)
AuthHelperz;Public key based authentication helper for Ansible Core CI.c                    t        t        j                  |d            }| j                  |      }t	        t        j                  |            }|j                  |       y)z>Sign the given auth request and make the public key available.T)	sort_keys)	signatureN)r   jsondumps
sign_bytesr   base64	b64encodeupdate)r!   requestpayload_bytessignature_raw_bytesrN   s        r   sign_requestzAuthHelper.sign_requestl   sJ     Gt!DE"oom<F,,-@AB	+r   c                    t         j                  j                  d      }t         j                  j                  t	        |            rt        |      }|S | j                         }t        ||       |S )z
        Initialize and publish a new key pair (if needed) and return the private key.
        The private key is cached across ansible-test invocations, so it is only generated and published once per CI job.
        z~/.ansible-core-ci-private.key)ospath
expanduserexistsr   r   generate_private_keyr   )r!   r[   private_key_pems      r   initialize_private_keyz!AuthHelper.initialize_private_keyt   s_    
 ww!!"BC77>>(4.),T2O
  #779OD/2r   c                     y)YSign the given payload and return the signature, initializing a new key pair if required.Nr   )r!   rV   s     r   rQ   zAuthHelper.sign_bytes   r   r   c                     y)zPublish the given public key.Nr   )r!   public_key_pems     r   publish_public_keyzAuthHelper.publish_public_key   r   r   c                     y)QGenerate a new key pair, publishing the public key and returning the private key.Nr   r    s    r   r^   zAuthHelper.generate_private_key   r   r   N)rU   r7   r3   Noner5   rV   bytesr3   rj   )rd   r6   r3   rh   )r   r   r   r   rX   r`   r:   r;   rQ   re   r^   r   r   r   rK   rK   i   sa    E, 	h h 	, , 	` `r   rK   c                       e Zd ZdZddZddZy)CryptographyAuthHelperzNCryptography based public key based authentication helper for Ansible Core CI.c                   ddl m} ddlm} ddlm} ddlm} | j                         } |t        |      d |             }t        ||j                        sJ |j                  ||j                  |j                                     }|S )rb   r   default_backend)hashesec)load_pem_private_keyN)cryptography.hazmat.backendsro   cryptography.hazmat.primitivesrp   )cryptography.hazmat.primitives.asymmetricrr   ,cryptography.hazmat.primitives.serializationrs   r`   r   
isinstanceEllipticCurvePrivateKeysignECDSASHA256)	r!   rV   ro   rp   rr   rs   r_   private_keyrW   s	            r   rQ   z!CryptographyAuthHelper.sign_bytes   ss     	A9@U557*8O+DdOL]^+r'A'ABBB)..}bhhv}}>WX""r   c                   ddl m} ddlm} ddlm} |j                  |j                          |             }|j                         }t        |j                  |j                  j                  |j                  j                  |j                                     }t        |j!                  |j                  j                  |j"                  j$                              }| j'                  |       |S )rg   r   rn   )serializationrq   )encodingformatencryption_algorithm)r   r   )rt   ro   ru   r   rv   rr   r^   	SECP384R1
public_keyr   private_bytesEncodingPEMPrivateFormatPKCS8NoEncryptionpublic_bytesPublicFormatSubjectPublicKeyInfore   )r!   ro   r   rr   r}   r   r_   rd   s           r   r^   z+CryptographyAuthHelper.generate_private_key   s     	A@@--bllno>OP ++-
!+";";"++// ..44!.!;!;!= #< #
  !!8!8"++// --BB "9 "
 
 	/r   Nri   r5   r   r   r   r   rQ   r^   r   r   r   rl   rl      s    X#"r   rl   c                       e Zd ZdZddZddZy)OpenSSLAuthHelperzIOpenSSL based public key based authentication helper for Ansible Core CI.c                :   | j                         }t        j                         5 }|j                  t	        |             |j                          t        j                         5 }|j                  |       |j                          t        j                         5 }t        dddd|j                  d|j                  |j                  gd       |j                         }ddd       ddd       ddd       S # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   S xY w)	rb   openssldgstz-sha256z-signz-outTcaptureN)	r`   tempfileNamedTemporaryFilewriter   flushr   r$   read)r!   rV   r_   private_key_filepayload_filesignature_filerW   s          r   rQ   zOpenSSLAuthHelper.sign_bytes   s    557((* 
	@.>""8O#<=""$,,. @,""=1""$002 @nFIwHXH]H]_egugzgz  }I  }N  }N  !O  Y]  ^*8*=*=*?'@	@	
	@ #"	@ @	@ @	
	@ #"s<   ?D$6DAC8D&D8D=DD		DDc                r    t        g dd      d   }t        g d|d      d   }| j                  |       |S )rg   )r   ecparamz-genkeyz-name	secp384r1z-nooutTr   r   )r   rr   z-pubout)datar   )r   re   )r!   r_   rd   s      r   r^   z&OpenSSLAuthHelper.generate_private_key   s@    %&gquvwxy$%Aaefghi/r   Nri   r5   r   r   r   r   r   r      s    S#$r   r   )r3   r   )!r   
__future__r   r:   rR   rO   rZ   r   typingtr   r   r   ior   r   configr	   r
   utilr   r   r   r   r   r   r   ABCMetar   rI   rK   rl   r   r   r   r   <module>r      s    ' " 
   	  


 G"2 G*C3;; *CZ  &$`3;; $`N+Z3;; +\
ckk r   