a
   P{ʴL                   @   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	Z	ddl
mZ ddl
mZ ddlmZ ddlmZ dd	lmZ dd
lmZ e	jrd dlmZ d dlmZ nd dlmZm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 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/d0 Z'd1d2 Z(d3d4 Z)d5d6 Z*d7d8 Z+d9d: Z,dAd;d<Z-d=d> Z.dS )B    N)datetimeStrictVersion   )errors)tls)DEFAULT_HTTP_HOST)DEFAULT_UNIX_SOCKET)DEFAULT_NPIPE)
BYTE_UNITS)
splitnport)urlparse)r   r   c                  O   s   t dd S )Nz[utils.create_ipam_pool has been removed. Please use a docker.types.IPAMPool object instead.r   ZDeprecatedMethodargskwargs r   6/usr/lib/python3.9/site-packages/docker/utils/utils.pycreate_ipam_pool   s    r   c                  O   s   t dd S )Nz_utils.create_ipam_config has been removed. Please use a docker.types.IPAMConfig object instead.r   r   r   r   r   create_ipam_config!   s    r   c                 C   s$   t | }tjr|d}t|S Nutf-8)base64Z	b64decodesixZPY3decodejsonloads)headerdatar   r   r   decode_json_header(   s    

r   c                 C   s0   t | }t |}||krdS ||kr(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      Nr   )v1v2s1s2r   r   r   compare_version/   s    r&   c                 C   s   t | |dkS )Nr   )r&   r"   r#   r   r   r   
version_ltE   s    r(   c                 C   s   t | | S )N)r(   r'   r   r   r   version_gteI   s    r)   c                 C   s   ddd}t | trft| dkr:| d |d< | d |d< qt | d tjrX| d |d< q| d |d< nFt | trd| v r| d |d< d| v r| d |d< qt| n| |d< |d d u rd|d< nt|d |d< |S )N )HostIpHostPortr   r!   r,   r   r+   )
isinstancetuplelenr   string_typesdict
ValueErrorstr)bindingresultr   r   r   _convert_port_bindingM   s&    




