
    o7                        d Z ddlmZ ddlmZ ddlm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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ZddlZdd	lmZ ddlZ G d
 d ej6                  ej8                  e            Z G d de      Z e       e_          G d de      Z!ddZ" G d de!      Z# G d de      Z$ G d de      Z%y)zEThis package provides DockerImage for examining docker_build outputs.    )absolute_import)division)print_functionN)docker_creds)docker_name)docker_http)rangec                      e Zd ZdZej
                  d        Zej
                  d        Zd Zej
                  d        Z	ej
                  d        Z
d Zd Zej
                  d	        Zej
                  d
        Zej
                  d        Zy)DockerImagez?Interface for implementations that interact with Docker images.c                      y)z"The layer id of the topmost layer.N selfs    <lib/third_party/containerregistry/client/v1/docker_image_.pytopzDockerImage.top0   s        c                      y)z(The json blob of tags, loaded as a dict.Nr   r   s    r   repositorieszDockerImage.repositories6   s     	r   c                 ^    t        j                  | j                  |            }d|vry|d   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   zDockerImage.parent<   s1     zz$))H-.HxHr   c                      y)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   zDockerImage.jsonK        	r   c                      y)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   layerzDockerImage.layerY   r   r   c                     | j                  |      }t        j                  |      }t        j                  d|      }|j                         }|S )z!Same as layer() but uncompressed.rb)modefileobj)r   ioBytesIOgzipGzipFileread)r   r   zippedbuffunzippeds         r   uncompressed_layerzDockerImage.uncompressed_layerf   s>    ZZ!F
**V
C4-AvvxHOr   c                      y)z!diff_id only exist in schema v22.Nr   )r   digests     r   diff_idzDockerImage.diff_idn   s    r   c                      y)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   ancestryzDockerImage.ancestrys   r   r   c                      y Nr   r   s    r   	__enter__zDockerImage.__enter__       r   c                      y r4   r   r   unused_typeunused_valueunused_tracebacks       r   __exit__zDockerImage.__exit__   r6   r   N)__name__
__module____qualname____doc__abcabstractmethodr   r   r   r   r   r-   r0   r2   r5   r<   r   r   r   r   r   ,   s    G - -
 	 	
 		 		 		 		
 		 		 	 	 	 	r   r   c                       e Zd Zd Zy)	_FakeTimec                      y)NgEDAr   r   s    r   timez_FakeTime.time   s    r   N)r=   r>   r?   rF   r   r   r   rD   rD      s    r   rD   c                   T    e Zd ZdZ	 	 ddZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zy)FromShardedTarballz:This decodes the sharded image tarballs from docker_build.Nc                 |    || _         || _        || _        i | _        t	        j
                         | _        || _        y r4   )_layer_to_tarball_top_compresslevel_memoize	threadingLock_lock_name)r   layer_to_tarballr   namecompresslevels        r   __init__zFromShardedTarball.__init__   s7    
 .DDI'DDM!DJDJr   c                    |r<| j                   5  || j                  v r| j                  |   cddd       S 	 ddd       t        j                  | j	                  |      d      5 }	 |j                  |      j                         }|r$| j                   5  || j                  |<   ddd       |cddd       S # 1 sw Y   xY w# t        $ r% |j                  d|z         j                         }Y jw xY w# 1 sw Y   QxY w# 1 sw Y   yxY w)z6Fetches a particular path's contents from the tarball.Nr:rS   r"   ./)rP   rM   tarfileopenrJ   extractfiler(   KeyError)r   r   rS   memoizetarcontents         r   _contentzFromShardedTarball._content   s     ::4== t$ :   
411(;$	G36//$',,.
 
ZZ '$--
  
H	G :  6//$+.3356
 Z 
H	GsS   B7%D 'CD C4$	D 7C +C1.D 0C11D 4C=	9D  D	c                     | j                   S 	Override.)rK   r   s    r   r   zFromShardedTarball.top   s    99r   c                     t        j                  | j                  | j                         d      j	                  d            S )rd   r   utf8)r   r   ra   r   decoder   s    r   r   zFromShardedTarball.repositories   s-    ::dmmDHHJ?FFvNOOr   c                 J    | j                  ||dz         j                  d      S rd   z/jsonrf   ra   rg   r   s     r   r   zFromShardedTarball.json   s#    ==8g#56==fEEr   c                 0    | j                  ||dz   d      S )rd   z
/layer.tarF)r^   ra   r   s     r   r-   z%FromShardedTarball.uncompressed_layer   s    ==8l#:E=JJr   c                 "   | j                  |      }t        j                         }t        j                  d| j
                  |      }	 |j                  |       |j                          |j                         }|S # |j                          w xY w)rd   wb)r"   rT   r#   )	r-   r$   r%   r&   r'   rL   writeclosegetvalue)r   r   r,   r*   r+   r)   s         r   r   zFromShardedTarball.layer   sl    &&x0H
