
    5                     h   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 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  ej,                  dd      Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d&dZ$d Z%d'dZ&d Z'd Z(d Z)d  Z*d! Z+d" Z,d# Z-d(d$Z.d% Z/y))    N)datetimeVersion   )errors)DEFAULT_HTTP_HOST)DEFAULT_UNIX_SOCKET)DEFAULT_NPIPE)
BYTE_UNITS)	TLSConfig)urlparse
urlunparseURLComponentsz'scheme netloc url params query fragmentc                  ,    t        j                  d      )Nz[utils.create_ipam_pool has been removed. Please use a docker.types.IPAMPool object instead.r   DeprecatedMethodargskwargss     %lib/third_party/docker/utils/utils.pycreate_ipam_poolr      s    

!
!	0     c                  ,    t        j                  d      )Nz_utils.create_ipam_config has been removed. Please use a docker.types.IPAMConfig object instead.r   r   s     r   create_ipam_configr   "       

!
!	2 r   c                 x    t        j                  |       }|j                  d      }t        j                  |      S )Nutf-8)base64	b64decodedecodejsonloads)headerdatas     r   decode_json_headerr%   )   s/    F#D;;wD::dr   c                 H    t        |       }t        |      }||k(  ry||kD  ryy)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s2s       r   compare_versionr-   /   s-     
B	B	Rx	br   c                      t        | |      dkD  S )Nr   )r-   r)   r*   s     r   
version_ltr0   E   s    2r"Q&&r   c                     t        | |       S N)r0   r/   s     r   version_gter3   I   s    "b!!!r   c                 d   ddd}t        | t              rDt        |       dk(  r| d   |d<   | d   |d<   n^t        | d   t              r	| d   |d<   nB| d   |d<   n9t        | t              r$d| v r| d   |d<   d| v r| d   |d<   nt        |       | |d<   |d   d|d<   |S t        |d         |d<   |S )N )HostIpHostPortr   r(   r7   r   r6   )
isinstancetuplelenstrdict
ValueError)bindingresults     r   _convert_port_bindingr@   M   s    +F'5!w<1!(F:&qzF8
C(&qzF8!(F:	GT	" !(!4F:7"#*8#4x W%%$zj!z M !
!34zMr   c                     i }t        | j                               D ]U  \  }}t        |      }d|vr|dz  }t        |t              r|D cg c]  }t        |       c}||<   Gt        |      g||<   W |S c c}w )N/z/tcp)iteritemsr;   r8   listr@   )port_bindingsr?   kvkeyr>   s         r   convert_port_bindingsrJ   i   s    F]((*+1!fc>6MCaIJKg09KF3K034F3K , M Ls   
A6c                 :   t        | t              r| S g }| j                         D ]  \  }}t        |t              r|j	                  d      }t        |t
              rd|v r'd|v r#t        dj                  t        |                  |d   }t        |t              r|j	                  d      }d|v r
