o
    viD                     @   s  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 d dlm	Z	 d dl
mZmZ d dlmZ d dlmZmZ d dlmZ dd	lmZmZmZmZmZ dd
lmZmZ dZG dd deZG dd deZ G dd deZ!G dd deZ"G dd dej#Z$G dd dej%Z&dS )    N)partial)defaultdict)abstractmethodabstractproperty)JSONDecodeError)ProtocolErrorMaxRetryError)__version__   )NotFoundErrorResourceNotFoundErrorResourceNotUniqueErrorApiExceptionServiceUnavailableError)ResourceResourceListapisc                   @   s   e Zd ZdZdd ZdddZdd Zd	d
 Zedd Z	e
dddZe
dd Zedd ZdddZd ddZdd Zdd Zdd ZdS )!
Discovererz
        A convenient container for storing discovered API resources. Allows
        easy searching and retrieval of specific resources.

        Subclasses implement the abstract methods with different loading strategies.
    c                 C   s   || _ | j jj}tjr|d}zdtj|dd	 }W n t
y1   dt|	 }Y nw |p<tjt || _|   d S )Nzutf-8zosrcp-{0}.jsonF)usedforsecurity)clientconfigurationhostsixPY3encodeformathashlibmd5	hexdigest	TypeErrorospathjointempfile
gettempdir_Discoverer__cache_file_Discoverer__init_cache)selfr   
cache_filedefault_cache_iddefault_cachefile_name r+   [/home/air/biblejyuku/back/venv/lib/python3.10/site-packages/kubernetes/dynamic/discovery.py__init__,   s   

zDiscoverer.__init__Fc              
   C   s   |s	t j| jsdti| _d}nMz0t| jd}tj|t	t
| jd| _W d    n1 s/w   Y  | jdtkr@|   W n ty] } ztd| |   W Y d }~nd }~ww |   |   |rn|   d S d S )Nlibrary_versionTrclszload cache error: %s)r    r!   existsr%   r	   _cacheopenjsonloadr   CacheDecoderr   getinvalidate_cache	Exceptionloggingerror_load_server_infodiscover_write_cache)r'   refreshfer+   r+   r,   __init_cache9   s(   
zDiscoverer.__init_cachec                 C   s^   z$t | jd}tj| j|td W d    W d S 1 sw   Y  W d S  ty.   Y d S w )Nwr0   )r4   r%   r5   dumpr3   CacheEncoderr:   )r'   rA   r+   r+   r,   r?   L   s   &zDiscoverer._write_cachec                 C   s   | j dd d S )NT)r@   )r&   r'   r+   r+   r,   r9   T   s   zDiscoverer.invalidate_cachec                 C      d S Nr+   rG   r+   r+   r,   
api_groupsW      zDiscoverer.api_groupsNc                 K   rH   rI   r+   )r'   prefixgroupapi_versionkindkwargsr+   r+   r,   search[   rK   zDiscoverer.searchc                 C   rH   rI   r+   rG   r+   r+   r,   r>   _   rK   zDiscoverer.discoverc                 C   s   | j S rI   )_Discoverer__versionrG   r+   r+   r,   versionc   s   zDiscoverer.versionc              
   C   s\   i }dd|rt d| dddddnt dii|d< ddt ddt| jgidii|t< |S )N v1Tapi	resourcesList)ResourceGroupget_resources_for_api_versionr   r   DISCOVERY_PREFIX)r'   request_resourcesgroupsr+   r+   r,   default_groupsg   s   

zDiscoverer.default_groupsc                 C   s  | j dr|r~| j di | j d< | jddtj}| j|d}|D ]L}i }|d D ];}|d }| j di ti |d i |}	||d k}
|	rR|	jni }|r`| 	t|d ||
}t
|
|d	||< q-||t |d < q%| j d | |   | j d S )
z1 Discovers all API groups present in the cluster rX   GETz/{}r]   versionsrS   namepreferredVersionrW   )r3   r8   r   requestr   r\   r^   r_   rX   r[   rZ   updater?   )r'   r]   rf   groups_responser^   rM   	new_groupversion_rawrS   resource_group	preferredrX   r+   r+   r,   parse_api_groupss   s$   (
zDiscoverer.parse_api_groupsc              
   C   s   dd }| j dsGzd| jjdd|di| j d< W n, ttfyF } zt|tr0t|jts0 | jj	j
dsAtd	| jj	j
  d }~ww | j d | _d S )
Nc                 S   s   |S rI   r+   )_
serializedr+   r+   r,   	just_json   s   z/Discoverer._load_server_info.<locals>.just_jsonrS   
kubernetesr8   z/version)
serializerzhttps://zGHost value %s should start with https:// when talking to HTTPS endpoint)r3   r8   r   re   
ValueErrorr   
isinstancereasonr   r   r   
startswithrR   )r'   ro   rB   r+   r+   r,   r=      s    	zDiscoverer._load_server_infoc                 C   s:  t t}i }dtd|||g}z| jd|jpg }W n ttfy*   g }Y nw ttdd |}	ttdd |}
|
D ]}|d 	dd\}}|
|sTi ||< ||| |< q?|	D ]=}d	D ]}||d qatd|||| j||
|d d
|}||d  | t| j|||d d}||j | q]|S )zT returns a dictionary of resources associated with provided (prefix, group, version)/Nr`   c                 S   s   d| d vS Nrv   rc   r+   resourcer+   r+   r,   <lambda>       z:Discoverer.get_resources_for_api_version.<locals>.<lambda>c                 S   s   d| d v S rw   r+   rx   r+   r+   r,   rz      r{   rc   r
   )rL   rM   rN   r   rk   )rL   rM   rN   r   rk   subresourcesrO   )rM   rN   	base_kindr+   )r   listr"   filterr   re   rX   r   r   splitr8   popr   appendr   rO   )r'   rL   rM   rS   rk   rX   r|   r!   resources_responseresources_rawsubresources_rawsubresourcery   rc   keyresourceobjresource_listr+   r+   r,   r[      s@   
	z(Discoverer.get_resources_for_api_versionc                    s   | j di  }t|dkr dr fdd|D }t|dkr2tdd |D s2dd |D }t|dkr<|d S |sEtd td	 |)z Same as search, but will throw an error if there are multiple or no
            results. If there are multiple results and only one is an exact match
            on api_version, that resource will be returned.
        r
   rN   c                    s   g | ]}|j  d  kr|qS )rN   )group_version.0resultrP   r+   r,   
