
    4                         d Z ddlm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
 ddl	mZ ddl	mZ dd	lmZ  G d
 dej                        Z G d dej                        Zy)z9This package provides compatibility interfaces for v1/v2.    )absolute_import)division)print_functionN)docker_image)docker_digest)util)zipc                   X    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d Zy)V1FromV2zEThis compatibility interface serves the v1 interface from a v2 image.c                 2    || _         | j                          y)zgConstructor.

    Args:
      v2_img: a v2 DockerImage on which __enter__ has already been called.
    N)	_v2_image_ComputeLayerMapping)selfv2_imgs     9lib/third_party/containerregistry/client/v2/v1_compat_.py__init__zV1FromV2.__init__!   s     DN    c                    | j                   j                         }t        j                  |      }|d   D cg c]  }|d   	 }}|d   D cg c]  }|d   	 }}d }i | _        i | _        g | _        t        ||      D ]}  \  }}	 ||      }
|
| j                  v r)| j                  |
   |	k(  sJ | j
                  |
   |k(  sJ E|	| j                  |
<   || j
                  |
<   | j                  j                  |
        yc c}w c c}w )a  Parse the v2 manifest and extract indices to efficiently answer v1 apis.

    This reads the v2 manifest, corrolating the v1 compatibility and v2 fsLayer
    arrays and creating three indices for efficiently answering v1 queries:
      self._v1_to_v2: dict, maps from v1 layer id to v2 digest
      self._v1_json: dict, maps from v1 layer id to v1 json
      self._v1_ancestry: list, the order of the v1 layers
    fsLayersblobSumhistoryv1Compatibilityc                 6    t        j                  |       }|d   S )Nid)jsonloads)v1_jsonv1_metadatas     r   	ExtractIdz0V1FromV2._ComputeLayerMapping.<locals>.ExtractId9   s    JJw'kr   N)	r   manifestr   r   	_v1_to_v2_v1_json_v1_ancestryr	   append)r   raw_manifestr    fs_layerv2_ancestryv1_layerv1_jsonsr   r   	v2_digestv1_ids              r   r   zV1FromV2._ComputeLayerMapping*   s    >>**,Lzz,'H7?
7KL7K88I&7KKL<DY<OP<O*+<OHP
 DNDMD #Hk :) e	$..	 ~~e$	111}}U#w...'dnnU$dmmE
u% !; MPs   C?Dc                      | j                   d   S )	Override.r   )r#   r   s    r   topzV1FromV2.topL   s    Qr   c                      yr-   N r.   s    r   repositorieszV1FromV2.repositoriesP   s     	r   c                 L    | j                  |      }t        |      dk(  ry|d   S )r-      N)ancestrylen)r   layer_idr6   s      r   parentzV1FromV2.parentU   s)    }}X&H
8}A;r   c                 :    | j                   j                  |d      S )r-   z{})r"   get)r   r8   s     r   r   zV1FromV2.json]   s    ==Xt,,r   c                 n    | j                   j                  |      }| j                  j                  |      S r-   )r!   r;   r   uncompressed_blobr   r8   r*   s      r   uncompressed_layerzV1FromV2.uncompressed_layerb   s+    ""8,I>>++I66r   c                 n    | j                   j                  |      }| j                  j                  |      S r=   )r!   r;   r   blobr?   s      r   layerzV1FromV2.layerh   s+    ""8,I>>y))r   c                 j    | j                   j                  | j                  j                  |            S r=   )r   diff_idr!   r;   r   digests     r   rE   zV1FromV2.diff_idm   s&    >>!!$.."4"4V"<==r   c                 V    | j                   j                  |      }| j                   |d S r1   )r#   index)r   r8   rI   s      r   r6   zV1FromV2.ancestryq   s+    ##H-EUV$$r   c                     | S Nr2   r.   s    r   	__enter__zV1FromV2.__enter__w       Kr   c                      y rK   r2   r   unused_typeunused_valueunused_tracebacks       r   __exit__zV1FromV2.__exit__z       r   N)__name__
__module____qualname____doc__r   r   r/   r3   r9   r   r@   rC   rE   r6   rL   rS   r2   r   r   r   r      sB    M &D 	
-
7*
>%	r   r   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
V2FromV1zEThis compatibility interface serves the v2 interface from a v1 image.c                 2    || _         | j                          y)zConstructor.

    Args:
      v1_img: a v1 DockerImage on which __enter__ has already been called.

    Raises:
      ValueError: an incorrectly typed argument was supplied.
    N)	_v1_image_ProcessImage)r   v1_imgs     r   r   zV2FromV1.__init__   s     DN 	r   c                 >   g }i | _         | j                  j                  | j                  j                               D ]I  }| j                  j	                  |      }t        j                  |      }|d|igz  }|| j                   |<   K t        j                  t        j                  dddd|| j                  j                  | j                  j                               D cg c]  }d| j                  j                  |      i! c}dd            | _        y c c}w )	Nr   r5   unusedamd64r   )schemaVersionnametagarchitecturer   r   T)	sort_keys)
_layer_mapr\   r6   r/   rC   r   SHA256r   Signr   dumps	_manifest)r   	fs_layersr8   rB   rG   s        r   r]   zV2FromV1._ProcessImage   s   IDONN++DNN,>,>,@A^^!!(+d##D)fY'((i (doof	 B
 YY

  #'.."9"9$..:L:L:N"O"Oh &t~~':':8'D"O  #	DNs   !$Dc                     | j                   S r=   )rk   r.   s    r   r    zV2FromV1.manifest   s    >>r   c                 R    | j                   j                  | j                  |         S r=   )r\   r@   rg   rF   s     r   r>   zV2FromV1.uncompressed_blob   s     >>,,T__V-DEEr   c                 R    | j                   j                  | j                  |         S r=   )r\   rC   rg   rF   s     r   rB   zV2FromV1.blob   s     >> 788r   c                     | S rK   r2   r.   s    r   rL   zV2FromV1.__enter__   rM   r   c                      y rK   r2   rO   s       r   rS   zV2FromV1.__exit__   rT   r   N)rU   rV   rW   rX   r   r]   r    r>   rB   rL   rS   r2   r   r   rZ   rZ   ~   s)    M8F9
	r   rZ   )rX   
__future__r   r   r   r   containerregistry.client.v1r   v1_imagecontainerregistry.client.v2r   v2_imager   	six.movesr	   DockerImager   rZ   r2   r   r   <module>ry      sM    @ &  %  @ 5 @ , ]	x## ]	@>	x## >	r   