§
    AxÅj¶=  ã                   ó8  — d Z ddlZddlZddlZddlmZ ddlZddlmZmZmZm	Z	 ddl
mZmZmZmZmZ ddlmZmZ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 ej                             ej                              e!¦  «        d¦  «        Z"d„ Z#	 	 	 dd„Z$d„ Z%d„ Z&dS )z$
Runpod | CLI | Project | Functions
é    N)Údatetime)ÚcommentÚdocumentÚnlÚtable)Ú__version__Úcreate_endpointÚcreate_templateÚget_podÚupdate_endpoint_template)ÚBASE_DOCKER_IMAGEÚENV_VARSÚ	GPU_TYPES)ÚSSHConnectioné   )Úsync_directoryé   )Úattempt_pod_launchÚcopy_template_filesÚget_project_endpointÚget_project_podÚload_project_configÚstarter_templatesc                  ó`  — t          ¦   «         } t          d¦  «         d| d         d         i}| d                              di ¦  «        D ]}| d         d         |         ||<   Œ| d                              dg ¦  «        }| d                              dd¦  «        r!|                     | d         d         ¦  «         t	          | |¦  «        }|€t          d	¦  «         dS t          d
d¬¦  «         t
          j                             ¦   «          |                     dd¦  «        dk    s|                     d¦  «        €Dt          |d         ¦  «        }|                     dd¦  «        dk    °/|                     d¦  «        ®D|d         }t          d| d         d         › d|› d�d¬¦  «         |S )zLaunch a development pod.z&Deploying development pod on Runpod...ÚRUNPOD_PROJECT_IDÚprojectÚuuidÚenv_varsÚ	gpu_typesÚgpuNzHSelected GPU types unavailable, try again later or use a different type.z"Waiting for pod to come online... Ú )ÚendÚdesiredStatusÚRUNNINGÚruntimeÚidzProject Únamez pod (z
) created.z

)	r   ÚprintÚgetÚappendr   ÚsysÚstdoutÚflushr   )ÚconfigÚenvironment_variablesÚvariableÚselected_gpu_typesÚnew_podÚproject_pod_ids         úTC:\Projects\Historical\venv\Lib\site-packages\runpod/cli/groups/project/functions.pyÚ_launch_dev_podr5   #   sá  € å Ñ"Ô"€Få	Ð
2Ñ3Ô3Ð3ð 1°&¸Ô2CÀFÔ2KÐLÐØ˜9Ô%×)Ò)¨*°bÑ9Ô9ð Rð RˆØ*0°Ô*;¸JÔ*GÈÔ*QÐ˜hÑ'Ð'ð   	Ô*×.Ò.¨{¸BÑ?Ô?ÐØˆiÔ×Ò˜U DÑ)Ô)ð <Ø×!Ò! &¨Ô"3°EÔ":Ñ;Ô;Ð;õ ! Ð)>Ñ?Ô?€GØ€ÝØVñ	
ô 	
ð 	
ð ˆtå	Ð
.°BÐ7Ñ7Ô7Ð7Ý„J×ÒÑÔÐð 	�Š�O TÑ*Ô*¨iÒ7Ð7Ø�;Š;�yÑ!Ô!Ð)å˜' $œ-Ñ(Ô(ˆð 	�Š�O TÑ*Ô*¨iÒ7Ð7Ø�;Š;�yÑ!Ô!Ð)ð ˜T”]€Nå	ØN�6˜)Ô$ VÔ,ÐNÐN°NÐNÐNÐNØðñ ô ð ð Ðó    Fc                 óB
  — |�s.t           j                             t          j        ¦   «         | ¦  «        }t           j                             |¦  «        st          j        |¦  «         |€d}t           j                             t          |¦  «        }t          ||¦  «         t           j                             |d¦  «        }	t          |	dd¬¦  «        5 }
|
 	                    ¦   «         }ddd¦  «         n# 1 swxY w Y   dt          v r|                     dd	¦  «        }n|                     dd
t          › �¦  «        }t          |	dd¬¦  «        5 }
|
                     |¦  «         ddd¦  «         n# 1 swxY w Y   |r³t           j                             | d¦  «        }t          |dd¬¦  «        5 }| 	                    ¦   «         }|                     d|¦  «        }ddd¦  «         n# 1 swxY w Y   t          |dd¬¦  «        5 }|                     |¦  «         ddd¦  «         n# 1 swxY w Y   nt          j        ¦   «         }t          t          j        ¦   «         ¦  «        dd…         }t!          ¦   «         }|                     t%          d¦  «        ¦  «         |                     t'          ¦   «         ¦  «         |                     d| ¦  «         t)          ¦   «         }|                     d|¦  «         |                     d| ¦  «         |                     dt+          j        |¬¦  «        ¦  «         |                     dt.          ¦  «         |                     dd¦  «         |                     d|¦  «         |                     dd¦  «         |                     dd¦  «         |                     dd¦  «         |                     dt0          ¦  «         |                     d |¦  «         t)          ¦   «         }|                     d!t          |¦  «        ¦  «         |                     d"t          |¦  «        ¦  «         |                     d#|¦  «         t)          ¦   «         }|                     d$|¦  «         |                     d%d¦  «         |                     d&d¦  «         |                     d'|¦  «         t          t           j                             |d(¦  «        dd)¬¦  «        5 }t3          j        ||¦  «         ddd¦  «         dS # 1 swxY w Y   dS )*zCreate a new project.NÚdefaultzbuilder/requirements.txtÚrzutf-8)ÚencodingÚdevz
<<RUNPOD>>z/git+https://github.com/runpod/runpod-python.gitzrunpod==Úwzsrc/handler.pyz<<MODEL_NAME>>é   zRunpod Project ConfigurationÚtitler   r'   Ú
base_image)Úcuda_versionr   Ú	gpu_countr   Ú
storage_idÚvolume_mount_pathz/runpod-volumeÚportsz8080/http, 22/tcpÚcontainer_disk_size_gbé
   r   r   Ú
model_typeÚ
model_nameÚtemplateÚpython_versionÚhandler_pathÚrequirements_pathr%   zrunpod.tomlzUTF-8)ÚosÚpathÚjoinÚgetcwdÚexistsÚmakedirsÚSTARTER_TEMPLATESr   ÚopenÚreadr   ÚreplaceÚwriteÚstrr   Úuuid4r   Úaddr   r   r   r   Úformatr   r   ÚtomlkitÚdump)Úproject_nameÚrunpod_volume_idr@   rJ   rG   rH   Úinit_current_dirÚproject_folderÚtemplate_dirrL   Úrequirements_fileÚrequirements_contentrK   ÚfileÚhandler_contentÚproject_uuidÚtoml_configÚproject_tableÚtemplate_tableÚruntime_tableÚconfig_files                        r4   Úcreate_new_projectrm   O   sö  € ð ñ '%ÝœŸš¥b¤i¡k¤k°<Ñ@Ô@ˆÝŒw�~Š~˜nÑ-Ô-ð 	(ÝŒK˜Ñ'Ô'Ð'àÐØ"ˆJå”w—|’|Õ$5°zÑBÔBˆå˜L¨.Ñ9Ô9Ð9õ œGŸLšL¨Ð9SÑTÔTÐÝÐ# S°7Ð;Ñ;Ô;ð 	<Ð?PØ#4×#9Ò#9Ñ#;Ô#;Ð ð	<ð 	<ð 	<ñ 	<ô 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<øøøð 	<ð 	<ð 	<ð 	<ð •KÐÐØ#7×#?Ò#?ØÐOñ$ô $Ð Ð ð $8×#?Ò#?ØÐ6­Ð6Ð6ñ$ô $Ð õ Ð# S°7Ð;Ñ;Ô;ð 	:Ð?PØ×#Ò#Ð$8Ñ9Ô9Ð9ð	:ð 	:ð 	:ñ 	:ô 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:øøøð 	:ð 	:ð 	:ð 	:ð ð 	,Ýœ7Ÿ<š<¨Ð6FÑGÔGˆLÝ�l C°'Ð:Ñ:Ô:ð X¸dØ"&§)¢)¡+¤+�Ø"1×"9Ò"9Ð:JÈJÑ"WÔ"W�ðXð Xð Xñ Xô Xð Xð Xð Xð Xð Xð Xøøøð Xð Xð Xð Xõ �l C°'Ð:Ñ:Ô:ð ,¸dØ—
’
˜?Ñ+Ô+Ð+ð,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,øõ œ™œˆå•t”z‘|”|Ñ$Ô$ R a RÔ(€Lå‘*”*€KØ‡O‚O•GÐ:Ñ;Ô;Ñ<Ô<Ð<Ø‡O‚O•B‘D”DÑÔÐØ‡O‚O�G˜\Ñ*Ô*Ð*å‘G”G€MØ×Ò�f˜lÑ+Ô+Ð+Ø×Ò�f˜lÑ+Ô+Ð+Ø×Ò�lÕ$5Ô$<È,Ð$WÑ$WÔ$WÑXÔXÐXØ×Ò�k¥9Ñ-Ô-Ð-Ø×Ò�k 1Ñ%Ô%Ð%Ø×Ò�lÐ$4Ñ5Ô5Ð5Ø×ÒÐ)Ð+;Ñ<Ô<Ð<Ø×Ò�gÐ2Ñ3Ô3Ð3Ø×ÒÐ.°Ñ3Ô3Ð3Ø×Ò�j¥(Ñ+Ô+Ð+Ø‡O‚O�I˜}Ñ-Ô-Ð-å‘W”W€NØ×Ò�|¥S¨¡_¤_Ñ5Ô5Ð5Ø×Ò�|¥S¨¡_¤_Ñ5Ô5Ð5Ø‡O‚O�J Ñ/Ô/Ð/å‘G”G€MØ×ÒÐ&¨Ñ7Ô7Ð7Ø×Ò�nÐ&6Ñ7Ô7Ð7Ø×ÒÐ)Ð+EÑFÔFÐFØ‡O‚O�I˜}Ñ-Ô-Ð-å	Ý
Œ�Š�^ ]Ñ3Ô3°SÀ7ð
ñ 
ô 
ð /à	ÝŒ�[ +Ñ.Ô.Ð.ð/ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /ð /ð /sZ   ÃC4Ã4C8Ã;C8ÅE1Å1E5Å8E5Æ0+G'Ç'G+Ç.G+ÈH&È&H*È-H*Ó1TÔTÔTc                  óÂ  — t          ¦   «         } | d         D ]#}t          d|› d| d         |         › �¦  «         Œ$t          d¦  «         t          | d         d         ¦  «        }|st          ¦   «         }|€dS t	          |¦  «        5 }| d         d         › d| d         d         › �}t
          j                             |d	¦  «        }t
          j                             |d
¦  «        }t
          j                             || d         d         ¦  «        }t          d|› d|› �¦  «         |                     d|› d|› �g¦  «         t          d|› �¦  «         | 	                    t          j
        ¦   «         |¦  «         t
          j                             |d¦  «        }t          d|› d|› �¦  «         d| d         d         › d|› �d|› d|› d| d         d         › �g}	|                     |	¦  «         t          |t          j
        ¦   «         |¦  «         | d         d         }
t
          j                             || d         d         ¦  «        }t
          j                             || d         d         ¦  «        }d|› d|› d|
› d|› d|› d |› d!|› d"�g}t          d¦  «         t          d#¦  «         |                     |¦  «         ddd¦  «         dS # 1 swxY w Y   dS )$au  
    Start the project development environment from runpod.toml
    - Check if the project pod already exists.

    - If the project pod does not exist:
        # SSH into the pod and create a project folder within the volume
        # Create a folder in the volume for the project that matches the project uuid
        # Create a folder in the project folder that matches the project name
        # Copy the project files into the project folder
        # crate a virtual environment using the python version specified in the project config
        # install the requirements.txt file

    - If the project pod does exist:

    r   z    - z: r!   r   NrC   ú/r;   Úprodr'   zChecking pod project folder: ú on pod ú	mkdir -p ú úSyncing files to pod Úvenvú'Activating Python virtual environment: Úpythonr%   rJ   z -m virtualenv úsource ú/bin/activate &&cd úP &&python -m pip install --upgrade pip &&python -m pip install -v --requirement rL   rK   ai  
            pkill inotify

            function force_kill {
                kill $1 2>/dev/null
                sleep 1

                if ps -p $1 > /dev/null; then
                    echo "Graceful kill failed, attempting SIGKILL..."
                    kill -9 $1 2>/dev/null
                    sleep 1

                    if ps -p $1 > /dev/null; then
                        echo "Failed to kill process with PID: $1"
                        exit 1
                    else
                        echo "Killed process with PID: $1 using SIGKILL"
                    fi

                else
                    echo "Killed process with PID: $1"
                fi
            }

            function cleanup {
                echo "Cleaning up..."
                force_kill $last_pid
            }

            trap cleanup EXIT SIGINT

            if source zÝ/venv/bin/activate; then
                echo -e "- Activated virtual environment."
            else
                echo "Failed to activate virtual environment."
                exit 1
            fi

            if cd a¯  ; then
                echo -e "- Changed to project directory."
            else
                echo "Failed to change directory."
                exit 1
            fi

            exclude_pattern='(__pycache__|\.pyc$)'
            function update_exclude_pattern {
                exclude_pattern='(__pycache__|\.pyc$)'
                if [[ -f .runpodignore ]]; then
                    while IFS= read -r line; do
                        line=$(echo "$line" | tr -d '[:space:]')
                        [[ "$line" =~ ^#.*$ || -z "$line" ]] && continue # Skip comments and empty lines
                        exclude_pattern="${exclude_pattern}|(${line})"
                    done < .runpodignore
                    echo -e "- Ignoring files matching pattern: $exclude_pattern"
                fi
            }
            update_exclude_pattern

            # Start the API server in the background, and save the PID
            python a»   --rp_serve_api --rp_api_host="0.0.0.0" --rp_api_port=8080 --rp_api_concurrency=1 &
            last_pid=$!

            echo -e "- Started API server with PID: $last_pid" && echo ""
            echo "Connect to the API server at:"
            echo ">  https://$RUNPOD_POD_ID-8080.proxy.runpod.net" && echo ""

            while true; do
                if changed_file=$(inotifywait -q -r -e modify,create,delete --exclude "$exclude_pattern" aÄ   --format '%w%f'); then
                    echo "Detected changes in: $changed_file"
                else
                    echo "Failed to detect changes."
                    exit 1
                fi

                force_kill $last_pid

                if [[ $changed_file == *"requirements"* ]]; then
                    echo "Installing new requirements..."
                    python -m pip install --upgrade pip && python -m pip install -r z­
                fi

                if [[ $changed_file == *".runpodignore"* ]]; then
                    update_exclude_pattern
                fi

                python zÊ --rp_serve_api --rp_api_host="0.0.0.0" --rp_api_port=8080 --rp_api_concurrency=1 &
                last_pid=$!

                echo "Restarted API server with PID: $last_pid"
            done
        z(Starting project development endpoint...)r   r(   r   r5   r   rM   rN   rO   Úrun_commandsÚrsyncrP   r   )r.   Úconfig_itemr3   Ússh_connÚproject_path_uuidÚproject_path_uuid_devÚproject_path_uuid_prodÚremote_project_pathÚ	venv_pathÚcommandsr^   Úpip_req_pathrK   Úlaunch_api_servers                 r4   Ústart_projectr‡   ¨   s#  € õ  !Ñ"Ô"€Fà˜iÔ(ð Hð HˆÝÐF�{ÐFÐF f¨YÔ&7¸Ô&DÐFÐFÑGÔGÐGÐGÝ	ˆ"�I„I€Iå$ V¨IÔ%6°vÔ%>Ñ?Ô?€Nð ð +Ý(Ñ*Ô*ˆàÐØˆå	�~Ñ	&Ô	&ð Q1¨(ð �iÔ Ð!4Ô5ÐSÐS¸¸yÔ8IÈ&Ô8QÐSÐSð 	õ !#¤§¢Ð->ÀÑ FÔ FÐÝ!#¤§¢Ð.?ÀÑ!HÔ!HÐÝ œgŸlšlØ! 6¨)Ô#4°VÔ#<ñ
ô 
Ðõ
 	ØYÐ,?ÐYÐYÈÐYÐYñ	
ô 	
ð 	
ð 	×ÒØGÐ,ÐGÐGÐ/EÐGÐGÐHñ	
ô 	
ð 	
õ
 	Ð6 nÐ6Ð6Ñ7Ô7Ð7Ø�Š•r”y‘{”{Ð$9Ñ:Ô:Ð:õ ”G—L’LÐ!6¸Ñ?Ô?ˆ	ÝØY°iÐYÐYÈÐYÐYñ	
ô 	
ð 	
ð U�V˜IÔ&Ð'7Ô8ÐTÐTÈÐTÐTð_�ið _ð _Ø%ð_ð _ð 7=¸YÔ6GÐH[Ô6\ð_ð _ð
ˆð 	×Ò˜hÑ'Ô'Ð'õ 	�x¥¤¡¤Ð.CÑDÔDÐDà˜iÔ(¨Ô0ˆÝ”w—|’|Ø ¨	Ô!2Ð3FÔ!Gñ
ô 
ˆõ ”w—|’|Ø ¨	Ô!2°>Ô!Bñ
ô 
ˆð
[ð> -ð?[ð [ðL )ðM[ð [ðL ,8ðM[ð [ðx !ðy[ð [ðH k~ðI[ð [ð^ Vbð_[ð [ðl %ðm[ð [ð [ð]
Ðõ~ 	ˆb‰	Œ	ˆ	ÝÐ8Ñ9Ô9Ð9Ø×ÒÐ/Ñ0Ô0Ð0ðcQ1ð Q1ð Q1ñ Q1ô Q1ð Q1ð Q1ð Q1ð Q1ð Q1ð Q1ð Q1øøøð Q1ð Q1ð Q1ð Q1ð Q1ð Q1s   ÂH?KËKËKc            	      ó  — t          ¦   «         } t          | d         d         ¦  «        }|st          ¦   «         }|€dS t          |¦  «        5 }| d         d         › d| d         d         › �}t          j                             |d¦  «        }t          j                             || d         d         ¦  «        }|                     d|› �g¦  «         t          d	|› d
�¦  «         | 	                    t	          j
        ¦   «         |¦  «         t          j                             |d¦  «        }t          d|› d|› �¦  «         d| d         d         › d|› �d|› d|› d| d         d         › �g}|                     |¦  «         |                     ¦   «          ddd¦  «         n# 1 swxY w Y   i }| d         d         D ]}	| d         d         |	         ||	<   Œd| d         d         › d�}
d| d         d         › d| d         d         › d| d         d         › �}d|
z   dz   |z   dz   }t          | d         d         › d| d         d         › d t          j        ¦   «         › �| d         d!         | d         d"         ||d#¬$¦  «        }t          | d         d         ¦  «        }|sBt!          | d         d         › d| d         d         › �|d%         | d         d&         ¬'¦  «        }nt#          |d%         |d%         ¬(¦  «        }|d%         S ))zçCreate a project endpoint.
    - Move code in dev to prod folder
    - TODO: git commit the diff from current state to new state
    - Create a serverless template for the project
    - Create a new endpoint using the template
    r   r   NrC   ro   rp   r'   rr   rt   z prodru   rv   rq   rw   r%   rJ   z	 -m venv rx   ry   rz   rL   r   z. /runpod-volume/z/prod/venv/bin/activatezpython -u /runpod-volume/z/prod/rK   z	bash -c "z && ú"z-endpoint | z | r?   rE   T)r'   Ú
image_nameÚcontainer_disk_in_gbÚdocker_start_cmdÚenvÚis_serverlessr&   rB   )r'   Útemplate_idÚnetwork_volume_id)Úendpoint_idr�   )r   r   r5   r   rM   rN   rO   r{   r(   r|   rP   Úcloser
   r   Únowr   r	   r   )r.   r3   r~   r   r�   r‚   rƒ   r„   r/   r0   Úactivate_cmdÚ
python_cmdrŒ   Úproject_endpoint_templateÚdeployed_endpoints                  r4   Úcreate_project_endpointr˜   \  s   € õ !Ñ"Ô"€FÝ$ V¨IÔ%6°vÔ%>Ñ?Ô?€Nð ð +Ý(Ñ*Ô*ˆàÐØˆtå	�~Ñ	&Ô	&ð ¨(à�iÔ Ð!4Ô5ÐSÐS¸¸yÔ8IÈ&Ô8QÐSÐSð 	õ "$¤§¢Ð.?ÀÑ!HÔ!HÐÝ œgŸlšlØ" F¨9Ô$5°fÔ$=ñ
ô 
Ðð
 	×ÒÐ@Ð+>Ð@Ð@ÐAÑBÔBÐBÝÐ; nÐ;Ð;Ð;Ñ<Ô<Ð<Ø�Š•r”y‘{”{Ð$:Ñ;Ô;Ð;õ ”G—L’LÐ!7¸Ñ@Ô@ˆ	ÝØY°iÐYÐYÈÐYÐYñ	
ô 	
ð 	
ð O�V˜IÔ&Ð'7Ô8ÐNÐNÀ9ÐNÐNð_�ið _ð _Ø%ð_ð _ð 7=¸YÔ6GÐH[Ô6\ð_ð _ð
ˆð 	×Ò˜hÑ'Ô'Ð'Ø�ŠÑÔÐð7ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð: ÐØ˜9Ô% jÔ1ð Rð RˆØ*0°Ô*;¸JÔ*GÈÔ*QÐ˜hÑ'Ð'ð 	O˜F 9Ô-¨fÔ5ÐNÐNÐNð ð N¨V°IÔ->¸vÔ-Fð  Nð  NÈfÐU^ÔN_Ð`fÔNgð  Nð  NÐjpÐqzÔj{ð  }Kô  kLð  Nð  N€JØ" \Ñ1°FÑ:¸ZÑGÈ#ÑMÐå /Ø�yÔ! &Ô)ÐeÐe°v¸iÔ7HÈÔ7PÐeÐeÕU]ÔUaÑUcÔUcÐeÐeØ˜)Ô$ \Ô2Ø# IÔ.Ð/GÔHØ)Ø!Øð!ñ !ô !Ðõ -¨V°IÔ->¸vÔ-FÑGÔGÐØð 

