o
    3Ih]                    @   s  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Zd dlZd dlZd dl	m
Z
 d dlmZ d dlZd dlmZmZ d dl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' dZ(dZ)dZ*dZ+dZ,dd Z-dd Z.dd Z/dd Z0dd Z1dZ2dZ3dZ4dZ5e-e5Z6dZ7e-e7Z8dZ9d Z:d!Z;d"Z<ejj=ed#j>dd$ej?e*d% Z@ejj=ed#j>dd$ej?e+d% ZAe/e@ZBd&ZCd'ZDe-eDZEd(ZFe-eFZGd)ZHe-eHZId*ZJd+ZKd,ZLd-Me.eKe.eLgZNd-MeNe.eIgZOdeO ZKd.ZPe.eKd- e.eP ZQd-MeQe.eHgZRd-Me.eKe.eL>d/d0e.eHgZSd-Me.eKd1e.eHgZTe-eDZUeOZVd2ZWd3eW ZXG d4d5 d5ejYZZG d6d7 d7eZZ[G d8d9 d9eZZ\G d:d; d;Z]G d<d= d=eZZ^G d>d? d?eZZ_G d@dA dAeZZ`eadBkreb  dS dS )C    N)pprint)
namedtuple)mock)PY3next)Configuration   )ConfigException)UTCformat_rfc3339parse_rfc3339)ENV_KUBECONFIG_PATH_SEPARATORCommandTokenSource
ConfigNode
FileOrDataKubeConfigLoaderKubeConfigMerger_cleanup_temp_files_create_temp_file_with_content_get_kube_config_loader%_get_kube_config_loader_for_yaml_filelist_kube_config_contextsload_kube_configload_kube_config_from_dictnew_client_from_confignew_client_from_config_dictz	Bearer %sz%Y-%m-%dT%H:%M:%SZ   <   zz_non_existing_file_472398324c                 C   s   t |   S N)base64standard_b64encodeencodedecodestring r&   b/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/kubernetes/config/kube_config_test.py_base646   s   r(   c                 C   s   t |   dS )N=)r    urlsafe_b64encoder"   r#   rstripr$   r&   r&   r'   _urlsafe_unpadded_b64encode:   s   r,   c                 C   s
   |  tS r   )strftimeEXPIRY_DATETIME_FORMAT)dtr&   r&   r'   _format_expiry_datetime>      
r0   c                    s<    fdd| j jdD }t|ddddS )Nc                 3   s"    | ]}| d  kr|V  qdS )nameN)get).0itemactive_contextr&   r'   	<genexpr>C   s    z_get_expiry.<locals>.<genexpr>usersuserauth-providerconfigexpiry)_configvaluer3   r   )loaderr7   expired_gcp_confr&   r6   r'   _get_expiryB   s   rB   c                 C   s   t | r   )	Exception)str&   r&   r'   _raise_exceptionI   s   rE   filedataztest-filenamez	test-datazanother-test-dataz	test-hostmepasszBasic bWU6cGFzcw==tztzinfo)minuteszhttps://test-hostz	cert-auth
client-keyzclient-certzkubernetes.ioztest-oidc-tokenz{"name": "test"}.z!{"name": "test","exp": 536457600}a+aaaaaztest-azure-tokenBearer c                   @   s.   e Zd Zdd Zdd ZdddZdd	 Zd
S )BaseTestCasec                 C   s
   g | _ d S r   )_temp_filesselfr&   r&   r'   setUp   r1   zBaseTestCase.setUpc                 C   s   | j D ]}t| qd S r   )rV   osremove)rX   fr&   r&   r'   tearDown   s   
zBaseTestCase.tearDown c                 C   s8   t  \}}| j| t|t| t| |S r   )	tempfilemkstemprV   appendrZ   writestrr"   close)rX   contenthandlerr2   r&   r&   r'   _create_temp_file   s
   
zBaseTestCase._create_temp_filec                 O   sN   |  t}||i | W d    n1 sw   Y  | |t|j d S r   )assertRaisesr	   assertInrc   	exception)rX   funcmessage_partargskwargscontextr&   r&   r'   expect_exception   s   zBaseTestCase.expect_exceptionN)r^   )__name__
__module____qualname__rY   r]   rg   rp   r&   r&   r&   r'   rU      s
    
rU   c                   @   s   e Zd Zed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 Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!S )"TestFileOrDatac                 C   s4   t | }| W  d    S 1 sw   Y  d S r   )openread)filenamer\   r&   r&   r'   get_file_content   s   
$zTestFileOrData.get_file_contentc                 C   s6   t t}t|i}t|td}| t| |  d S )Nobjfile_key_name)r   	TEST_DATATEST_FILE_KEYr   assertEqualrx   as_filerX   temp_filenamerz   tr&   r&   r'   test_file_given_file   s   z#TestFileOrData.test_file_given_filec                 C   s*   t }t|i}t|td}| |jd d S )Nry   does not exist)NON_EXISTING_FILEr}   r   rp   r   r   r&   r&   r'   !test_file_given_non_existing_file   s   z0TestFileOrData.test_file_given_non_existing_filec                 C   s0   t ti}t|tt d}| t| |  d S Nrz   r{   data_key_name)TEST_DATA_KEYTEST_DATA_BASE64r   r}   r~   r|   rx   r   rX   rz   r   r&   r&   r'   test_file_given_data   s
   z#TestFileOrData.test_file_given_datac                 C   s2   t ti}t|tt dd}| t| |  d S NF)rz   r{   r   base64_file_content)r   r|   r   r}   r~   rx   r   r   r&   r&   r'   test_file_given_data_no_base64   s
   z-TestFileOrData.test_file_given_data_no_base64c                 C   s*   t ti}t|tt d}| t|  d S r   )r   r   r   r}   r~   as_datar   r&   r&   r'   test_data_given_data   s
   z#TestFileOrData.test_data_given_datac                 C   s0   t | jtdi}t|t d}| t|  d S )Nre   ry   )r}   rg   r|   r   r~   r   r   r   r&   r&   r'   test_data_given_file   s   z#TestFileOrData.test_data_given_filec                 C   s2   t | jtdi}t|t dd}| t|  d S )Nr   F)rz   r{   r   )r}   rg   r|   r   r~   r   r   r&   r&   r'   test_data_given_file_no_base64   s   z-TestFileOrData.test_data_given_file_no_base64c                 C   s6   t tt| jtdi}t|tt d}| t|  d S Nr   r   )r   r   r}   rg   TEST_ANOTHER_DATAr   r~   r   r   r&   r&   r'   test_data_given_file_and_data   s   z,TestFileOrData.test_data_given_file_and_datac                 C   s<   t tt| jtdi}t|tt d}| t| |	  d S r   )
r   r   r}   rg   r   r   r~   r|   rx   r   r   r&   r&   r'   test_file_given_file_and_data   s   z,TestFileOrData.test_file_given_file_and_datac                 C   sT   | j td}tj|}tj|}t|i}t|t|d}| t| 	|
  d S )Nr   )rz   r{   file_base_path)rg   r|   rZ   pathdirnamebasenamer}   r   r~   rx   r   )rX   r_   tempfile_dirtempfile_basenamerz   r   r&   r&   r'   test_file_with_custom_dirname   s   z,TestFileOrData.test_file_with_custom_dirnamec                 C   s    |  t| tt t  d S r   )r~   r|   rx   r   r   rW   r&   r&   r'   "test_create_temp_file_with_content   s   
z1TestFileOrData.test_create_temp_file_with_contentc                 C   s4   t t i}t|tt d}| t| |  d S r   )	r   r   r"   r   r}   r~   r|   rx   r   r   r&   r&   r'   test_file_given_data_bytes   s
   z)TestFileOrData.test_file_given_data_bytesc                 C   s6   t t i}t|tt dd}| t| |  d S r   )r   r|   r"   r   r}   r~   rx   r   r   r&   r&   r'   $test_file_given_data_bytes_no_base64   s
   z3TestFileOrData.test_file_given_data_bytes_no_base64c                 C   "   t d ttd}| | d  d S r   )r   r}   r   r~   r   rX   r   r&   r&   r'   test_file_given_no_object     z(TestFileOrData.test_file_given_no_objectc                 C   r   r   )r   r}   r   r~   r   r   r&   r&   r'   test_file_given_no_object_data	  r   z-TestFileOrData.test_file_given_no_object_dataN)rq   rr   rs   staticmethodrx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   r&   r&   r'   rt      s$    
			rt   c                	       s   e Zd Zdg dddiddddd	dhdd
g ddgddddd	dhdd
g ddgdZ fddZdd Zdd Zdd Zdd Zdd Z	dd Z
dd Z  ZS )TestConfigNodetestrQ   bc	inner_keyinner_value	test_name
test_value)r2   r?   
test_name2key1
test_name3)r   r      )r   key2key3
with_nameswith_names_dupc                    s    t t|   td| j| _d S )Ntest_obj)superr   rY   r   r   noderW   	__class__r&   r'   rY     s   zTestConfigNode.setUpc                 C   s   |  d| jd  |  dt| j |  d| jd j |  g d| jd j |  d| jd d  |  d	t| jd  |  d
| jd j |  ddi| jd j |  d| jd d  |  dt| jd  d S )Nr   r      ztest_obj/key2r   r   r   r   r   ztest_obj/key3r   r   r   )r~   r   lenr2   r?   rW   r&   r&   r'    test_normal_map_array_operations"  s   

z/TestConfigNode.test_normal_map_array_operationsc                 C   sx   | j d }| d|dd  | t|dt | t|dt | d|dj | d|dj d S )	Nr   r   r   r?   r   r   z$test_obj/with_names[name=test_name2]z$test_obj/with_names[name=test_name3])r   r~   get_with_name
assertTrue
isinstancer   r2   )rX   r   r&   r&   r'   test_get_with_name1  s"   


z!TestConfigNode.test_get_with_namec                    s,      fddd    fddd d S )Nc                      s
    j d S )Nnot-exists-keyr   r&   rW   r&   r'   <lambda>@  s   
 z9TestConfigNode.test_key_does_not_exists.<locals>.<lambda>z'Expected key not-exists-key in test_objc                      s    j d d S )Nr   r   r   r&   rW   r&   r'   r   B  s    z,Expected key not-exists-key in test_obj/key3rp   rW   r&   rW   r'   test_key_does_not_exists?  s   z'TestConfigNode.test_key_does_not_existsc                          fddd d S )Nc                          j d dS )Nr   no-namer   r   r&   rW   r&   r'   r   G      zETestConfigNode.test_get_with_name_on_invalid_object.<locals>.<lambda>z<Expected all values in test_obj/key2 list to have 'name' keyr   rW   r&   rW   r'   $test_get_with_name_on_invalid_objectE     
z3TestConfigNode.test_get_with_name_on_invalid_objectc                    r   )Nc                      r   )Nr   r   r   r&   rW   r&   r'   r   L  r   zFTestConfigNode.test_get_with_name_on_non_list_object.<locals>.<lambda>z#Expected test_obj/key3 to be a listr   rW   r&   rW   r'   %test_get_with_name_on_non_list_objectJ  r   z4TestConfigNode.test_get_with_name_on_non_list_objectc                    r   )Nc                      r   )Nr   r   r   r&   rW   r&   r'   r   Q  r   zKTestConfigNode.test_get_with_name_on_name_does_not_exists.<locals>.<lambda>z=Expected object with name no-name in test_obj/with_names listr   rW   r&   rW   r'   *test_get_with_name_on_name_does_not_existsO  r   z9TestConfigNode.test_get_with_name_on_name_does_not_existsc                    r   )Nc                      r   )Nr   r   r   r&   rW   r&   r'   r   V  r   zETestConfigNode.test_get_with_name_on_duplicate_name.<locals>.<lambda>zLExpected only one object with name test_name in test_obj/with_names_dup listr   rW   r&   rW   r'   $test_get_with_name_on_duplicate_nameT  r   z3TestConfigNode.test_get_with_name_on_duplicate_name)rq   rr   rs   r   rY   r   r   r   r   r   r   r   __classcell__r&   r&   r   r'   r     s0    r   c                   @   s4   e Zd Zg dZdgZd
ddZdd Zdd	 ZdS )
FakeConfig)ssl_ca_certkey_file	cert_filerefresh_api_key_hookNc                 K   s*   i | _ d | _|r|| j d< | j| d S )Nauthorization)api_keyr   __dict__update)rX   tokenrn   r&   r&   r'   __init__`  s
   
