o
    xiQ!                     @  s\  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mZ d dl	m
Z
 d dlmZ G dd deZejejejedZeeZdMddZdadNddZdNddZ	dOdPddZdQddZdRdd Z	!	!		"	dSdTd+d,ZdUd.d/ZdVdWd1d2Z dXd5d6Z!dYd9d:Z"dZd;d<Z#dZd=d>Z$d[d@dAZ%d\dDdEZ&d]dIdJZ'd^dKdCZ(g dLZ)dS )_    )annotationsN)Any)names)Errorc                      s(   e Zd ZdZ		dd fddZ  ZS )DockerErrorz3Raised when attempting to execute a docker command.Ncommand_launched	list[str]return_codeintstdoutbytes | NonestderrreturnNonec                   sx   d |}d| d| d}|d ur|d|  d7 }n|d7 }|d ur0|d|  d7 }n|d	7 }t | d S )
N z!The docker command executed was `z`.
It returned with code 
zThe content of stdout is 'z'
zNThe content of stdout can be found above the stacktrace (it wasn't captured).
zThe content of stderr is 'zMThe content of stderr can be found above the stacktrace (it wasn't captured).)joindecodesuper__init__)selfr   r	   r   r   command_launched_str	error_msg	__class__ I/home/ubuntu/.local/lib/python3.10/site-packages/wandb/docker/__init__.pyr      s    
zDockerError.__init__)NN)
r   r   r	   r
   r   r   r   r   r   r   )__name__
__module____qualname____doc__r   __classcell__r   r   r   r   r      s
    r   zwandb-entrypoint.shcmdr   r   
str | Nonec              
   C  sT   zt jdg|  t jdd W S  t jy) } zt| W Y d}~dS d}~ww )z_Simple wrapper for calling docker,.

    returning None on error and the output on success
    docker)r   utf8N)
subprocesscheck_outputSTDOUTr   stripCalledProcessErrorprint)r"   er   r   r   shell4   s   r-   boolc                  C  s>   t durt S tdsda t S tddg} | duod| v a t S )z8Return `True` if docker buildx is installed and working.Nr$   Fbuildxz--help)_buildx_installedshutilwhichr-   )help_outputr   r   r   is_buildx_installedG   s   
r4   c                  C  s6   zt jddgdd} W n
 ty   Y dS w | jdkS )z?Return `True` if docker is installed and working, else `False`.r$   z	--versionT)capture_outputFr   )r&   runFileNotFoundError
returncode)resultr   r   r   is_docker_installedT   s   

r:   tagsfilestrcontext_pathplatformc           
      C  s   t  }|r	ddgndg}|t|r|rdgng 7 }|r!|d|g7 }g }| D ]}|d|g7 }q%dg| | d||g }t|}	|	S )Nr/   buildz--loadz
--platformz-tr$   z-f)r4   should_add_load_argumentrun_command_live_output)
r;   r<   r>   r?   
use_buildxcommand
build_tagstagargsr   r   r   r   r@   c   s   r@   c                 C  s   t | d u p
| o
d| vS )N,)r.   )r?   r   r   r   rA   u   s   rA   rG   	list[Any]c                 C  s   t j| t jt jddd<}d}	 t|j d}|sn!|d}|dkr.t	|
 dd n||
 7 }t	|
 d	d qt	| W d    n1 sKw   Y  | }|d
kr`t| || |S )NT   )r   r   universal_newlinesbufsize i      )endr   )r&   PopenPIPEr(   osreadr   filenofindr+   r   waitr   encode)rG   processr   chunkindexr	   r   r   r   rB   {   s2   

rB   TFcapture_stdoutcapture_stderrinputr   return_stderrenvdict[str, str] | Nonestr | tuple[str, str]c           
      C  s   dd | D } t tj}||pi  | d dkrd|d< |r"tjnd }|r)tjnd }tj| ||||d}	|	jdkrDt| |	j|	j	|	j
|rPt|	j	t|	j
fS t|	j	S )	Nc                 S  s   g | ]}t |qS r   )r=   ).0xr   r   r   
<listcomp>   s    zrun.<locals>.<listcomp>rJ   r/   enabledDOCKER_CLI_EXPERIMENTAL)r_   r   r   ra   r   )dictrT   environupdater&   rS   r6   r8   r   r   r   _post_process_stream)
rG   r]   r^   r_   r`   ra   subprocess_envstdout_deststderr_destcompleted_processr   r   r   r6      s,   



