o
    -wiv(                     @   s  d dl Z d dl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m	Z	m
Z
mZ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mZmZmZmZmZmZmZmZm Z  d	d
l!m"Z"m#Z#m$Z$ erpd dl%m&Z& e'e(Z)G dd de"Z*G dd de#Z+de,dee, de"fddZ-de*dee, de,de
e,e,f ddf
ddZ.			d$de,de
e,e,f deee,  dee
e,e	f  deee,  dee, fdd Z/d!ee, de,fd"d#Z0dS )%    N)TYPE_CHECKINGAnyDictListOptional)AbstractEnvironment)AbstractRegistry   )LaunchProject)LaunchError)
CODE_MOUNT_DIR
LOG_PREFIXMAX_ENV_LENGTHSPROJECT_SYNCHRONOUS_is_wandb_dev_uri_is_wandb_local_uridocker_image_existsevent_loop_thread_execpull_docker_imagesanitize_wandb_api_key   )AbstractRunAbstractRunnerStatus)Apic                       s   e Zd ZdZd fddZdejddfddZd	ej	ddfd
dZ
edee fddZdefddZdee fddZdddZdefddZ  ZS )LocalSubmittedRunziInstance of ``AbstractRun`` corresponding to a subprocess launched to run an entry point command locally.returnNc                    s&   t    d | _d | _d| _d | _d S )NF)super__init___command_proc_stdout_terminate_flag_threadself	__class__ d/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/wandb/sdk/launch/runner/local_container.pyr   '   s
   

zLocalSubmittedRun.__init__command_procc                 C   
   || _ d S N)r   )r$   r)   r'   r'   r(   set_command_proc.      
z"LocalSubmittedRun.set_command_procthreadc                 C   r*   r+   )r"   )r$   r.   r'   r'   r(   
set_thread1   r-   zLocalSubmittedRun.set_threadc                 C   s   | j d u rd S t| j jS r+   )r   strpidr#   r'   r'   r(   id4   s   
zLocalSubmittedRun.idc                    sn   | j d usJ | jd u r'| j  r%tdI d H  | jd ur n| j  sdS t| jj}t| I d H dkS )N   Fr   )r"   r   is_aliveasynciosleepr   waitint)r$   r7   r'   r'   r(   r7   :   s   



zLocalSubmittedRun.waitc                    s   | j S r+   )r    r#   r'   r'   r(   get_logsI   s   zLocalSubmittedRun.get_logsc                    s   | j d usJ d| _d S )NT)r"   r!   r#   r'   r'   r(   cancelL   s   
zLocalSubmittedRun.cancelc                    sj   | j d us
J d| jd u r| j  rtdS tdS | j }|d u r)tdS |dkr1tdS tdS )Nz)Failed to get status, self._thread = Nonerunningstoppedr   finishedfailed)r"   r   r4   r   poll)r$   	exit_coder'   r'   r(   
get_statusT   s   


zLocalSubmittedRun.get_status)r   N)__name__
__module____qualname____doc__r   
subprocessPopenr,   	threadingThreadr/   propertyr   r0   r2   boolr7   r9   r:   r   rA   __classcell__r'   r'   r%   r(   r   $   s    
r   c                
       sv   e Zd ZdZdddeeef dededdf
 fd	d
Z	de
dedeeef fddZde
dedee fddZ  ZS )LocalContainerRunnerz=Runner class, uses a project to create a LocallySubmittedRun.apir   backend_configenvironmentregistryr   Nc                    s   t  || || _|| _d S r+   )r   r   rP   rQ   )r$   rN   rO   rP   rQ   r%   r'   r(   r   e   s   
zLocalContainerRunner.__init__launch_project	image_uric                 C   s   | |di }t| jdr-tjdkrd|d< nd|d< tjdks)tjdkr-d	|d
< |j}|d urMd|vr<g |d< |d |j	 dt
  t
|d< |S )Nzlocal-containerbase_urlwin32hostnetnetworklinuxlinux2z!host.docker.internal:host-gatewayzadd-hostvolume:workdir)fill_macrosgetr   _apisettingssysplatformjob_base_imageappendproject_dirr   )r$   rR   rS   docker_args
base_imager'   r'   r(   _populate_docker_argsp   s$   


z*LocalContainerRunner._populate_docker_argsc              
      sl  |  ||}| jt }|| jt| jj }t| j	dr8t