zFakeConfig.__init__c              
   C   sD  t | jt |jkrd S | j D ]\}}|| jv rq||jvr# d S || jv r|r|j| rzFt|8}t|j| !}| | krV	 W d    W d    W  d S W d    n1 s`w   Y  W d    n1 sow   Y  W q ty   |j| |krY  d S Y qw |j| |kr d S q|j| |kr d S qdS )NT)r   r   itemsIGNORE_KEYS	FILE_KEYSru   rv   OSError)rX   otherkvf1f2r&   r&   r'   __eq__i  s>   


  zFakeConfig.__eq__c                 C   s   d}| j  D ]K\}}|}|| jv rJzt|}dt|  }W d    n1 s+w   Y  W n tyI } zdt| }W Y d }~nd }~ww |d||f 7 }qd| S )N
zFILE: %sz	ERROR: %sz	%s: %s
zConfig(%s
))r   r   r   ru   rc   r#   rv   r   )rX   repr   r   valr\   er&   r&   r'   __repr__  s   

zFakeConfig.__repr__r   )rq   rr   rs   r   r   r   r   r   r&   r&   r&   r'   r   [  s    
	r   c                    @   sl  e Zd Zddddiddddddddddddddddd	dd	ddd
dd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dd!ddd"dd#ddd$d$dddgdd%eid&deed'd&ded(d'd&deed)d*d&ded+d,d&di d&d$eed)ed-d&gdee	e
d.d/ddd0eid1ee	e
d2d/ddeed3d1ee	e
d2d/d	deed3d1ee	e
d2d/d
d4d
d5eid1id/dd4ed6d7d8d9d:dd;id/dd4ed6d7d<d=d8d9d>dd;id/dd4ed6d7d<d?d8d9d>dd;id/dd4ed6d7d<d@d8d9d>dd;id/dd4ed6d7d<dAd8d9d>dd;id/dd4d
dBdCeedDdEdFd1id/dd4d
dBdCeedDdEdGd1id/dd4d
dBdCedDdEdHd1id/dd4d
dBdCedDdEdHd1id/dd4d
dBdCedDdEdHd1id/de	e
dId/deeedJd/ddKdLdMdNd/deeedOd/ddPdQdRg dSdTid/ddPdQdUg dTid/dd4ddVdWid1id/d!d4ddVdXid1id/d#d4ddYdZd[d1id/gd\Zd]d^ Zd_d` Zdadb Zdcdd Zdedf Zdgdh Zdidj Zdkdl Ze dme dndodp Z!e dme dndqdr Z"e dme dndsdt Z#dudv Z$dwdx Z%dydz Z&d{d| Z'd}d~ Z(dd Z)dd Z*dd Z+dd Z,dd Z-dd Z.dd Z/dd Z0dd Z1dd Z2dd Z3dd Z4dd Z5dd Z6dd Z7dd Z8dd Z9dd Z:dd Z;dd Z<dd Z=dd Z>dd Z?e ddd Z@e ddd ZAe ddd ZBej dd+ddd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIddĄ ZJddƄ ZKdS )TestKubeConfigLoaderno_userclusterdefaultr2   ro   simple_tokenr   r:   gcpexpired_gcpexpired_gcp_refreshoidcazure	azure_num	azure_strazure_num_errorazure_str_errorexpired_oidcexpired_oidc_with_idp_ca_fileexpired_oidc_nocert oidc_contains_reserved_characteroidc_invalid_padding_length	user_passsslno_ssl_verificationssl-no_filessl-local-filenon_existing_userexec_cred_userexec_cred_user_certificatecontexttestcmdpathclustertestcmdpathusertestcmdpathcontexttestcmdpathemptyusertestcmdpathemptycontexttestcmdpathscopeusertestcmdpathscopetls-server-nameserverr2   r   )r  zcertificate-authority	cert_testF)r  certificate-authority-datainsecure-skip-tls-verifyT)r  r  )r  r  r  r  r   usernamepasswordr2   r:   access-tokenr2   r<   )r;   r   r  r  )r  r=   r;   id-tokenz$00000002-0000-0000-c000-000000000000AzurePublicCloudrefreshTokenz$9d2ac018-e843-4e14-9e2b-4e0ddac75433)r  apiserver-idenvironmentrefresh-token	tenant-id)r<   r2   0	156207275)r  r$  r%  z
expires-inz
expires-onr&  r'  z2018-10-18 00:52:29.044727z2018-10-18 00:52z-1tectonic-kubectlFAKE_SECREThttps://example.org/identity lucWJjEhlxZW01cXI3YmVlcYnpxNGhzk	client-idclient-secretr!  zidp-certificate-authority-dataidp-issuer-urlr&  )r/  r0  r!  zidp-certificate-authorityr1  r&  )r/  r0  r!  r1  r&  )r  r  )r   client-certificaterO   
token_fileclient_cert
client_key)	tokenFiler2  rO   r   zclient-certificate-datazclient-key-dataexecz$client.authentication.k8s.io/v1beta1zaws-iam-authenticator)r   z-izdummy-cluster)
apiVersioncommandrm   z custom-certificate-authenticatorcmd-pathcmdtorunr^   cmdscope)r;  scopescurrent-contextcontextsclustersr9   c                 C   4   t td}t  }t| jdd| | || d S )Nhostr   config_dictr7   r   	TEST_HOSTr   TEST_KUBE_CONFIGload_and_setr~   rX   expectedactualr&   r&   r'   test_no_user_context     
z)TestKubeConfigLoader.test_no_user_contextc                 C   s:   t ttt d}t  }t| jdd| | || d S )NrF  r   r   rG  )r   rJ  BEARER_TOKEN_FORMATr   r   rK  rL  r~   rM  r&   r&   r'   test_simple_token  s   z&TestKubeConfigLoader.test_simple_tokenc                 C   s2   t | jdd}| |  | tt |j d S )Nr   rG  )r   rK  r   _load_user_tokenr~   rS  r   r   rX   r@   r&   r&   r'   test_load_user_token  s   z)TestKubeConfigLoader.test_load_user_tokenc                 C   s`   t  }| |j t| jddd d| | |j | t|j	 | t
t |jd  d S )Nr   c                   S      t dS NzSHOULD NOT BE CALLEDrE   r&   r&   r&   r'   r         z:TestKubeConfigLoader.test_gcp_no_refresh.<locals>.<lambda>rH  r7   get_google_credentialsr   )r   assertIsNoner   r   rK  rL  assertIsNotNoner~   rJ  rF  rS  r   r   )rX   fake_configr&   r&   r'   test_gcp_no_refresh  s   
z(TestKubeConfigLoader.test_gcp_no_refreshc                 C   s8   t | jddd d}| |  | tt |j d S )Nr   c                   S   rX  rY  rZ  r&   r&   r&   r'   r     r[  zETestKubeConfigLoader.test_load_gcp_token_no_refresh.<locals>.<lambda>r\  )r   rK  r   _load_auth_provider_tokenr~   rS  r   r   rV  r&   r&   r'   test_load_gcp_token_no_refresh  s   
z3TestKubeConfigLoader.test_load_gcp_token_no_refreshc                    s   dd  t  _tjjtdjd d _t| jd fddd}t	|d}| 
|  t	|d}| 
||k | tt  |j d S )	Nc                   S   s   d S r   r&   r&   r&   r&   r'   cred      zCTestKubeConfigLoader.test_load_gcp_token_with_refresh.<locals>.credrJ   rL   r   c                      s    S r   r&   r&   rd  r&   r'   r     re  zGTestKubeConfigLoader.test_load_gcp_token_with_refresh.<locals>.<lambda>r\  )TEST_ANOTHER_DATA_BASE64r   datetimenowr
   replacer=   r   rK  rB   r   rb  r~   rS  )rX   r@   original_expiry
new_expiryr&   rf  r'    test_load_gcp_token_with_refresh  s   



z5TestKubeConfigLoader.test_load_gcp_token_with_refreshc                 C   s   G dd d}G dd d}t  }t }||g|_t| jd|d}|| t|d}|| t|d}| 	||k | 
tt |j d S )Nc                   @      e Zd ZeZeZdS )zDTestKubeConfigLoader.test_gcp_refresh_api_key_hook.<locals>.cred_oldN)rq   rr   rs   r   r   DATETIME_EXPIRY_PASTr=   r&   r&   r&   r'   cred_old      rp  c                   @   rn  )zDTestKubeConfigLoader.test_gcp_refresh_api_key_hook.<locals>.cred_newN)rq   rr   rs   rg  r   DATETIME_EXPIRY_FUTUREr=   r&   r&   r&   r'   cred_new  rq  rs  r   r\  )r   r   Mockside_effectr   rK  rL  rB   r   r   r~   rS  rg  r   )rX   rp  rs  r`  _get_google_credentialsr@   rk  rl  r&   r&   r'   test_gcp_refresh_api_key_hook  s$   





