o
    \hLD                     @   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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)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/segue/gemini/backup/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_cache8   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wr/   )r3   r$   r4   dumpr2   CacheEncoderr9   )r&   r@   r*   r*   r+   r>   K   s   &zDiscoverer._write_cachec                 C   s   | j dd d S )NT)r?   )r%   r&   r*   r*   r+   r8   S   s   zDiscoverer.invalidate_cachec                 C      d S Nr*   rF   r*   r*   r+   
api_groupsV      zDiscoverer.api_groupsNc                 K   rG   rH   r*   )r&   prefixgroupapi_versionkindkwargsr*   r*   r+   searchZ   rJ   zDiscoverer.searchc                 C   rG   rH   r*   rF   r*   r*   r+   r=   ^   rJ   zDiscoverer.discoverc                 C   s   | j S rH   )_Discoverer__versionrF   r*   r*   r+   versionb   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_groupsf   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 rW   GETz/{}r\   versionsrR   namepreferredVersionrV   )r2   r7   r   requestr   r[   r]   r^   rW   rZ   rY   updater>   )r&   r\   re   groups_responser]   rL   	new_groupversion_rawrR   resource_group	preferredrW   r*   r*   r+   parse_api_groupsr   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 rH   r*   )_
serializedr*   r*   r+   	just_json   s   z/Discoverer._load_server_info.<locals>.just_jsonrR   
kubernetesr7   z/version)
serializerzhttps://zGHost value %s should start with https:// when talking to HTTPS endpoint)r2   r7   r   rd   
ValueErrorr   
isinstancereasonr   r   r   
startswithrQ   )r&   rn   rA   r*   r*   r+   r<      s    	zDiscoverer._load_server_infoc                 C   s6  t t}i }dtd|||g}z| jd|jpg }W n ty(   g }Y nw ttdd |}	ttdd |}
|
D ]}|d dd\}}|	|sRi ||< ||| |< q=|	D ]=}d	D ]}|
|d q_t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 Nru   rb   r*   resourcer*   r*   r+   <lambda>       z:Discoverer.get_resources_for_api_version.<locals>.<lambda>c                 S   s   d| d v S rv   r*   rw   r*   r*   r+   ry      rz   rb   r	   )rK   rL   rM   r   rj   )rK   rL   rM   r   rj   subresourcesrN   )rL   rM   	base_kindr*   )r   listr!   filterr   rd   rW   r   splitr7   popr   appendr   rN   )r&   rK   rL   rR   rj   rW   r{   r    resources_responseresources_rawsubresources_rawsubresourcerx   rb   keyresourceobjresource_listr*   r*   r+   rZ      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	   rM   c                    s   g | ]}|j  d  kr|qS )rM   )group_version.0resultrO   r*   r+   
<listcomp>   s    z"Discoverer.get.<locals>.<listcomp>c                 S   s   g | ]}t |tqS r*   rr   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*   )rP   lenr7   allr   r   r   r&   rO   resultsr*   r   r+   r7      s   
zDiscoverer.get)FNNNN)FF)__name__
__module____qualname____doc__r,   r%   r>   r8   r   rI   r   rP   r=   propertyrR   r^   rk   r<   rZ   r7   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 )NFr`   )rk   _LazyDiscoverer__resourcesrF   r*   r*   r+   r=         zLazyDiscoverer.discoverc                 C   s   | j r|   d| _ d S d S r   )r   r>   rF   r*   r*   r+   __maybe_write_cache   s   
z"LazyDiscoverer.__maybe_write_cachec                 C   s   | j dddd  S )NFTr\   re   r   rk   keysrF   r*   r*   r+   rI      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   r8   "_LazyDiscoverer__maybe_write_cacher   r*   r*   r+   rP      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	   rW   T)r7   rr   rY   r   rq   rW   rZ   rj   r
   r   r2   r   r   dictitemsgetattrr   extend)r&   partsrW   	reqParamspartresourcePartrK   rL   rR   	_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 )Nru   c                 S      | pdS Nr   r*   r   r*   r*   r+   ry   .      z/LazyDiscoverer.__build_search.<locals>.<lambda>r   r}   mapr&   rK   rL   rM   rN   rO   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 )NrW   T)
r   r   rW   rZ   rj   r2   r   r   	iteritemsr   )	r&   rK   r]   rL   ra   rR   rgrl   rx   r*   r*   r+   __iter__0  s    

zLazyDiscoverer.__iter__r   )r   r   r   r   r,   r=   r   r   rI   rP   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 rH   )_EagerDiscoverer__resources)r&   rW   r*   r*   r+   re   F  s   
zEagerDiscoverer.updatec                 C   s   t | || d S rH   )r   r,   r   r*   r*   r+   r,   I  r   zEagerDiscoverer.__init__c                 C   r   )NTr`   )rk   r   rF   r*   r*   r+   r=   L  r   zEagerDiscoverer.discoverc                 C   s   | j dddd  S )z list available api groups Tr   r   r   rF   r*   r*   r+   rI   O  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   r8   r   r*   r*   r+   rP   U  s
   zEagerDiscoverer.searchNc                 K   r   )Nru   c                 S   r   r   r*   r   r*   r*   r+   ry   k  r   z0EagerDiscoverer.__build_search.<locals>.<lambda>r   r   r*   r*   r+   r   f  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	   )
r7   rr   rY   r   rW   r   r   r   r   r   )
r&   r   rW   r   r   r   r   r   r   r   r*   r*   r+   r   m  s,   


"zEagerDiscoverer.__searchc                 c   sV    | j  D ]"\}}| D ]\}}| D ]\}}| D ]\}}|V  qqqqd S rH   )r   r   )r&   rl   r]   ra   rW   rx   r*   r*   r+   r     s   zEagerDiscoverer.__iter__r   )r   r   r   r   re   r,   r=   r   rI   rP   r   r   r   r*   r*   r*   r+   r   ?  s    

r   c                   @   s"   e Zd ZdZdddZdd ZdS )rY   z%Helper class for Discoverer containerNc                 C   s   || _ |pi | _d S rH   rj   rW   )r&   rj   rW   r*   r*   r+   r,     s   zResourceGroup.__init__c                 C   s   d| j | jdS )NrY   )_typerj   rW   r   rF   r*   r*   r+   to_dict  s   zResourceGroup.to_dictrH   )r   r   r   r   r,   r   r*   r*   r*   r+   rY     s    
rY   c                   @   s   e Zd Zdd ZdS )rE   c                 C   s   |  S rH   )r   )r&   or*   r*   r+   default  s   zCacheEncoder.defaultN)r   r   r   r   r*   r*   r*   r+   rE     s    rE   c                   @   s   e Zd Zdd Zdd ZdS )r6   c                 O   s*   || _ tjj| g|R d| ji| d S )Nobject_hook)r   r4   JSONDecoderr,   r   )r&   r   argsrO   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   rY   rj   rW   rV   r*   )r   r   r   r   rY   r   )r&   objr   r*   r*   r+   r     s   
zCacheDecoder.object_hookN)r   r   r   r,   r   r*   r*   r*   r+   r6     s    r6   )%r   r   r4   r:   r   r"   	functoolsr   collectionsr   abcr   r   urllib3.exceptionsr   r   ro   r   
exceptionsr
   r   r   r   r   rx   r   r   r[   objectr   r   r   rY   JSONEncoderrE   r   r6   r*   r*   r*   r+   <module>   s*    :cO