
    o7                        S r SSKJr  SSKJr  SSKJr  SSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKrSSKrSSKrSSKJr  SSKJr  SSKJr  SSKJr  SSKrSSKrSS	KJr  SSKr " S
 S\R6                  " \R8                  \5      5      r " S S\5      r\" 5       \l          " S S\5      r!SS jr" " S S\!5      r# " S S\5      r$ " S S\5      r%g)zEThis package provides DockerImage for examining docker_build outputs.    )absolute_import)division)print_functionN)docker_creds)docker_name)docker_http)rangec                   &   \ rS rSrSr\R                  S 5       r\R                  S 5       rS r	\R                  S 5       r
\R                  S 5       rS rS	 r\R                  S
 5       r\R                  S 5       r\R                  S 5       rSrg)DockerImage,   z?Interface for implementations that interact with Docker images.c                     g)z"The layer id of the topmost layer.N selfs    <lib/third_party/containerregistry/client/v1/docker_image_.pytopDockerImage.top0   s        c                     g)z(The json blob of tags, loaded as a dict.Nr   r   s    r   repositoriesDockerImage.repositories6   s     	r   c                 d    [         R                  " U R                  U5      5      nSU;  a  gUS   $ )zThe layer of id of the parent of the provided layer, or None.

Args:
  layer_id: the id of the layer whose parentage we're asking

Returns:
  The identity of the parent layer, or None if the root.
parentN)jsonloads)r   layer_idmetadatas      r   r   DockerImage.parent<   s1     zz$))H-.HxHr   c                     g)zThe JSON metadata of the provided layer.

Args:
  layer_id: the id of the layer whose metadata we're asking

Returns:
  The raw json string of the layer.
Nr   r   r   s     r   r   DockerImage.jsonK        	r   c                     g)zThe layer.tar.gz blob of the provided layer id.

Args:
  layer_id: the id of the layer for whose layer blob we're asking

Returns:
  The raw blob string of the layer.
Nr   r    s     r   layerDockerImage.layerY   r"   r   c                     U R                  U5      n[        R                  " U5      n[        R                  " SUS9nUR                  5       nU$ )z!Same as layer() but uncompressed.rb)modefileobj)r$   ioBytesIOgzipGzipFileread)r   r   zippedbuffunzippeds         r   uncompressed_layerDockerImage.uncompressed_layerf   s>    ZZ!F
**V
C4-AvvxHOr   c                     g)z!diff_id only exist in schema v22.Nr   )r   digests     r   diff_idDockerImage.diff_idn   s    r   c                     g)zThe ancestry of the given layer, base layer first.

Args:
  layer_id: the id of the layer whose ancestry we're asking

Returns:
  The list of ancestor IDs, base first, layer_id last.
Nr   r    s     r   ancestryDockerImage.ancestrys   r"   r   c                     g Nr   r   s    r   	__enter__DockerImage.__enter__       r   c                     g r=   r   r   unused_typeunused_valueunused_tracebacks       r   __exit__DockerImage.__exit__   r@   r   r   N)__name__
__module____qualname____firstlineno____doc__abcabstractmethodr   r   r   r   r$   r3   r7   r:   r>   rF   __static_attributes__r   r   r   r   r   ,   s    G - -
 	 	
 		 		 		 		
 		 		 	 	 	 	r   r   c                       \ rS rSrS rSrg)	_FakeTime   c                     g)NgEDAr   r   s    r   time_FakeTime.time   s    r   r   N)rH   rI   rJ   rK   rT   rO   r   r   r   rQ   rQ      s    r   rQ   c                   `    \ rS rSrSr  SS jrSS jrS rS rS r	S	 r
S
 rS rS rS rSrg)FromShardedTarball   z:This decodes the sharded image tarballs from docker_build.Nc                 v    Xl         X l        X@l        0 U l        [        R
                  " 5       U l        X0l        g r=   )_layer_to_tarball_top_compresslevel_memoize	threadingLock_lock_name)r   layer_to_tarballr   namecompresslevels        r   __init__FromShardedTarball.__init__   s/    
 .I'DM!DJJr   c                 H   U(       a=  U R                      X R                  ;   a  U R                  U   sSSS5        $  SSS5        [        R                  " U R	                  U5      SS9 n UR                  U5      R                  5       nU(       a#  U R                      XPR                  U'   SSS5        UsSSS5        $ ! , (       d  f       N= f! [         a%    UR                  SU-   5      R                  5       n Ntf = f! , (       d  f       N\= f! , (       d  f       g= f)z6Fetches a particular path's contents from the tarball.Nr:rc   r(   ./)r`   r]   tarfileopenrZ   extractfiler.   KeyError)r   r   rc   memoizetarcontents         r   _contentFromShardedTarball._content   s     ::== t$ :   
