o
    'ThP8  ã                   @   sä   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mZmZmZmZ zd dlZdZW n eyE   d	ZY nw zd d
lmZ W n ey_   G dd„ deƒZY nw g d¢Zdd„ ZG dd„ deƒZdS )é    N)Úwatch)ÚApiExceptioné   )ÚEagerDiscovererÚLazyDiscoverer)Úapi_exceptionÚKubernetesValidateMissing)ÚResourceÚResourceListÚSubresourceÚResourceInstanceÚResourceFieldTF)ÚVersionNotSupportedErrorc                   @   s   e Zd ZdS )r   N)Ú__name__Ú
__module__Ú__qualname__© r   r   úZ/home/air/segue/gemini/back/venv/lib/python3.10/site-packages/kubernetes/dynamic/client.pyr   "   s    r   )ÚDynamicClientr   r	   r
   r   r   r   r   c                    s   ‡ fdd„}|S )zC Handles parsing response structure and translating API Exceptions c              
      sÀ   |  dd¡}|  dt¡}zˆ | g|¢R i |¤Ž}W n ty) } zt|ƒ‚d }~ww |r^ztjr:|| t |j¡ƒW S || t |j 	d¡¡ƒW S  t
y]   tjrU|j Y S |j 	d¡ Y S w |S )NÚ	serializeTÚ
serializerÚutf8)Úpopr   r   r   ÚsixÚPY2ÚjsonÚloadsÚdataÚdecodeÚ
ValueError)ÚselfÚargsÚkwargsÚserialize_responser   ÚrespÚe©Úfuncr   r   Úinner3   s&   €ÿ
ýzmeta_request.<locals>.innerr   )r'   r(   r   r&   r   Úmeta_request1   s   r)   c                   @   s    e Zd ZdZd dd„Zedd„ ƒZedd„ ƒZd	d
„ Zdd„ Z	d dd„Z
d dd„Zd!dd„Zd"dd„Zd"dd„Zd#dd„Zd$dd„Zed%dd„ƒZd&dd„ZdS )'r   zb A kubernetes client that dynamically discovers and interacts with
        the kubernetes API
    Nc                 C   s&   |pt }|| _|j| _|| |ƒ| _d S ©N)r   ÚclientÚconfigurationÚ_DynamicClient__discoverer)r    r+   Ú
cache_fileÚ
discovererr   r   r   Ú__init__M   s   zDynamicClient.__init__c                 C   s   | j S r*   )r-   ©r    r   r   r   Ú	resourcesV   s   zDynamicClient.resourcesc                 C   s   | j jS r*   )r-   Úversionr1   r   r   r   r3   Z   s   zDynamicClient.versionc                 C   s2   |p
|  di ¡  d¡}|std |j|j¡ƒ‚|S )NÚmetadataÚ	namespacezNamespace is required for {}.{})Úgetr   ÚformatÚgroup_versionÚkind)r    Úresourcer5   Úbodyr   r   r   Úensure_namespace^   s   zDynamicClient.ensure_namespacec                 C   s    t t|ddƒƒr| ¡ S |pi S )zSerialize body to raw dict so apiserver can handle it

        :param body: kubernetes resource body, current support: Union[Dict, ResourceInstance]
        Úto_dictN)ÚcallableÚgetattrr=   )r    r;   r   r   r   Úserialize_bodyd   s   zDynamicClient.serialize_bodyc                 K   s"   |j ||d}| jd|fi |¤ŽS )N©Únamer5   r6   )ÚpathÚrequest)r    r:   rB   r5   r"   rC   r   r   r   r6   n   s   zDynamicClient.getc                 K   sB   |   |¡}|jr|  |||¡}|j|d}| jd|fd|i|¤ŽS )N)r5   Úpostr;   )r@   Ú
namespacedr<   rC   rD   )r    r:   r;   r5   r"   rC   r   r   r   Úcreater   s
   