z2TestKubeConfigLoader.test_gcp_refresh_api_key_hookc                 C   .   t | jdd}| |  | t|j d S )Nr   rG  )r   rK  r   rb  r~   TEST_OIDC_TOKENr   rV  r&   r&   r'   test_oidc_no_refresh/     z)TestKubeConfigLoader.test_oidc_no_refreshz9kubernetes.config.kube_config.OAuth2Session.refresh_tokenz/kubernetes.config.kube_config.ApiClient.requestc                 C   v   t  }t jddt|_t jtddidt|_||_ddd|_t	| j
dd	}| |  | d
|j d S )N   return_valuetoken_endpoint"https://example.org/identity/tokenabc123newtoken123id_tokenrefresh_tokenr  rG  Bearer abc123r   	MagicMockPropertyMocktypestatusjsondumpsrG   r  r   rK  r   rb  r~   r   rX   mock_ApiClientmock_OAuth2Sessionmock_responser@   r&   r&   r'   test_oidc_with_refresh7  s&   z+TestKubeConfigLoader.test_oidc_with_refreshc                 C   r|  )Nr}  r~  r  r  r  r  r  r  rG  r  r  r  r&   r&   r'   "test_oidc_with_idp_ca_file_refreshP  s&   z7TestKubeConfigLoader.test_oidc_with_idp_ca_file_refreshc                 C   r|  )Nr}  r~  r  r  r  r  r  r  rG  r  r  r  r&   r&   r'   test_oidc_with_refresh_nocertj  s&   z2TestKubeConfigLoader.test_oidc_with_refresh_nocertc                 C   $   t | jdd}| |dd  d S )Nr  rG  r   rK  r~   _load_oid_tokenrV  r&   r&   r'   *test_oidc_fails_if_contains_reserved_chars     z?TestKubeConfigLoader.test_oidc_fails_if_contains_reserved_charsc                 C   r  )Nr  rG  r  rV  r&   r&   r'   )test_oidc_fails_if_invalid_padding_length  r  z>TestKubeConfigLoader.test_oidc_fails_if_invalid_padding_lengthc                 C   rx  )Nr   rG  )r   rK  r   rb  r~   TEST_AZURE_TOKEN_FULLr   rV  r&   r&   r'   test_azure_no_refresh  r{  z*TestKubeConfigLoader.test_azure_no_refreshc                 C   ,   t | jdd}|jd }| || d S )Nr   rG  r;   r   rK  _userr   _azure_is_expiredrX   r@   providerr&   r&   r'   test_azure_with_expired_num     
z0TestKubeConfigLoader.test_azure_with_expired_numc                 C   r  )Nr   rG  r;   r  r  r&   r&   r'   test_azure_with_expired_str  r  z0TestKubeConfigLoader.test_azure_with_expired_strc                 C   ,   t | jdd}|jd }| t|j| d S )Nr   rG  r;   r   rK  r  rh   
ValueErrorr  r  r&   r&   r'   !test_azure_with_expired_str_error  r  z6TestKubeConfigLoader.test_azure_with_expired_str_errorc                 C   r  )Nr   rG  r;   r  r  r&   r&   r'   !test_azure_with_expired_int_error  r  z6TestKubeConfigLoader.test_azure_with_expired_int_errorc                 C   s6   t ttd}t  }t| jdd| | || d S )NrR  r  rG  )r   rJ  TEST_BASIC_TOKENr   rK  rL  r~   rM  r&   r&   r'   test_user_pass  s   z#TestKubeConfigLoader.test_user_passc                 C   rx  )Nr  rG  )r   rK  r   _load_user_pass_tokenr~   r  r   rV  r&   r&   r'   test_load_user_pass_token  s   z.TestKubeConfigLoader.test_load_user_pass_tokenc                 C   s$   t | jdd}| |jdt  d S )Nr	  rG  r   )r   rK  rp   rL  r   rV  r&   r&   r'   test_ssl_no_cert_files  s   z+TestKubeConfigLoader.test_ssl_no_cert_filesc                 C   sT   t ttt | t| t| tdd}t  }t| j	dd
| | || d S )NTrF  r   r   r   r   
verify_sslr  rG  )r   TEST_SSL_HOSTrS  r   rg   TEST_CLIENT_CERTTEST_CLIENT_KEYTEST_CERTIFICATE_AUTHr   rK  rL  r~   rM  r&   r&   r'   test_ssl  s   zTestKubeConfigLoader.test_sslc                 C   sN   t ttt | t| tdd d}t  }t| jdd	| | 
|| d S )NF)rF  r   r   r   r  r   r  rG  )r   r  rS  r   rg   r  r  r   rK  rL  r~   rM  r&   r&   r'   test_ssl_no_verification  s   z-TestKubeConfigLoader.test_ssl_no_verificationc              	   C   sV   t ttt | t| t| tdtd}t  }t	| j
dd| | || d S )NT)rF  r   r   r   r   r  tls_server_namer  rG  )r   r  rS  r   rg   r  r  r  TEST_TLS_SERVER_NAMEr   rK  rL  r~   rM  r&   r&   r'   test_tls_server_name  s    	z)TestKubeConfigLoader.test_tls_server_namec                 C   sP   t | jdd}| }td| jd }|D ]}||d }| |j| qd S )Nr   rG  r^   rB  r2   )r   rK  list_contextsr   r   r~   r?   )rX   r@   actual_contextsexpected_contextsrO  rN  r&   r&   r'   test_list_contexts  s   z'TestKubeConfigLoader.test_list_contextsc                 C   s6   t | jd}td| jd }| |dj|j d S )NrH  r^   rB  r   )r   rK  r   r~   r   r?   current_contextrX   r@   r  r&   r&   r'   test_current_context  s
   z)TestKubeConfigLoader.test_current_contextc                 C   s@   t | jd}|d td| jd }| |dj|j d S )Nr  r  r^   rB  )r   rK  set_active_contextr   r~   r   r?   r  r  r&   r&   r'   test_set_active_context  s   