<listcomp>   s    z"Discoverer.get.<locals>.<listcomp>c                 S   s   g | ]}t |tqS r+   rs   r   )r   xr+   r+   r,   r      s    c                 S   s   g | ]	}t |ts|qS r+   r   r   r+   r+   r,   r      s    r   zNo matches found for {}z!Multiple matches found for {}: {}Nr+   )rQ   lenr8   allr   r   r   r'   rP   resultsr+   r   r,   r8      s   
zDiscoverer.get)FNNNN)FF)__name__
__module____qualname____doc__r-   r&   r?   r9   r   rJ   r   rQ   r>   propertyrS   r_   rl   r=   r[   r8   r+   r+   r+   r,   r   $   s&    





)r   c                   @   sV   e Zd ZdZdd Zdd Zdd Zedd	 Zd
d Z	dd Z
dddZdd ZdS )LazyDiscovererz A convenient container for storing discovered API resources. Allows
        easy searching and retrieval of specific resources.

        Resources for the cluster are loaded lazily.
    c                 C   s   t | || d| _d S NF)r   r-   _LazyDiscoverer__update_cacher'   r   r(   r+   r+   r,   r-      s   
zLazyDiscoverer.__init__c                 C      | j dd| _d S )NFra   )rl   _LazyDiscoverer__resourcesrG   r+   r+   r,   r>         zLazyDiscoverer.discoverc                 C   s   | j r|   d| _ d S d S r   )r   r?   rG   r+   r+   r,   __maybe_write_cache   s   
z"LazyDiscoverer.__maybe_write_cachec                 C   s   | j dddd  S )NFTr]   rf   r   rl   keysrG   r+   r+   r,   rJ      s   zLazyDiscoverer.api_groupsc                 K   sl   z|  | jdi || jg }W n ty   g }Y nw |s0|   |  | jdi || jg }|   |S )Nr+   )_LazyDiscoverer__search_LazyDiscoverer__build_searchr   r   r9   "_LazyDiscoverer__maybe_write_cacher   r+   r+   r,   rQ      s    zLazyDiscoverer.searchc              	   C   s~  |d }|dkr| |}|sg S t|trat|dkr"td| |jsU|d |d |}}}z| ||||j|_W n	 tyF   t	w || j
d | | |< d| _| |dd  |j|S t|trt| |dd  |||g S |d dkrt|d tr|D ]}	|d  D ]\}
}t|	|
|kr|	g    S qqg S |S g }| D ]}|| |g|dd   || q|S )Nr   *   z2prefix and group params should be present, have %sr
   rX   T)r8   rs   rZ   r   rr   rX   r[   rk   r   r   r3   r   r   dictitemsgetattrr   extend)r'   partsrX   	reqParamspartresourcePartrL   rM   rS   	_resourcetermvaluematchesr   r+   r+   r,   __search  sF   




$zLazyDiscoverer.__searchNc                 K   >   |s|rd|v r| d\}}|||||g}ttdd |S )Nrv   c                 S      | pdS Nr   r+   r   r+   r+   r,   rz   0      z/LazyDiscoverer.__build_search.<locals>.<lambda>r   r~   mapr'   rL   rM   rN   rO   rP   r   r+   r+   r,   __build_search+     zLazyDiscoverer.__build_searchc           	   	   c   s    | j  D ]?\}}| D ]6\}}| D ]-\}}|js5| ||||j|_|| jd | | |< d| _t|jD ]\}}|V  q;qqq| 	  d S )NrX   T)
r   r   rX   r[   rk   r3   r   r   	iteritemsr   )	r'   rL   r^   rM   rb   rS   rgrm   ry   r+   r+   r,   __iter__2  s    

