o
    nia]                  	   @   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Zd dlZd dl	Z	d dl
Z
d dlmZmZmZ d dlZd dlmZ d dlmZm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 d d
lm Z  d dl!m"Z" ddl#m$Z$m%Z% ddl&m'Z' ddl(m)Z)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/ e"ddd d dl0Z1d dl0m2Z2 e3e4Z5dZ6ej78ddZ9ej78dZ:e:rej78dd;dndZ<ej78dZ=ej>?dre@dZAeAB C ZDW d   n1 sw   Y  nd ZDd!e2jEfd"d#ZF	d,d$e2jGd%eHd&eeI d'eJfd(d)ZKG d*d+ d+eZLdS )-    N)AnyDictOptional)JobAndRunStatusTracker)AbstractBuilderregistry_from_uri)AbstractEnvironment)AzureEnvironment)AbstractRegistry)AzureContainerRegistry)ElasticContainerRegistry)GoogleArtifactRegistry)
get_module   )
EntryPointLaunchProject)LaunchError)
LOG_PREFIXget_kube_context_and_api_client$warn_failed_packages_from_build_logs   )_WANDB_DOCKERFILE_NAME)BuildContextManagerkubernetes_asynciozkKaniko builder requires the kubernetes_asyncio package. Please install it with `pip install wandb[launch]`.)required)clienti  !WANDB_LAUNCH_SERVICE_ACCOUNT_NAMEdefaultWANDB_LAUNCH_KANIKO_PVC_NAME"WANDB_LAUNCH_KANIKO_PVC_MOUNT_PATHz/kaniko/WANDB_LAUNCH_KANIKO_AUTH_SECRETz7/var/run/secrets/kubernetes.io/serviceaccount/namespacewandbjobc                 C   s$   z| j jjjW S  ty   Y d S w N)spectemplatemetadatanameAttributeError)r#    r*   e/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/wandb/sdk/launch/builder/kaniko_builder.pyget_pod_name_safeB   s
   r,   batch_clientjob_namedeadline_secsreturnc                    s   t   }	 | |tI d H }|jjd ur|jjdkrdS |jjd ur:|jjdkr:tt d|jj d|  dS t	t d |d urPt   | |krPdS t
dI d H  q)NTr   z
Build job z failed Fz$Waiting for build job to complete...   )timeread_namespaced_job_status	NAMESPACEstatus	succeededfailedr"   	termerrorr   termlogasynciosleep)r-   r.   r/   
start_timer#   r*   r*   r+   _wait_for_completionI   s   r=   c                   @   sZ  e Zd ZU dZdZeed< eed< ee ed< ee ed< eed< 								
	d2dede	dedededededee
 fddZe		d3de
dede	dededdfddZd4ddZd4ddZdedejdeddfdd Zded!ejddfd"d#Zd$ed%edefd&d'Z	d5d(ed)ed*ee defd+d,Zdeded-ed.ed/ejdeeef fd0d1ZdS )6KanikoBuilderz1Builds a docker image for a project using Kaniko.kanikobuild_job_namebuild_context_storesecret_name
secret_keyimagewandb-launch-container-build &gcr.io/kaniko-project/executor:v1.11.0Nenvironmentregistryconfigc	           	      C   s>   || _ || _|| _|d| _|| _|| _|| _|pi | _dS )a  Initialize a KanikoBuilder.

        Arguments:
            environment (AbstractEnvironment): The environment to use.
            registry (AbstractRegistry): The registry to use.
            build_job_name (str, optional): The name of the build job.
            build_context_store (str, optional): The name of the build context store.
            secret_name (str, optional): The name of the secret to use for the registry.
            secret_key (str, optional): The key of the secret to use for the registry.
            verify (bool, optional): Whether to verify the functionality of the builder.
                Defaults to True.
        r    N)	rH   rI   r@   rstriprA   rB   rC   rD   kaniko_config)	selfrH   rI   r@   rA   rB   rC   rD   rJ   r*   r*   r+   __init__f   s   zKanikoBuilder.__init__Tverifyloginr0   r   c              
   C   s   | ddkrtd| dd}|du rtstd| dd	}| d
d}| dd}	| dd}
| d}|dur@t|}| di }| ||||||	|
|dS )a  Create a KanikoBuilder from a config dict.

        Arguments:
            config: A dict containing the builder config. Must contain a "type" key
                with value "kaniko".
            environment: The environment to use for the build.
            registry: The registry to use for the build.
            verify: Whether to verify the builder config.

        Returns:
            A KanikoBuilder instance.
        typer?   zFBuilder config must include 'type':'kaniko' to create a KanikoBuilder.zbuild-context-storerF   Na.  You must specify a build context store for kaniko builds. You can set builder.build-context-store in your agent config to a valid s3, gcs, or azure blog storage URI. Or, configure a persistent volume claim through the agent helm chart: https://github.com/wandb/helm-charts/tree/main/charts/launch-agentzbuild-job-namerE   zsecret-namez