Ý+Ø˜9Ô% fÔ-ÐVÐV¸6À)Ô;LÈVÔ;TÐVÐVØ1°$Ô7Ø$ YÔ/°Ô=ð
ñ 
ô 
ÐÐõ 5Ø)¨$Ô/Ø1°$Ô7ð
ñ 
ô 
Ðð ˜TÔ"Ð"s   ÁEF!Æ!F%Æ(F%)NNF)'Ú__doc__rM   r+   r   r   r\   r   r   r   r   Úrunpodr   r	   r
   r   r   Ú
runpod.clir   r   r   Úrunpod.cli.utils.ssh_cmdr   Úutils.rp_syncr   Úhelpersr   r   r   r   r   rN   rO   ÚdirnameÚ__file__rS   r5   rm   r‡   r˜   © r6   r4   ú<module>r¢      sÇ  ððð ð 
€	€	€	Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð à €€€Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0ðð ð ð ð ð ð ð ð ð ð ð ð ð ð >Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2à +Ð +Ð +Ð +Ð +Ð +ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ”G—L’L ¤§¢°Ñ!:Ô!:Ð<OÑPÔPÐ ð(ð (ð (ðb ØØðU/ð U/ð U/ð U/ðrp1ð p1ð p1ðhQ#ð Q#ð Q#ð Q#ð Q#r6   