zLazyDiscoverer.__iter__r   )r   r   r   r   r-   r>   r   r   rJ   rQ   r   r   r   r+   r+   r+   r,   r      s    

*r   c                   @   sV   e Zd ZdZdd Zdd Zdd Zedd	 Zd
d Z	dddZ
dd Zdd ZdS )EagerDiscovererz A convenient container for storing discovered API resources. Allows
        easy searching and retrieval of specific resources.

        All resources are discovered for the cluster upon object instantiation.
    c                 C   s
   || _ d S rI   )_EagerDiscoverer__resources)r'   rX   r+   r+   r,   rf   H  s   
zEagerDiscoverer.updatec                 C   s   t | || d S rI   )r   r-   r   r+   r+   r,   r-   K  r   zEagerDiscoverer.__init__c                 C   r   )NTra   )rl   r   rG   r+   r+   r,   r>   N  r   zEagerDiscoverer.discoverc                 C   s   | j dddd  S )z list available api groups Tr   r   r   rG   r+   r+   r,   rJ   Q  s   zEagerDiscoverer.api_groupsc                 K   sD   |  | jdi || j}|s |   |  | jdi || j}|S )aW   Takes keyword arguments and returns matching resources. The search
            will happen in the following order:
                prefix: The api prefix for a resource, ie, /api, /oapi, /apis. Can usually be ignored
                group: The api group of a resource. Will also be extracted from api_version if it is present there
                api_version: The api version of a resource
                kind: The kind of the resource
                arbitrary arguments (see below), in random order

            The arbitrary arguments can be any valid attribute for an Resource object
        Nr+   )_EagerDiscoverer__search_EagerDiscoverer__build_searchr   r9   r   r+   r+   r,   rQ   W  s
   zEagerDiscoverer.searchNc                 K   r   )Nrv   c                 S   r   r   r+   r   r+   r+   r,   rz   m  r   z0EagerDiscoverer.__build_search.<locals>.<lambda>r   r   r+   r+   r,   r   h  r   zEagerDiscoverer.__build_searchc           
   	   C   s   |d }| |}|dkr]|r]t|tr| |dd  |jS t|tr.| |dd  |S |d dkr[t|d tr[|D ]}|d  D ]\}}t|||krW|g    S qEq=g S |S |dkr|g }| D ]}	|	| |	g|dd   | qg|S g S )Nr   r   r
   )
r8   rs   rZ   r   rX   r   r   r   r   r   )
r'   r   rX   r   r   r   r   r   r   r   r+   r+   r,   r   o  s,   


"zEagerDiscoverer.__searchc                 c   sV    | j  D ]"\}}| D ]\}}| D ]\}}| D ]\}}|V  qqqqd S rI   )r   r   )r'   rm   r^   rb   rX   ry   r+   r+   r,   r     s   zEagerDiscoverer.__iter__r   )r   r   r   r   rf   r-   r>   r   rJ   rQ   r   r   r   r+   r+   r+   r,   r   A  s    

r   c                   @   s"   e Zd ZdZdddZdd ZdS )rZ   z%Helper class for Discoverer containerNc                 C   s   || _ |pi | _d S rI   rk   rX   )r'   rk   rX   r+   r+   r,   r-     s   zResourceGroup.__init__c                 C   s   d| j | jdS )NrZ   )_typerk   rX   r   rG   r+   r+   r,   to_dict  s   zResourceGroup.to_dictrI   )r   r   r   r   r-   r   r+   r+   r+   r,   rZ     s    
rZ   c                   @   s   e Zd Zdd ZdS )rF   c                 C   s   |  S rI   )r   )r'   or+   r+   r,   default  s   zCacheEncoder.defaultN)r   r   r   r   r+   r+   r+   r,   rF     s    rF   c                   @   s   e Zd Zdd Zdd ZdS )r7   c                 O   s*   || _ tjj| g|R d| ji| d S )Nobject_hook)r   r5   JSONDecoderr-   r   )r'   r   argsrP   r+   r+   r,   r-     s   $zCacheDecoder.__init__c                 C   sr   d|vr|S | d}|dkrtd	d| ji|S |dkr&t| jfi |S |dkr7t|d | |d dS |S )
Nr   r   r   r   rZ   rk   rX   rW   r+   )r   r   r   r   rZ   r   )r'   objr   r+   r+   r,   r     s   
zCacheDecoder.object_hookN)r   r   r   r-   r   r+   r+   r+   r,   r7     s    r7   )'r    r   r5   r;   r   r#   	functoolsr   collectionsr   abcr   r   json.decoderr   urllib3.exceptionsr   r   rp   r	   
exceptionsr   r   r   r   r   ry   r   r   r\   objectr   r   r   rZ   JSONEncoderrF   r   r7   r+   r+   r+   r,   <module>   s,    ;cO