secret-keyzkaniko-imagerG   destinationzkaniko-config)rA   r@   rB   rC   rD   rJ   )getr   PVC_MOUNT_PATHr   )clsrJ   rH   rI   rO   rP   rA   r@   rB   rC   kaniko_image	image_urirL   r*   r*   r+   from_config   s<   
zKanikoBuilder.from_configc                    s$   | j r| j| j I dH  dS dS )z}Verify that the builder config is valid.

        Raises:
            LaunchError: If the builder config is invalid.
        N)rA   rH   verify_storage_urirM   r*   r*   r+   rO      s   zKanikoBuilder.verifyc                 C   s   dS )zLogin to the registry.Nr*   rZ   r*   r*   r+   rP      s    zKanikoBuilder.loginr.   corev1_client
repositoryc                    s   | j  I d H \}}t| d|  d}tjddtjd| t	ddt
d| j  I d H  d	|iiiid
d}|t	|I d H  d S )N:zutf-8v1	ConfigMapdocker-config-)r(   	namespaceconfig.jsonauthsauthT)api_versionkindr'   data	immutable)rI   get_username_passwordbase64	b64encodeencodedecoder   V1ConfigMapV1ObjectMetar4   jsondumpsget_repo_uricreate_namespaced_config_map)rM   r.   r[   r\   usernamepasswordencodedecr_config_mapr*   r*   r+   _create_docker_ecr_config_map   s(   	z+KanikoBuilder._create_docker_ecr_config_mapr   c                    s(   | j r|d| tI d H  d S d S )Nr`   )rB   delete_namespaced_config_mapr4   )rM   r.   r   r*   r*   r+   _delete_docker_ecr_config_map   s   
z+KanikoBuilder._delete_docker_ecr_config_maprun_idcontext_pathc              
      s   t jdd}tjj|dd}|j|dd W d    n1 s!w   Y  |  td u rM| j d| d}| j	d u r@t
