o
    Nrf,7                     @   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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 ddlmZ ddlmZmZmZmZ dd	lmZ ed
dZdd Zdd Zdd Ze
dd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&d'Z'd(d) Z(d?d*d+Z)d,d- Z*d.d/ Z+d0d1 Z,d2d3 Z-d4d5 Z.d6d7 Z/d8d9 Z0d@d:d;Z1d<d= Z2dS )A    N)datetimetimezone)	lru_cache)zip_longest)urlparse
urlunparse   )errors)
BYTE_UNITSDEFAULT_HTTP_HOSTDEFAULT_NPIPEDEFAULT_UNIX_SOCKET)	TLSConfigURLComponentsz'scheme netloc url params query fragmentc                  O   
   t d)Nz[utils.create_ipam_pool has been removed. Please use a docker.types.IPAMPool object instead.r	   ZDeprecatedMethodargskwargs r   [/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/docker/utils/utils.pycreate_ipam_pool      r   c                  O   r   )Nz_utils.create_ipam_config has been removed. Please use a docker.types.IPAMConfig object instead.r   r   r   r   r   create_ipam_config#   r   r   c                 C   s   t | }|d}t|S )Nutf-8)base64	b64decodedecodejsonloads)headerdatar   r   r   decode_json_header*   s   


r"   )maxsizec                 C   st   | |krdS t dd | dD }t dd |dD }t||ddD ]\}}||kr.q%||kr5 dS  dS dS )	zCompare docker versions

    >>> v1 = '1.9'
    >>> v2 = '1.10'
    >>> compare_version(v1, v2)
    1
    >>> compare_version(v2, v1)
    -1
    >>> compare_version(v2, v2)
    0
    r   c                 s       | ]}t |V  qd S Nint.0pr   r   r   	<genexpr>@       z"compare_version.<locals>.<genexpr>.c                 s   r$   r%   r&   r(   r   r   r   r+   A   r,   )	fillvalue   )tuplesplitr   )v1v2s1s2c1c2r   r   r   compare_version0   s   r9   c                 C   s   t | |dkS )Nr   )r9   r3   r4   r   r   r   
version_ltM   s   r;   c                 C   s   t | | S r%   )r;   r:   r   r   r   version_gteQ   s   r<   c                 C   s   ddd}t | tr2t| dkr| d |d< | d |d< n7t | d tr+| d |d< n)| d |d< n"t | trPd| v rL| d |d< d| v rK| d |d< nt| | |d< |d d u r`d|d< |S t|d |d< |S )N )HostIpHostPortr   r0   r?   r   r>   )
isinstancer1   lenstrdict
ValueError)bindingresultr   r   r   _convert_port_bindingU   s*   


rG   c                 C   sb   i }t |  D ]&\}}t|}d|vr|d7 }t|tr'dd |D ||< qt|g||< q|S )N/z/tcpc                 S   s   g | ]}t |qS r   )rG   )r)   rE   r   r   r   
<listcomp>x       z)convert_port_bindings.<locals>.<listcomp>)iteritemsrB   r@   listrG   )Zport_bindingsrF   kvkeyr   r   r   convert_port_bindingsq   s   
rQ   c                 C   s2  t | tr| S g }|  D ]\}}t |tr|d}t |trd|v r/d|v r/td||d }t |tr=|d}d|v rJ|d rGdnd}nd|v rS|d }nd}g d}d|v rs|d |v rs|ro| d	|d  }n|d }|| d
| d
|  qt |tr|d}|| d
| d q|S )Nr   romodez-Binding cannot contain both "ro" and "mode": bindrw)ZrsharedZsharedZrslaveZslaveZrprivateprivateZpropagation,:z:rw)r@   rM   rL   bytesr   rC   rD   append)ZbindsrF   rN   rO   rT   rS   Zpropagation_modesr   r   r   convert_volume_binds~   sB   








r[   c                 C   s   t | tr| S t | tstdt| j i }| D ]'}t |tr3d|v r.|dd\}}n|}d}n
tdt|j |||< q|S )Nz;Expected tmpfs value to be either a list or a dict, found: rX   r0   r=   z3Expected item in tmpfs list to be a string, found: )r@   rC   rM   rD   type__name__rB   r2   )ZtmpfsrF   mountnameoptionsr   r   r   convert_tmpfs_mounts   s,   



ra   c                 C   sH   | s| S t | tstdg }| D ]}t |trd|i}|| q|S )Nz"networks parameter must be a list.ZTarget)r@   rM   	TypeErrorrB   rZ   )ZnetworksrF   nr   r   r   convert_service_networks   s   

rd   c                 C   sT   |  dd}t|dkrt|S |  dd}t|dkr&d|d vr&t|S | d fS )N@r0   r   rX   rH   )rsplitrA   r1   )	repo_namepartsr   r   r   parse_repository_tag   s   ri   Fc              	   C   s  | s|rt S | r|  dkrtS |  } t| }|j}|r&tdd |D r0td|  d}d}|dkr9td|dksA|d	krH|d	k}d}n|d
krNd}|dvrZtd|  |dkri|jsitd|  t|j	|j
|j|jgr}td|  |jr|dkrtd|  |j}|dkr|jd ur|j d| }|j}|dv r|jpd}|dkr|dkrtd|  d}|j d| }|jst d| }|dkrd|rdnd }n|dkrd
}|dv r| d| dS tt|||dddddS )Nzunix://c                 s   s     | ]}|t j d vV  qdS )+N)stringascii_letters)r)   xr   r   r   r+      s    zparse_host.<locals>.<genexpr>z//tcpfdzfd protocol is not implementedhttphttps	http+unixunix)rn   rs   npipesshzInvalid bind address protocol: zInvalid bind address format: ru   z@Invalid bind address format: no path allowed for this protocol: rH   )rn   ru   r   z/Invalid bind address format: port is required:    rX   sr=   )rr   rt   z://)schemenetlocurlparamsqueryfragment)r   stripr   r   rx   anyr	   DockerExceptionry   r{   r|   r}   passwordpathhostnameportr   rstripr   r   )addrZis_win32tls
parsed_urlprotor   ry   r   r   r   r   
parse_host   s   

