
    Ў                        S r SSKJr  SSKJr  SSKJ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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Jr  SSKJr  SrSrSrSrSrSrSr Sr!Sr"Sr#SRI                  \RJ                  RL                  RN                  RQ                  5       5      r)SRI                  \RJ                  RL                  RN                  RQ                  5       5      r*SRI                  \RJ                  RL                  RN                  RQ                  5       5      r+SRI                  \RJ                  RL                  RN                  RQ                  5       5      r,Sr-Sr.S r/S! r0S" r1S# r2SHS$ jr3S% r4S& r5 SIS' jr6    SJS( jr7S) r8S* r9S+ r:S, r; " S- S.\<5      r= " S/ S0\<5      r> " S1 S2\<5      r? " S3 S4\<5      r@S5 rAS6\BS7\C4S8 jrDS9 rE " S: S;5      rFS< rGS= rHS> rIS? rJS@ rKSA rLSB rMSC rNSD rOSE rPSF rQSG rRg)Kz>Utility for interacting with `artifacts docker` command group.    )absolute_import)division)unicode_literalsN)
exceptions)common_args)waiter)containeranalysis_util)requests)util)log)
properties)	resources)
console_ioartifactregistryzInvalid Docker string.

A valid Docker repository has the format of
  LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID

A valid image has the format of
  LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID/IMAGE
aB  Fail to construct Docker string from config values:
core/project: {project}, artifacts/location: {location}, artifacts/repository: {repo}

A valid Docker repository has the format of
  LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID

A valid image has the format of
  LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID/IMAGE
aO  Invalid Docker image.

A valid container image has the format of
  LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID/IMAGE

A valid container image that can be referenced by tag or digest, has the format of
  LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID/IMAGE:tag
  LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID/IMAGE@sha256:digest
ac  Invalid Docker image/Version.

A valid container image that can be referenced by tag or digest, has the format of
  projects/PROJECT-ID/locations/LOCATION/repositories/REPOSITORY-ID/packages/PACKAGE-ID/versions/sha256:digest
  LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID/IMAGE:tag
  LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID/IMAGE@sha256:digest
zInvalid Docker image.

A valid container image can be referenced by tag or digest, has the format of
  LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID/IMAGE:tag
  LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID/IMAGE@sha256:digest
zvInvalid Docker tag.

A valid Docker tag has the format of
  LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID/IMAGE:tag
zImage not found.

A valid container image can be referenced by tag or digest, has the format of
  LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID/IMAGE:tag
  LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID/IMAGE@sha256:digest
