o
    -wi!                     @   s~  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mZmZm	Z	m
Z
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dee d	e	e fd
dZdad	efddZd	efddZ	dAdee dedede	e d	ef
ddZ de	e d	efddZ!dee d	efddZ"					dBdee dedede	e# d ed!e	eeef  d	eee
eef f fd"d#Z$d$e	e# d	efd%d&Z%dCd'ed	efd(d)Z&d*ed	e
ee	e f fd+d,Z'd-ed	e
eeef fd.d/Z(d-ed	e	e fd0d1Z)d-ed	e	e fd2d3Z*d-ed	e+fd4d5Z,d6ed7ed	e	e fd8d9Z-d:ed;ed<ed	e	e fd=d>Z.d-ed7ed	e	e fd?d7Z/g d@Z0dS )D    N)AnyDictListOptionalTupleUnion)names)Errorc                       sH   e Zd ZdZ		d
dee dedee dee ddf
 fdd	Z	  Z
S )DockerErrorz3Raised when attempting to execute a docker command.Ncommand_launchedreturn_codestdoutstderrreturnc                    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__ R/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/wandb/docker/__init__.pyr      s    
zDockerError.__init__)NN)__name__
__module____qualname____doc__r   strintr   bytesr   __classcell__r   r   r   r   r
      s    r
   zwandb-entrypoint.shcmdr   c              
   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   shell2   s   r/   c                  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_installedE   s   
r5   c                  C   s>   zt jddgdd} | jdkrW dS W dS  ty   Y dS w )z?Return `True` if docker is installed and working, else `False`.r&   z	--versionT)capture_outputr   F)r(   run
returncodeFileNotFoundError)resultr   r   r   is_docker_installedR   s   
r;   tagsfile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 )Nr0   buildz--loadz
--platformz-tr&   z-f)r5   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   | d u s
| rd| vrdS dS )N,TFr   )r?   r   r   r   rA   u   s   rA   rG   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inputreturn_stderrenvc           
      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>rI   r0   enabledDOCKER_CLI_EXPERIMENTAL)r^   r   r   r`   r   )dictrS   environupdater(   rR   r7   r8   r
   r   r   _post_process_stream)
rG   r\   r]   r^   r_   r`   subprocess_envstdout_deststderr_destcompleted_processr   r   r   r7      s,   



r7   streamc                 C   s<   | d u rdS |   }t|dkr|d dkr|d d }|S )NrL   r   rN   r   )r   len)rn   decoded_streamr   r   r   ri      s   ri   gpuc                 C   s   d}| s|d7 }d| S )Nallz-cpuzwandb/deepo:r   )rq   rF   r   r   r   default_image   s   
rs   	repo_namec                 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@rI      r   :/)rsplitro   )rt   partsr   r   r   parse_repository_tag   s   r{   
image_namec                 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   registryrt   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:...".
    r0   
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   c                 C   s    t d| ddg}|rt|S dS )z3Retrieve the image default uid through brute force.r7   idz-urN   )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.pushrw   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@   r7   r   r   r;   r   r{   rs   r   r   r   rF   )N)TTNFN)F)1r   loggingrS   r2   r(   typingr   r   r   r   r   r   wandb.dockerr   wandb.errorsr	   r
   pathr   dirnameabspath__file__
entrypoint	getLoggerr   logr!   r/   r1   boolr5   r;   r@   rA   rB   r#   r7   ri   rs   r{   r   r   r   r"   r   r   r   rF   __all__r   r   r   r   <module>   s|      


$	