|d   rdnd}nd|v r|d   }nd}|j                  | d| d|        t        |t              r|j	                  d      }|j                  | d| d        |S )	Nr   romodez/Binding cannot contain both "ro" and "mode": {}bindrw:z:rw)
r8   rE   rD   bytesr    r<   r=   formatreprappend)bindsr?   rG   rH   rN   rM   s         r   convert_volume_bindsrV   v   s   %F1a!AaqyVq[ EVDG_ 
 V9D$&{{7+qy wtD1yMM#QtfAdV$ !U#HHW%MM#Qqc9 > Mr   c                 x   t        | t              r| S t        | t              s-t        dj	                  t        |       j                              i }| D ]c  }t        |t              rd|v r|j                  dd      \  }}n2|}d}n-t        dj	                  t        |      j                              |||<   e |S )Nz=Expected tmpfs value to be either a list or a dict, found: {}rP   r(   r5   z5Expected item in tmpfs list to be a string, found: {})	r8   r<   rE   r=   rR   type__name__r;   split)tmpfsr?   mountnameoptionss        r   convert_tmpfs_mountsr_      s    %eT"KVDK(()
 	

 FeS!e| %C 3g GU,,- 
 t  Mr   c                     | s| S t        | t              st        d      g }| D ]'  }t        |t              rd|i}|j	                  |       ) |S )Nz"networks parameter must be a list.Target)r8   rE   	TypeErrorr;   rT   )networksr?   ns      r   convert_service_networksre      sU    h%<==Fa1Aa  Mr   c                     | j                  dd      }t        |      dk(  rt        |      S | j                  dd      }t        |      dk(  rd|d   vrt        |      S | d fS )N@r(   r   rP   rB   )rsplitr:   r9   )	repo_namepartss     r   parse_repository_tagrk      se    S!$E
5zQU|S!$E
5zQ3eAh.U|d?r   c           
      H   | s|rt         S | r| j                         dk(  rt        S | j                         } t        |       }|j                  }|r,t        |D cg c]  }|t        j                  dz   v c}      rt        d| z   d      }d}|dk(  rt        j                  d      |dk(  s|dk(  r|dk(  }d}n|d	k(  rd
}|dvrt        j                  d|        |dk(  r$|j                  st        j                  d|        t        |j                  |j                  |j                  |j                  g      rt        j                  d|        |j                  r)|dk(  r$t        j                  dj!                  |             |j                  }|d
k(  r)|j"                  dj%                  |j"                  |f      }|j                  }|dv rh|j&                  xs d}|dk  r<|dk7  r$t        j                  dj!                  |             d}|j                   d| }|j"                  st(         d| }|dk(  rdj!                  |rdnd      }n|d
k(  rd	}|dv r| d| j+                  d      S t-        t/        |||ddd            j+                  d      S c c}w )Nzunix://+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   zBInvalid bind address format: no path allowed for this protocol: {}rB   )rn   ru   r   z1Invalid bind address format: port is required: {}   rP   zhttp{}sr5   )rr   rt   z://)schemenetlocurlparamsqueryfragment)r
   stripr	   r   rx   anystringascii_lettersr   DockerExceptionry   r{   r|   r}   passwordpathrR   hostnamejoinportr   rstripr   r   )	addris_win32tls
parsed_urlprotoxr   ry   r   s	            r   
parse_hostr      s   H4::<9,""::<D$JECeLe&"6"6"<<eLMdTk51
}$$%EFF %7*w	+	33$$-dV4
 	
 ~j// $$+D62
 	
 :++Z-@-@  $$+D62
 	
 5E>$$&,
 	

 F?z22> 88Z00$78DF#!19~,, &,  D"))*!D62F"")*!D62F ~s3	&&&D6"))#..m  vc{Q Ms   Jc                 r   g }| D ]  }t        |t              r|j                  |       %t        |t              s!t	        j
                  dt        |             |j                  d      }|sj|d   }t        |      dkD  r|d   }n|}t        |      dkD  r|d   }nd}|j                  |||d        |S )NzInvalid device type rP   r   r(   r   rwm)
PathOnHostPathInContainerCgroupPermissions)	r8   r<   rT   r;   r   r   rX   rZ   r:   )devicesdevice_listdevicedevice_mappingpath_on_hostpath_in_containerpermissionss          r   parse_devicesr   /  s    Kfd#v&&#&((&tF|n5   c*)!,L>"Q&$21$5!$0!>"Q&,Q/#*#4%0  ' 0 r   c                 >   |st         j                  }|j                  d      }|j                  d      xs d }|j                  d      }|dk(  rd}n|d u}|xs |}i }|r||d<   |s|S |s=t         j                  j	                  t         j                  j                  d      d      }|s|d}t        t         j                  j	                  |d	      t         j                  j	                  |d
      ft         j                  j	                  |d      || |      |d<   |S )NDOCKER_HOSTDOCKER_CERT_PATHDOCKER_TLS_VERIFYr5   Fbase_url~z.dockerzcert.pemzkey.pemzca.pem)client_certca_certverifyssl_versionassert_hostnamer   )osenvirongetr   r   
