
    ZiD                     r   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e          Z G d de          Z  G d de          Z! G d de          Z" G d dej#                  Z$ G d dej%                  Z&dS )    N)partial)defaultdict)abstractmethodabstractproperty)JSONDecodeError)ProtocolErrorMaxRetryError)__version__   )NotFoundErrorResourceNotFoundErrorResourceNotUniqueErrorApiExceptionServiceUnavailableError)ResourceResourceListapisc                       e Zd ZdZd ZddZd Zd Zed             Z	e
dd	            Ze
d
             Zed             ZddZddZd Zd Z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                    || _         | j         j        j        }t          j        r|                    d          }	 d                    t          j        |d          	                                          }nI# t          $ r< d                    t          j        |          	                                          }Y nw xY w|p0t          j                            t          j                    |          | _        |                                  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_names        W/root/projects/butler/venv/lib/python3.11/site-packages/kubernetes/dynamic/discovery.py__init__zDiscoverer.__init__,   s   ;497 	@/66w??	h%5%<%<W[IYkp=q=q=q={={=}=}%~%~"" 	h 	h 	h%5%<%<W[IY=Z=Z=d=d=f=f%g%g"""	h 'e"',,x7J7L7LNd*e*es   ;A7 7AB=<B=Fc                    |s$t           j                            | j                  sdt          i| _        d}n	 t          | j        d          5 }t          j        |t          t          | j                            | _        d d d            n# 1 swxY w Y   | j                            d          t          k    r|                                  n@# t          $ r3}t          j        d|           |                                  Y d }~nd }~ww xY w|                                  |                                  |r|                                  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es       r.   __init_cachezDiscoverer.__init_cache9   s    	("'..):;; 	(,k:DKGG($+S11 WQ"&)A7<3U3U"V"V"VDKW W W W W W W W W W W W W W W;??#455DD))+++ ( ( (4a888%%''''''''( 	    	 	  	 s;   C 4BC BC B:C 
D)D		Dc                     	 t          | j        d          5 }t          j        | j        |t
                     d d d            d S # 1 swxY w Y   d S # t          $ r Y d S w xY w)Nwr3   )r7   r(   r8   dumpr6   CacheEncoderr=   )r*   rD   s     r.   rB   zDiscoverer._write_cacheL   s    	d'-- <	$+ql;;;;< < < < < < < < < < < < < < < < < < 	 	 	DD	s3   A "AA A