r6   streamc                 C  s<   | d u rdS |   }t|dkr|d dkr|d d }|S )NrM   r   rO   r   )r   len)rq   decoded_streamr   r   r   rl      s   rl   gpuc                 C  s   d}| s|d7 }d| S )Nallz-cpuzwandb/deepo:r   )rt   rF   r   r   r   default_image   s   
rv   	repo_nametuple[str, str | None]c                 C  sd   |  dd}t|dkr|d |d fS |  dd}t|dkr.d|d vr.|d |d fS | d fS )N@rJ      r   :/)rsplitrr   )rw   partsr   r   r   parse_repository_tag   s   r   
image_nametuple[str, str, str]c                 C  s4   t | \}}t|\}}|dkrd}|||pdfS )Nz	docker.iozindex.docker.iolatest)r   r   resolve_repository_name)r   
repositoryrF   registryrw   r   r   r   parse   s
   r   c                 C  s$   ddd| g}ddg}t g ||S )zQuery the image manifest to get its full ID including the digest.

    Args:
        image_name: The image name, such as "wandb/local".

    Returns:
        The image name followed by its digest, like "wandb/local@sha256:...".
    r/   
imagetoolsinspect--formatz{{.Name}}@{{.Manifest.Digest}}r-   )r   inspect_cmdformat_argsr   r   r   image_id_from_registry   s   
r   c              	   C  s\   d| v r| S t d| ddg}|du rt| S zt|d W S  ttfy-   t|  Y S w )zFRetrieve the image id from the local docker daemon or remote registry.z@sha256:r   r   z{{json .RepoDigests}}Nr   )r-   r   jsonloads
ValueError
IndexError)r   digestsr   r   r   image_id   s   r   r
   c                 C  s    t d| ddg}|rt|S dS )z3Retrieve the image default uid through brute force.r6   idz-urO   )r-   r
   )r   	image_uidr   r   r   get_image_uid   s   r   imagerF   c                 C  s   t d|  d| gS )z#Push an image to a remote registry.pushr{   r   )r   rF   r   r   r   r     s   r   usernamepasswordr   c                 C  s   t dd| d||gS )zLogin to a registry.loginz
--usernamez
--passwordr   )r   r   r   r   r   r   r     s   r   c                 C  s   t d| |gS )zTag an image.rF   r   )r   rF   r   r   r   rF     s   )r-   r@   r6   r   r   r:   r   r   rv   r   r   r   rF   )r"   r   r   r#   )r   r.   )N)
r;   r   r<   r=   r>   r=   r?   r#   r   r=   )r?   r#   r   r.   )rG   rI   r   r=   )TTNFN)rG   rI   r]   r.   r^   r.   r_   r   r`   r.   ra   rb   r   rc   )rq   r   r   r=   )F)rt   r.   r   r=   )rw   r=   r   rx   )r   r=   r   r   )r   r=   r   r#   )r   r=   r   r
   )r   r=   rF   r=   r   r#   )r   r=   r   r=   r   r=   r   r#   )r   r=   rF   r=   r   r#   )*
__future__r   r   loggingrT   r1   r&   typingr   wandb.dockerr   wandb.errorsr   r   pathr   dirnameabspath__file__
entrypoint	getLoggerr   logr-   r0   r4   r:   r@   rA   rB   r6   rl   rv   r   r   r   r   r   r   r   rF   __all__r   r   r   r   <module>   sN     






$	