r6   c                 C   s`   i }t | D ]L\}}t|}d|vr.|d7 }t|trLdd |D ||< qt|g||< q|S )N/z/tcpc                 S   s   g | ]}t |qS r   )r6   ).0r4   r   r   r   
<listcomp>p       z)convert_port_bindings.<locals>.<listcomp>)r   	iteritemsr3   r-   listr6   )Zport_bindingsr5   kvkeyr   r   r   convert_port_bindingsi   s    
r@   c                 C   s  t | tr| S g }|  D ]\}}t |tjr8|d}t |trd|v rdd|v rdtdt	||d }t |tjr|d}d|v r|d rdnd}nd|v r|d }nd}|
td||| qt |tjr|d}|
td|| q|S )	Nr   romodez/Binding cannot contain both "ro" and "mode": {}bindrwz{0}:{1}:{2}z
{0}:{1}:rw)r-   r<   itemsr   binary_typer   r1   r2   formatreprappendZ	text_type)Zbindsr5   r=   r>   rC   rB   r   r   r   convert_volume_bindsv   s<    





rJ   c                 C   s   t | tr| S t | ts,tdt| ji }| D ]P}t |tjrhd|v r^|	dd\}}q||}d}ntdt|j|||< q4|S )Nz=Expected tmpfs value to be either a list or a dict, found: {}:r!   r*   z5Expected item in tmpfs list to be a string, found: {})
r-   r1   r<   r2   rG   type__name__r   r0   split)Ztmpfsr5   Zmountnameoptionsr   r   r   convert_tmpfs_mounts   s,    


rQ   c                 C   sJ   | s| S t | tstdg }| D ]"}t |tjr:d|i}|| q"|S )Nz"networks parameter must be a list.ZTarget)r-   r<   	TypeErrorr   r0   rI   )Znetworksr5   nr   r   r   convert_service_networks   s    
rT   c                 C   sT   |  dd}t|dkr t|S |  dd}t|dkrLd|d vrLt|S | d fS )N@r!   r   rK   r7   )rsplitr/   r.   )Z	repo_namepartsr   r   r   parse_repository_tag   s    rX   Fc                 C   s
  d}d }d }| s|rt S | r(|  dkr,tS |  } t| }|j}|rXtdd |D rjtd|  d}d}|dkr|td|d	ks|d
kr|d
k}d}n|dkrd}|dvrtd| |dkr|j	std| t|j
|j|j|jgrtd| |jr*|dkr*td| n,|j}|dkrV|jd urVd|j|f}|dv rt|j	\}}|d u s|dk r|dkrtd| d}|st}|dkrd|rdnd}n|dkrd}|dv rd||dS d||||dS )Nr*   zunix://c                 S   s   g | ]}|t jd  vqS )+)stringascii_letters)r8   xr   r   r   r9      r:   zparse_host.<locals>.<listcomp>z//tcpfdzfd protocol is not implementedhttphttps	http+unixunix)r]   rb   npipesshz!Invalid bind address protocol: {}zInvalid bind address format: {}rd   zBInvalid bind address format: no path allowed for this protocol: {}r7   )r]   rd   r   z1Invalid bind address format: port is required: {}   zhttp{}s)ra   rc   z{}://{}z{0}://{1}:{2}{3})r
   stripr	   r   schemeanyr   DockerExceptionrG   netlocparamsqueryfragmentpasswordpathhostnamejoinr   r   rstrip)ZaddrZis_win32r   rp   porthostZ
parsed_urlprotor   r   r   
parse_host   s~    





rw   c                 C   s   g }| D ]}t |tr"|| qt |tjsBtdt||	d}|r|d }t
|dkrn|d }n|}t
|dkr|d }nd}||||d q|S )NzInvalid device type {0}rK   r   r!   r   Zrwm)Z
PathOnHostZPathInContainerZCgroupPermissions)r-   r1   rI   r   r0   r   rj   rG   rL   rN   r/   )ZdevicesZdevice_listZdeviceZdevice_mappingZpath_on_hostZpath_in_containerZpermissionsr   r   r   parse_devices+  s0    





rx   c                 C   s   |s
t j}|d}|dp d }|d}|dkr:d}n|d u}|pH|}i }|rZ||d< |sb|S |s|t jt jdd}|s|d u rd}tjt j|d	t j|d
ft j|d|| |d|d< |S )NZDOCKER_HOSTZDOCKER_CERT_PATHZDOCKER_TLS_VERIFYr*   FZbase_url~z.dockerzcert.pemzkey.pemzca.pem)Zclient_certZca_certZverifyssl_versionassert_hostnamer   )osenvirongetrp   rr   
expanduserr   Z	TLSConfig)rz   r{   environmentru   Z	cert_pathZ
tls_verifyZ
enable_tlsrl   r   r   r   kwargs_from_envH  s8    


	r   c                 C   sZ   i }t | D ]@\}}t|tr,|r(dnd}t|ts<|g}dd |D ||< qt|S )NtrueZfalsec                 S   s$   g | ]}t |tjst|n|qS r   )r-   r   r0   r3   )r8   itemr   r   r   r9   |  s   z#convert_filters.<locals>.<listcomp>)r   r;   r-   boolr<   r   dumps)filtersr5   r=   r>   r   r   r   convert_filtersu  s    

r   c                 C   s"   | t d }|j|jd d  S )z*Convert a UTC datetime to a Unix timestampr      i  )r   ZutcfromtimestampZsecondsZdays)ZdtZdeltar   r   r   datetime_to_timestamp  s    r   c                 C   s   t | tjtf r| S t| dkr&dS | dd  rf| d  rf| d dksZ| d dkrf| d d } t}| d  }| r| }d}n| d d }||	 v s| rzt|}W n" t
y   td|Y n0 t|||  } ntd| | S )Nr   r    bBzBFailed converting the string value for memory ({0}) to an integer.zzThe specified value for memory ({0}) should specify the units. The postfix should be one of the `b` `k` `m` `g` characters)r-   r   Zinteger_typesfloatr/   isalphar   lowerisdigitkeysr2   r   rj   rG   int)rf   ZunitssuffixZdigits_partdigitsr   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 )z{0}:{1}rG   r8   r=   r>   r   r   r   r9     r:   z#normalize_links.<locals>.<listcomp>)r-   r1   r   r;   sorted)Zlinksr   r   r   normalize_links  s    

r   c                 C   s   i }t | dr}|D ]\}|d dkr&q| }|s4q|dd}t|dkr^|\}}|||< qtd| |qW d   n1 s0    Y  |S )	ze
    Reads a line-separated environment file.
    The format of each line should be "key=value".
    rr   #=r!   r   z)Invalid line in environment file {0}:
{1}N)openrg   rN   r/   r   rj   rG   )Zenv_filer   flineZ
parse_liner=   r>   r   r   r   parse_env_file  s$    
$r   c                 C   s&   t jrt| t js| d} t| S r   )r   PY2r-   rF   encodeshlexrN   )Zcommandr   r   r   split_command  s    
r   c                    s    dd   fddt | D S )Nc                 S   s0   |d u r| S t |tjr"|d}dj| |dS )Nr   z{key}={value}r?   value)r-   r   rF   r   rG   r   r   r   r   
format_env  s
    
z&format_environment.<locals>.format_envc                    s   g | ]} | qS r   r   )r8   varr   r   r   r9     r:   z&format_environment.<locals>.<listcomp>)r   r;   )r   r   r   r   format_environment  s    r   c                 C   s4   |rdd t t| D S dd t t| D S )Nc                 S   s   g | ]\}}d  ||qS )z{} {}r   r   r   r   r   r9     s   z&format_extra_hosts.<locals>.<listcomp>c                 S   s   g | ]\}}d  ||qS )z{}:{}r   r   r   r   r   r9     s   )r   r   r;   )Zextra_hostsZtaskr   r   r   format_extra_hosts  s    r   c                 O   s   t dd S )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  s    r   )FF)NNN)F)/r   r   r|   Zos.pathr   rZ   r   Zdistutils.versionr   r   r*   r   r   Z	constantsr   r	   r
   r   r   Zurllibr   r   urllib.parser   r   r   r&   r(   r)   r6   r@   rJ   rQ   rT   rX   rw   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sT   '

Y
-)