r   c                 C   s   g }| D ]J}t |tr|| qt |ts tdt| |d}|rN|d }t|dkr6|d }n|}t|dkrC|d }nd}||||d q|S )NzInvalid device type rX   r   r0   r   Zrwm)Z
PathOnHostZPathInContainerZCgroupPermissions)	r@   rC   rZ   rB   r	   r   r\   r2   rA   )ZdevicesZdevice_listZdeviceZdevice_mappingZpath_on_hostZpath_in_containerZpermissionsr   r   r   parse_devicesD  s2   





r   c                 C   s   | st j} | d}| dpd }| d}|dkrd}n|d u}|p$|}i }|r-||d< |s1|S |s>t jt jdd}tt j|d	t j|d
ft j|d|d|d< |S )NZDOCKER_HOSTZDOCKER_CERT_PATHZDOCKER_TLS_VERIFYr=   Fbase_url~z.dockerzcert.pemzkey.pemzca.pem)client_certZca_certverifyr   )osenvirongetr   join
expanduserr   )environmenthostZ	cert_pathZ
tls_verifyZ
enable_tlsr{   r   r   r   kwargs_from_enva  s0   


r   c                 C   s\   i }t |  D ] \}}t|tr|rdnd}t|ts|g}dd |D ||< qt|S )Ntruefalsec                 S   s"   g | ]}t |tst|n|qS r   )r@   rB   )r)   itemr   r   r   rI     s    z#convert_filters.<locals>.<listcomp>)rK   rL   r@   boolrM   r   dumps)filtersrF   rN   rO   r   r   r   convert_filters  s   


r   c                 C   s2   |  tjtdddtjd }|j|jd d  S )z&Convert a datetime to a Unix timestampi  r0   )tzinfo   i  )
astimezoner   utcr   secondsdays)dtdeltar   r   r   datetime_to_timestamp  s   r   c              
   C   s  t | ttfr	| S t| dkrdS | dd  r1| d  r1| d dks+| d dkr1| d d } t}| d  }| rB| }d}n| d d }|| v sR| ryzt|}W n t	yn } z
t
d| d|d }~ww t|||  } | S t
d|  d	)
Nr   r/   bBz/Failed converting the string value for memory (z) to an integer.z The specified value for memory (zW) should specify the units. The postfix should be one of the `b` `k` `m` `g` characters)r@   r'   floatrA   isalphar
   lowerisdigitkeysrD   r	   r   )rw   ZunitssuffixZdigits_partdigitsver   r   r   parse_bytes  s>   
r   c                 C   s(   t | trt|  } dd t| D S )Nc                 S   s&   g | ]\}}|r| d | n|qS rX   r   r)   rN   rO   r   r   r   rI     s   & z#normalize_links.<locals>.<listcomp>)r@   rC   rK   rL   sorted)linksr   r   r   normalize_links  s   
r   c                 C   s   i }t | ;}|D ]/}|d dkrq	| }|sq	|dd}t|dkr.|\}}|||< q	td|  d| W d   |S 1 sDw   Y  |S )	ze
    Reads a line-separated environment file.
    The format of each line should be "key=value".
    r   #=r0   r   z!Invalid line in environment file z:
N)openr~   r2   rA   r	   r   )Zenv_filer   fline
parse_linerN   rO   r   r   r   parse_env_file  s(   


r   c                 C   s
   t | S r%   )shlexr2   )commandr   r   r   split_command  s   
r   c                    s"   dd   fddt |  D S )Nc                 S   s.   |d u r| S t |tr|d}|  d| S )Nr   r   )r@   rY   r   )rP   valuer   r   r   
format_env  s
   

z&format_environment.<locals>.format_envc                    s   g | ]} | qS r   r   )r)   varr   r   r   rI     rJ   z&format_environment.<locals>.<listcomp>)rK   rL   )r   r   r   r   format_environment  s   r   c                 C   s8   |rdd t t|  D S dd t t|  D S )Nc                 S   s   g | ]\}}| d | qS ) r   r   r   r   r   rI         z&format_extra_hosts.<locals>.<listcomp>c                 S   s   g | ]\}}| d | qS r   r   r   r   r   r   rI     r   )r   rK   rL   )Zextra_hoststaskr   r   r   format_extra_hosts  s   r   c                 O   r   )Nz_utils.create_host_config has been removed. Please use a docker.types.HostConfig object instead.r   )selfr   r   r   r   r   create_host_config  r   r   )FFr%   )F)3r   collectionsr   r   Zos.pathr   rk   r   r   	functoolsr   	itertoolsr   urllib.parser   r   r=   r	   	constantsr
   r   r   r   r   r   
namedtupler   r   r   r"   r9   r;   r<   rG   rQ   r[   ra   rd   ri   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sV    
6

[
&(