zDynamicClient.createc           	      K   sX   |s
|s
|s
t dƒ‚|jr|s|s|st dƒ‚|j||d}| jd|f|||dœ|¤ŽS )Nz>At least one of name|label_selector|field_selector is requiredzCAt least one of namespace|label_selector|field_selector is requiredrA   Údelete)r;   Úlabel_selectorÚfield_selector)r   rF   rC   rD   )	r    r:   rB   r5   r;   rI   rJ   r"   rC   r   r   r   rH   y   s   zDynamicClient.deletec                 K   sr   |   |¡}|p| di ¡ d¡}|std |j|j¡ƒ‚|jr&|  |||¡}|j||d}| j	d|fd|i|¤ŽS )Nr4   rB   z!name is required to replace {}.{}rA   Úputr;   )
r@   r6   r   r7   r8   r9   rF   r<   rC   rD   )r    r:   r;   rB   r5   r"   rC   r   r   r   Úreplace   s   
zDynamicClient.replacec                 K   s€   |   |¡}|p| di ¡ d¡}|std |j|j¡ƒ‚|jr&|  |||¡}| dd¡}|j	||d}| j
d|f||dœ|¤ŽS )	Nr4   rB   úname is required to patch {}.{}Úcontent_typez&application/strategic-merge-patch+jsonrA   Úpatch)r;   rN   )r@   r6   r   r7   r8   r9   rF   r<   r   rC   rD   )r    r:   r;   rB   r5   r"   rN   rC   r   r   r   rO   ‹   s   
zDynamicClient.patchc                 K   s‚   |   |¡}|p| di ¡ d¡}|std |j|j¡ƒ‚|jr&|  |||¡}| ddi¡ |j	||d}| j
d|f||dœ|¤ŽS )	Nr4   rB   rM   rN   zapplication/apply-patch+yamlrA   rO   )r;   Úforce_conflicts)r@   r6   r   r7   r8   r9   rF   r<   ÚupdaterC   rD   )r    r:   r;   rB   r5   rP   r"   rC   r   r   r   Úserver_side_apply˜   s   
zDynamicClient.server_side_applyc
              
   c   sZ    |st  ¡ }|rd|› }|j|j||||d||	dD ]}
t||
d ƒ|
d< |
V  qdS )a6  
        Stream events for a resource from the Kubernetes API

        :param resource: The API resource object that will be used to query the API
        :param namespace: The namespace to query
        :param name: The name of the resource instance to query
        :param label_selector: The label selector with which to filter results
        :param field_selector: The field selector with which to filter results
        :param resource_version: The version with which to filter results. Only events with
                                 a resource_version greater than this value will be returned
        :param timeout: The amount of time in seconds to wait before terminating the stream
        :param watcher: The Watcher object that will be used to stream the resource
        :param allow_watch_bookmarks: Ask the API server to send BOOKMARK events

        :return: Event object with these keys:
                   'type': The type of event such as "ADDED", "DELETED", etc.
                   'raw_object': a dict representing the watched object.
                   'object': A ResourceInstance wrapping raw_object.

        Example:
            client = DynamicClient(k8s_client)
            watcher = watch.Watch()
            v1_pods = client.resources.get(api_version='v1', kind='Pod')

            for e in v1_pods.watch(resource_version=0, namespace=default, timeout=5, watcher=watcher):
                print(e['type'])
                print(e['object'].metadata)
                # If you want to gracefully stop the stream watcher
                watcher.stop()
        zmetadata.name=F)r5   rJ   rI   Úresource_versionr   Útimeout_secondsÚallow_watch_bookmarksÚobjectN)r   ÚWatchÚstreamr6   r   )r    r:   r5   rB   rI   rJ   rS   ÚtimeoutÚwatcherrU   Úeventr   r   r   r   ¦   s"   €