A A
A 
A! A!c                 2    |                      d           d S )NT)rC   )r)   r*   s    r.   r<   zDiscoverer.invalidate_cacheT   s    $'''''    c                     d S N rL   s    r.   
api_groupszDiscoverer.api_groupsW       rM   Nc                     d S rO   rP   )r*   prefixgroupapi_versionkindkwargss         r.   searchzDiscoverer.search[   rR   rM   c                     d S rO   rP   rL   s    r.   rA   zDiscoverer.discover_   rR   rM   c                     | j         S rO   )_Discoverer__versionrL   s    r.   versionzDiscoverer.versionc   s
    ~rM   c                     i }dd|r't          d|                     dddd                    nt          d          ii|d<   ddt          ddt          | j                  gi          ii|t          <   |S )N v1Tapi	resourcesList)ResourceGroupget_resources_for_api_versionr   r   DISCOVERY_PREFIX)r*   request_resourcesgroupss      r.   default_groupszDiscoverer.default_groupsg   s    $>=$$2T2TUZ\^`dfj2k2kmmmm*7*=*=
 u
 %'-6L<U<U;V2WXXX)
 $  rM   c                 b   | j                             d          r|r| j                             di           | j         d<   | j                            dd                    t
                              j        }|                     |          }|D ]}i }|d         D ]}|d         }| j                             di                               t
          i                               |d         i                               |          }	||d         k    }
|	r|	j        ni }|r#| 	                    t
          |d         ||
          }t          |
|	          ||<   ||t
                   |d         <   | j         d                             |           |                                  | j         d         S )
z1 Discovers all API groups present in the cluster rc   GETz/{}rh   versionsr]   namepreferredVersionrb   )r6   r;   r   requestr   rg   ri   rj   rc   rf   re   updaterB   )r*   rh   rr   groups_responseri   rU   	new_groupversion_rawr]   resource_group	preferredrc   s               r.   parse_api_groupszDiscoverer.parse_api_groupss   s   {{++ 	 v 	 '+{{B'G'GDK$"k11%FV9W9WXX_O((;L(MMF( 
D 
D	#(#4 W WK))4G%)[__["%E%E%I%IJZ\^%_%_%c%cdijpdqsu%v%v%z%z  |C  &D  &DN +u5G/H HI<J R 8 8PRI( |$($F$FGWY^_eYfhoqz${${	)6yI)V)V)VIg&&:C'(v77K$++F333{;''rM   c                    d }| j                             d          s	 d| j                            dd|          i| j         d<   n# t          t
          f$ r{}t          |t
                    rt          |j        t                    s | j        j	        j
                            d          s!t	          d| j        j	        j
        z             d }~ww xY w| j         d         | _        d S )	Nc                     |S rO   rP   )_
serializeds     r.   	just_jsonz/Discoverer._load_server_info.<locals>.just_json   s    rM   r]   
kubernetesr;   z/version)
serializerzhttps://zGHost value %s should start with https:// when talking to HTTPS endpoint)r6   r;   r   rq   
ValueErrorr	   
isinstancereasonr   r   r   
startswithr\   )r*   r}   rE   s      r.   r@   zDiscoverer._load_server_info   s
   	 	 	 {y)) 	 $+"5"5eZT]"5"^"^*I&& .   a// 
18]8[8[ {05@@LL $%n%)[%>%C&D E E E  Y/s   'A CA6CCc                 b   t          t                    }i }d                    t          d|||g                    }	 | j                            d|          j        pg }n# t          t          f$ r g }Y nw xY wt          t          d |                    }	t          t          d |                    }
|
D ]F}|d         	                    dd          \  }}|
                    |          si ||<   |||         |<   G|	D ]}dD ]}|                    |d           t          d|||| j        ||
                    |d                   d	|}||d
                                      |           t          | j        |||d
                   }||j                                     |           |S )zT returns a dictionary of resources associated with provided (prefix, group, version)/Nrl   c                     d| d         vS Nr   ro   rP   resources    r.   <lambda>z:Discoverer.get_resources_for_api_version.<locals>.<lambda>   s    S@P5P rM   c                     d| d         v S r   rP   r   s    r.   r   z:Discoverer.get_resources_for_api_version.<locals>.<lambda>   s    x?O8O rM   ro   r   )rT   rU   rV   r   rw   )rT   rU   rV   r   rw   subresourcesrW   )rU   rV   	base_kindrP   )r   listr%   filterr   rq   rc   r   r   splitr;   popr   appendr   rW   )r*   rT   rU   r]   rw   rc   r   r$   resources_responseresources_rawsubresources_rawsubresourcer   ro   keyresourceobjresource_lists                    r.   rf   z(Discoverer.get_resources_for_api_version   s     %%	xxtfeW%=>>??	$!%!4!4UD!A!A!K!Qr'9 	$ 	$ 	$!#	$ V$P$PRdeeff'O'OQc d dee+ 	7 	7K(066sA>>NHd##H-- ,)+X&+6L"4((% 	@ 	@HP ( (S$''''" #{#)--hv.>??   K hv&'..{;;;(EwbjkqbrsssMm()00????s   "A! !A76A7c                     | j         d
i }t          |          dk    r#                    d          rfd|D             }t          |          dk    r%t          d |D                       sd |D             }t          |          dk    r|d         S |s"t	          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   rV   c                 6    g | ]}|j         d          k    |S )rV   )group_version).0resultrX   s     r.   
<listcomp>z"Discoverer.get.<locals>.<listcomp>   s2       !0D}H]0]0]0]0]0]rM   c                 8    g | ]}t          |t                    S rP   r   r   )r   xs     r.   r   z"Discoverer.get.<locals>.<listcomp>   s"    (V(V(VA|)D)D(V(V(VrM   c                 <    g | ]}t          |t                    |S rP   r   )r   r   s     r.   r   z"Discoverer.get.<locals>.<listcomp>   s'    \\\&:fl;[;[\v\\\rM   r   zNo matches found for {}z!Multiple matches found for {}: {}NrP   )rY   lenr;   allr   r   r   r*   rX   resultss    ` r.   r;   zDiscoverer.get   s
   
 $+''''w<<!

= 9 9   %,  G w<<!C(V(Vg(V(V(V$W$W\\G\\\Gw<<11: 	f'(A(H(H(P(PQQQ()L)S)STZ\c)d)deeerM   )FNNNN)FF)__name__
__module____qualname____doc__r/   r)   rB   r<   r   rQ   r   rY   rA   propertyr]   rj   rx   r@   rf   r;   rP   rM   r.   r   r   $   s,                 &  ( ( (       ^   ^   X
 
 
 
( ( ( (00 0 0(' ' 'Rf f f f frM   r   c                   T    e Zd ZdZd Zd Zd Zed             Zd Z	d Z
dd	Z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                 L    t                               | ||           d| _        d S NF)r   r/   _LazyDiscoverer__update_cacher*   r   r+   s      r.   r/   zLazyDiscoverer.__init__   s(    D&*555#rM   c                 <    |                      d          | _        d S )NFrm   )rx   _LazyDiscoverer__resourcesrL   s    r.   rA   zLazyDiscoverer.discover   s!    0050IIrM   c                 N    | j         r|                                  d| _         d S d S r   )r   rB   rL   s    r.   __maybe_write_cachez"LazyDiscoverer.__maybe_write_cache   s7     	("'D	( 	(rM   c                 `    |                      dd          d                                         S )NFTrh   rr   r   rx   keysrL   s    r.   rQ   zLazyDiscoverer.api_groups   s,    $$uT$JJ6RWWYYYrM   c                    	 |                       | j        di || j        g           }n# t          $ r g }Y nw xY w|s;|                                  |                       | j        di || j        g           }|                                  |S )NrP   )_LazyDiscoverer__search_LazyDiscoverer__build_searchr   r   r<   "_LazyDiscoverer__maybe_write_cacher   s      r.   rY   zLazyDiscoverer.search   s    	mm$7D$7$A$A&$A$A4CSUWXXGG$ 	 	 	GGG	 	Y!!###mm$7D$7$A$A&$A$A4CSUWXXG  """s   '* 99c           	         |d         }|dk    r|                     |          }|sg S t          |t                    rt          |          dk    rt	          d|z            |j        sn|d         |d         |}}}	 |                     ||||j                  |_        n# t          $ r t          w xY w|| j
        d         |         |         |<   d| _        |                     |dd          |j        |          S t          |t                    r#|                     |dd          |||gz             S |d         dk    r]t          |d         t                    rB|D ]=}	|d                                         D ] \  }
}t          |	|
          |k    r|	gc c S !>g S |S g }|                                D ]8}|                    |                     |g|dd          z   ||                     9|S )Nr   *   z2prefix and group params should be present, have %sr   rc   T)r;   r   re   r   r   rc   rf   rw   r   r   r6   r   r   dictitemsgetattrr   extend)r*   partsrc   	reqParamspartresourcePartrT   rU   r]   	_resourcetermvaluematchesr   s                 r.   __searchzLazyDiscoverer.__search  sC   Qx3;;$==..L (	L-88 (y>>Q&&$%Y\e%efff#- 	/-6q\9Q<7EF4151S1S"E41G2I 2I..( 4 4 4334 HTDK,V4U;GD*.D'}}U122Y0F	RRRL$// ( }}U122Yi4&>PRRR8s??z%(D'A'A?%1 3 3	+08>>+;+; 3 3KD%&y$775@@(1{ 2 2 2 2 2  A3 I''G ~~'' W Wt}}cUU122Y->	9UUVVVVNs   ="B   B2Nc                     |s|rd|v r|                     d          \  }}|||||g}t          t          d |                    S )Nr   c                 
    | pdS Nr   rP   r   s    r.   r   z/LazyDiscoverer.__build_search.<locals>.<lambda>0  
    !(s rM   r   r   mapr*   rT   rU   rV   rW   rX   r   s          r.   __build_searchzLazyDiscoverer.__build_search+  _     	8 	8););!,!2!23!7!7E;T6:C**E22333rM   c           	   #     K   | j                                         D ]\  }}|                                D ]\  }}|                                D ]t\  }}|j        sE|                     ||||j                  |_        || j        d         |         |         |<   d| _        t          j        |j                  D ]	\  }}|V  
u| 	                                 d S )Nrc   T)
r   r   rc   rf   rw   r6   r   r   	iteritemsr   )	r*   rT   ri   rU   rn   r]   rgr{   r   s	            r.   __iter__zLazyDiscoverer.__iter__2  s     ".4466 
	' 
	'NFF#)<<>> 	' 	'x#+>>#3#3 ' 'KGR< 3'+'I'I"E7BL(B (BKMK08?H.2+'*}R\'B'B ' '8&''	' 	  """""rM   r   )r   r   r   r   r/   rA   r   r   rQ   rY   r   r   r   rP   rM   r.   r   r      s         $ $ $J J J( ( (
 Z Z XZ
 
 
( ( (T4 4 4 4# # # # #rM   r   c                   T    e Zd ZdZd Zd Zd Zed             Zd Z	ddZ
d	 Z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                     || _         d S rO   )_EagerDiscoverer__resources)r*   rc   s     r.   rr   zEagerDiscoverer.updateH  s    $rM   c                 >    t                               | ||           d S rO   )r   r/   r   s      r.   r/   zEagerDiscoverer.__init__K  s     D&*55555rM   c                 <    |                      d          | _        d S )NTrm   )rx   r   rL   s    r.   rA   zEagerDiscoverer.discoverN  s!    0040HHrM   c                 `    |                      dd          d                                         S )z list available api groups Tr   r   r   rL   s    r.   rQ   zEagerDiscoverer.api_groupsQ  s.     $$tD$II&QVVXXXrM   c                     |                       | 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
        rP   )_EagerDiscoverer__search_EagerDiscoverer__build_searchr   r<   r   s      r.   rY   zEagerDiscoverer.searchW  sx     -- 3 3 = =f = =t?OPP 	U!!###mm$7D$7$A$A&$A$A4CSTTGrM   Nc                     |s|rd|v r|                     d          \  }}|||||g}t          t          d |                    S )Nr   c                 
    | pdS r   rP   r   s    r.   r   z0EagerDiscoverer.__build_search.<locals>.<lambda>m  r   rM   r   r   s          r.   r   zEagerDiscoverer.__build_searchh  r   rM   c           	         |d         }|                     |          }|dk    r|rt          |t                    r#|                     |dd          |j                  S t          |t
                    r|                     |dd          |          S |d         dk    r]t          |d         t
                    rB|D ]=}|d                                         D ] \  }}t          ||          |k    r|gc c S !>g S |S |dk    rPg }|                                D ]7}	|	                    |                     |	g|dd          z   |                     8|S g S )Nr   r   r   )
r;   r   re   r   rc   r   r   r   r   r   )
r*   r   rc   r   r   r   r   r   r   r   s
             r.   r   zEagerDiscoverer.__searcho  s}   Qx }}T**3;;<;,66 (}}U122Y0FGGGL$// 
(}}U122Y===8s??z%(D'A'A?%1 3 3	+08>>+;+; 3 3KD%&y$775@@(1{ 2 2 2 2 2  A3 I''S[[G ~~'' L Lt}}cUU122Y->	JJKKKKN	rM   c              #      K   | j                                         D ]W\  }}|                                D ]=\  }}|                                D ]#\  }}|                                D ]	\  }}|V  
$>Xd S rO   )r   r   )r*   r{   ri   rn   rc   r   s         r.   r   zEagerDiscoverer.__iter__  s      )//11 	' 	'IAv%||~~ ' '8$,NN$4$4 ' 'LAy'0'8'8 ' '8&'''	' 	'rM   r   )r   r   r   r   rr   r/   rA   r   rQ   rY   r   r   r   rP   rM   r.   r   r   A  s         % % %6 6 6I I I Y Y XY
  "4 4 4 4  2' ' ' ' 'rM   r   c                        e Zd ZdZddZd ZdS )re   z%Helper class for Discoverer containerNc                 &    || _         |pi | _        d S rO   rw   rc   )r*   rw   rc   s      r.   r/   zResourceGroup.__init__  s    ""brM   c                 "    d| j         | j        dS )Nre   )_typerw   rc   r   rL   s    r.   to_dictzResourceGroup.to_dict  s    $
 
 	
