o
    vi                    @   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&   a/home/air/biblejyuku/back/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!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_datac                 C   sT   t ti}t|tt d}| }t| t|tt d}| }| t| 	| d S r   )
r   r   r   r}   r   rZ   r[   r~   r|   rx   )rX   rz   t1first_file_patht2second_file_pathr&   r&   r'   test_file_recreation  s   
z#TestFileOrData.test_file_recreationN)rq   rr   rs   staticmethodrx   r   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   2  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_operations6  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_nameE  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>T  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   V  s    z,Expected key not-exists-key in test_obj/key3rp   rW   r&   rW   r'   test_key_does_not_existsS  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   [      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_objectY     
z3TestConfigNode.test_get_with_name_on_invalid_objectc                    r   )Nc                      r   )Nr   r   r   r&   rW   r&   r'   r   `  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_object^  r   z4TestConfigNode.test_get_with_name_on_non_list_objectc                    r   )Nc                      r   )Nr   r   r   r&   rW   r&   r'   r   e  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_existsc  r   z9TestConfigNode.test_get_with_name_on_name_does_not_existsc                    r   )Nc                      r   )Nr   r   r   r&   rW   r&   r'   r   j  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_nameh  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__t  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__}  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   o  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+  )r4  r5  r&  zidp-certificate-authorityr6  r+  )r4  r5  r&  r6  r+  )r!  r"  )r   client-certificaterO   
token_fileclient_cert
client_key)	tokenFiler7  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rK  r   r   rL  )r   rO  BEARER_TOKEN_FORMATr   r   rP  rQ  r~   rR  r&   r&   r'   test_simple_token  s   z&TestKubeConfigLoader.test_simple_tokenc                 C   s2   t | jdd}| |  | tt |j d S )Nr   rL  )r   rP  r   _load_user_tokenr~   rX  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>rM  r7   get_google_credentialsr   )r   assertIsNoner   r   rP  rQ  assertIsNotNoner~   rO  rK  rX  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   r]  r^  r_  r&   r&   r&   r'   r     r`  zETestKubeConfigLoader.test_load_gcp_token_no_refresh.<locals>.<lambda>ra  )r   rP  r   _load_auth_provider_tokenr~   rX  r   r   r[  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&   ri  r&   r'   r      rj  zGTestKubeConfigLoader.test_load_gcp_token_with_refresh.<locals>.<lambda>ra  )TEST_ANOTHER_DATA_BASE64r   datetimenowr
   replacer=   r   rP  rB   r   rg  r~   rX  )rX   r@   original_expiry
new_expiryr&   rk  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*      ru  c                   @   rs  )zDTestKubeConfigLoader.test_gcp_refresh_api_key_hook.<locals>.cred_newN)rq   rr   rs   rl  r   DATETIME_EXPIRY_FUTUREr=   r&   r&   r&   r'   cred_new.  rv  rx  r   ra  )r   r   Mockside_effectr   rP  rQ  rB   r   r   r~   rX  rl  r   )rX   ru  rx  re  _get_google_credentialsr@   rp  rq  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   rL  )r   rP  r   rg  r~   TEST_OIDC_TOKENr   r[  r&   r&   r'   test_oidc_no_refreshC     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  rL  Bearer abc123r   	MagicMockPropertyMocktypestatusjsondumpsrG   r  r   rP  r   rg  r~   r   rX   mock_ApiClientmock_OAuth2Sessionmock_responser@   r&   r&   r'   test_oidc_with_refreshK  s&   z+TestKubeConfigLoader.test_oidc_with_refreshc                 C   r  )Nr  r  r  r  r  r  r  r  rL  r  r  r  r&   r&   r'   "test_oidc_with_idp_ca_file_refreshd  s&   z7TestKubeConfigLoader.test_oidc_with_idp_ca_file_refreshc                 C   r  )Nr  r  r  r  r  r  r  r  rL  r  r  r  r&   r&   r'   test_oidc_with_refresh_nocert~  s&   z2TestKubeConfigLoader.test_oidc_with_refresh_nocertc                 C   $   t | jdd}| |dd  d S )Nr	  rL  r   rP  r~   _load_oid_tokenr[  r&   r&   r'   *test_oidc_fails_if_contains_reserved_chars     z?TestKubeConfigLoader.test_oidc_fails_if_contains_reserved_charsc                 C   r  )Nr
  rL  r  r[  r&   r&   r'   )test_oidc_fails_if_invalid_padding_length  r  z>TestKubeConfigLoader.test_oidc_fails_if_invalid_padding_lengthc                 C   r}  )Nr  rL  )r   rP  r   rg  r~   TEST_AZURE_TOKEN_FULLr   r[  r&   r&   r'   test_azure_no_refresh  r  z*TestKubeConfigLoader.test_azure_no_refreshc                 C   ,   t | jdd}|jd }| || d S )Nr  rL  r;   r   rP  _userr   _azure_is_expiredrX   r@   providerr&   r&   r'   test_azure_with_expired_num     
z0TestKubeConfigLoader.test_azure_with_expired_numc                 C   r  )Nr  rL  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  rL  r;   r   rP  r  rh   
ValueErrorr  r  r&   r&   r'   !test_azure_with_expired_str_error  r  z6TestKubeConfigLoader.test_azure_with_expired_str_errorc                 C   r  )Nr  rL  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 )NrW  r  rL  )r   rO  TEST_BASIC_TOKENr   rP  rQ  r~   rR  r&   r&   r'   test_user_pass  s   z#TestKubeConfigLoader.test_user_passc                 C   r}  )Nr  rL  )r   rP  r   _load_user_pass_tokenr~   r  r   r[  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  rL  r   )r   rP  rp   rQ  r   r[  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rK  r   r   r   r   
verify_sslr  rL  )r   TEST_SSL_HOSTrX  r   rg   TEST_CLIENT_CERTTEST_CLIENT_KEYTEST_CERTIFICATE_AUTHr   rP  rQ  r~   rR  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)rK  r   r   r   r  r   r  rL  )r   r  rX  r   rg   r  r  r   rP  rQ  r~   rR  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)rK  r   r   r   r   r  tls_server_namer  rL  )r   r  rX  r   rg   r  r  r  TEST_TLS_SERVER_NAMEr   rP  rQ  r~   rR  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   rL  r^   rG  r2   )r   rP  list_contextsr   r   r~   r?   )rX   r@   actual_contextsexpected_contextsrT  rS  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rM  r^   rG  r   )r   rP  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^   rG  )r   rP  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)rK  r   r   r   r   r  wbr9  r:  r8  r  rM  r7   config_base_path)r   r  rX  r   rg   r  r  r  r_   mkdtempru   rZ   r   joinrb   r"   r   rP  rQ  r~   shutilrmtree)rX   rS  temp_dirrT  fdr&   r&   r'    test_ssl_with_relative_ssl_files1  s<   z5TestKubeConfigLoader.test_ssl_with_relative_ssl_filesc                 C   sF   t ttt d}| t| j}t  }t|d|d | 	|| d S )NrW  r   config_filero   client_configuration)
r   rO  rX  r   rg   yaml	safe_dumprP  r   r~   rX   rS  r  rT  r&   r&   r'   $test_load_kube_config_from_file_pathL  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 )NrW  r^   ro  )errorsr   r  )r   rO  rX  r   ioStringIOunicoderb   r  r  rP  	NameErrorr   r~   )rX   rS  config_file_like_objectrT  r&   r&   r'   +test_load_kube_config_from_file_like_objectV  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 )NrW  r   )rM  ro   r  )r   rO  rX  r   r   rP  r~   rR  r&   r&   r'   test_load_kube_config_from_dictm  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  )rM  ro   r  temp_file_pathF)r   r  rX  r   rg   r  r  r  rZ   r   r  r   abspath__file__r   rP  assertFalselistdirr~   r   )rX   rS  rT  tmp_pathr&   r&   r'   3test_load_kube_config_from_dict_with_temp_file_pathv  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_object  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  rG  r   )	rg   r  r  rP  r   assertDictEqualr   assertCountEqualassertItemsEqual)rX   r  rG  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  rP  r   r~   rO  configurationrK  rX  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   )rM  ro   r   )	r   rP  r~   rO  r  rK  rX  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 )NrJ  r9   r   rL  )r   rO  rP  copyr   rQ  r~   )rX   rS  rT  test_kube_configr&   r&   r'   test_no_users_section  s   

z*TestKubeConfigLoader.test_no_users_sectionc                 C   rI  )NrJ  r  rL  rN  rR  r&   r&   r'   test_non_existing_user  rV  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   )rK  r   r  rL  )r  r   rO  rX  r   rP  rQ  r~   )rX   r   r   rS  rT  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  rL  r   )r   rt  rw  rz  r   rc  r   r   rP  rQ  r~   r   rX  rd  )rX   r   expired_tokencurrent_tokenre  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)rK  r   r   r   r  r  rL  )r  r  r  r   r  rg   r  r   rP  rQ  r~   )rX   r   rS  rT  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  )rz  r   rP  rQ  r   r~   )rX   r   r  rS  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  rL  )r   r   rm  rn  r   ry  r   r   r   rX  r   rP  rQ  r~   )rX   r  r   r  rS  rT  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  rL  r   rP  rQ  r&   rT  rX   r&   r'   r   0  
    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   rm  rn  r   ry  r   r   r   rX  rp   rX   r  r   r  rS  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  rL  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_scope6  r  z2TestKubeConfigLoader.test_user_cmd_path_with_scopec                 C   s:   t ttt d}| t| j}t|}| 	|j
 d S )NrW  )r   rO  rX  r   rg   r  r  rP  r   rc  _config_persisterr  r&   r&   r'   5test__get_kube_config_loader_for_yaml_file_no_persistD  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 )NrW  T)persist_configsave_changes)r   rO  rX  r   rg   r  r  rP  r   r   callabler  r~   rq   r  r&   r&   r'   2test__get_kube_config_loader_for_yaml_file_persistL     
zGTestKubeConfigLoader.test__get_kube_config_loader_for_yaml_file_persistc                 C   s<   t ttt d}| t| j}t|d}| 	|j
 d S )NrW  )rw   )r   rO  rX  r   rg   r  r  rP  r   rc  r  r  r&   r&   r'   ,test__get_kube_config_loader_file_no_persistV  s   

zATestKubeConfigLoader.test__get_kube_config_loader_file_no_persistc                 C   r  )NrW  T)rw   r  r  )r   rO  rX  r   rg   r  r  rP  r   r   r   r  r~   rq   r  r&   r&   r'   )test__get_kube_config_loader_file_persist^  r"  z>TestKubeConfigLoader.test__get_kube_config_loader_file_persistc                 C   s,   t ttt d}t| jd}| |j d S )NrW  r  )r   rO  rX  r   r   rP  rc  r  rR  r&   r&   r'   ,test__get_kube_config_loader_dict_no_persisth  s   zATestKubeConfigLoader.test__get_kube_config_loader_dict_no_persistN)Lrq   rr   rs   rO  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_BASE64rP  rU  rY  r\  rf  rh  rr  r|  r  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_existsv  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<   r6  
identifierrX   r&   r'   r     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   r7  r   r&   r;  r'   +test_get_api_key_calls_refresh_api_key_hooky  s   
zMTestKubernetesClientConfiguration.test_get_api_key_calls_refresh_api_key_hookN)rq   rr   rs   r5  r>  r&   r&   r&   r'   r3  p  s    r3  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  rE  r^   r  r   r   )r  r  r<  r#  r  z"skipped-part2-defined-this-contextskippedr;   r   r/  r0  r1  r2  r3  r%  r   rF  r  r  r  r   r@  rA  )rG  rH  r9   NrH  )rF  rG  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_configJ  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   )rD  TEST_KUBE_CONFIG_SET1r   r~   )rX   kubeconfigsr  rG  r7   r&   r&   r'   r  P  s(   
z3TestKubeConfigMerger.test_list_kube_config_contextsc                 C   sD   |  | j}t|dd}| t|jj | tt |jj	d  d S r  )
rD  rF  r   r~   rO  r  rK  rX  r   r   )rX   rG  r  r&   r&   r'   r  c  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   rE  r   r   )rD  TEST_KUBE_CONFIG_SET2r   r   r~   rO  r  rK  rX  r   r   )rX   rG  r  r  rG  r7   r&   r&   r'   )test_merge_with_context_in_different_filek  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&  )rD  rF  r   r<   r   r?   r  r~   )rX   rG  kconfr:   r  r&   r&   r'   test_save_changes{  s   
z&TestKubeConfigMerger.test_save_changes)rq   rr   rs   rO  r  r&  r   r0  r1  r,  r-  r'  r(  rF  rH  rD  r  r  rI  rK  r&   r&   r&   r'   r?    s   
'0
  
!r?  __main__)cr    rm  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   rX  r.   PAST_EXPIRY_TIMEDELTAFUTURE_EXPIRY_TIMEDELTAr   r(   r,   r0   rB   rE   r}   r   TEST_FILENAMEr|   r   r   rl  rO  r'  r(  r  rn  ro  	timedeltart  rw  r)  r  r  r&  r  r1  r  r0  r  r~  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   r3  r?  rq   mainr&   r&   r&   r'   <module>   s   D	

~L7         S  
