o
    0j b                     @   s.  d Z ddl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mZ ddl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 ddlmZ ddl m!Z! ddl"m#Z# g dZ$dd Z%dd Z&G dd dZ'dd Z(dd Z)dd Z*dd Z+dd  Z,d!d" Z-d#d$ Z.d%d& Z/dS )'u   
本文件实现了产线任务提交、查询、停止功能

Authors: xiangyiqing(xiangyiqing@baidu.com), suoyi@baidu.com
Date:    2024/3/2
    N)Path)PrettyTable)logconfig)	ErrorEnum)AUTH_DIRAUTH_TOKEN_FILELOG_DIRLOG_LEVEL_FILE)zip_direrr_resp)upload_super_fileMyBosClientupload_file)pipeline)dataset)BceClientConfiguration)BceCredentials)BceHttpClientError)	BosClient)
set_configcreatequerystopc                 C   s   t j d|  dS )u   拼接产线详情链接z
/pipeline/z/detail)r   Z#STUDIO_MODEL_API_URL_PREFIX_DEFAULT)pipeline_id r   Z/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/aistudio_sdk/sdk/pipeline.pyget_detail_url%   s   r   c                 C   s2   t  }g d|_| D ]}|| q
t| dS )u   
    表格化打印
    tabled_log_info([
        ["pipeline_id", "args.summit_name", "status", "get_detail_url(pipeline_id)", "create_ime"], 
        [], 
        ...
    ])
    )pidnamestatusurl
createTimeN)r   field_namesadd_rowr   info)Zdetail_listtabledetailr   r   r   tabled_log_info*   s
   	
r(   c                   @   sd   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )Pipelineu   
    pipeline类
    r   c              
   C   sd  t d|  |j}|r[z3tjtsttjddd t	t
d}|| W d   n1 s2w   Y  t dt
  W n tyZ } zt d|  W Y d}~nd}~ww |j }|rz4tjtspttjddd t	td}|| W d   n1 sw   Y  t dt  W dS  ty } zt d|  W Y d}~dS d}~ww dS )u*   
        配置: token, log_level
        u   鉴权配置，参数: T)parentsexist_okwNz[OK] Configuration saved to: z[Error] Configuration faild: )r   debugtokenospathexistsr   r   mkdiropenr   writer%   	Exceptionerrorr	   r
   )selfargsr.   fileeZ	log_levelr   r   r   r   @   s8   zPipeline.set_configc              
   C   s   t jtsdS zttd}|  W  d   W S 1 s w   Y  W dS  tyB } zt	d|  W Y d}~dS d}~ww )u#   
        获取鉴权token
        Nrz"[Error] Read configuration faild: )