rM   rO   )r   r   r   r   r/   r   rP   rM   r.   re   re     s=        //) ) ) )
 
 
 
 
rM   re   c                       e Zd Zd ZdS )rJ   c                 *    |                                 S rO   )r   )r*   os     r.   defaultzCacheEncoder.default  s    yy{{rM   N)r   r   r   r   rP   rM   r.   rJ   rJ     s#            rM   rJ   c                       e Zd Zd Zd ZdS )r:   c                 V    || _         t          j        j        | g|R d| j        i| d S )Nobject_hook)r   r8   JSONDecoderr/   r   )r*   r   argsrX   s       r.   r/   zCacheDecoder.__init__  s;    !$VtVVVD4DVvVVVVVrM   c                 
   d|vr|S |                     d          }|dk    rt          d	d| j        i|S |dk    rt          | j        fi |S |dk    r0t	          |d         |                     |d                             S |S )
Nr   r   r   r   re   rw   rc   rb   rP   )r   r   r   r   re   r   )r*   objr   s      r.   r   zCacheDecoder.object_hook  s    #J  J664;6#666n$$33s333o%% [!1T=M=McR]N^=_=_````
rM   N)r   r   r   r/   r   rP   rM   r.   r:   r:     s5        W W W
 
 
 
 
rM   r:   )'r#   r   r8   r>   r   r&   	functoolsr   collectionsr   abcr   r   json.decoderr   urllib3.exceptionsr   r	   r~   r
   
exceptionsr   r   r   r   r   r   r   r   rg   objectr   r   r   re   JSONEncoderrJ   r   r:   rP   rM   r.   <module>r     s.   
			 



           # # # # # # 0 0 0 0 0 0 0 0 ( ( ( ( ( ( ; ; ; ; ; ; ; ; " " " " " " { { { { { { { { { { { { { { , , , , , , , ,  wf wf wf wf wf wf wf wft`# `# `# `# `#Z `# `# `#FL' L' L' L' L'j L' L' L'^
 
 
 
 
F 
 
 
    4#       4#     rM   