z,TestKubeConfigLoader.test_set_active_contextc              	   C   s~  t ttt | t| t| td}zt	 }t  }t
tj|dd}|t  W d    n1 s8w   Y  t
tj|dd}|t  W d    n1 sYw   Y  t
tj|dd}|t  W d    n1 szw   Y  t
tj|dd}|t  W d    n1 sw   Y  t| jd|d| | || W t| d S t| w )	N)rF  r   r   r   r   r  wbr4  r5  r3  r
  rH  r7   config_base_path)r   r  rS  r   rg   r  r  r  r_   mkdtempru   rZ   r   joinrb   r"   r   rK  rL  r~   shutilrmtree)rX   rN  temp_dirrO  fdr&   r&   r'    test_ssl_with_relative_ssl_files  s<   z5TestKubeConfigLoader.test_ssl_with_relative_ssl_filesc                 C   sF   t ttt d}| t| j}t  }t|d|d | 	|| d S )NrR  r   config_filero   client_configuration)
r   rJ  rS  r   rg   yaml	safe_dumprK  r   r~   rX   rN  r  rO  r&   r&   r'   $test_load_kube_config_from_file_path8  s   
z9TestKubeConfigLoader.test_load_kube_config_from_file_pathc                 C   s   t ttt d}t }ztd |tt	| j
dd W n ty1   |t	| j
 Y nw t  }t|d|d | || d S )NrR  r^   rj  )errorsr   r  )r   rJ  rS  r   ioStringIOunicoderb   r  r  rK  	NameErrorr   r~   )rX   rN  config_file_like_objectrO  r&   r&   r'   +test_load_kube_config_from_file_like_objectB  s8   z@TestKubeConfigLoader.test_load_kube_config_from_file_like_objectc                 C   s6   t ttt d}t  }t| jd|d | || d S )NrR  r   )rH  ro   r  )r   rJ  rS  r   r   rK  r~   rM  r&   r&   r'   test_load_kube_config_from_dictY  s   z4TestKubeConfigLoader.test_load_kube_config_from_dictc              	   C   s   t ttt | t| t| tdd}t  }tj	
