o
    xi*                     @  sP  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Zd dlZd dl	Z	d dl
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rtd dl%m&Z& e'e(Z)G dd de"Z*G dd de#Z+d/ddZ,d0ddZ-d1d!d"Z.			d2d3d*d+Z/d4d-d.Z0dS )5    )annotationsN)TYPE_CHECKINGAny)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                      sl   e Zd ZdZd fddZddd	ZdddZedddZdddZ	dddZ
dddZd ddZ  ZS )!LocalSubmittedRunziInstance of ``AbstractRun`` corresponding to a subprocess launched to run an entry point command locally.returnNonec                   s&   t    d | _d | _d| _d | _d S )NF)super__init___command_proc_stdout_terminate_flag_threadself	__class__ [/home/ubuntu/.local/lib/python3.10/site-packages/wandb/sdk/launch/runner/local_container.pyr   *   s
   

zLocalSubmittedRun.__init__command_procsubprocess.Popenc                 C  
   || _ d S N)r   )r#   r(   r&   r&   r'   set_command_proc1      
z"LocalSubmittedRun.set_command_procthreadthreading.Threadc                 C  r*   r+   )r!   )r#   r.   r&   r&   r'   
set_thread4   r-   zLocalSubmittedRun.set_thread
str | Nonec                 C  s   | j d u rd S t| j jS r+   )r   strpidr"   r&   r&   r'   id7   s   
zLocalSubmittedRun.idboolc                   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#   r:   r&   r&   r'   r:   =   s   



zLocalSubmittedRun.waitc                   s   | j S r+   )r   r"   r&   r&   r'   get_logsL   s   zLocalSubmittedRun.get_logsc                   s   | j d usJ d| _d S )NT)r!   r    r"   r&   r&   r'   cancelO   s   
zLocalSubmittedRun.cancelr   c                   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   r7   r   poll)r#   	exit_coder&   r&   r'   
get_statusW   s   


zLocalSubmittedRun.get_status)r   r   )r(   r)   r   r   )r.   r/   r   r   )r   r1   )r   r5   )r   r   )__name__
__module____qualname____doc__r   r,   r0   propertyr4   r:   r<   r=   rD   __classcell__r&   r&   r$   r'   r   '   s    




r   c                      s6   e Zd ZdZd fddZdddZdddZ  ZS )LocalContainerRunnerz=Runner class, uses a project to create a LocallySubmittedRun.apir   backend_configdict[str, Any]environmentr   registryr   r   r   c                   s   t  || || _|| _d S r+   )r   r   rO   rP   )r#   rL   rM   rO   rP   r$   r&   r'   r   h   s   
zLocalContainerRunner.__init__launch_projectr   	image_urir2   c                 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#   rQ   rR   docker_args
base_imager&   r&   r'   _populate_docker_argss   s$   


z*LocalContainerRunner._populate_docker_argsAbstractRun | Nonec              
     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 )NrS   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:  )rf   	entry_cmdadditional_argsz&Launching run in docker with command: )"rh   rM   r   get_env_vars_dictr_   r   r%   rE   r   r`   ra   rb   splitr   docker_imagerc   r   	Exceptionwandbtermwarnr   r	   get_job_entry_pointcommandjoinget_docker_commandoverride_argsstripr   r   termlog_run_entry_pointre   r:   )r#   rQ   rR   rf   synchronousenv_vars_porte
entrypointrm   command_strsanitized_cmd_str_msgrunr&   r&   r'   r      sZ   

	
zLocalContainerRunner.run)
rL   r   rM   rN   rO   r   rP   r   r   r   )rQ   r   rR   r2   r   rN   )rQ   r   rR   r2   r   ri   )rE   rF   rG   rH   r   rh   r   rJ   r&   r&   r$   r'   rK   e   s
    
rK   rv   r2   work_dirr1   r   r   c                 C  sP   |du rt  }t j }t }tjt|t| ||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)targetargs)osgetcwdenvironcopyr   	threadingThread_thread_process_runner_shell_commandr0   start)rv   r   envr   r.   r&   r&   r'   r|      s   


r|   	list[str]c                 C  sB   t jdkr
dd| gS tdptd}|du rtd|d| gS )	z?Return a cross-platform shell invocation for command execution.ntcmdz/CbashshNzJCould not launch command: no compatible shell found (expected bash or sh).z-c)r   nameshutilwhichr	   )rv   shellr&   r&   r'   r      s   


r   r   r   r   dict[str, str]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    
subprocessPopen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   list[str] | Nonerf   dict[str, Any] | Nonern   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listr2   r5   )r   r~   rm   rf   rn   docker_pathr   env_key	env_valuer   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   )rv   r2   r   r1   r   r   )rv   r2   r   r   )
r   r   r   r   r   r2   r   r   r   r   )NNN)r   r2   r~   r   rm   r   rf   r   rn   r   r   r   )r   r   r   r2   )1
__future__r   r8   loggingr   r   r   r   ra   r   typingr   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   	getLoggerrE   _loggerr   rK   r|   r   r   rx   rw   r&   r&   r&   r'   <module>   s<    0
>
Z

-.