**,C4t/B/BCPAgghggi\\^FM ggis   	A< <Bc                 X    | j                  |      }|s|gS |g| j                  |      z   S rc   )r   r2   )r   r   ps      r   r2   zFromShardedTarball.ancestry   s1    HAZ:a(((r   c                     | S r4   r   r   s    r   r5   zFromShardedTarball.__enter__       Kr   c                      y r4   r   r8   s       r   r<   zFromShardedTarball.__exit__       r   N	   )T)r=   r>   r?   r@   rU   ra   r   r   r   r-   r   r2   r5   r<   r   r   r   rH   rH      sB    B
  	
0PF
K
)	r   rH   c                 r   t        j                  | d      5 }|j                  d      xs |j                  d      }|t        d      t	        j
                  |j                         j                  d            }ddd       |r+t        |j                               }|   |j                     S t              dk7  rt        d	      t        j                  |      D ]@  \  }}t        |      dk7  rt        d
      t        j                  |      D ]
  \  }}	|	c c S  B t        d      # 1 sw Y   xY w)z+Get the topmost layer in the image tarball.rW   rX   r   z./repositoriesNz(Tarball must contain a repositories filerf      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())rZ   r[   r\   
ValueErrorr   r   r(   rg   stras_repositorytaglensix	iteritems	Exception)
tarballrS   r_   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{D
4yA~ E F F"%--"5Xo #6	 9 	233+ -,s   A$D--D6c                   (     e Zd ZdZ	 	 d fd	Z xZS )FromTarballzAThis decodes the image tarball output of docker_build for upload.c                 P    t         t        |   fdt        |      ||       y )Nc                     S r4   r   )	unused_idr   s    r   <lambda>z&FromTarball.__init__.<locals>.<lambda>  s    'r   )rS   rT   )superr   rU   r   )r   r   rS   rT   	__class__s    `  r   rU   zFromTarball.__init__
  s,     
+t%!$#	 & %r   rx   )r=   r>   r?   r@   rU   __classcell__)r   s   @r   r   r     s    I  % %r   r   c                   R    e 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 Zy)FromRegistryz>This accesses a docker image hosted on a registry (non-local).c                 J    || _         || _        || _        i | _        i | _        y r4   )rQ   _creds
_transport_tags	_response)r   rS   basic_creds	transports       r   rU   zFromRegistry.__init__  s'    
 DJDKDODJDNr   c                     t        | j                  t        j                        sJ | j                  | j                  j
                     S rc   )
isinstancerQ   r   Tagr   r   r   s    r   r   zFromRegistry.top$  s1    djj+//222::djjnn%%r   c                 F    | j                   j                  | j                  iS rc   )rQ   
repositoryr   r   s    r   r   zFromRegistry.repositories)  s    JJ!!4::..r   c                 P    t        | j                         j                               S )z0Lists the tags present in the remote repository.)listraw_tagskeysr   s    r   r   zFromRegistry.tags-  s    $$&''r   c                     | j                   S )zDictionary of tag to image id.)r   r   s    r   r   zFromRegistry.raw_tags1  s    ::r   c                 l   || j                   vrt        j                  | j                  dj	                  t        j
                  | j                        | j                  |      | j                  t        j                  j                  j                  g      \  }| j                   |<   | j                   |   S )Nz({scheme}://{endpoint}/v1/images/{suffix})schemeendpointsuffix)r   r   Requestr   formatScheme	_endpointr   r   moveshttp_clientOK)r   r   _s      r   ra   zFromRegistry._content5  s    T^^#"-"5"5
//ELL ''7~~ M  #kkCII,A,A,D,D+E	#Ga	
 >>&!!r   c                 H    | j                  |dz         j                  d      S ri   rj   r   s     r   r   zFromRegistry.json>  s#     ==G+,33F;;r   c                 *    | j                  |dz         S )rd   z/layerrl   r   s     r   r   zFromRegistry.layerD  s     ==H,--r   c                 n    t        j                  | j                  |dz         j                  d            S )rd   z	/ancestryrf   )r   r   ra   rg   r   s     r   r2   zFromRegistry.ancestryI  s,     ::dmmH{$:;BB6JKKr   c                 J   t        j                  | j                  dj                  t        j                  | j
                  j                        | j
                  j                  | j
                  j                        | j                  t        j                  j                  j                  g      \  }}t        j                  |d         | _        |d   | _        t        j                  | j                  dj                  t        j                  | j                        | j                  | j
                  j                        | j                  t        j                  j                  j                  g      \  }}t!        j"                  |j%                  d            | _        | S )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   rf   )r   r   r   r   r   rQ   r   r   r   r   r   r   r   v1_credsTokenr   r   r   rg   r   )r   respunused_contentr`   s       r   r5   z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                      y r4   r   r8   s       r   r<   zFromRegistry.__exit__p  rw   r   N)r=   r>   r?   r@   rU   r   r   r   r   ra   r   r   r2   r5   r<   r   r   r   r   r     s>    F