jdkr8| j	dd\}}}d| |d< nt| j	drDd|d< |jsJ|jryzt| W n( tyx } ztd|  t|sntd| d	| W Y d }~nd }~ww | }	|	d u rd n|	j}
d
t||||
|jd }t|}t d| }t| t||j }|r|! I d H  |S )NrT   darwinr\   zhttp://host.docker.internal:WANDB_BASE_URLz http://host.docker.internal:9001z&Error attempting to pull docker image zFailed to pull docker image z with error:  )rg   	entry_cmdadditional_argsz&Launching run in docker with command: )"ri   rO   r   get_env_vars_dictr`   r   r&   rB   r   ra   rb   rc   splitr   docker_imagerd   r   	Exceptionwandbtermwarnr   r   get_job_entry_pointcommandjoinget_docker_commandoverride_argsstripr   r   termlog_run_entry_pointrf   r7   )r$   rR   rS   rg   synchronousenv_vars_porte
entrypointrm   command_strsanitized_cmd_str_msgrunr'   r'   r(   r      sZ   

	
zLocalContainerRunner.run)rB   rC   rD   rE   r   r0   r   r   r   r   r
   ri   r   r   r   rL   r'   r'   r%   r(   rM   b   s6    


rM   rv   work_dirr   c                 C   sR   |du rt  }t j }t }tjt|dd| g||fd}|| |	  |S )zRun an entry point command in a subprocess.

    Arguments:
        command: Entry point command to run
        work_dir: Working directory in which to run the command

    Returns:
        An instance of `LocalSubmittedRun`
    Nbashz-c)targetargs)
osgetcwdenvironcopyr   rH   rI   _thread_process_runnerr/   start)rv   r   envr   r.   r'   r'   r(   r|      s   


r|   r   r   r   c              
   C   s   | j rd S tj|dtjtjdd||d}| | d| _	 | j r$|  t	|j
 d}|s1d S |d}d }|sWz| }W n tyT   |t	|j
 d7 }Y nw |r:|dkrk|  j|7  _t| dd n|  j|d	 7  _t| d	d q)
NTr   )	close_fdsstdoutstderruniversal_newlinesbufsizecwdr    i      )end)r!   rF   rG   PIPESTDOUTr,   r    	terminater   readr   filenofinddecodeUnicodeDecodeErrorprint)r   r   r   r   processchunkindexdecoded_chunkr'   r'   r(   r      sF   


r   imager~   rm   rg   rn   c                 C   s2  d}|ddg}|  D ]\}}|dt| dt| g7 }q|ro|  D ]G\}	}
t|	dkr9dt|	 }ndt|	 }t|
trV|
D ]}||tt|g7 }qGq't|
trc|
rc||g7 }q'||tt|
g7 }q'|ry|d	|d
 g7 }|t| g7 }|rt|dkr||dd 7 }|r||7 }|S )a0  Construct the docker command using the image and docker args.

    Arguments:
    image: a Docker image to be run
    env_vars: a dictionary of environment variables for the command
    entry_cmd: the entry point command to run
    docker_args: a dictionary of additional docker args for the command
    dockerr   z--rmz-e=r   -z--z--entrypointr   N)itemsshlexquotelen
isinstancelistr0   rK   )r   r~   rm   rg   rn   docker_pathcmdenv_key	env_valuenamevalueprefixvr'   r'   r(   rx      s0   
$
rx   split_commandc                 C   s   d dd | D S )z3Return a shell-escaped string from *split_command*.rl   c                 s   s    | ]}t |V  qd S r+   )r   r   ).0argr'   r'   r(   	<genexpr>-  s    zjoin.<locals>.<genexpr>)rw   )r   r'   r'   r(   rw   +  s   rw   )NNN)1r5   loggingr   r   rF   rb   rH   typingr   r   r   r   r   rs   %wandb.sdk.launch.environment.abstractr   "wandb.sdk.launch.registry.abstractr   _project_specr
   errorsr   utilsr   r   r   r   r   r   r   r   r   r   abstractr   r   r   wandb.apis.internalr   	getLoggerrB   _loggerr   rM   r0   r|   r   rx   rw   r'   r'   r'   r(   <module>   sb    0
>Z

-



.