411(;$	G36//$',,.
 
ZZ '--
  
H	G :  6//$+.3356
 Z 
H	GsS   B?)D+C
DD,	D?
C,C?<D>C??D
D	D
D!c                     U R                   $ 	Override.)r[   r   s    r   r   FromShardedTarball.top   s    99r   c                     [         R                  " U R                  U R                  5       S5      R	                  S5      5      $ )rv   r   utf8)r   r   rr   r   decoder   s    r   r   FromShardedTarball.repositories   s-    ::dmmDHHJ?FFvNOOr   c                 H    U R                  XS-   5      R                  S5      $ rv   z/jsonry   rr   rz   r    s     r   r   FromShardedTarball.json   s!    ==g#56==fEEr   c                 (    U R                  XS-   SS9$ )rv   z
/layer.tarF)ro   rr   r    s     r   r3   %FromShardedTarball.uncompressed_layer   s    ==l#:E=JJr   c                     U R                  U5      n[        R                  " 5       n[        R                  " SU R
                  US9n UR                  U5        UR                  5         UR                  5       nU$ ! UR                  5         f = f)rv   wb)r(   rd   r)   )	r3   r*   r+   r,   r-   r\   writeclosegetvalue)r   r   r2   r0   r1   r/   s         r   r$   FromShardedTarball.layer   sl    &&x0H