r/   r0   r1   r   r3   readstripr5   r   r6   )r7   r9   r:   r   r   r   get_auth`   s   
(zPipeline.get_authc                 C   s&  t d|  |  }|st ttjjtjjd  dS t	|j
tjkr;t ttjjtjj dtj d dS |j}| d}tj|sWt ttjjtjj dS tj|skt ttjjtjj dS zt d|  t|| t d|  W n$ ty } zt ttjjtjj d	|  W Y d}~dS d}~ww tjt|jk rt ttjjtjj d
tjd d  d dS z(t d g }|j
D ]	}|d|i qt||j|j|j |j!|j"|j#|}W n* tj$y } zt ttj%jtj%j d|dd   W Y d}~dS d}~ww |d tj&jkr@t ttj%jtj%j d|d  |d |d  dS t d |d d }	zt d t'||	}W n* tj$y } zt ttj(jtj(j d|dd   W Y d}~dS d}~ww |d tj&jkrt ttj(jtj(j d|d  |d |d  dS t d |d }
|
d }|
d }|
d }|
d }|
d }|
d }zt d t)||||||| W n0 ty
 } z#t*||	d  t ttj+jtj+j d|dd   W Y d}~dS d}~ww t d! zt d" t*||	d#|tj,|}W n* tj$yN } zt ttj-jtj-j d|dd   W Y d}~dS d}~ww |d tj&jkrst ttj-jtj-j d|d  |d |d  dS t d$ |d }
|
d% }|
d& }t.|	|j|t/|	|gg dS )'u$   
        创建产线任务
        u   创建产线，参数: /   , 请使用 aistudio config --token {yourToken}Nu   : 单个任务最多挂载u   个数据集z.zipu   step 1: 开始打包代码... u   代码打包完成! u   : 压缩出错
u!   : 代码包总体积不能超过 i   z MBu   step 2: 请求参数校验...Z	datasetId:   	errorCodeerrorMsglogIdu   参数校验成功!result
pipelineIdu   step 3: 请求申请ak/sk...   申请ak/sk成功!endpoint
bucketNamefileKeyaccessKeyIdsecretAccessKeysessionTokenu   step 4: 代码上传bos...Fu   代码上传成功!u#   step 5: 回调请求创建产线...Tu   创建成功!stager"   )0r   r-   r>   r6   r   r   TOKEN_IS_EMPTYcodemessagelenZmount_datasetr   ZMOUNT_DATASET_LIMITPARAMS_INVALIDr0   r/   r1   ZFILE_NOT_FOUNDisdirZNEED_FOLDERr   r5   INTERNAL_ERRORZPIPELINE_CODE_SIZE_LIMITstatst_sizeZFILE_TOO_LARGEappend
pp_requestr   Zsummit_namecmdenvZdeviceZgpuspaymentRequestPipelineExceptionZREQUEST_CREATE_PIPELINE_FAILEDSUCCESSZbosaclREQUEST_BOSACL_FAILEDZ
bos_uploadZcreate_callbackBOS_UPLOAD_FAILEDbasenameZ'REQUEST_CREATE_PIPELINE_CALLBACK_FAILEDr(   r   )r7   r8   r.   Z
input_pathzip_filer:   Zdataset_list
dataset_idrespr   rE   rH   bucket_namefile_keyaccess_key_idsecret_access_keysession_tokenrN   Z
create_imer   r   r   r   n   sT  









	




zPipeline.createc                 C   s<  t d|  |  }|st ttjjtjjd  dS zt	
||j|j|j}W n) t	jyT } zt ttjjtjj d|dd   W Y d}~dS d}~ww |d tjjkrxt ttjjtjj d|d  |d |d  dS t }|d	 D ]}||d
 |d |d t|d
 |d g qt| dS )u   
        查询产线
        u   查询产线，参数: r?   Nr@   rA   rB   rC   rD   rE   rF   ZpipelineNamerN   r"   )r   r-   r>   r6   r   r   rO   rP   rQ   rY   r   Zquery_pipeline_idr   r    r]   ZREQUEST_QUERY_PIPELINE_FAILEDr^   listrX   r   r(   )r7   r8   r.   rd   r:   dataresr   r   r   r   $  sT   

	zPipeline.queryc                 C   s   t d|  |  }|st ttjjtjjd  dS z	t	
||j}W n) t	jyP } zt ttjjtjj d|dd   W Y d}~dS d}~ww |d tjjkrtt ttjjtjj d|d  |d |d  dS t d	 dS )
u   
        停止产线
        u   停止产线，参数: r?   Nr@   rA   rB   rC   rD   u   [OK] 停止成功.)r   r-   r>   r6   r   r   rO   rP   rQ   rY   r   Zstop_pipeline_idr]   ZREQUEST_STOP_PIPELINE_FAILEDr^   r%   )r7   r8   r.   rd   r:   r   r   r   r   W  s6   
zPipeline.stopc                 C   sv  t d|  |  }|st ttjjtjjd  dS zt d t	
||j}W n+ t	jyW } zt ttjjtjj dt|dd   W Y d}~dS d}~ww |d tjjkr{t ttjjtjj d|d  |d |d	  dS t d
 |d }|d }|d }|d }|d }	|d }
|d }|d}|dd }|jr|jd|_|jd|_|jr|jd |_||j }tt||	||
d}t|}z>t d| d |j||dd}t d |jD ]}|j|d}|rt | q|jD ]}t |j|d qW dS  ty: } zt ttjjtjj dt|  W Y d}~dS d}~ww )u@   
        列出某个 job 的 output 目录下的文件
        u"   列出 job 输出文件，参数: r?   N   请求申请ak/sk...r@   rA   rB   rC   rD   rG   rE   rH   rI   rK   rL   rM   rJ   /credentialsrH   Zsecurity_tokenu0   列出 output 目录下的文件和文件夹...[])prefix	delimiteru   文件和文件夹列表: )r   r-   r>   r6   r   r   rO   rP   rQ   rY   bosacl_ls_cpjob_idr]   r_   strr^   lstriprstrip	directoryr   r   r   Zlist_objectsr%   contentskeyreplaceZcommon_prefixesrr   r   ZBOS_LIST_FILES_FAILED)r7   r8   r.   rd   r:   rE   rH   re   rg   rh   ri   rf   bos_conf
bos_clientZresposer9   r|   dr   r   r   list_output_filesy  s   








zPipeline.list_output_filesc                 C   sr  t d|  |  }|st ttjjtjjd  dS zt d t	
||j}W n+ t	jyW } zt ttjjtjj dt|dd   W Y d}~dS d}~ww |d tjjkr{t ttjjtjj d|d  |d |d	  dS t d
 |d }|d }|d }|d }|d }	|d }
|d }|d}|dd }tt||	||
d}t|}||j }tj|j}|jdkrtjt ||_tj|jrtj|j||_t d| d|j  z||||j |j t d|j  W dS  ty8 } z't d|j  t ttj jtj j dt|dd   W Y d}~dS d}~ww )uI   
        下载某个 job 的 output 目录下的文件到本地
        u"   下载 job 输出文件，参数: r?   Nrm   r@   rA   rB   rC   rD   rG   rE   rH   rI   rK   rL   rM   rJ   rn   ro   .u!   下载 output 目录下的文件[u   ] 到 u   文件下载成功: u-   下载失败：请检查文件是否存在：)!r   r-   r>   r6   r   r   rO   rP   rQ   rY   ru   rv   r]   r_   rw   r^   rx   ry   r   r   r   Zresult_filer/   r0   ra   Z
local_pathjoingetcwdrT   Zget_object_to_filer%   r   ZBOS_DOWNLOAD_FAILED)r7   r8   r.   rd   r:   rE   rH   re   rg   rh   ri   rf   r~   r   Zbos_fileZlocal_file_namer   r   r   download_output_file  s|   





zPipeline.download_output_filec                 C   s  g }|}d}|D ]Q}zt d t|}W n0 tjyG } z#t ttjj	d tjj	d  dt
|dd   W Y d}~ dS d}~ww |d tjj	d krrt ttjj	d tjj	d  d|d  |d |d	   dS t d
 |d }	|	d }
|	d }|	d }|	d }|	d }|	d }tt|||
|d}t|}|drtj|}t d| d| d |d7 }tj|st ttjj	d tjj	d  d|  t d|  qzt|||| t d W n6 ty$ } z)t ttjj	d tjj	d  dt
|dd   t d|  W Y d}~qd}~ww t|tj|||}|rB|| t d|  qt ttjj	d tjj	d  d t d qt d|  |S )u   
        上传文件
           rm   r   r@   NrA   rB   rC   rD   rG   rE   rH   rI   rK   rL   rM   rJ   ro   rn   u	   上传第u
   个文件[u   ]到BOS路径u$   上传失败（文件不存在）：u   BOS文件上传成功u   BOS文件上传失败：z
add file: u   : 上传文件失败   add file 失败u   所有文件上传结束: )r   r-   
ds_requestZbos_acl_dataset_fileZRequestDatasetExceptionr6   r   r   r_   valuerw   r^   r   r   r   
startswithr/   r0   abspathr1   ZUPLOAD_FILE_NOT_FOUNDr%   r   r   r`   add_filera   rX   )r7   r.   filesfile_idsZlocal_filesilocal_file_pathrd   r:   rE   rH   re   rg   rh   ri   rf   r~   r   Zfile_idr   r   r   _upload_files  s   


 




 