tj	tj	tj	td}t| jd||d | t|s=dnd | || t  d S )NTr  tmp_file_path_testr  )rH  ro   r  temp_file_pathF)r   r  rS  r   rg   r  r  r  rZ   r   r  r   abspath__file__r   rK  assertFalselistdirr~   r   )rX   rN  rO  tmp_pathr&   r&   r'   3test_load_kube_config_from_dict_with_temp_file_pathb  s2   

zHTestKubeConfigLoader.test_load_kube_config_from_dict_with_temp_file_pathc                 C   s   t  }| tt| d S r   )r  r  rh   r	   r   )rX   r  r&   r&   r'   1test_load_kube_config_from_empty_file_like_objecty  s   zFTestKubeConfigLoader.test_load_kube_config_from_empty_file_like_objectc                 C   s"   |  td }| tt| d S r   )rg   r  r  rh   r	   r   )rX   r  r&   r&   r'   %test_load_kube_config_from_empty_file  s   z:TestKubeConfigLoader.test_load_kube_config_from_empty_filec                 C   sf   |  t| j}t|d\}}| | jd d | tr(| | jd | d S | | jd | d S )Nr  rB  r   )	rg   r  r  rK  r   assertDictEqualr   assertCountEqualassertItemsEqual)rX   r  rB  r7   r&   r&   r'   test_list_kube_config_contexts  s    