**,C4t/B/BCPAgghggi\\^FM ggis   A; ;Bc                 b    U R                  U5      nU(       d  U/$ U/U R                  U5      -   $ ru   )r   r:   )r   r   ps      r   r:   FromShardedTarball.ancestry   s1    HAZ:a(((r   c                     U $ r=   r   r   s    r   r>   FromShardedTarball.__enter__       Kr   c                     g r=   r   rB   s       r   rF   FromShardedTarball.__exit__       r   )r\   rZ   r`   r]   ra   r[   N	   )T)rH   rI   rJ   rK   rL   re   rr   r   r   r   r3   r$   r:   r>   rF   rO   r   r   r   rW   rW      sB    B
  	
0PF
K
)	r   rW   c                    [         R                  " U SS9 nUR                  S5      =(       d    UR                  S5      nUc  [        S5      e[        R
                  " UR                  5       R                  S5      5      nSSS5        U(       a+  [        UR                  5       5      nWU   UR                     $ [        W5      S:w  a  [        S	5      e[        R                  " U5       HB  u  pg[        U5      S:w  a  [        S
5      e[        R                  " U5       H	  u  pU	s  s  $    MD     [        S5      e! , (       d  f       N= f)z+Get the topmost layer in the image tarball.rh   ri   r   z./repositoriesNz(Tarball must contain a repositories filery      zUTarball must contain a single repository, or a name must be specified to FromTarball.zNTarball must contain a single tag, or a name must be specified to FromTarball.zUnreachable code in _get_top())rk   rl   rm   
ValueErrorr   r   r.   rz   stras_repositorytaglensix	iteritems	Exception)
tarballrc   rp   repsr   keyunused_repotags
unused_tagr   s
             r   _get_topr      s   ||t,??>*Ocoo>N.OD|ABB::diik0089L	 - 

d  "
#CTXX&&!
 C D D !]]<8{
4yA~ E F F"%--"5o #6	 9 	233+ -,s   A+D<<
E
c                   4   ^  \ rS rSrSr  SU 4S jjrSrU =r$ )FromTarballi  zAThis decodes the image tarball output of docker_build for upload.c                 L   >^ [         [        U ]  U4S j[        TU5      UUS9  g )Nc                    > T$ r=   r   )	unused_idr   s    r   <lambda>&FromTarball.__init__.<locals>.<lambda>  s    'r   )rc   rd   )superr   re   r   )r   r   rc   rd   	__class__s    `  r   re   FromTarball.__init__
  s,     
+t%!$#	 & %r   r   r   )rH   rI   rJ   rK   rL   re   rO   __classcell__)r   s   @r   r   r     s    I  % %r   r   c                   Z    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rSrg)FromRegistryi  z>This accesses a docker image hosted on a registry (non-local).c                 D    Xl         X l        X0l        0 U l        0 U l        g r=   )ra   _creds
_transport_tags	_response)r   rc   basic_creds	transports       r   re   FromRegistry.__init__  s!    
 JKODJDNr   c                     [        U R                  [        R                  5      (       d   eU R                  U R                  R
                     $ ru   )
isinstancera   r   Tagr   r   r   s    r   r   FromRegistry.top$  s4    djj+//2222::djjnn%%r   c                 F    U R                   R                  U R                  0$ ru   )ra   
repositoryr   r   s    r   r   FromRegistry.repositories)  s    JJ!!4::..r   c                 P    [        U R                  5       R                  5       5      $ )z0Lists the tags present in the remote repository.)listraw_tagskeysr   s    r   r   FromRegistry.tags-  s    $$&''r   c                     U R                   $ )zDictionary of tag to image id.)r   r   s    r   r   FromRegistry.raw_tags1  s    ::r   c           	      j   XR                   ;  a  [        R                  " U R                  SR	                  [        R
                  " U R                  5      U R                  US9U R                  [        R                  R                  R                  /5      u  o R                   U'   U R                   U   $ )Nz({scheme}://{endpoint}/v1/images/{suffix})schemeendpointsuffix)r   r   Requestr   formatScheme	_endpointr   r   moveshttp_clientOK)r   r   _s      r   rr   FromRegistry._content5  s    ^^#"-"5"5
//ELL ''7~~ M  #kkCII,A,A,D,D+E	#Ga	
 >>&!!r   c                 H    U R                  US-   5      R                  S5      $ r}   r~   r    s     r   r   FromRegistry.json>  s#     ==G+,33F;;r   c                 *    U R                  US-   5      $ )rv   z/layerr   r    s     r   r$   FromRegistry.layerD  s     ==H,--r   c                 p    [         R                  " U R                  US-   5      R                  S5      5      $ )rv   z	/ancestryry   )r   r   rr   rz   r    s     r   r:   FromRegistry.ancestryI  s,     ::dmmH{$:;BB6JKKr   c           	      F   [         R                  " U R                  SR                  [         R                  " U R
                  R                  5      U R
                  R                  U R
                  R                  S9U R                  [        R                  R                  R                  /5      u  p[        R                  " US   5      U l        US   U l        [         R                  " U R                  SR                  [         R                  " U R                  5      U R                  U R
                  R                  S9U R                  [        R                  R                  R                  /5      u  p[         R"                  " UR%                  S5      5      U l        U $ )Nz>{scheme}://{registry}/v1/repositories/{repository_name}/images)r   registryrepository_namezx-docker-tokenzx-docker-endpointsz<{scheme}://{endpoint}/v1/repositories/{repository_name}/tags)r   r   r   ry   )r   r   r   r   r   ra   r   r   r   r   r   r   r   v1_credsTokenr   r   r   rz   r   )r   respunused_contentrq   s       r   r>   FromRegistry.__enter__O  s<    '..HOO%%djj&9&9:ZZ(( JJ11 	P 	3 59KK				!	!"$D ..&6!78DK./DN  ''FMM%%dnn5^^ JJ11 	N 	3 59KK				!	!"$MD GNN623DJKr   c                     g r=   r   rB   s       r   rF   FromRegistry.__exit__p  r   r   )r   r   ra   r   r   r   N)rH   rI   rJ   rK   rL   re   r   r   r   r   rr   r   r$   r:   r>   rF   rO   r   r   r   r   r     s>    F
&
/("<.
LB	r   r   c                   ^    \ rS rSrSr   SS jrS rS rS rS r	S	 r
S
 rS rS rS rSrg)Randomit  zlThis generates an image with Random properties.

We ensure basic consistency of the generated docker
image.
Nc                 6   / U l         0 U l        U(       a  [        U5      OUn[        U5       Hh  n U R	                  U5      nX`R                   ;  aD  U =R                   U/-  sl         U(       a  XE   OS nU R                  XU5      U R                  U'   Mh  Mf     g r=   )	_ancestry_layersr   r	   _next_id_next_layer)r   sample
num_layerslayer_byte_sizeblobsir   blobs           r   re   Random.__init__|  s     DNDL$U*J:==(>>)
..XJ
&."$#'#3#3t$-$,,x
 
  r   c                      U R                   S   $ )rv   r   )r   r   s    r   r   
Random.top  s    >>!r   c                 *    SSU R                  5       00$ )rv   zrandom/imagelatest)r   r   s    r   r   Random.repositories  s    Xtxxz344r   c                     SU0nU R                  U5      n[        U5      S:w  a  US   US'   [        R                  " USS9$ )rv   idr   r   T)	sort_keys)r:   r   r   dumps)r   r   r   r:   s       r   r   Random.json  sE    hH}}X&H
8}#A;hx::h$//r   c                      U R                   U   $ ru   )r   r    s     r   r$   Random.layer  s    <<!!r   c                 x    XR                   ;   d   eU R                   R                  U5      nU R                   US $ )rv   N)r   index)r   r   r   s      r   r:   Random.ancestry  s7    ~~%%%NN  *E>>%&!!r   c                 2    U" SS5      R                  S5      $ )Ns   0123456789abcdef@   ry   )rz   )r   r   s     r   r   Random._next_id  s    %r*11&99r   c           	      (   [         R                  " 5       n[        R                  " USS9 nU(       a\  [        R                  " SU R                  U5      -   S9n[        U5      Ul        UR                  U[         R                  " U5      S9  GO[        R                  R                  S5      (       Ga  US:  Ga  US-  n[        R                  " 5       n[        R                  R!                  US5      n	[        R                  R#                  U	5      (       a  [        R$                  " U	5        [&        R(                  " S	S
SU	-  SSU-  /5      n
U
R+                  5         [         R                  " U	S5       nUR-                  U	S9nUR                  XkS9  [        R$                  " U	5        [        R.                  " U5        S S S 5        OU" [0        R2                  R5                  S5      U5      n[        R                  " SU R                  U5      -   S9n[        U5      Ul        UR                  U[         R                  " U5      S9  S S S 5        UR7                  5       $ ! , (       d  f       N&= f! , (       d  f       UR7                  5       $ = f)Nzw:gz)r)   r(   rj   )rc   )r)   linuxi   za.binddzif=/dev/urandomzof=%szbs=1Mzcount=%dr'   ry   )r*   r+   rk   rl   TarInfor   r   sizeaddfilesysplatform
startswithtempfilemkdtempospathjoinexistsremove
subprocessPopenwait
gettarinformdirstring	printableencoder   )r   r   r   r   r0   rp   infombtempdirdata_filenameprocessfddatas                r   r   Random._next_layer  s   
**,C 
c	/3	Dv)>$>?I	D"**T"23<<""7++;0N,""$Wg677>>-((
))M
"""#m#WO$
 
 	WW]E*b]3$
++d+
'
))M
"
((7
	 +* f&&--f5GD4==+@$@AI	D"**T"23; 
0> <<> +*) 
0	/> <<>s&   EI47AI#B	I4#
I1	-I44
Jc                     U $ r=   r   r   s    r   r>   Random.__enter__  r   r   c                     g r=   r   rB   s       r   rF   Random.__exit__  r   r   )r   r   )   r  N)rH   rI   rJ   rK   rL   re   r   r   r   r$   r:   r   r   r>   rF   rO   r   r   r   r   r   t  sE     !#	*50"":$N	r   r   r=   )&rL   
__future__r   r   r   rM   r,   r*   r   r  r  r  r  rk   r  r^   containerregistry.clientr   r   containerregistry.client.v1r   r   httplib2r   	six.movesr	   six.moves.http_clientwith_metaclassABCMetaobjectr   rQ   rT   rW   r   r   r   r   r   r   r   <module>r3     s    L &  % 
  	  	   
    1 0 @ 3  
  [	#$$S[[&9 [	F  K	R	 R	j44%$ %\	; \	~h	[ h	r   