expanduserr   )r   r   environmenthost	cert_path
tls_verify
enable_tlsr{   s           r   kwargs_from_envr   L  s   jj??=)D  23;tI !45JR
t+
(jJF!zGGLL!3!3C!8)D	/1  WW\\)Z8WW\\)Y79Y1'F5M Mr   c                 *   i }t        | j                               D ]\  \  }}t        |t              r|rdnd}t        |t              s|g}|D cg c]  }t        |t
              st        |      n|! c}||<   ^ t        j                  |      S c c}w )Ntruefalse)rC   rD   r8   boolrE   r;   r!   dumps)filtersr?   rG   rH   items        r   convert_filtersr   y  s    FW]]_%1aA!T"A 
 (c2CI<
q	 & ::f	
s   $Bc                 p    | t        j                  d      z
  }|j                  |j                  dz  dz  z   S )z*Convert a UTC datetime to a Unix timestampr      i  )r   utcfromtimestampsecondsdays)dtdeltas     r   datetime_to_timestampr     s3    **1--E==5::?T111r   c                 X   t        | t        t        f      r| S t        |       dk(  ry| dd j	                         r(| d   j	                         r| d   dk(  s| d   dk(  r| d d } t
        }| d   j                         }|j                         r| }d}n| d d }||j                         v s|j                         r	 t        |      }t        |||   z        } | S t        j                  dj                  |             # t        $ r% t        j                  dj                  |            w xY w)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)r8   intfloatr:   isalphar   lowerisdigitkeysr=   r   r   rR   )rw   unitssuffixdigits_partdigitss        r   parse_bytesr     s.   !c5]#
1v{BxaemmoR5C<1R5C<#2AErU[[]F ~~f!1	;'F v&' H $$ &)
 	
  	((%vk2 	s   9C; ;.D)c                     t        | t              rt        | j                               } t	        |       D cg c]  \  }}|r| d| n| c}}S c c}}w )NrP   )r8   r<   rC   rD   sorted)linksrG   rH   s      r   normalize_linksr     sM    %U[[]#/5e}=}tq!!qc1#J"}===s   Ac                 2   i }t        |       5 }|D ]m  }|d   dk(  r|j                         }|s|j                  dd      }t        |      dk(  r|\  }}|||<   Jt	        j
                  dj                  | |             	 ddd       |S # 1 sw Y   |S xY w)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)openr~   rZ   r:   r   r   rR   )env_filer   fline
parse_linerG   rH   s          r   parse_env_filer     s    
 K	h1DAw#~::<DC+J:!#!1!"A,,>EE $() )  
& ' 
& s   A3BBc                 ,    t        j                  |       S r2   )shlexrZ   )commands    r   split_commandr     s    ;;wr   c                 f    d }t        | j                               D cg c]  } || 	 c}S c c}w )Nc                 Z    || S t        |t              r|j                  d      }|  d| S )Nr   r   )r8   rQ   r    )rI   values     r   
format_envz&format_environment.<locals>.format_env  s5    =JeU#LL)Eawr   )rC   rD   )r   r   vars      r   format_environmentr     s6      )-[->->-@(AB(AJ(ABBBs   .c                    |r:t        t        | j                                     D cg c]  \  }}| d|  c}}S t        t        | j                                     D cg c]  \  }}| d|  c}}S c c}}w c c}}w )N rP   )r   rC   rD   )extra_hoststaskrG   rH   s       r   format_extra_hostsr     s    #)${/@/@/B*C#D
#D41aqc1#J#D
 	

  &d;+<+<+>&?@@tq!1#Qqc
@ 	
s   A7"A=c                 ,    t        j                  d      )Nz_utils.create_host_config has been removed. Please use a docker.types.HostConfig object instead.r   )selfr   r   s      r   create_host_configr     r   r   )FF)NNN)F)0r   collectionsr!   r   os.pathr   r   r   packaging.versionr   r5   r   	constantsr   r	   r
   r   r   r   urllib.parser   r   
namedtupler   r   r   r%   r-   r0   r3   r@   rJ   rV   r_   re   rk   r   r   r   r   r   r   r   r   r   r   r   r    r   r   <module>r      s       	     %  ) + % "  - '&&-,'"8
$N:Zz:*Z2&R>: C	r   