o
    2.a(5                     @   sj  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
 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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-d. Z$d/d0 Z%d1d2 Z&d3d4 Z'd5d6 Z(d7d8 Z)d?d9d:Z*d;d< Z+dS )@    N)datetimeStrictVersion   )errors)tls)DEFAULT_HTTP_HOST)DEFAULT_UNIX_SOCKET)DEFAULT_NPIPE)
BYTE_UNITS)
splitnporturlparsec                  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   4/usr/lib/python3/dist-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)base64Z	b64decodedecodejsonloads)headerdatar   r   r   decode_json_header"   s   


r   c                 C   s,   t | }t |}||krdS ||kr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      r   )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_lt>   s   r(   c                 C   s   t | | S N)r(   r'   r   r   r   version_gteB   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   r!   r-   r   r,   )
isinstancetuplelenstrdict
ValueError)bindingresultr   r   r   _convert_port_bindingF   s*   


r6   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   )r6   ).0r4   r   r   r   
<listcomp>i       z)convert_port_bindings.<locals>.<listcomp>)iteritemsr1   r.   listr6   )Zport_bindingsr5   kvkeyr   r   r   convert_port_bindingsb   s   
rA   c                 C   s   t | tr| S g }|  D ]m\}}t |tr|d}t |tred|v r1d|v r1tdt||d }t |tr?|d}d|v rL|d rIdnd}nd|v rU|d }nd}|	| d| d|  qt |tro|d}|	| d| d q|S )	Nr   romodez/Binding cannot contain both "ro" and "mode": {}bindrw:z:rw)
r.   r=   r<   bytesr   r2   r3   formatreprappend)Zbindsr5   r>   r?   rD   rC   r   r   r   convert_volume_bindso   s:   









rK   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: {}rF   r!   r+   z5Expected item in tmpfs list to be a string, found: {})	r.   r2   r=   r3   rH   type__name__r1   split)Ztmpfsr5   Zmountnameoptionsr   r   r   convert_tmpfs_mounts   s(   



rQ   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.   r=   	TypeErrorr1   rJ   )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r&d|d vr&t|S | d fS )N@r!   r   rF   r7   )rsplitr0   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}|r,tdd |D r5td|  d}d}|dkr>td|d	ksF|d
krM|d
k}d}n|dkrSd}|dvr_td|  |dkrn|jsntd|  t|j	|j
|j|jgrtd|  |jr|dkrtd| |j}|dkr|jd urd|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 r| d| dS | d| d| | dS )Nr+   zunix://c                 S   s   g | ]	}|t jd  vqS )+)stringZascii_letters)r8   xr   r   r   r9      s    zparse_host.<locals>.<listcomp>z//tcpfdzfd protocol is not implementedZhttpZhttps	http+unixunix)r\   r_   npipesshzInvalid bind address protocol: zInvalid bind address format: ra   zBInvalid bind address format: no path allowed for this protocol: {}r7   )r\   ra   r   z1Invalid bind address format: port is required: {}   zhttp{}s)r^   r`   z://rF   )r
   stripr	   r   Zschemeanyr   DockerExceptionZnetlocparamsZqueryZfragmentZpasswordpathrH   Zhostnamejoinr   r   rstrip)ZaddrZis_win32r   rh   ZporthostZ
parsed_urlprotor   r   r   
parse_host   sz   
rm   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 rF   r   r!   r   Zrwm)Z
PathOnHostZPathInContainerZCgroupPermissions)	r.   r2   rJ   r1   r   rf   rL   rN   r0   )ZdevicesZdevice_listZdeviceZdevice_mappingZpath_on_hostZpath_in_containerZpermissionsr   r   r   parse_devices$  s2   





rn   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}|sF|d u rFd}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getrh   ri   
expanduserr   Z	TLSConfig)rp   rq   environmentrk   Z	cert_pathZ
tls_verifyZ
enable_tlsrg   r   r   r   kwargs_from_envA  s8   


	rw   c                 C   s\   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st|n|qS r   )r.   r1   )r8   itemr   r   r   r9   u  s    z#convert_filters.<locals>.<listcomp>)r;   r<   r.   boolr=   r   dumps)filtersr5   r>   r?   r   r   r   convert_filtersn  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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| rrzt|}W n t	yg   t
d|w t|||  } | S t
d| )Nr   r    bBzAFailed converting the string value for memory ({}) to an integer.zyThe specified value for memory ({}) should specify the units. The postfix should be one of the `b` `k` `m` `g` characters)r.   intfloatr0   isalphar   lowerisdigitkeysr3   r   rf   rH   )rc   ZunitssuffixZdigits_partdigitsr   r   r   parse_bytes  s8   r   c                 C   s(   t | trt|  } dd t| D S )Nc                 S   s&   g | ]\}}|r| d | n|qS rF   r   r8   r>   r?   r   r   r   r9     s   & z#normalize_links.<locals>.<listcomp>)r.   r2   r;   r<   sorted)Zlinksr   r   r   normalize_links  s   
r   c                 C   s   i }t | 9}|D ]-}|d dkrq	| }|sq	|dd}t|dkr.|\}}|||< q	td| |W d   |S 1 sBw   Y  |S )ze
    Reads a line-separated environment file.
    The format of each line should be "key=value".
    r   #=r!   r   z'Invalid line in environment file {}:
{}N)openrd   rN   r0   r   rf   rH   )Zenv_filerv   flineZ
parse_liner>   r?   r   r   r   parse_env_file  s,   


r   c                 C   s
   t | S r)   )shlexrN   )Z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.   rG   r   )r@   valuer   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<   )rv   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   r9         z&format_extra_hosts.<locals>.<listcomp>c                 S   s   g | ]\}}| d | qS r   r   r   r   r   r   r9     r   )r   r;   r<   )Zextra_hostsZ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   )FF)NNN)F),r   r   rr   os.pathr   rZ   r   Zdistutils.versionr   r+   r   r   Z	constantsr   r	   r
   r   Zurllib.parser   r   r   r   r   r&   r(   r*   r6   rA   rK   rQ   rT   rX   rm   rn   rw   r}   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sN    '

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