ø
õzDynamicClient.watchc                 K   sþ  |  d¡s	d| }| di ¡}| dg ¡}| d¡d ur%| d|d f¡ | d¡d ur5| d|d f¡ | d¡d urE| d|d f¡ | d	¡d urU| d
|d	 f¡ | d¡d ure| d|d f¡ | d¡d uru| d|d f¡ | d¡d ur…| d|d f¡ | d¡d ur•| d|d f¡ | d¡d ur¥| d|d f¡ | d¡d urµ| d|d f¡ | d¡d urÅ| d|d f¡ | d¡d urÕ| d|d f¡ | d¡d urå| d|d f¡ | d¡d urõ| d|d f¡ | d¡d ur| d|d f¡ | d¡d ur| d |d f¡ | d!i ¡}g }i }	td"d#„ | ¡ D ƒƒ}
d$|
vr;| j d%d&g¡|d'< | d(¡rH|d( |d)< n	| j d*g¡|d)< d+g}| jj|| 	¡ |||||| d,¡|	|d-| d.d/¡| d0¡d1}| d,¡r}| ¡ S |S )2Nú/Úpath_paramsÚquery_paramsÚprettyÚ	_continueÚcontinueÚinclude_uninitializedÚincludeUninitializedrJ   ÚfieldSelectorrI   ÚlabelSelectorÚlimitrS   ÚresourceVersionrT   ÚtimeoutSecondsr   Úgrace_period_secondsÚgracePeriodSecondsÚpropagation_policyÚpropagationPolicyÚorphan_dependentsÚorphanDependentsÚdry_runÚdryRunÚfield_managerÚfieldManagerrP   ÚforcerU   ÚallowWatchBookmarksÚheader_paramsc                 s   s     | ]\}}|  ¡ |fV  qd S r*   )Úlower)Ú.0ÚkeyÚvaluer   r   r   Ú	<genexpr>  s   € z(DynamicClient.request.<locals>.<genexpr>Úacceptzapplication/jsonzapplication/yamlÚAcceptrN   zContent-Typez*/*ÚBearerTokenÚ	async_reqFÚ_return_http_data_onlyTÚ_request_timeout)r;   Úpost_paramsr~   ÚfilesÚauth_settingsÚ_preload_contentr   r€   )
Ú
startswithr6   ÚappendÚdictÚitemsr+   Úselect_header_acceptÚselect_header_content_typeÚcall_apiÚupper)r    ÚmethodrC   r;   Úparamsr]   r^   ru   Úform_paramsÚlocal_var_filesÚnew_header_paramsrƒ   Úapi_responser   r   r   rD   Ø   s†   


þ
ózDynamicClient.requestFc              
   C   s$  t stƒ ‚tƒ }tƒ }z'|du r'z	| jd d }W n ty&   t ¡ }Y nw t |||¡ W ||fS  tjj	y\ } z| 
dd dd„ |jD ƒ¡|jf ¡ W Y d}~||fS d}~w tyn   | 
d| ¡ Y ||fS  tjjy‘ } z| 
d	|j|j|jf ¡ W Y d}~||fS d}~ww )
aŸ  validate checks a kubernetes resource definition

        Args:
            definition (dict): resource definition
            version (str): version of kubernetes to validate against
            strict (bool): whether unexpected additional properties should be considered errors

        Returns:
            warnings (list), errors (list): warnings are missing validations, errors are validation failures
        NÚ
kubernetesÚ
gitVersionz.resource definition validation error at %s: %sÚ.c                 S   s   g | ]}t |ƒ‘qS r   )Ústr)rw   Úitemr   r   r   Ú
<listcomp>A  s    z*DynamicClient.validate.<locals>.<listcomp>z=Kubernetes version %s is not supported by kubernetes-validatezqCould not find schema for object kind %s with API version %s in Kubernetes version %s (possibly Custom Resource?))ÚHAS_KUBERNETES_VALIDATEr   Úlistr3   ÚKeyErrorÚkubernetes_validateÚlatest_versionÚvalidateÚutilsÚValidationErrorr†   ÚjoinrC   Úmessager   ÚSchemaNotFoundErrorr9   Úapi_version)r    Ú
definitionr3   ÚstrictÚerrorsÚwarningsr%   r   r   r   rž   )  s6   ÿù0€ûýÿ€ýzDynamicClient.validate)NN)NNNNN)NNN)NNNN)NNNNNNNNr*   )NF)r   r   r   Ú__doc__r0   Úpropertyr2   r3   r<   r@   r6   rG   rH   rL   rO   rR   r   r)   rD   rž   r   r   r   r   r   H   s&    
	










2Pr   )r   r   r“   r   Úkubernetes.client.restr   Ú	discoveryr   r   Ú
exceptionsr   r   r:   r	   r
   r   r   r   rœ   r™   ÚImportErrorÚkubernetes_validate.utilsr   ÚNotImplementedErrorÚ__all__r)   rV   r   r   r   r   r   Ú<module>   s*   ÿÿ