zPipeline._upload_filesc                 C   s  t d|  t|jdkr$t ttjjd tjjd  d dS | 	 }|s>t ttj
jd tj
jd d  dS | ||j}|rxt d |jrQd	nd}tj||j|||j|jd
}|rqt d|j d|  dS t d dS t ttjjd tjjd  d dS )u!   
        创建数据集
        u   创建数据集，参数: (   r   r   u.   : 数据集名称长度不能超过40个字符Nr?   u   创建数据集...   )dataset_typeZdataset_absZdataset_licenseu   数据集创建成功: z id: u   数据集创建失败   : 本地文件上传失败)r   r-   rR   r   r6   r   r   rS   r   r>   rO   r   r   publicr   create_datasetdescriptionlicenser%   DATASET_CREATION_FAILED)r7   r8   r.   r   r   rc   r   r   r   r   b  s<   




zPipeline.create_datasetc                 C   s   t d|  |  }|s"t ttjjd tjjd d  dS | ||j	}|r=t d|  t
||j|}dS t d t ttjjd tjjd  d dS )	u'   
        上传数据集文件
        u    上传数据集文件，参数: r   r   r?   Nu   add file 成功 r   r   )r   r-   r>   r6   r   r   rO   r   r   r   r   Zadd_files_to_datasetidr   )r7   r8   r.   r   rl   r   r   r   r     s"   



zPipeline.add_fileN)__name__
__module____qualname____doc__ZOBJECT_NAMEr   r>   r   r   r   r   r   r   r   r   r   r   r   r   r)   :   s      73"OIQ)r)   c                  G      t  j|  S )r   )r)   r   r8   r   r   r   r        r   c                  G   r   )r   )r)   r   r   r   r   r   r     r   r   c                  G   r   )r   )r)   r   r   r   r   r   r     r   r   c                  G   r   r   )r)   r   r   r   r   r   r     r   r   c                  G   r   r   )r)   r   r   r   r   r   r     r   r   c                  G   r   r   )r)   r   r   r   r   r   r     r   r   c                  G   r   r   )r)   r   r   r   r   r   r     r   r   c                  G   r   r   )r)   r   r   r   r   r   r     r   r   )0r   r/   pathlibr   Zprettytabler   Zaistudio_sdkr   r   Zaistudio_sdk.constant.err_coder   Zaistudio_sdk.constant.constr   r   r	   r
   Zaistudio_sdk.utils.utilr   r   Zaistudio_sdk.utils.bos_sdkr   r   r   Zaistudio_sdk.requestsr   rY   r   r   Z!baidubce.bce_client_configurationr   Zbaidubce.auth.bce_credentialsr   Zbaidubce.exceptionr   Z baidubce.services.bos.bos_clientr   __all__r   r(   r)   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s>       m