z3TestKubeConfigLoader.test_list_kube_config_contextsc                 C   sJ   |  t| j}t|dd}| t|jj | t	t
 |jjd  d S Nr   )r  ro   r   )rg   r  r  rK  r   r~   rJ  configurationrF  rS  r   r   )rX   r  clientr&   r&   r'   test_new_client_from_config  s   


z0TestKubeConfigLoader.test_new_client_from_configc                 C   s:   t | jdd}| t|jj | tt |jjd  d S )Nr   )rH  ro   r   )	r   rK  r~   rJ  r  rF  rS  r   r   )rX   r  r&   r&   r'    test_new_client_from_config_dict  s   

z5TestKubeConfigLoader.test_new_client_from_config_dictc                 C   sB   t td}t  }| j }|d= t|dd| | || d S )NrE  r9   r   rG  )r   rJ  rK  copyr   rL  r~   )rX   rN  rO  test_kube_configr&   r&   r'   test_no_users_section  s   

z*TestKubeConfigLoader.test_no_users_sectionc                 C   rD  )NrE  r  rG  rI  rM  r&   r&   r'   test_non_existing_user  rQ  z+TestKubeConfigLoader.test_non_existing_userz.kubernetes.config.kube_config.ExecProvider.runc                 C   sL   d}d|i|_ ttdt| id}t }t| jdd| | || d S )Ndummyr   r   )rF  r   r  rG  )r  r   rJ  rS  r   rK  rL  r~   )rX   r   r   rN  rO  r&   r&   r'   test_user_exec_auth  s   z(TestKubeConfigLoader.test_user_exec_authc                 C   s   d}d}|t td|t tdg|_t }| |j t| jdd	| | 
|jd t|  | |j || | 
|jd t|  d S )Nexpiredcurrent)r   expirationTimestampr  rG  r   )r   ro  rr  ru  r   r^  r   r   rK  rL  r~   r   rS  r_  )rX   r   expired_tokencurrent_tokenr`  r&   r&   r'   test_user_exec_auth_with_expiry  s0   
z4TestKubeConfigLoader.test_user_exec_auth_with_expiryc                 C   sZ   t td|_tt| t | t| tdd}t }t| jdd	| | 
|| d S )N)clientCertificateDataclientKeyDataT)rF  r   r   r   r  r  rG  )r  r  r  r   r  rg   r  r   rK  rL  r~   )rX   r   rN  rO  r&   r&   r'    test_user_exec_auth_certificates  s"   z5TestKubeConfigLoader.test_user_exec_auth_certificates)autospecc                    sF   i   fdd}||_ d}t| jd|dt  | | d  d S )Nc                    s   | j  d< d S )Ncwd)r  )exec_providercapturer&   r'   capture_cwd  s   z<TestKubeConfigLoader.test_user_exec_cwd.<locals>.capture_cwdz/some/random/pathr  r  r  )ru  r   rK  rL  r   r~   )rX   r   r  rN  r&   r  r'   test_user_exec_cwd  s   
z'TestKubeConfigLoader.test_user_exec_cwdc                 C   sp   t dddg}d}||ttj }tj|dt_tdt	| id}t }t
| jdd	| | || d S )
NAr   r=   r  r~  r   r   r  rG  )r   r   rh  ri  r   rt  r   r   r   rS  r   rK  rL  r~   )rX   r	  r   r  rN  rO  r&   r&   r'   test_user_cmd_path  s   z'TestKubeConfigLoader.test_user_cmd_pathc                    f   t dddg}d}||ttj }tj|dt_tdt	| id}t  
 fdd	d
 d S )Nr	  r   r=   r  r~  r   r
  c                         t jdd S )Nr  rG  r   rK  rL  r&   rO  rX   r&   r'   r     
    z?TestKubeConfigLoader.test_user_cmd_path_empty.<locals>.<lambda>zNmissing access token cmd (cmd-path is an empty string in your kubeconfig file)r   r   rh  ri  r   rt  r   r   r   rS  rp   rX   r	  r   r  rN  r&   r  r'   test_user_cmd_path_empty     z-TestKubeConfigLoader.test_user_cmd_path_emptyc                    r  )Nr	  r   r=   r  r~  r   r
  c                      r  )Nr  rG  r  r&   r  r&   r'   r   *  r  zDTestKubeConfigLoader.test_user_cmd_path_with_scope.<locals>.<lambda>zGscopes can only be used when kubectl is using a gcp service account keyr  r  r&   r  r'   test_user_cmd_path_with_scope"  r  z2TestKubeConfigLoader.test_user_cmd_path_with_scopec                 C   s:   t ttt d}| t| j}t|}| 	|j
 d S )NrR  )r   rJ  rS  r   rg   r  r  rK  r   r^  _config_persisterr  r&   r&   r'   5test__get_kube_config_loader_for_yaml_file_no_persist0  s   
zJTestKubeConfigLoader.test__get_kube_config_loader_for_yaml_file_no_persistc                 C   R   t ttt d}| t| j}t|dd}| 	t
|j | |jjd d S )NrR  T)persist_configsave_changes)r   rJ  rS  r   rg   r  r  rK  r   r   callabler  r~   rq   r  r&   r&   r'   2test__get_kube_config_loader_for_yaml_file_persist8     
zGTestKubeConfigLoader.test__get_kube_config_loader_for_yaml_file_persistc                 C   s<   t ttt d}| t| j}t|d}| 	|j
 d S )NrR  )rw   )r   rJ  rS  r   rg   r  r  rK  r   r^  r  r  r&   r&   r'   ,test__get_kube_config_loader_file_no_persistB  s   

zATestKubeConfigLoader.test__get_kube_config_loader_file_no_persistc                 C   r  )NrR  T)rw   r  r  )r   rJ  rS  r   rg   r  r  rK  r   r   r  r  r~   rq   r  r&   r&   r'   )test__get_kube_config_loader_file_persistJ  r  z>TestKubeConfigLoader.test__get_kube_config_loader_file_persistc                 C   s,   t ttt d}t| jd}| |j d S )NrR  r  )r   rJ  rS  r   r   rK  r^  r  rM  r&   r&   r'   ,test__get_kube_config_loader_dict_no_persistT  s   zATestKubeConfigLoader.test__get_kube_config_loader_dict_no_persistN)Lrq   rr   rs   rJ  r  r  TEST_CERTIFICATE_AUTH_BASE64r  r   TEST_USERNAMETEST_PASSWORDTEST_TOKEN_EXPIRY_PASTTEST_OIDC_LOGINTEST_AZURE_TOKENTEST_OIDC_EXPIRED_LOGINTEST_OIDC_CA&TEST_OIDC_CONTAINS_RESERVED_CHARACTERS TEST_OIDC_INVALID_PADDING_LENGTHr  r  TEST_CLIENT_CERT_BASE64TEST_CLIENT_KEY_BASE64rK  rP  rT  rW  ra  rc  rm  rw  rz  r   patchr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r&   r&   r&   r'   r     s   		  J
6	



			       E	


	

		






r   c                   @   s   e Zd Zdd Zdd ZdS )!TestKubernetesClientConfigurationc                 C   s   |  tt d d S )Nr   )r   hasattrr   rW   r&   r&   r'    test_refresh_api_key_hook_existsb  s   zBTestKubernetesClientConfiguration.test_refresh_api_key_hook_existsc                    sR   ddd}t |idid  fdd}| _d   d S )	Nr   expected_token	old_tokenBearer)r   api_key_prefixc                    s    |   | j< d S r   )r~   r   )client_configr<   r1  
identifierrX   r&   r'   r   n  s   zkTestKubernetesClientConfiguration.test_get_api_key_calls_refresh_api_key_hook.<locals>.refresh_api_key_hookrT   )r   r   r~   get_api_key_with_prefix)rX   r2  r   r&   r6  r'   +test_get_api_key_calls_refresh_api_key_hooke  s   
zMTestKubernetesClientConfiguration.test_get_api_key_calls_refresh_api_key_hookN)rq   rr   rs   r0  r9  r&   r&   r&   r'   r.  \  s    r.  c                   @   s  e Zd Zddddidgddeidgg ddd	d	d	d
ddddd
dgd	eeddgd	eeeddgdddddd
dd	ddd
dgg ddddde	e
ddddiddeeeddgdddidddd
dgdi dgdddd d!ididgd"ddddidgddeidgd#dgZd$ddeidgiddddd
dgd%d&deeeddgigZd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd#S )1TestKubeConfigMergerr   r   r   r   r  r  r@  r^   r  r   r   )r  r  r7  r  r  z"skipped-part2-defined-this-contextskippedr;   r   r*  r+  r,  r-  r.  r   r  rA  r  r  r  r   r;  r<  )rB  rC  r9   NrC  )rA  rB  r9   c                 C   s.   g }|D ]}| | t| qt|S r   )ra   rg   r  r  r   r  )rX   partsfilespartr&   r&   r'   _create_multi_config6  s   
z)TestKubeConfigMerger._create_multi_configc                 C   s   |  | j}ddidddddddddddddddddd	d
dddg}t|d\}}| || | ||d  d S )Nr   r   r   ro   r2   r  r   r   r  r  r  r  r  r   )r?  TEST_KUBE_CONFIG_SET1r   r~   )rX   kubeconfigsr  rB  r7   r&   r&   r'   r  <  s(   
z3TestKubeConfigMerger.test_list_kube_config_contextsc                 C   sD   |  | j}t|dd}| t|jj | tt |jj	d  d S r  )
r?  rA  r   r~   rJ  r  rF  rS  r   r   )rX   rB  r  r&   r&   r'   r  O  s   

z0TestKubeConfigMerger.test_new_client_from_configc                 C   s~   |  | j}t|d}dddddg}t|d\}}| || | ||d  | t|jj | tt	 |jj
d  d S )Nr  r   r   r   r@  r   r   )r?  TEST_KUBE_CONFIG_SET2r   r   r~   rJ  r  rF  rS  r   r   )rX   rB  r  r  rB  r7   r&   r&   r'   )test_merge_with_context_in_different_fileW  s   



z>TestKubeConfigMerger.test_merge_with_context_in_different_filec                 C   s   |  | j}t|}|jd dd }|d d }d|jd< |  t|}|jd dd }|d d }| |jd d d S )Nr9   r  r:   r;   r<   ztoken-changedr!  )r?  rA  r   r<   r   r?   r  r~   )rX   rB  kconfr:   r  r&   r&   r'   test_save_changesg  s   
z&TestKubeConfigMerger.test_save_changes)rq   rr   rs   rJ  r  r!  r   r+  r,  r'  r(  r"  r#  rA  rC  r?  r  r  rD  rF  r&   r&   r&   r'   r:  w  s   
'0
  
!r:  __main__)cr    rh  r  r  rZ   r   r  r_   unittestcollectionsr   r   r  sixr   r   kubernetes.clientr   config_exceptionr	   dateutilr
   r   r   kube_configr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rS  r.   PAST_EXPIRY_TIMEDELTAFUTURE_EXPIRY_TIMEDELTAr   r(   r,   r0   rB   rE   r}   r   TEST_FILENAMEr|   r   r   rg  rJ  r"  r#  r  ri  rj  	timedeltaro  rr  r$  r  r  r!  r  r,  r  r+  r  ry  TEST_OIDC_INFOr  TEST_OIDC_BASEr%  TEST_OIDC_EXPTEST_OIDC_EXP_BASEr'  r)  r*  r(  TEST_AZURE_LOGINr&  r  TestCaserU   rt   r   r   r   r.  r:  rq   mainr&   r&   r&   r'   <module>   s   D	

jL7         S  