zJ^(?P<repo>(us\.|eu\.|asia\.)?gcr.io)\/(?P<project>[^\/\.]+)\/(?P<image>.*)zX^(?P<repo>(us\.|eu\.|asia\.)?gcr.io)\/(?P<project>[^\/]+\.[^\/]+\/[^\/]+)\/(?P<image>.*)zQ^(?P<location>.*)[.-]docker.(?P<domain>{})\/(?P<project>[^\/]+)\/(?P<repo>[^\/]+)zE^.*[.-]docker.(?P<domain>{})\/[^\/]+\/[^\/]+\/(?P<img>.*):(?P<tag>.*)zO^.*[.-]docker.(?P<domain>{})\/[^\/]+\/[^\/]+\/(?P<img>.*)@(?P<digest>sha256:.*)z9^.*[.-]docker.(?P<domain>{})\/[^\/]+\/[^\/]+\/(?P<img>.*)zBartifactregistry.projects.locations.repositories.packages.versionszprojects\/(?P<project>[^\/]+)\/locations\/(?P<location>[^\/]+)\/repositories\/(?P<repository>[^\/]+)\/packages\/(?P<package>.+)\/versions\/(?P<version>[^\/]+)$z9https://(?P<docker_string>.*(docker\.pkg\.dev|gcr\.io).*)c            
         [         R                  R                  R                  R	                  5       n [         R                  R
                  R                  R	                  5       n[         R                  R
                  R                  R	                  5       nU (       a  U(       a  U(       d.  [        R                  " [        R                  " S0 U UUS.D65      e[        XU5      $ )zAGets default config values for project, location, and repository.projectlocationrepo )r   VALUEScorer   Get	artifactsr   
repositoryar_exceptionsInvalidInputValueError$_INVALID_DEFAULT_DOCKER_STRING_ERRORformat
DockerRepor   s      7lib/googlecloudsdk/command_lib/artifacts/docker_util.py_GetDefaultResourcesr"      s    ""**..0'((11557(				$	$	/	/	3	3	5$	

.
.,33 	 7
 	  
Gt	,,    c                    [         R                  R                  R                  R	                  5       n[
        R                  " U5      nSU-   [        SS -   n[
        R                  " X 5      nU(       d  [        R                  " 5       eUR                  S5      nUR                  S5      n[        XTUR                  S5      5      $ )aA  Parses user input into project, location, and repository values.

Args:
  input_str: str, user input. Ex: us-docker.pkg.dev/my-proj/my-repo/my-img

Raises:
  ar_exceptions.InvalidInputValueError if user input is invalid.
  ar_exceptions.UnsupportedLocationError if provided location is invalid.

Returns:
  A DockerRepo.
^   Nr   r   r   )r   r   r   registry_endpoint_prefixr   reescapeDOCKER_REPO_REGEXmatchr   r   groupr    )	input_strprefixregexmatchesr   
project_ids         r!   _ParseInputr2      s      &&??CCE&99V&
,*12.
.%HHU&'	

.
.
00]]:&(}}Y'*	J'--*?	@@r#   c                    U (       d
  [        5       $ [        [        SU R                  S5      5      5      n [	        U 5      n[        U5      S:X  a  U$ [        U5      S:  a  [        USR                  USS 5      5      $ [
        R                  " [        5      e! [
        R                   a    [
        R                  " [        5      ef = f)zFValidates and parses an image path into a DockerImage or a DockerRepo.N/   )r"   listfiltersplitr2   r   r   _INVALID_IMAGE_PATH_ERRORlenDockerImagejoin)img_pathresource_val_listdocker_repos      r!   ParseDockerImagePathr@      s    	!!6$s(;<=Jh'K 		q 
!{CHH->qr-B$CDD,,-FGG 
	-	- J

.
./H
IIJs   B /C	c                     [        U 5      n[        R
                  " [        U 5      nU(       a7  [        X4R                  S5      5      nU[        UUR                  S5      5      4$ [        R
                  " [        U 5      nU(       a6  [        X6R                  S5      5      nU[        XVR                  S5      5      4$ [        R
                  " [        U 5      nU(       aA  [        UUR                  S5      R                  S5      5      nXR(       a  S4$ [        US5      4$ [        R                  " U5      e! [        R                   a    [        R                  " [        5      ef = f)a  Validates and parses an image string into a DockerImage.

Args:
  img_str: str, User input docker formatted string.
  err_msg: str, Error message to return to user.
  strict: bool, If False, defaults tags to "latest".

Raises:
  ar_exceptions.InvalidInputValueError if user input is invalid.
  ar_exceptions.UnsupportedLocationError if provided location is invalid.

Returns:
  A DockerImage, and a DockerTag or a DockerVersion.
imgdigesttagr4   Nlatest)r2   r   r   _INVALID_DOCKER_IMAGE_ERRORr(   r+   DOCKER_IMG_BY_DIGEST_REGEXr;   r,   DockerVersionDOCKER_IMG_BY_TAG_REGEX	DockerTagDOCKER_IMG_REGEXstrip)img_strerr_msgstrictr?   img_by_digest_match
docker_imgimg_by_tag_matchwhole_img_matchs           r!   _ParseDockerImagerT      s<   Lg&K !;WE[*C*CE*JKJ}Z%8%>%>x%HJ J JXX5w?[*@*@*GHJy-C-CE-JKKKHH-w7/[,2259??DFJvtJJ9Z+JJJ,,W55# 
	-	- L

.
./J
KKLs   D7 7/E&c                 d   [         R                  " [        U 5      nU(       a  [        [	        [        UR                  S5      UR                  S5      UR                  S5      5      [        R                  " UR                  S5      5      5      UR                  S5      5      $  [        U 5      n[         R                  " [        U 5      n[         R                  " [        U 5      nU(       a4  [	        X#R                  S5      5      n[        XSR                  S5      5      $ U(       a?  [	        X$R                  S5      5      n[        XTR                  S5      5      n[!        U5      $ [        R                  " [        5      e! [        R                   a    [        R                  " [        5      ef = f)	a@  Validates and parses an image string into a DockerImage.

Args:
  version_str: str, User input docker formatted or AR version resource string.

Raises:
  ar_exceptions.InvalidInputValueError if user input is invalid.
  ar_exceptions.UnsupportedLocationError if provided location is invalid.

Returns:
  A DockerVersion.
r   r   r   packageversionrB   rC   rD   )r(   r+   _VERSION_REGEXrH   r;   r    r,   r   EscapePackageStrr2   r   r   _INVALID_VERSION_STR_ERRORrG   rI   rJ   _ValidateAndGetDockerVersion)version_strr+   r?   uri_digest_matchuri_tag_matchrQ   rD   s          r!   ParseDockerVersionStrr_      sW    ((>;
/%
I&J'L)
 !!%++i"89	
 	I
 
Kk*K XX8+F((2K@-[*@*@*GHJ%;%;H%EFF[*=*=e*DEJ
J 3 3E :
;C',,,,-GHH 
	-	- K

.
./I
JJKs   $F   /F/c                 b    [        U 5      n[        R
                  " [        U 5      nU(       a6  [        XR                  S5      5      nU[        X2R                  S5      5      4$ [        R                  " [        5      e! [        R                   a    [        R                  " [        5      ef = f)a  Validates and parses a tag string.

Args:
  tag: str, User input Docker tag string.

Raises:
  ar_exceptions.InvalidInputValueError if user input is invalid.
  ar_exceptions.UnsupportedLocationError if provided location is invalid.

Returns:
  A DockerImage and a DockerTag.
rB   rD   )
r2   r   r   _INVALID_DOCKER_TAG_ERRORr(   r+   rI   r;   r,   rJ   )rD   r?   rR   rQ   s       r!   _ParseDockerTagrb     s    Jc"K XX5s;[*@*@*GHJy-C-CE-JKKK

.
./H
II 
	-	- J

.
./H
IIJs   A? ?/B.c                 <   [         R                  " 5       n[         R                  " 5       n/ n[         R                  " XgU R	                  5       US9 H  n	U	R
                  R                  S5      n
[        U
5      S:w  a/  [        R                  " SR                  U	R
                  5      5      e[        [        U
S   U
S   U
S   5      U
S   5      nU(       a&  UR                  5       R                  U5      (       d  M  UR                  [!        XX#US	S
95        M     U$ )z>Gets a list of packages with versions for a Docker repository.)	page_sizer4      z*Internal error. Corrupted package name: {}r&   r5         Fsearch_subdirs)ar_requests	GetClientGetMessagesListPackagesGetRepositoryNamenamer8   r:   r   ArtifactRegistryErrorr   r;   r    GetDockerString
startswithextend_GetDockerVersions)r?   include_tagsrd   order_bylimitpackage_prefixclientmessagesimg_listpkgpartsrB   s               r!   _GetDockerPackagesAndVersionsr~   -  s       "&$$&((%%5579NcHHNN3E
5zQ//
6
=
=chh
GI I
jq58U1X>a
ICc113>>~NNOOyE 	"#N 
/r#   c           
      
   [         R                  " 5       n[         R                  " 5       nUR                  R                  R
                  nU(       a   UR                  R                  R                  n/ n	 [         R                  " XgU R                  5       UX#U5      n	/ n
U	 GH  n[        R                  R!                  UR"                  [$        S9R'                  5       nU R                  5       UR(                   Vs/ s H   oR"                  R+                  S5      S   PM"     snUUR,                  UR.                  S.nUR0                  bI  UR0                  R2                   Vs0 s H$  nUR4                  UR6                  R8                  _M&     snUS'   U
R;                  U5        GM     U
$ ! [        R                   a7    U(       a+  [        U R                  UUUUU R                  5       S-   S9s $ / s $ f = fs  snf s  snf )z+Gets a list of versions for a Docker image.r4   )rx   
collection)rV   tagsrW   
createTime
updateTimemetadata)rj   rk   rl   HArtifactregistryProjectsLocationsRepositoriesPackagesVersionsListRequestViewValueValuesEnumBASICFULLListVersionsGetPackageNameapi_exceptionsHttpNotFoundErrorr~   r?   rq   r   REGISTRYParsero   _VERSION_COLLECTION_NAMENamerelatedTagsr8   r   r   r   additionalPropertieskeyvaluestring_valueappend)rQ   ru   rd   rv   rw   ri   ry   rz   ver_viewver_listr{   vervtrB   props                   r!   rt   rt   G  s      "&$$&(OO55  PP		TT 
 (''(2(A(A(CX(1UDH( (c  5 	! 	77;tv  --/03@1c"2&@nnnnC || ll777d ((DJJ++
+7c*o OOC   
/C 
	)	) 
 *

 
 



#335;= = i, As%   5(F- <'G;$+H -AG83G87G8c                 $   [         R                  R                  SU R                  5       -   5        U(       aY  [         R                  R                  S5        U H3  n[         R                  R                  SUR                  5       -   5        M5     gg)z6Logs user visible messages on resources to be deleted.zDigests:
- z
Tags:z- N)r   statusPrintrq   )docker_versiondocker_tagsrD   s      r!   _LogResourcesToDeleter     sf    **>N$B$B$DDEJJY	jjtc11334  r#   c           	          [         R                  " XUR                  5       UR                  5       5      nU Vs/ s H5  n[	        UR
                  UR                  R                  S5      S   5      PM7     sn$ s  snf )zAGets a list of DockerTag associated with the given DockerVersion.r4   r   )rj   ListVersionTagsr   GetVersionNamerJ   imagero   r8   )ry   rz   r   r   rD   s        r!   _GetDockerVersionTagsr     sv    		$	$V%3%B%B%D%3%B%B%D
F$
 59
48S $$s#B')48
  
s   <A8c                    [         R                  " U 5      n[         R                  " 5       nUR                  UR                  R
                  R                  :w  a/  [        R                  " SR                  UR                  5      5      eg )NziInvalid repository type {}. The `artifacts docker` command group can only be used on Docker repositories.)	rj   GetRepositoryrl   r   
RepositoryFormatValueValuesEnumDOCKERr   r   )	repo_namer   rz   s      r!   _ValidateDockerRepor     sl    		"	"9	-$$$&(	[[H''==DDD

.
.	//5vdkk/BD D Er#   c                 T    [        U [        5      (       aN  [        R                  " [        R                  " 5       [        R
                  " 5       U R                  5       5        U $ [        U [        5      (       ad  [        R                  " [        R                  " 5       [        R
                  " 5       U R                  5       5      n[        U R                  U5      nU$ [        R                  " [        5      e! [        R                   a    [        R                  " [         5      ef = f)zValidates a version_or_tag and returns the validated DockerVersion object.

Args:
  version_or_tag: a docker version or a docker tag.

Returns:
  a DockerVersion object.

Raises:
  ar_exceptions.InvalidInputValueError if version_or_tag is not valid.
)
isinstancerH   rj   
GetVersionrk   rl   r   rJ   GetVersionFromTag
GetTagNamer   r   r   rF   r   r   _DOCKER_IMAGE_NOT_FOUND)version_or_tagrC   r   s      r!   r[   r[     s    H.-00 [224k6M6M6O+::<>	NI	.	.,,[-B-B-D-8-D-D-F-;-F-F-HJf %^%9%96Bn001LMM		)	) H

.
./F
GGHs   A"C8 %A8C8 C8 8/D'c                   `    \ rS rSrSrS r\S 5       r\S 5       r\S 5       r	S r
S rS	 rS
rg)r    i  a  Holder for a Docker repository.

A valid Docker repository has the format of
LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID

Properties:
  project: str, The name of cloud project.
  location: str, The location of the Docker resource.
  repo: str, The name of the repository.
c                 (    Xl         X l        X0l        g N)_project	_location_repo)selfr1   location_idrepo_ids       r!   __init__DockerRepo.__init__  s    M NJr#   c                     U R                   $ r   r   r   s    r!   r   DockerRepo.project      ==r#   c                     U R                   $ r   )r   r   s    r!   r   DockerRepo.location  s    >>r#   c                     U R                   $ r   )r   r   s    r!   r   DockerRepo.repo  s    ::r#   c                     [        U[        5      (       aY  U R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ [
        $ r   )r   r    r   r   r   NotImplementedr   others     r!   __eq__DockerRepo.__eq__  sV    %$$
--5>>
) (nn/(jjEKK'
 r#   c                     SR                  U R                  [        R                  R                  R
                  R                  5       U R                  U R                  5      $ )Nz{}-docker.{}/{}/{})	r   r   r   r   r   domainr   r   r   r   s    r!   rq   DockerRepo.GetDockerString  sH    &&##**..0			 r#   c                 x    [        U R                  5      nSR                  U R                  XR                  5      $ )Nz(projects/{}/locations/{}/repositories/{})RemoveEndpointPrefixr   r   r   r   )r   locs     r!   rn   DockerRepo.GetRepositoryName  s0    
t}}
-C5<<c99 r#   )r   r   r   N)__name__
__module____qualname____firstlineno____doc__r   propertyr   r   r   r   rq   rn   __static_attributes__r   r#   r!   r    r      sW    	
      r#   r    c                   `    \ rS rSrSrS r\S 5       r\S 5       r\S 5       r	S r
S rS	 rS
rg)r;   i  a  Holder for a Docker image resource.

A valid image has the format of
LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID/IMAGE_PATH

Properties:
  project: str, The name of cloud project.
  docker_repo: DockerRepo, The Docker repository.
  pkg: str, The name of the package.
c                     Xl         X l        g r   _docker_repo_pkg)r   r?   pkg_ids      r!   r   DockerImage.__init__  s    #Ir#   c                 .    U R                   R                  $ r   )r   r   r   s    r!   r   DockerImage.project  s    $$$r#   c                     U R                   $ r   )r   r   s    r!   r?   DockerImage.docker_repo	  s    r#   c                     U R                   $ r   )r   r   s    r!   r|   DockerImage.pkg      99r#   c                     [        U[        5      (       a9  U R                  UR                  :H  =(       a    U R                  UR                  :H  $ [        $ r   )r   r;   r   r   r   r   s     r!   r   DockerImage.__eq__  s>    %%%%"4"44Pejj9PPr#   c                     SR                  U R                  R                  5       U R                  R	                  SS5      5      $ )Nz{}/packages/{}r4   %2F)r   r?   rn   r|   replacer   s    r!   r   DockerImage.GetPackageName  s<    ""4#3#3#E#E#G#'88#3#3C#?A Ar#   c                    SR                  [        R                  R                  R                  R                  5       U R                  R                  [        R                  R                  R                  R                  5       U R                  R                  U R                  R                  U R                  R                  SS5      5      $ )Nz{}{}-docker.{}/{}/{}/{}r   r4   )r   r   r   r   r'   r   r?   r   r   r   r   r|   r   r   s    r!   rq   DockerImage.GetDockerString  s    $++##<<@@B!!##**..0  $ r#   r   N)r   r   r   r   r   r   r   r   r?   r|   r   r   rq   r   r   r#   r!   r;   r;     sX    	 % %    
Ar#   r;   c                   V    \ rS rSrSrS r\S 5       r\S 5       rS r	S r
S rS	 rS
rg)rJ   i%  zHolder for a Docker tag.

A valid Docker tag has the format of
LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID/IMAGE:tag

Properties:
  image: DockerImage, The DockerImage containing the tag.
  tag: str, The name of the Docker tag.
c                     Xl         X l        g r   _image_tag)r   rQ   tag_ids      r!   r   DockerTag.__init__0  s    KIr#   c                     U R                   $ r   r   r   s    r!   r   DockerTag.image4      ;;r#   c                     U R                   $ r   )r   r   s    r!   rD   DockerTag.tag8  r   r#   c                     [        U[        5      (       a9  U R                  UR                  :H  =(       a    U R                  UR                  :H  $ [        $ r   )r   rJ   r   r   r   r   s     r!   r   DockerTag.__eq__<  s:    %##[[ELL(DTYY%**-DDr#   c                 j    SR                  U R                  R                  5       U R                  5      $ )Nz
{}/tags/{})r   r   r   rD   r   s    r!   r   DockerTag.GetTagNameA  s&    tzz88:DHHEEr#   c                 6    U R                   R                  5       $ r   r   r   r   s    r!   r   DockerTag.GetPackageNameD      ::$$&&r#   c                 j    SR                  U R                  R                  5       U R                  5      $ )Nz{}:{})r   r   rq   rD   r   s    r!   rq   DockerTag.GetDockerStringG  s$    >>$**446AAr#   r   N)r   r   r   r   r   r   r   r   rD   r   r   r   rq   r   r   r#   r!   rJ   rJ   %  sJ        
F'Br#   rJ   c                   f    \ rS rSrSrS r\S 5       r\S 5       r\S 5       r	S r
S rS	 rS
 rSrg)rH   iK  a3  Holder for a Docker version.

A valid Docker version has the format of
LOCATION-docker.DOMAIN/PROJECT-ID/REPOSITORY-ID/IMAGE@sha256:digest

Properties:
  image: DockerImage, The DockerImage containing the tag.
  digest: str, The name of the Docker digest.
  project: str, the project this image belongs to.
c                     Xl         X l        g r   )r   _digest)r   rQ   rC   s      r!   r   DockerVersion.__init__W  s    KLr#   c                     U R                   $ r   r   r   s    r!   r   DockerVersion.image[  r   r#   c                     U R                   $ r   )r  r   s    r!   rC   DockerVersion.digest_  s    <<r#   c                 B    U R                   R                  R                  $ r   )r   r?   r   r   s    r!   r   DockerVersion.projectc  s    ;;""***r#   c                     [        U[        5      (       a9  U R                  UR                  :H  =(       a    U R                  UR                  :H  $ [        $ r   )r   rH   r   r  r   r   s     r!   r   DockerVersion.__eq__g  s:    %''[[ELL(JT\\U]]-JJr#   c                 j    SR                  U R                  R                  5       U R                  5      $ )Nz{}/versions/{})r   r   r   rC   r   s    r!   r   DockerVersion.GetVersionNamel  s&    ""4::#<#<#>LLr#   c                 6    U R                   R                  5       $ r   r  r   s    r!   r   DockerVersion.GetPackageNameo  r
  r#   c                 j    SR                  U R                  R                  5       U R                  5      $ )Nz{}@{})r   r   rq   rC   r   s    r!   rq   DockerVersion.GetDockerStringr  s$    >>$**446DDr#   )r  r   N)r   r   r   r   r   r   r   r   rC   r   r   r   r   rq   r   r   r#   r!   rH   rH   K  s^    	     + +
M'Er#   rH   c           	         UR                   nUR                  b  Sn[        R                  " UR                  5      nUb
  SU;   a  SnSn[        U [        5      (       a  [        U R                  5       5        [        R                  R                  SR                  U R                  U R                  U R                  5      5        [         R"                  " U R                  5       UR$                  U5       Vs/ s H  n['        XAR(                  5      PM     sn$ [        U [*        5      (       a  [        U R,                  R                  5       5        [        R                  R                  SR                  U R,                  R                  U R,                  R                  U R,                  R                  5      5        [/        U UR(                  UR$                  UUSS9$ / $ s  snf )zGets Docker images.N,<Listing items under project {}, location {}, repository {}.
Trh   )rw   r7   r   ParseSortByArgsort_byr   r    r   rn   r   r   r   r   r   r   r   rj   ListDockerImagesrd   DockerImageToLegacyru   r;   r?   rt   )resourceargsrw   rv   rB   s        r!   GetDockerImagesr(  v  s   
**%	[[E''5( 
hhe*%%2245JJGNNh//	
 //&&($..%

C 	C!2!23
  (K((,,>>@AJJGNN  ((  ))  %%	
   
)/s   7G!ru   returnc           	         U R                   R                  S5      n[        U5      S:w  a/  [        R                  " SR                  U R                   5      5      eUS   US   U R                  U R                  U R                  U R                  [        U R                  5      U R                  S.U(       a  U R                  S.$ SS.$ )	zConverts a docker image resource from generated client into legacy format.

Args:
  img: The docker image to convert to legacy format
  include_tags: Bool to specify if tags should be included

Returns:
  Legacy representation of a docker image.
@   z$Unable to parse docker image URI: {}r   r&   )	buildTime	mediaTypeimageSizeBytesro    )rV   rW   r   r   r   r   )urir8   r:   r   rp   r   
uploadTimer   r-  r.  strr/  ro   r   )rB   ru   splitss      r!   r%  r%    s     77==&[A

-
-.55cgg>  NNNN}}}} 2 23(( 'chh!
   -/!
 r#   c                     [         R                  " 5       R                  n[        R                  R                  U R                  SS9n[        R                  " U5      n[        R                  " XCU5        g)zWaits for the given google.longrunning.Operation to complete.

Args:
  operation: The operation to poll.
  message: String to display for default progress_tracker.

Raises:
  apitools.base.py.HttpError: if the request returns an HTTP error
z.artifactregistry.projects.locations.operationsr   N)
rj   rk   projects_locations_operationsr   r   ParseRelativeNamero   r   CloudOperationPollerNoResourcesWaitFor)	operationmessage
op_serviceop_resourcepollers        r!   WaitForOperationr?    s^     $$&DD*""44nnA 5 C+ 11*=&..g.r#   c                   4    \ rS rSrSr\S 5       rS rS rSr	g)GcrDockerVersioni  zfClass for sending a gcr.io docker url to container analysis.

Attributes:
  project:
  docker_string:
c                     U R                   $ r   r   r   s    r!   r   GcrDockerVersion.project  r   r#   c                     Xl         X l        g r   )r   _docker_string)r   r   docker_strings      r!   r   GcrDockerVersion.__init__  s    M'r#   c                     U R                   $ r   )rE  r   s    r!   rq    GcrDockerVersion.GetDockerString  s    r#   )rE  r   N)
r   r   r   r   r   r   r   r   rq   r   r   r#   r!   rA  rA    s%      (r#   rA  c                 2   SSSSS.n[         R                  " [        U 5      nU(       ad  SR                  XR	                  S5         UR	                  S5      UR	                  S5      UR	                  S5      5      UR	                  S5      S	4$ [         R                  " [
        U 5      nU(       ad  SR                  XR	                  S5         UR	                  S5      UR	                  S5      UR	                  S5      5      UR	                  S5      S	4$ U S
S4$ )zEConverts GCR image string to AR format. Leaves non-GCR strings as-is.useuropeasia)z	us.gcr.iogcr.ioz	eu.gcr.iozasia.gcr.ioz{}-docker.pkg.dev/{}/{}/{}r   r   r   TNF)r(   r+   GCR_DOCKER_REPO_REGEXr   r,   #GCR_DOCKER_DOMAIN_SCOPED_REPO_REGEX)image_stringlocation_mapr0   s      r!   ConvertGCRImageStringrS    s
    	, HH*L9'$++v./MM)$MM&!MM'"		
 	i 	 	 HH8,G'$++v./MM)$MM&!MM'"		
 	i 	 	 
tU	""r#   c           
      (   [        U R                  5      u  pnU(       ao  [        R                  " 5       n[        R                  " U5      nUR
                  UR                  R                  R                  :w  a  [        R                  " S5      e[        U5      u  pgSnUn	SUR                  R                  ;   Ga1  U(       d  [        R                  " 5       n[        R                  " UR                  R                  5      nUR
                  UR                  R                  R                  :w  a  [        R                   " S5        SnO[        R"                  " S5        [%        UR                  R                  UR'                  5       R)                  UR                  R'                  5       SR+                  UR                  R                  UR                  R                  5      5      5      n	0 n
UR,                  UR'                  5       SR+                  UR.                  R                  R0                  [2        R4                  R6                  R8                  R;                  5       5      UR.                  R                  R                  S	.U
S
'   U(       a  [<        R>                  " U	5      nURA                  5       U
S
   S'   URC                  5       nU(       a  XS
   S'   [<        RD                  " X5      nU
RG                  URI                  5       5        U
$ )zRetrieves information about a docker image based on the fully-qualified name.

Args:
  args: user input arguments.

Returns:
  A dictionary of information about the given docker image.
zyThis command only supports Artifact Registry. You can enable redirection to use gcr.io repositories in Artifact Registry.TrN  zSgcr.io domain repos in Artifact Registry are not scanned unless they are redirectedFzLNote: The container scanning API uses the gcr.io url for gcr.io domain reposz{}/{}z{}-docker.{})rC   fully_qualified_digestregistryr   image_summaryslsa_build_levelsbom_locations)%rS  IMAGErj   rl   GetProjectSettingslegacyRedirectionStateProjectSettings%LegacyRedirectionStateValueValuesEnumREDIRECTION_FROM_GCR_IO_ENABLEDr   r   DockerUrlToVersionr?   r   r   r   warninginforA  rq   r   r   rC   r   r   r   r   r   r   r   ca_utilGetImageSummaryMetadataSLSABuildLevelSbomLocationsGetContainerAnalysisMetadataupdateArtifactsDescribeView)r'  ar_image_namegcr_projectin_gcr_formatrz   settingsr   r   scanning_allowedscanning_docker_versionresultsummary_metadatarY  r   s                 r!   DescribeDockerImagerr    s    /DDJJ.O+-m&&(H--k:H''##IIii	j 00J  -];% +""'''((*h//0A0A0I0IJh

)
)%%KKkkl 	"	
 !#	

 /!!&&(00--/NN!!&&!!))	
	 &%% . > > @ ''



*
*
3
3



%
%
,
,
0
0
2 #((4499& 667NO 	'') ?
 &335N2@_./33H MM(0023	-r#   c           	         [        U R                  [        5      u  p[        UR                  R                  5       5        [        R                  " 5       n[        R                  " 5       nU(       dN  [        R                  " SUR                  5       -   S-   SS9  [        R                  " X4UR                  5       5      $ / nUn[        U[        5      (       aJ  [!        UR"                  [        R$                  " X4UR'                  5       5      5      nUR)                  U5        [+        X4U5      nU R,                  (       dK  Xu:w  aF  [.        R0                  " SR3                  U R                  SR5                  S U 5       5      5      5      e[7        Xg5        [        R                  " SSS9  U H(  n[        R8                  " X4UR'                  5       5        M*     [        R:                  " X4UR=                  5       5      $ )	a  Deletes a Docker digest or image.

If input is an image, delete the image along with its resources.

If input is an image identified by digest, delete the digest.
If input is an image identified by tag, delete the digest and the tag.
If --delete-tags is specified, delete all tags associated with the image
digest.

Args:
  args: user input arguments.

Returns:
  The long-running operation from DeletePackage API call.
z4
This operation will delete all tags and images for .Tr;  cancel_on_nozDCannot delete image {} because it is tagged. Existing tags are:
- {}z
- c              3   @   #    U  H  oR                  5       v   M     g 7fr   )rq   ).0rD   s     r!   	<genexpr>$DeleteDockerImage.<locals>.<genexpr>  s     I=C--//=s   z0
This operation will delete the above resources.)rT   rZ  _INVALID_IMAGE_ERRORr   r?   rn   rj   rk   rl   r   PromptContinuerq   DeletePackager   r   rJ   rH   r   r   r   r   r   delete_tagsr   rp   r   r<   r   	DeleteTagDeleteVersionr   )	r'  r   r   ry   rz   provided_tagsr   existing_tagsrD   s	            r!   DeleteDockerImager  l  s     ,DJJ8LM%e''99;<  "&$$&(	G "%& $$Vu7K7K7MNN M#N.),,$




'
'(6(A(A(CEFn >*)&NKM >//%%+VjjkkI=II&KL L .8C Fcnn.>? $$V%3%B%B%DF Fr#   c                     [        U [        5      u  p[        UR                  R	                  5       5        [
        R                  " UR                  5       5      $ )zGets a Docker image.

Args:
  image_url (str): path to a Docker image.

Returns:
  package: Docker image package

Throws:
  HttpNotFoundError: if repo or image path are invalid
)rT   r{  r   r?   rn   rj   
GetPackager   )	image_urlr   _s      r!   GetDockerImager    sD     y*>?(%e''99;<			 4 4 6	77r#   c           	      Z   [        U R                  [        5      u  pUc  [        R                  " [        5      e[        U R                  5      u  p4UR                  5       UR                  5       :w  aB  [        R                  " SR                  UR                  5       UR                  5       5      5      e[        UR                  R                  5       5        [        R                  " 5       n[        R                  " 5       nUn[!        U["        5      (       a9  [%        UR&                  [        R(                  " XVUR+                  5       5      5      n [        R,                  " XVUR+                  5       5        [        R.                  " XVUR+                  5       5        [        R0                  " XVXG5        [6        R8                  R;                  SR                  UR                  5       U R                  5      5        g! [2        R4                   a    [        R0                  " XVXG5         Nuf = f)zAdds a Docker tag.Nz Image {}
does not match image {}zAdded tag [{}] to image [{}].)rT   DOCKER_IMAGErF   r   r   rb   
DOCKER_TAGr   r   rq   r   r?   rn   rj   rk   rl   r   rJ   rH   r   r   r   GetTagr  CreateDockerTagr   r   r   r   r   )r'  	src_imager   
dest_imagerD   ry   rz   r   s           r!   AddDockerTagr    s   /0A0A0KM)

.
./J
KK#DOO4/*:#<#<#>>

.
.+22%%')C)C)E	GH H i++==?@  "&$$&(!.	**"%%f&4&?&?&A	CDN
Gv)9: &CNN,<=#F**299	T..0 1 
	)	) G#FGs   %G< <+H*)H*c                    [        U R                  5      u  p[        UR                  R	                  5       5        [
        R                  " SR                  UR                  5       5      SS9  [        R                  " [        R                  " 5       [        R                  " 5       UR                  5       5        [        R                  R!                  SR                  UR                  5       5      5        g)zDeletes a Docker tag.z You are about to delete tag [{}]Tru  zDeleted tag [{}].N)rb   r  r   r?   rn   r   r|  r   rq   rj   r  rk   rl   r   r   r   r   )r'  rB   rD   s      r!   DeleteDockerTagr    s    T__-(#coo779:0778K8K8MN --/1H1H1J(***&--c.A.A.CDEr#   c           	         [        U R                  5      n[        R                  " 5       n[        R                  " 5       n/ n[        U[        5      (       a  [        UR                  5       5        [        R                  R                  SR                  UR                  UR                  UR                  5      5        [        R                   " X#UR                  5       5       H9  nUR#                  [%        XR&                  R)                  S5      S   5      5        M;     O[        U[$        5      (       a  [        UR*                  R                  5       5        [        R                  R                  SR                  UR*                  R                  UR*                  R                  UR*                  R                  5      5        UR#                  U5        / nU Hq  n[        R,                  " X#UR/                  5       U R0                  5       H:  nUR#                  UR&                  UR3                  5       UR4                  S.5        M<     Ms     U$ )zLists Docker tags.r!  r4   r   )rD   r   rW   )r@   
IMAGE_PATHrj   rk   rl   r   r    r   rn   r   r   r   r   r   r   r   rm   r   r;   ro   r8   r?   ListTagsr   rd   rq   rW   )	r'  r&  ry   rz   r{   r|   tag_listrB   rD   s	            r!   ListDockerTagsr    s   !$//2(  "&$$&((*%%2245JJGNNh//	@A ''(0(B(B(DFook(HHNN3,?,CDEF (K((,,>>@AJJGNN  (((*>*>*G*G  %%	'( OOH(c##Fc6H6H6J$(NN4oo&&([[ 	4  
/r#   c                     [        U [        SS9u  p[        UR                  R	                  5       5        [        U5      nX4$ )zValidates a Docker image URL and get Docker version information.

Args:
  url: Url of a docker image.

Returns:
  A DockerImage, and a DockerVersion.

Raises:
  ar_exceptions.InvalidInputValueError: If user input is invalid.

FrO   rT   r{  r   r?   rn   r[   urlr   r   r   s       r!   r`  r`  
  sE     ,	% e''99;</?.		r#   c                     [        U [        SS9u  p[        UR                  R	                  5       5        Uc  US4$ [        U5      nX4$ )a  Converts docker url to image.

If a version or tag is present, validate it, transform tags to versions, and
return it.  Otherwise, none will be returned in place of version.  This
function is similar to DockerUrlToVersion with some differences like strict
parsing and only validating if version or tag is none.

Args:
  url: Url of a docker image, which could have version or tag.

Returns:
  A DockerImage, and a DockerVersion.  DockerVersion can be None.

Raises:
  ar_exceptions.InvalidInputValueError: If user input is invalid.
Tr  Nr  r  s       r!   DockerUrlToImager    sU    " ,	% e''99;<$;/?.		r#   c                 <    [         R                  " [        U 5      S L$ r   )r(   r+   r*   r1  s    r!   IsARDockerImager  :  s    	#S	)	55r#   c                     [         R                  " [        U 5      S L=(       d    [         R                  " [        U 5      S L$ r   )r(   r+   rO  rP  r  s    r!   
IsGCRImager  >  s5    hh$c*$6 H	5s	;4	Gr#   c                     [         R                  R                  R                  R	                  5       nU R                  U5      (       a  U [        U5      S  $ U $ r   )r   r   r   r'   r   rr   r:   )r   endpoint_prefixs     r!   r   r   E  sV    %%//HHLLN/ 
		_	-	- s?#%& r#   )T)r0  )NNNF)Sr   
__future__r   r   r   r(   apitools.base.pyr   r    googlecloudsdk.api_lib.artifactsr   googlecloudsdk.api_lib.utilr   r   $googlecloudsdk.command_lib.artifactsr	   rc  r
   rj   r   googlecloudsdk.corer   r   r   googlecloudsdk.core.consoler   ARTIFACTREGISTRY_API_NAMEr9   r   r{  rZ   rF   ra   r   rO  rP  r   r   r   r   r   r*   rI   rG   rK   r   rX   DOCKER_URI_REGEXr"   r2   r@   rT   r_   rb   r~   rt   r   r   r   r[   objectr    r;   rJ   rH   r(  boolmapr%  r?  rA  rS  rr  r  r  r  r  r  r`  r  r  r  r   r   r#   r!   <module>r     sg   E &  ' 	 9 H 3 . R H 5 # * ) 2 /   %      f  'B #hoo&&**, 
 MVJ''..2245 
 pvv&&**, 
 AGG##**..0  I  tO -A6H$"6J-I`J> 248 "& $!&+:z5DH>2 2j-& -`#B #BL(EF (EV1h!4 !C !H/$ (!#HQh5Fp8""1J
F F*66r#   