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   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)base64	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*   


r8   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   )r8   ).0r6   r   r   r   
<listcomp>i       z)convert_port_bindings.<locals>.<listcomp>)iteritemsr3   r0   listr8   )port_bindingsr7   kvkeyr   r   r   convert_port_bindingsb   s   
rD   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)
r0   r?   r>   bytesr   r4   r5   formatreprappend)bindsr7   rA   rB   rG   rF   r   r   r   convert_volume_bindso   s:   









rO   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: {}rI   r#   r-   z5Expected item in tmpfs list to be a string, found: {})	r0   r4   r?   r5   rK   type__name__r3   split)tmpfsr7   mountnameoptionsr   r   r   convert_tmpfs_mounts   s(   



rW   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.Target)r0   r?   	TypeErrorr3   rM   )networksr7   nr   r   r   convert_service_networks   s   

r\   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   rI   r9   )rsplitr2   r1   )	repo_namepartsr   r   r   parse_repository_tag   s   ra   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 )+)stringascii_letters)r:   xr   r   r   r;      s    zparse_host.<locals>.<listcomp>z//tcpfdzfd protocol is not implementedhttphttps	http+unixunix)rf   rk   npipesshzInvalid bind address protocol: zInvalid bind address format: rm   zBInvalid bind address format: no path allowed for this protocol: {}r9   )rf   rm   r   z1Invalid bind address format: port is required: {}   zhttp{}s)rj   rl   z://rI   )r
   stripr	   r   schemeanyr   DockerExceptionnetlocparamsqueryfragmentpasswordpathrK   hostnamejoinr   r   rstrip)addris_win32r   ry   porthost
parsed_urlprotor   r   r   
parse_host   sz   
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 rI   r   r#   r   rwm)
PathOnHostPathInContainerCgroupPermissions)	r0   r4   rM   r3   r   rs   rP   rR   r2   )devicesdevice_listdevicedevice_mappingpath_on_hostpath_in_containerpermissionsr   r   r   parse_devices$  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}|sF|d u rFd}tjt j|d	t j|d
ft j|d|| |d|d< |S )NDOCKER_HOSTDOCKER_CERT_PATHDOCKER_TLS_VERIFYr-   Fbase_url~z.dockerzcert.pemzkey.pemzca.pem)client_certca_certverifyssl_versionassert_hostnamer   )osenvirongetry   r{   
expanduserr   	TLSConfig)r   r   environmentr   	cert_path
tls_verify
enable_tlsru   r   r   r   kwargs_from_envA  s8   


	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   )r0   r3   )r:   itemr   r   r   r;   u  s    z#convert_filters.<locals>.<listcomp>)r=   r>   r0   boolr?   r   dumps)filtersr7   rA   rB   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   utcfromtimestamp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| 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)r0   intfloatr2   isalphar   lowerisdigitkeysr5   r   rs   rK   )ro   unitssuffix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 rI   r   r:   rA   rB   r   r   r   r;     s   & z#normalize_links.<locals>.<listcomp>)r0   r4   r=   r>   sorted)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)openrp   rR   r2   r   rs   rK   )env_filer   fline
parse_linerA   rB   r   r   r   parse_env_file  s,   


r   c                 C   s
   t | S r+   )shlexrR   )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   )r0   rJ   r   )rC   valuer   r   r   
format_env  s
   

z&format_environment.<locals>.format_envc                    s   g | ]} | qS r   r   )r:   varr   r   r   r;     r<   z&format_environment.<locals>.<listcomp>)r=   r>   )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   r;         z&format_extra_hosts.<locals>.<listcomp>c                 S   s   g | ]\}}| d | qS r   r   r   r   r   r   r;     r   )r   r=   r>   )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   )FF)NNN)F),r   r   r   os.pathr   rc   r   distutils.versionr   r-   r   r   	constantsr   r	   r
   r   urllib.parser   r   r   r   r!   r(   r*   r,   r8   rD   rO   rW   r\   ra   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sN    '

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