&
/("<.
LB	r   r   c                   T    e Zd ZdZ	 	 	 ddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zy)RandomzrThis generates an image with Random properties.

  We ensure basic consistency of the generated docker
  image.
  Nc                    g | _         i | _        |rt        |      n|}t        |      D ]b  }	 | j	                  |      }|| j                   vr@| xj                   |gz  c_         |r||   nd }| j                  |||      | j                  |<   c` y r4   )	_ancestry_layersr   r	   _next_id_next_layer)r   sample
num_layerslayer_byte_sizeblobsir   blobs           r   rU   zRandom.__init__|  s     DNDL$U*J:==(4>>)
..XJ
&."q$#'#3#3ot$-$,,x
 
  r   c                      | j                   d   S )rd   r   )r   r   s    r   r   z
Random.top  s    >>!r   c                 *    dd| j                         iiS )rd   zrandom/imagelatest)r   r   s    r   r   zRandom.repositories  s    Xtxxz344r   c                     d|i}| j                  |      }t        |      dk7  r|d   |d<   t        j                  |d      S )rd   idr{   r   T)	sort_keys)r2   r   r   dumps)r   r   r   r2   s       r   r   zRandom.json  sE    hH}}X&H
8}#A;hx::h$//r   c                      | j                   |   S rc   )r   r   s     r   r   zRandom.layer  s    <<!!r   c                 v    || j                   v sJ | j                   j                  |      }| j                   |d S )rd   N)r   index)r   r   r   s      r   r2   zRandom.ancestry  s9    t~~%%%NN  *E>>%&!!r   c                 2     |dd      j                  d      S )Ns   0123456789abcdef@   rf   )rg   )r   r   s     r   r   zRandom._next_id  s    %r*11&99r   c           	         t        j                         }t        j                  |d      5 }|r`t        j                  d| j                  |      z         }t        |      |_        |j                  |t        j                  |             nt        j                  j                  d      r|dk\  r|dz  }t        j                         }t        j                  j!                  |d      }	t        j                  j#                  |	      rt        j$                  |	       t'        j(                  d	d
d|	z  dd|z  g      }
|
j+                          t        j                  |	d      5 }|j-                  |	      }|j                  ||       t        j$                  |	       t        j.                  |       d d d        n |t0        j2                  j5                  d      |      }t        j                  d| j                  |      z         }t        |      |_        |j                  |t        j                  |             d d d        |j7                         S # 1 sw Y   !xY w# 1 sw Y   |j7                         S xY w)Nzw:gz)r#   r"   rY   )rS   )r#   linuxi   za.binddzif=/dev/urandomzof=%szbs=1Mzcount=%dr!   rf   )r$   r%   rZ   r[   TarInfor   r   sizeaddfilesysplatform
startswithtempfilemkdtempospathjoinexistsremove
subprocessPopenwait
gettarinformdirstring	printableencoderq   )r   r   r   r   r*   r_   infombtempdirdata_filenameprocessfddatas                r   r   z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$
++dB+
'
))M
"
((7
	 +* f&&--f5GD4==+@$@AI	D"**T"23; 
0> <<> +*) 
0> <<>s&   D<I)(AI8BI)I&	"I))Jc                     | S r4   r   r   s    r   r5   zRandom.__enter__  ru   r   c                      y r4   r   r8   s       r   r<   zRandom.__exit__  rw   r   )   r   N)r=   r>   r?   r@   rU   r   r   r   r   r2   r   r   r5   r<   r   r   r   r   r   t  sE     !#	*50"":$N	r   r   r4   )&r@   
__future__r   r   r   rA   r&   r$   r   r   r   r   r   rZ   r   rN   containerregistry.clientr   r   containerregistry.client.v1r   r   httplib2r   	six.movesr	   six.moves.http_clientwith_metaclassABCMetaobjectr   rD   rF   rH   r   r   r   r   r   r   r   <module>r     s    L &  % 
  	  	   
    1 0 @ 3  
  [	$#$$S[[&9 [	F  K	R	 R	j44%$ %\	; \	~h	[ h	r   