
    d(                     P   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JrJrJrJrJrJrJ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r " S S\5      r " S S\R<                  " \R>                  \ 5      5      r! " S S\!5      r"S r#Sr$S r%g)zEThis package provides DockerImage for examining docker_build outputs.    )absolute_import)division)print_functionN)AnyDictIteratorListSetTextUnion)docker_creds)docker_name)docker_digest)docker_httpc                       \ rS rSrSrSrg)DigestMismatchedError&   z7Exception raised when a digest mismatch is encountered. N)__name__
__module____qualname____firstlineno____doc____static_attributes__r       <lib/third_party/containerregistry/client/v2/docker_image_.pyr   r   &   s    ?r   r   c                       \ rS rSrSrS rS rS r\R                  S 5       r
S r\R                  S 5       rS	 rS
 r\R                  S 5       r\R                  S 5       rS rSrg)DockerImage*   z?Interface for implementations that interact with Docker images.c                     [         R                  " U R                  5       5      nUS    Vs/ s H  o"S   PM	     sn$ s  snf )zEThe ordered collection of filesystem layers that comprise this image.fsLayersblobSum)jsonloadsmanifest)selfr%   xs      r   	fs_layersDockerImage.fs_layers-   s7    zz$--/*H"*:"67"6QiL"6777s   =c                 4    [        U R                  5       5      $ )z>The unique set of blobs that compose to create the filesystem.)setr(   r&   s    r   blob_setDockerImage.blob_set2   s    t~~  r   c                 J    [         R                  " U R                  5       5      $ zThe digest of the manifest.)r   SignedManifestToSHA256r%   r,   s    r   digestDockerImage.digest6   s    //@@r   c                     g)zRThe JSON manifest referenced by the tag/digest.

Returns:
  The raw json manifest
Nr   r,   s    r   r%   DockerImage.manifest;       r   c                 6    [        U R                  U5      5      $ )The byte size of the raw blob.)lenblobr&   r2   s     r   	blob_sizeDockerImage.blob_sizeE   s    tyy !!r   c                     g)zThe raw blob of the layer.

Args:
  digest: the 'algo:digest' of the layer being addressed.

Returns:
  The raw blob bytes of the layer.
Nr   r;   s     r   r:   DockerImage.blobJ   r6   r   c                     [         R                  " U R                  U5      5      n[        R                  " SUS9nUR                  5       $ )z Same as blob() but uncompressed.rbmodefileobj)ioBytesIOr:   gzipGzipFileread)r&   r2   buffs       r   uncompressed_blobDockerImage.uncompressed_blobW   s4    
**TYYv&
'C4-A668Or   c                     g)z!diff_id only exist in schema v22.Nr   r;   s     r   diff_idDockerImage.diff_id]   s    r   c                     g)zOpen the image for reading.Nr   r,   s    r   	__enter__DockerImage.__enter__b   r6   r   c                     g)zClose the image.Nr   r&   unused_typeunused_valueunused_tracebacks       r   __exit__DockerImage.__exit__f   r6   r   c                 *    [        [        U 5      5      $ )z-A human-readable representation of the image.)strtyper,   s    r   __str__DockerImage.__str__j   s    tDz?r   r   N)r   r   r   r   r   r(   r-   r2   abcabstractmethodr%   r<   r:   rL   rO   rR   rY   r^   r   r   r   r   r   r   *   s    G8
!A
  "
  
 & &  r   r   c                      ^  \ rS rSrSrU 4S jrSS jrS rS rU 4S jr	S r
S	 rS
 rSS jrS rS rSS jrS rS rS rSrU =r$ )FromRegistryo   z>This accesses a docker image hosted on a registry (non-local).c                 T   > [         TU ]  5         Xl        X l        X0l        0 U l        g N)super__init___name_creds_original_transport	_response)r&   namebasic_creds	transport	__class__s       r   rh   FromRegistry.__init__r   s'     
GJK(DNr   c                    [        U R                  [        R                  5      (       a$  SR	                  U R                  R
                  US9nXR                  ;   a  U R                  U   $ U R                  R                  SR	                  [        R                  " U R                  R                  5      U R                  R                  US9[        R                  R                  R                  /S9u  p4U(       a  X@R                  U'   U$ )z=Fetches content of the resources from registry by http calls.{repository}/{suffix}
repositorysuffix!{scheme}://{registry}/v2/{suffix}schemeregistryrv   accepted_codes)
isinstanceri   r   
Repositoryformatru   rl   
_transportRequestr   Schemerz   sixmoveshttp_clientOK)r&   rv   cache_contents        r   _contentFromRegistry._content{   s    $**k4455&--ZZ**6 . ;f ^^F##((+22%%djj&9&9:ZZ(( 	3 	 		--001 ) 3JA &nnVNr   c                 j    [         R                  " U R                  S5      R                  S5      5      $ )Nz	tags/listutf8)r#   r$   r   decoder,   s    r   _tagsFromRegistry._tags   s'     ::dmmK077?@@r   c                 B    U R                  5       R                  S/ 5      $ )Ntags)r   getr,   s    r   r   FromRegistry.tags   s    ::<FB''r   c                    > [        U R                  [        R                  5      (       a  U R                  R                  $ [
        TU ]  5       $ r0   )r}   ri   r   Digestr2   rg   )r&   rp   s    r   r2   FromRegistry.digest   s7    $**k0011ZZ7>r   c                 <    U R                  5       nSU;  a  0 $ US   $ )Nr%   r   r&   payloads     r   	manifestsFromRegistry.manifests   s%    jjlG i:r   c                 <    U R                  5       nSU;  a  / $ US   $ )Nchildr   r   s     r   childrenFromRegistry.children   s%    jjlGgi7r   c                      U R                  SS9  g! [        R                   a=  nUR                  [        R
                  R                  R                  :X  a   S nAge S nAff = f)NF)validateT)r%   r   V2DiagnosticExceptionstatusr   r   r   	NOT_FOUND)r&   errs     r   existsFromRegistry.exists   sP    
mmUm#,, 	syy,,66	6s    A#2AAA#c                 D   [        U R                  [        R                  5      (       a7  U R	                  SU R                  R
                  -   5      R                  S5      $ [        U R                  [        R                  5      (       d   eU R	                  SU R                  R                  -   5      R                  S5      n[        R                  " U5      nU(       a@  X0R                  R                  :w  a'  [        SU R                  R                  < SU< 35      eU$ )	Override.z
manifests/r   z?The returned manifest's digest did not match requested digest,  vs. )r}   ri   r   Tagr   tagr   r   r2   r   r1   r   )r&   r   ccomputeds       r   r%   FromRegistry.manifest   s     $**koo..]]<$**..89@@HH

K$6$67777
--tzz'8'88
9
@
@
Ha55a8h	h**"3"33#::,,h89 	9 hr   c                    SU-   n[        U R                  [        R                  5      (       a$  SR	                  U R                  R
                  US9nU R                  R                  SR	                  [        R                  " U R                  R                  5      U R                  R                  US9S[        R                  R                  R                  /S9u  p4[        US   5      $ )	r8   blobs/rs   rt   rw   rx   HEAD)methodr|   zcontent-length)r}   ri   r   r~   r   ru   r   r   r   r   rz   r   r   r   r   int)r&   r2   rv   respunused_contents        r   r<   FromRegistry.blob_size   s    F$**k4455&--ZZ**6 . ;f  ??22+22%%djj&9&9:ZZ(( 	3 	 		--001 3 3D t$%&&r   c                     U R                  SU-   SS9n[        R                  " U5      nX:w  a  [        SU< SU(       a  UOS< 35      eU$ )r   r   F)r   zAThe returned content's digest did not match its content-address, r   z(content was empty))r   r   SHA256r   )r&   r2   r   r   s       r   r:   FromRegistry.blob   sZ     	h'u5A##A&H!Q4I!IKL L Hr   c              #   $  #    [        U R                  [        R                  5      (       a  [	        S5      eSR                  [        R                  " U R                  R                  5      U R                  R                  US9nU R                  R                  U[        R                  R                  R                  /S9 HJ  u  p4[        R                   " U5      nSU;  a  [        R"                  " SU-  5      eUS    H  nUv   M	     ML     g 7f)Nz(Expected docker_name.Registry for "name"z/{scheme}://{registry}/v2/_catalog?n={page_size})ry   rz   	page_sizer{   repositorieszMalformed JSON response: %s)r}   ri   r   r~   
ValueErrorr   r   r   rz   r   PaginatedRequestr   r   r   r   r#   r$   BadStateException)r&   r   urlr   r   wrapper_objectrepos          r   catalogFromRegistry.catalog   s     $**k4455ABB
;
B
B!!$**"5"56$$ C C
 oo66SYY22556 7 8
zz'*n	~	-++)G35 	5 !0$
 18s   DDc                     [         R                  " U R                  U R                  U R                  [         R
                  5      U l        U $ rf   )r   	Transportri   rj   rk   PULLr   r,   s    r   rR   FromRegistry.__enter__   s9    !++

DKK!9!9;;K;KMDO Kr   c                     g rf   r   rU   s       r   rY   FromRegistry.__exit__   s    r   c                 J    SR                  [        U R                  5      5      $ )Nz$<docker_image.FromRegistry name: {}>)r   r\   ri   r,   s    r   r^   FromRegistry.__str__  s    188TZZIIr   )rj   ri   rk   rl   r   )T)d   )r   r   r   r   r   rh   r   r   r   r2   r   r   r   r%   r<   r:   r   rR   rY   r^   r   __classcell__)rp   s   @r   rc   rc   o   sY    F&A
( '$	.	J Jr   rc   c                     U(       aH  [         R                  R                  U5      nX:X  a   gU R                  U5      (       a  gUnU(       a  MH  g)NTF)ospathdirnamer   )fsrm   r   s      r   _in_whiteout_dirr     sG    ggood#G 
 
vvgD 	 
r   z.wh.c           
         0 nU R                  5        GH  n[        R                  " U R                  U5      5      n[        R
                  " SUS9 nUR                  5        GHT  n[        R                  R                  UR                  5      n[        R                  R                  UR                  5      nUR                  [        5      n	U	(       a  U[        [        5      S n[        R                  R                  [        R                  R!                  SX5      5      n
X;   a  M  [#        X*5      (       a  M  U	=(       d    UR%                  5       (       + X*'   U	(       a  GM  UR'                  5       (       a+  UR)                  XeR+                  UR                  5      S9  GMD  UR)                  USS9  GMW     SSS5        GM     g! , (       d  f       GM  = f)zExtract the final filesystem from the image into tar.

Args:
  image: a docker image whose final filesystem to construct.
  tar: the open tarfile into which we are writing the final filesystem.
zr:gzrB   N.)rD   )r(   rE   rF   r:   tarfileopen
getmembersr   r   basenamerm   r   
startswith_WHITEOUT_PREFIXr9   normpathjoinr   isdirisfileaddfileextractfile)imagetarr   layerrJ   	layer_tarmemberr   r   	tombstonerm   s              r   extractr     sM    
"  e
**UZZ&
'C	63	/9((*& 77##FKK0''//&++.''(89	c"2345( wwS' DE:
 B%%

 2FLLN 2y]]__KK(=(=fkk(JKKKKK-9 + 
0	/ !	/	/s   DG	&AG		
G	)&r   
__future__r   r   r   r`   rG   rE   r#   r   r   typingr   r   r   r	   r
   r   r   containerregistry.clientr   r   containerregistry.client.v2r   r   httplib2r   six.moves.http_client	Exceptionr   with_metaclassABCMetaobjectr   rc   r   r   r   r   r   r   <module>r      s    L &  % 
  	  	  > > > 1 0 5 3  
 @I @B#$$S[[&9 BJSJ; SJl  ,.r   