d	| j	|j|I d H  |S t d| d}z	t|j| W n tyu } zt
d
t d| |d }~ww d| dS )NF)deletezw:gz)fileobjmode.)arcnamer    z.tgzz*No environment specified for Kaniko build.z.Error copying build context to PVC mounted at : ztar:///context/)tempfileNamedTemporaryFiletarfileTarFileopenaddcloserT   rA   rH   r   upload_filer(   shutilcopy	Exception)rM   r{   r|   context_filecontext_tgzrR   er*   r*   r+   _upload_build_context   s0   
z#KanikoBuilder._upload_build_contextlaunch_project
entrypointjob_trackerc                    s(  |   I d H  t|d}|d\}}|j}| j I d H }|d | }	| s@tr5t	d|	 d n| j
|	I d H r@|	S td|	 d tt|jI d H \}
}t|}t|}| j d| }| ||I d H }| |||	|||I d H }t	t d	|  z<zt| jtrtstjtjd
| ddtd| jj ddiiid}|d|I d H  | jr|  |||I d H  |!t"|I d H }t#||dt$ I d H s|r|%d d| d}t&|}|r|dt" d| d7 }t'|z<|j(t"d| dI d H }t)|j*dkrt'd| dt)|j* |j*d j+j,}|-|t"I d H }t.||	|j/| W n  t'yU } zt0t d| d |  W Y d }~nd }~ww W n t'yq } zt1t d!| d" |d }~ww W t	t d# z/t| jtrts|2d
| dI d H  | jr| 3||I d H  |4|t"I d H  W |	S  t'y } zt56  t7d$| |d }~ww t	t d# z.t| jtrts|2d
| dI d H  | jr| 3||I d H  |4|t"I d H  W w  t'y } zt56  t7d$| |d }~ww )%N)r   r?   r]   z"Skipping check for existing image z due to custom dockerconfig.zBuilding image z...-zCreated kaniko job r`   )r(   rb   credHelpersz.azurecr.iozacr-env)r'   rg   r"      buildz(Failed to build image in kaniko for job r   z! View logs with `kubectl logs -n  z`.z	job-name=)ra   label_selectorr   zExpected 1 pod for job z, found r   z"Failed to get logs for kaniko job r   z.Exception when creating Kubernetes resources: 
zCleaning up resourcesz.Exception during Kubernetes resource clean up )8rO   r   create_build_contextr{   rI   rr   build_requiredDOCKER_CONFIG_SECRETr"   r9   check_image_exists_loggerinfor   
kubernetesresource_argsr   
BatchV1Api	CoreV1Apir@   r   _create_kaniko_jobr   
isinstancer   rn   ro   rp   rq   registry_namers   rB   rx   create_namespaced_jobr4   r=   _DEFAULT_BUILD_TIMEOUT_SECSset_err_stager,   r   list_namespaced_podlenitemsr'   r(   read_namespaced_pod_logr   apitermwarnr8   ry   rz   delete_namespaced_job	traceback	print_excr   )rM   r   r   r   build_contex_managerr|   	image_tagr{   repo_urirW   _
api_clientbatch_v1core_v1r@   build_context	build_jobdockerfile_config_mapk8s_jobmsgpod_namepods_from_joblogsr   r*   r*   r+   build_image  s  


















zKanikoBuilder.build_imager   build_context_pathcore_clientc              
      sZ  t | j}|di }|di }	|di }
|
di }|di }|di }|di }|dg }|dp>i g}t|dkrItd|d	 }|d
g }|dg }|dg }trs|ddtid |ddd t	| j
t	| jkrtdt| jtr|d| jjd t| jtrz|ddI d H  W n ty } ztd|d }~ww |dddddid tr|dtddd gd!d" |dd#d nj| j
rE| jrE|d$d%d&| id' |d$d#d t| jtrd(}d)}n%t| jtrd*}d}|d+d,d ntt d-t| j d.| j  || j
| j
| j|d gd!d" || j
|d/d0 t| jtrdtsd|d$d%d&| id' |d$d1d |}|d2rr|d2d3}|t|d4|d2d3d5d6d7}|D ]}|d8d\}}|||< qd9d: |  D }||d< d;|d< t| jtrtsd4|d<< |d=d>|d=< |d?t!|d?< |d@t"|d@< |
dAd	|
dA< d;|	d< |dBt#|dB< |d%||d%< dC|dD< dE|dF< ||d< ||d< |d%dG|d%< |dH| j$|dH< ||d
< ||d< |g|d< ||d< ||d< ||
d< |	|d< ||d< |
|d< |S )INr'   labelsr%   r&   volumes
containersr   z<Multiple container configs not supported for kaniko builder.r   volumeMountsenvargsz
kaniko-pvc	claimName)r(   persistentVolumeClaimz/context)r(   	mountPathzmBoth secret_name and secret_key or neither must be specified for kaniko build. You provided only one of them.
AWS_REGION)r(   valuezazure-storage-access-keyr"   zSecret azure-storage-access-key does not exist in namespace wandb. Please create it with the key password set to your azure storage access key.AZURE_STORAGE_ACCESS_KEYsecretKeyRefru   )r(   key)r(   	valueFromzkaniko-docker-configz.dockerconfigjsonrb   )r   path)
secretNamer   )r(   secretz/kaniko/.dockerzdocker-configr(   r`   )r(   	configMapz
/root/.awscredentialsz/kaniko/.config/gcloudGOOGLE_APPLICATION_CREDENTIALSz"/kaniko/.config/gcloud/config.jsonzAAutomatic credential handling is not supported for registry type z. Build job: T)r(   r   readOnlyz/kaniko/.docker/zhttps://rF   trueredofalse)z	--contextz--dockerfilez--destinationz--cachez--cache-repoz--snapshot-modez--compressed-caching=c                 S   s   g | ]\}}| d | qS )r   r*   ).0arg_name	arg_valuer*   r*   r+   
<listcomp>(  s    z4KanikoBuilder._create_kaniko_job.<locals>.<listcomp>launchzazure.workload.identity/userestartPolicyNeveractiveDeadlineSecondsserviceAccountNamebackoffLimitra   zbatch/v1
apiVersionJobrf   zwandb-container-buildrD   )%r   deepcopyrL   rS   r   r   rT   appendPVC_NAMEboolrB   rC   r   rI   r   regionrH   r	   read_namespaced_secretr   r   r   r"   r   r   rQ   r@   r   
startswithreplacer   splitr   r   SERVICE_ACCOUNT_NAMEr4   rD   )rM   r.   r\   r   r   r   r   r#   job_metadata
job_labelsjob_specpod_templatepod_metadata
pod_labelspod_specr   r   	containervolume_mountsr   custom_argsr   
mount_pathr   rR   r   
custom_argr   r   parsed_argsr*   r*   r+   r   ~  sT  		

	

z KanikoBuilder._create_kaniko_job)rE   rF   rF   rF   rG   N)TT)r0   Nr$   )__name__
__module____qualname____doc__rQ   str__annotations__r   r   r
   dictrN   classmethodr   rX   rO   rP   r   r   rx   rz   r   r   r   r   r   r   r   r   r*   r*   r*   r+   r>   [   s   
 	
 
8
	


|
r>   r$   )Mr:   rj   r   rp   loggingosr   r   r   r2   r   typingr   r   r   r"   )wandb.sdk.launch.agent.job_status_trackerr   !wandb.sdk.launch.builder.abstractr   r   %wandb.sdk.launch.environment.abstractr   .wandb.sdk.launch.environment.azure_environmentr	   "wandb.sdk.launch.registry.abstractr
   2wandb.sdk.launch.registry.azure_container_registryr   4wandb.sdk.launch.registry.elastic_container_registryr   2wandb.sdk.launch.registry.google_artifact_registryr   
wandb.utilr   _project_specr   r   errorsr   utilsr   r   r   r   r   context_managerr   r   r   r   	getLoggerr  r   r   environrS   r   r   rK   rT   r   r   existsr   freadstripr4   V1Jobr,   r   r  intr   r=   r>   r*   r*   r*   r+   <module>   sx    


