U
    #S\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mZ d dlmZ d dl	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
ZdZdZd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# Zd$d% Zd&d' Z d(d) Z!dCd+d,Z"d-d. Z#dDd/d0Z$d1d2 Z%d3d4 Z&d5d6 Z'd7d8 Z(d9d: Z)d;d< Z*d=d> Z+dEd?d@Z,dAdB Z-dS )F    N)datetimeStrictVersion   )errors)tls)
splitnport)urlparse)r   r	   z	127.0.0.1z http+unix:///var/run/docker.sockznpipe:////./pipe/docker_engine   i   i   i   @)bkmgc                  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   4/usr/lib/python3/dist-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   r
   Nr   )v1v2s1s2r   r   r   compare_version6   s    r&   c                 C   s   t | |dkS )Nr   )r&   r"   r#   r   r   r   
version_ltL   s    r(   c                 C   s   t | | S )N)r(   r'   r   r   r   version_gteP   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| kr| d |d< d| kr| d |d< qt| n| |d< |d d k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_bindingT   s&    




r6   c                 C   s`   i }t | D ]L\}}t|}d|k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>w   s     z)convert_port_bindings.<locals>.<listcomp>)r   	iteritemsr3   r-   listr6   )Zport_bindingsr5   r   vkeyr   r   r   convert_port_bindingsp   s    
r>   c                 C   s  t | tr| S g }|  D ]\}}t |tjr8|d}t |trd|krdd|krdtdt	||d }t |tjr|d}d|kr|d rdnd}nd|kr|d }nd}|
td||| qt |tjr|d}|
td|| q|S )	Nr   Zromodez/Binding cannot contain both "ro" and "mode": {}bindZrwz{0}:{1}:{2}z
{0}:{1}:rw)r-   r;   itemsr   binary_typer   r1   r2   formatreprappendZ	text_type)Zbindsr5   r   r<   r@   r?   r   r   r   convert_volume_binds}   s<    





rF   c                 C   s   t | tr| S t | ts,tdt| ji }| D ]P}t |tjrhd|k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   rC   type__name__r   r0   split)Ztmpfsr5   ZmountnameZoptionsr   r   r   convert_tmpfs_mounts   s,    


rL   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   rE   )Znetworksr5   nr   r   r   convert_service_networks   s    
rO   c                 C   sT   |  dd}t|dkr t|S |  dd}t|dkrLd|d krLt|S | d fS )N@r
   r   rG   r7   )rsplitr/   r.   )Z	repo_namepartsr   r   r   parse_repository_tag   s    rS   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k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 k	rVd|j|f}|dkrt|j	\}}|d ks|dk r|dkrtd| d}|st}|dkrd|rdnd}n|dkrd}|dkrd||dS d||||dS )Nr*   zunix://c                 S   s   g | ]}|t jd  k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)rW   rZ   npipesshz!Invalid bind address protocol: {}zInvalid bind address format: {}r\   zBInvalid bind address format: no path allowed for this protocol: {}r7   )rW   r\   r   z1Invalid bind address format: port is required: {}   zhttp{}s)rY   r[   z{}://{}z{0}://{1}:{2}{3})DEFAULT_NPIPEstripDEFAULT_UNIX_SOCKETr	   Zschemeanyr   DockerExceptionrC   ZnetlocparamsZqueryZfragmentZpasswordpathZhostnamejoinr   DEFAULT_HTTP_HOSTrstrip)ZaddrZis_win32r   re   ZporthostZ
parsed_urlprotor   r   r   
parse_host   s    
  




rk   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}rG   r   r
   r   Zrwm)Z
PathOnHostZPathInContainerZCgroupPermissions)r-   r1   rE   r   r0   r   rc   rC   rH   rJ   r/   )ZdevicesZdevice_listZdeviceZdevice_mappingZpath_on_hostZpath_in_containerZpermissionsr   r   r   parse_devices2  s0    





rl   c                 C   s   |s
t j}|d}|dp d }|d}|dkr:d}n|d k	}|pH|}i }|rZ||d< |sb|S |s|t jt jdd}|s|d k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getre   rf   
expanduserr   Z	TLSConfig)rn   ro   environmentri   Z	cert_pathZ
tls_verifyZ
enable_tlsrd   r   r   r   kwargs_from_envO  s8    


	ru   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_filters|  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 }||	 ks| rzt
|}W n$ tk
r   td|Y nX t
|||  } ntd| | S )Nr   r!   r   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/   isalpha
BYTE_UNITSlowerisdigitkeysintr2   r   rc   rC   )r^   ZunitssuffixZdigits_partZ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}rC   r8   r   r<   r   r   r   r9     s     z#normalize_links.<locals>.<listcomp>)r-   r1   r   r:   sorted)Zlinksr   r   r   normalize_links  s    

r   c              	   C   s   i }t | dh}|D ]\}|d dkr&q| }|s4q|dd}t|dkr^|\}}|||< qtd| |qW 5 Q R X |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})openr`   rJ   r/   r   rc   rC   )Zenv_filert   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-   rB   encodeshlexrJ   )Zcommandr   r   r   split_command  s    
r   c                    s    dd   fddt | D S )Nc                 S   s0   |d kr| S t |tjr"|d}dj| |dS )Nr   z{key}={value}r=   value)r-   r   rB   r   rC   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     s     z&format_environment.<locals>.<listcomp>)r   r:   )rt   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   rp   os.pathr   rU   r   Zdistutils.versionr   r   r*   r   r   r   Zurllibr   r	   Zurllib.parserg   ra   r_   r   r   r   r    r&   r(   r)   r6   r>   rF   rL   rO   rS   rk   rl   ru   r{   r}   r   r   r   r   r   r   r   r   r   r   r   <module>   s\   '

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