You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

cloudbrain.go 39 kB

3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
3 years ago
3 years ago
4 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185
  1. package models
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strings"
  6. "time"
  7. "xorm.io/builder"
  8. "xorm.io/xorm"
  9. "code.gitea.io/gitea/modules/log"
  10. "code.gitea.io/gitea/modules/setting"
  11. "code.gitea.io/gitea/modules/timeutil"
  12. )
  13. type CloudbrainStatus string
  14. type JobType string
  15. type ModelArtsJobStatus string
  16. const (
  17. JobWaiting CloudbrainStatus = "WAITING"
  18. JobStopped CloudbrainStatus = "STOPPED"
  19. JobSucceeded CloudbrainStatus = "SUCCEEDED"
  20. JobFailed CloudbrainStatus = "FAILED"
  21. JobRunning CloudbrainStatus = "RUNNING"
  22. JobTypeDebug JobType = "DEBUG"
  23. JobTypeBenchmark JobType = "BENCHMARK"
  24. JobTypeSnn4imagenet JobType = "SNN4IMAGENET"
  25. JobTypeBrainScore JobType = "BRAINSCORE"
  26. JobTypeTrain JobType = "TRAIN"
  27. ModelArtsCreateQueue ModelArtsJobStatus = "CREATE_QUEUING" //免费资源创建排队中
  28. ModelArtsCreating ModelArtsJobStatus = "CREATING" //创建中
  29. ModelArtsCreateFailed ModelArtsJobStatus = "CREATE_FAILED" //创建失败
  30. ModelArtsStartQueuing ModelArtsJobStatus = "START_QUEUING" //免费资源启动排队中
  31. ModelArtsReadyToStart ModelArtsJobStatus = "READY_TO_START" //免费资源等待启动
  32. ModelArtsStarting ModelArtsJobStatus = "STARTING" //启动中
  33. ModelArtsRestarting ModelArtsJobStatus = "RESTARTING" //重启中
  34. ModelArtsStartFailed ModelArtsJobStatus = "START_FAILED" //启动失败
  35. ModelArtsRunning ModelArtsJobStatus = "RUNNING" //运行中
  36. ModelArtsStopping ModelArtsJobStatus = "STOPPING" //停止中
  37. ModelArtsStopped ModelArtsJobStatus = "STOPPED" //停止
  38. ModelArtsUnavailable ModelArtsJobStatus = "UNAVAILABLE" //故障
  39. ModelArtsDeleted ModelArtsJobStatus = "DELETED" //已删除
  40. ModelArtsResizing ModelArtsJobStatus = "RESIZING" //规格变更中
  41. ModelArtsResizFailed ModelArtsJobStatus = "RESIZE_FAILED" //规格变更失败
  42. )
  43. type Cloudbrain struct {
  44. ID int64 `xorm:"pk autoincr"`
  45. JobID string `xorm:"INDEX NOT NULL"`
  46. JobType string `xorm:"INDEX NOT NULL DEFAULT 'DEBUG'"`
  47. JobName string `xorm:"INDEX"`
  48. Status string `xorm:"INDEX DEFAULT 'INIT'"`
  49. UserID int64 `xorm:"INDEX"`
  50. RepoID int64 `xorm:"INDEX"`
  51. SubTaskName string `xorm:"INDEX"`
  52. ContainerID string
  53. ContainerIp string
  54. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  55. UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
  56. Duration int64 `xorm:"INDEX duration"`
  57. TrainJobDuration string `xorm:"INDEX DEFAULT '00:00:00'"`
  58. DeletedAt time.Time `xorm:"deleted"`
  59. CanDebug bool `xorm:"-"`
  60. CanDel bool `xorm:"-"`
  61. Type int `xorm:"INDEX DEFAULT 0"`
  62. VersionID int64 `xorm:"INDEX DEFAULT 0"`
  63. VersionName string `xorm:"INDEX"`
  64. Uuid string //数据集id
  65. DatasetName string
  66. VersionCount int `xorm:"INDEX DEFAULT 1"` //任务的当前版本数量,不包括删除的
  67. IsLatestVersion string //是否是最新版本,1是,0否
  68. CommitID string //提交的仓库代码id
  69. FatherVersionName string //父版本名称
  70. ComputeResource string //计算资源,例如npu
  71. EngineID int64 //引擎id
  72. TrainUrl string //输出的obs路径
  73. BranchName string //分支名称
  74. Parameters string //传给modelarts的param参数
  75. BootFile string //启动文件
  76. DataUrl string //数据集的obs路径
  77. LogUrl string //日志输出的obs路径
  78. PreVersionId int64 //父版本的版本id
  79. FlavorCode string //modelarts上的规格id
  80. Description string
  81. WorkServerNumber int //节点数
  82. FlavorName string //规格名称
  83. EngineName string //引擎名称
  84. TotalVersionCount int //任务的所有版本数量,包括删除的
  85. User *User `xorm:"-"`
  86. Repo *Repository `xorm:"-"`
  87. }
  88. type TrainjobConfigDetail struct {
  89. ID int64 `xorm:"pk autoincr"`
  90. JobID string `xorm:"INDEX"`
  91. JobName string `xorm:"INDEX"`
  92. ResourcePools string `xorm:"INDEX"`
  93. EngineVersions int `xorm:"INDEX"`
  94. FlavorInfos string `xorm:"INDEX"`
  95. TrainUrl string `xorm:"INDEX"`
  96. BootFile string `xorm:"INDEX"`
  97. Uuid string `xorm:"INDEX"`
  98. DatasetName string `xorm:"INDEX"`
  99. Params string `xorm:"INDEX"`
  100. BranchName string `xorm:"INDEX"`
  101. VersionName string `xorm:"INDEX"`
  102. User *User `xorm:"-"`
  103. Repo *Repository `xorm:"-"`
  104. }
  105. type CloudbrainInfo struct {
  106. Cloudbrain `xorm:"extends"`
  107. User `xorm:"extends"`
  108. }
  109. type CloudBrainLoginResult struct {
  110. Code string
  111. Msg string
  112. Payload map[string]interface{}
  113. }
  114. type TaskRole struct {
  115. Name string `json:"name"`
  116. TaskNumber int `json:"taskNumber"`
  117. MinSucceededTaskCount int `json:"minSucceededTaskCount"`
  118. MinFailedTaskCount int `json:"minFailedTaskCount"`
  119. CPUNumber int `json:"cpuNumber"`
  120. GPUNumber int `json:"gpuNumber"`
  121. MemoryMB int `json:"memoryMB"`
  122. ShmMB int `json:"shmMB"`
  123. Command string `json:"command"`
  124. NeedIBDevice bool `json:"needIBDevice"`
  125. IsMainRole bool `json:"isMainRole"`
  126. UseNNI bool `json:"useNNI"`
  127. }
  128. type StHostPath struct {
  129. Path string `json:"path"`
  130. MountPath string `json:"mountPath"`
  131. ReadOnly bool `json:"readOnly"`
  132. }
  133. type Volume struct {
  134. HostPath StHostPath `json:"hostPath"`
  135. }
  136. type CreateJobParams struct {
  137. JobName string `json:"jobName"`
  138. RetryCount int8 `json:"retryCount"`
  139. GpuType string `json:"gpuType"`
  140. Image string `json:"image"`
  141. TaskRoles []TaskRole `json:"taskRoles"`
  142. Volumes []Volume `json:"volumes"`
  143. }
  144. type CreateJobResult struct {
  145. Code string `json:"code"`
  146. Msg string `json:"msg"`
  147. Payload map[string]interface{} `json:"payload"`
  148. }
  149. type GetJobResult struct {
  150. Code string `json:"code"`
  151. Msg string `json:"msg"`
  152. Payload map[string]interface{} `json:"payload"`
  153. }
  154. type GetImagesResult struct {
  155. Code string `json:"code"`
  156. Msg string `json:"msg"`
  157. Payload GetImagesPayload `json:"payload"`
  158. }
  159. type GetImagesPayload struct {
  160. Count int `json:"count"`
  161. TotalPages int `json:"totalPages,omitempty"`
  162. ImageInfo []*ImageInfo `json:"rows"`
  163. }
  164. type CloudbrainsOptions struct {
  165. ListOptions
  166. RepoID int64 // include all repos if empty
  167. UserID int64
  168. JobID string
  169. SortType string
  170. CloudbrainIDs []int64
  171. // JobStatus CloudbrainStatus
  172. Type int
  173. JobType string
  174. VersionName string
  175. IsLatestVersion string
  176. }
  177. type TaskPod struct {
  178. TaskRoleStatus struct {
  179. Name string `json:"name"`
  180. } `json:"taskRoleStatus"`
  181. //TaskStatuses []struct {
  182. // TaskIndex int `json:"taskIndex"`
  183. // PodUID string `json:"podUid"`
  184. // PodIP string `json:"podIp"`
  185. // PodName string `json:"podName"`
  186. // ContainerID string `json:"containerId"`
  187. // ContainerIP string `json:"containerIp"`
  188. // ContainerGpus string `json:"containerGpus"`
  189. // State string `json:"state"`
  190. // StartAt time.Time `json:"startAt"`
  191. // FinishedAt time.Time `json:"finishedAt"`
  192. // ExitCode int `json:"exitCode"`
  193. // ExitDiagnostics string `json:"exitDiagnostics"`
  194. // RetriedCount int `json:"retriedCount"`
  195. // StartTime string
  196. // FinishedTime string
  197. //} `json:"taskStatuses"`
  198. TaskStatuses []TaskStatuses `json:"taskStatuses"`
  199. }
  200. type TaskStatuses struct {
  201. TaskIndex int `json:"taskIndex"`
  202. PodUID string `json:"podUid"`
  203. PodIP string `json:"podIp"`
  204. PodName string `json:"podName"`
  205. ContainerID string `json:"containerId"`
  206. ContainerIP string `json:"containerIp"`
  207. ContainerGpus string `json:"containerGpus"`
  208. State string `json:"state"`
  209. StartAt time.Time `json:"startAt"`
  210. FinishedAt time.Time `json:"finishedAt"`
  211. ExitCode int `json:"exitCode"`
  212. ExitDiagnostics string `json:"exitDiagnostics"`
  213. RetriedCount int `json:"retriedCount"`
  214. StartTime string
  215. FinishedTime string
  216. }
  217. type TaskInfo struct {
  218. Username string `json:"username"`
  219. TaskName string `json:"task_name"`
  220. CodeName string `json:"code_name"`
  221. BenchmarkCategory []string `json:"selected_category"`
  222. CodeLink string `json:"code_link"`
  223. GpuType string `json:"gpu_type"`
  224. }
  225. func ConvertToTaskPod(input map[string]interface{}) (TaskPod, error) {
  226. data, _ := json.Marshal(input)
  227. var taskPod TaskPod
  228. err := json.Unmarshal(data, &taskPod)
  229. taskPod.TaskStatuses[0].StartTime = time.Unix(taskPod.TaskStatuses[0].StartAt.Unix()+8*3600, 0).UTC().Format("2006-01-02 15:04:05")
  230. taskPod.TaskStatuses[0].FinishedTime = time.Unix(taskPod.TaskStatuses[0].FinishedAt.Unix()+8*3600, 0).UTC().Format("2006-01-02 15:04:05")
  231. //if the task is not finished or stopped,the cloudbrain renturns 0001-01-01 08:00:00, the finishedTime shows with -
  232. if strings.HasPrefix(taskPod.TaskStatuses[0].FinishedTime, "0001") {
  233. taskPod.TaskStatuses[0].FinishedTime = "-"
  234. }
  235. return taskPod, err
  236. }
  237. type JobResultPayload struct {
  238. ID string `json:"id"`
  239. Name string `json:"name"`
  240. Platform string `json:"platform"`
  241. JobStatus struct {
  242. Username string `json:"username"`
  243. State string `json:"state"`
  244. SubState string `json:"subState"`
  245. ExecutionType string `json:"executionType"`
  246. Retries int `json:"retries"`
  247. CreatedTime int64 `json:"createdTime"`
  248. CompletedTime int64 `json:"completedTime"`
  249. AppID string `json:"appId"`
  250. AppProgress string `json:"appProgress"`
  251. AppTrackingURL string `json:"appTrackingUrl"`
  252. AppLaunchedTime int64 `json:"appLaunchedTime"`
  253. AppCompletedTime interface{} `json:"appCompletedTime"`
  254. AppExitCode int `json:"appExitCode"`
  255. AppExitDiagnostics string `json:"appExitDiagnostics"`
  256. AppExitType interface{} `json:"appExitType"`
  257. VirtualCluster string `json:"virtualCluster"`
  258. StartTime string
  259. EndTime string
  260. } `json:"jobStatus"`
  261. TaskRoles map[string]interface{} `json:"taskRoles"`
  262. Resource struct {
  263. CPU int `json:"cpu"`
  264. Memory string `json:"memory"`
  265. NvidiaComGpu int `json:"nvidia.com/gpu"`
  266. } `json:"resource"`
  267. Config struct {
  268. Image string `json:"image"`
  269. JobID string `json:"jobId"`
  270. GpuType string `json:"gpuType"`
  271. JobName string `json:"jobName"`
  272. JobType string `json:"jobType"`
  273. TaskRoles []struct {
  274. Name string `json:"name"`
  275. ShmMB int `json:"shmMB"`
  276. Command string `json:"command"`
  277. MemoryMB int `json:"memoryMB"`
  278. CPUNumber int `json:"cpuNumber"`
  279. GpuNumber int `json:"gpuNumber"`
  280. IsMainRole bool `json:"isMainRole"`
  281. TaskNumber int `json:"taskNumber"`
  282. NeedIBDevice bool `json:"needIBDevice"`
  283. MinFailedTaskCount int `json:"minFailedTaskCount"`
  284. MinSucceededTaskCount int `json:"minSucceededTaskCount"`
  285. } `json:"taskRoles"`
  286. RetryCount int `json:"retryCount"`
  287. } `json:"config"`
  288. Userinfo struct {
  289. User string `json:"user"`
  290. OrgID string `json:"org_id"`
  291. } `json:"userinfo"`
  292. }
  293. func ConvertToJobResultPayload(input map[string]interface{}) (JobResultPayload, error) {
  294. data, _ := json.Marshal(input)
  295. var jobResultPayload JobResultPayload
  296. err := json.Unmarshal(data, &jobResultPayload)
  297. jobResultPayload.JobStatus.StartTime = time.Unix(jobResultPayload.JobStatus.CreatedTime/1000, 0).Format("2006-01-02 15:04:05")
  298. jobResultPayload.JobStatus.EndTime = time.Unix(jobResultPayload.JobStatus.CompletedTime/1000, 0).Format("2006-01-02 15:04:05")
  299. if jobResultPayload.JobStatus.State == string(JobWaiting) {
  300. jobResultPayload.JobStatus.StartTime = "-"
  301. jobResultPayload.JobStatus.EndTime = "-"
  302. }
  303. return jobResultPayload, err
  304. }
  305. type ImagesResultPayload struct {
  306. Images []struct {
  307. ID int `json:"id"`
  308. Name string `json:"name"`
  309. Place string `json:"place"`
  310. Description string `json:"description"`
  311. Provider string `json:"provider"`
  312. Createtime string `json:"createtime"`
  313. Remark string `json:"remark"`
  314. } `json:"taskStatuses"`
  315. }
  316. type ImageInfo struct {
  317. ID int `json:"id"`
  318. Name string `json:"name"`
  319. Place string `json:"place"`
  320. Description string `json:"description"`
  321. Provider string `json:"provider"`
  322. Createtime string `json:"createtime"`
  323. Remark string `json:"remark"`
  324. IsPublic int `json:"isPublic"`
  325. PlaceView string
  326. }
  327. type Categories struct {
  328. Category []*Category `json:"category"`
  329. }
  330. type Category struct {
  331. Id int `json:"id"`
  332. Value string `json:"value"`
  333. }
  334. type GpuInfos struct {
  335. GpuInfo []*GpuInfo `json:"gpu_type"`
  336. }
  337. type GpuInfo struct {
  338. Id int `json:"id"`
  339. Value string `json:"value"`
  340. Queue string `json:"queue"`
  341. }
  342. type ResourceSpecs struct {
  343. ResourceSpec []*ResourceSpec `json:"resorce_specs"`
  344. }
  345. type ResourceSpec struct {
  346. Id int `json:"id"`
  347. CpuNum int `json:"cpu"`
  348. GpuNum int `json:"gpu"`
  349. MemMiB int `json:"memMiB"`
  350. ShareMemMiB int `json:"shareMemMiB"`
  351. }
  352. type FlavorInfos struct {
  353. FlavorInfo []*FlavorInfo `json:"flavor_info"`
  354. }
  355. type FlavorInfo struct {
  356. Id int `json:"id"`
  357. Value string `json:"value"`
  358. Desc string `json:"desc"`
  359. }
  360. type PoolInfos struct {
  361. PoolInfo []*PoolInfo `json:"pool_info"`
  362. }
  363. type PoolInfo struct {
  364. PoolId string `json:"pool_id"`
  365. PoolName string `json:"pool_name"`
  366. PoolType string `json:"pool_type"`
  367. }
  368. type CommitImageParams struct {
  369. Ip string `json:"ip"`
  370. TaskContainerId string `json:"taskContainerId"`
  371. ImageTag string `json:"imageTag"`
  372. ImageDescription string `json:"imageDescription"`
  373. }
  374. type CommitImageResult struct {
  375. Code string `json:"code"`
  376. Msg string `json:"msg"`
  377. Payload map[string]interface{} `json:"payload"`
  378. }
  379. type CloudBrainResult struct {
  380. Code string `json:"code"`
  381. Msg string `json:"msg"`
  382. }
  383. type CreateNotebookParams struct {
  384. JobName string `json:"name"`
  385. Description string `json:"description"`
  386. ProfileID string `json:"profile_id"`
  387. Flavor string `json:"flavor"`
  388. Spec Spec `json:"spec"`
  389. Workspace Workspace `json:"workspace"`
  390. Pool Pool `json:"pool"`
  391. }
  392. type Pool struct {
  393. ID string `json:"id"`
  394. Name string `json:"name"`
  395. Type string `json:"type"`
  396. }
  397. type Workspace struct {
  398. ID string `json:"id"`
  399. }
  400. type Spec struct {
  401. Storage Storage `json:"storage"`
  402. AutoStop AutoStop `json:"auto_stop"`
  403. }
  404. type AutoStop struct {
  405. Enable bool `json:"enable"`
  406. Duration int `json:"duration"`
  407. }
  408. type Storage struct {
  409. Type string `json:"type"`
  410. Location Location `json:"location"`
  411. }
  412. type Location struct {
  413. Path string `json:"path"`
  414. }
  415. type NotebookResult struct {
  416. ErrorCode string `json:"error_code"`
  417. ErrorMsg string `json:"error_msg"`
  418. }
  419. type CreateNotebookResult struct {
  420. ErrorCode string `json:"error_code"`
  421. ErrorMsg string `json:"error_msg"`
  422. ID string `json:"id"`
  423. Name string `json:"name"`
  424. Description string `json:"description"`
  425. Status string `json:"status"`
  426. CreationTimestamp string `json:"creation_timestamp"`
  427. LatestUpdateTimestamp string `json:"latest_update_timestamp"`
  428. Profile struct {
  429. ID string `json:"id"`
  430. Name string `json:"name"`
  431. Description string `json:"description"`
  432. DeType string `json:"de_type"`
  433. FlavorType string `json:"flavor_type"`
  434. } `json:"profile"`
  435. Flavor string `json:"flavor"`
  436. FlavorDetails struct {
  437. Name string `json:"name"`
  438. Status string `json:"status"`
  439. QueuingNum int `json:"queuing_num"`
  440. QueueLeftTime int `json:"queue_left_time"` //s
  441. Duration int `json:"duration"` //auto_stop_time s
  442. } `json:"flavor_details"`
  443. }
  444. type GetNotebookResult struct {
  445. ErrorCode string `json:"error_code"`
  446. ErrorMsg string `json:"error_msg"`
  447. ID string `json:"id"`
  448. Name string `json:"name"`
  449. Description string `json:"description"`
  450. Status string `json:"status"`
  451. CreationTimestamp string `json:"creation_timestamp"`
  452. CreateTime string
  453. LatestUpdateTimestamp string `json:"latest_update_timestamp"`
  454. LatestUpdateTime string
  455. Profile struct {
  456. ID string `json:"id"`
  457. Name string `json:"name"`
  458. Description string `json:"description"`
  459. DeType string `json:"de_type"`
  460. FlavorType string `json:"flavor_type"`
  461. } `json:"profile"`
  462. Flavor string `json:"flavor"`
  463. FlavorDetails struct {
  464. Name string `json:"name"`
  465. Status string `json:"status"`
  466. QueuingNum int `json:"queuing_num"`
  467. QueueLeftTime int `json:"queue_left_time"` //s
  468. Duration int `json:"duration"` //auto_stop_time s
  469. } `json:"flavor_details"`
  470. QueuingInfo struct {
  471. ID string `json:"id"`
  472. Name string `json:"name"`
  473. Flavor string `json:"flavor"`
  474. DeType string `json:"de_type"`
  475. Status string `json:"status"`
  476. BeginTimestamp int `json:"begin_timestamp"` //time of instance begin in queue
  477. BeginTime string
  478. RemainTime int `json:"remain_time"` //remain time of instance
  479. EndTimestamp int `json:"end_timestamp"` //
  480. EndTime string
  481. Rank int `json:"rank"` //rank of instance in queue
  482. } `json:"queuing_info"`
  483. Spec struct {
  484. Annotations struct {
  485. TargetDomain string `json:"target_domain"`
  486. Url string `json:"url"`
  487. } `json:"annotations"`
  488. } `json:"spec"`
  489. }
  490. type GetTokenParams struct {
  491. Auth Auth `json:"auth"`
  492. }
  493. type Auth struct {
  494. Identity Identity `json:"identity"`
  495. Scope Scope `json:"scope"`
  496. }
  497. type Scope struct {
  498. Project Project `json:"project"`
  499. }
  500. type Project struct {
  501. Name string `json:"name"`
  502. }
  503. type Identity struct {
  504. Methods []string `json:"methods"`
  505. Password Password `json:"password"`
  506. }
  507. type Password struct {
  508. User NotebookUser `json:"user"`
  509. }
  510. type NotebookUser struct {
  511. Name string `json:"name"`
  512. Password string `json:"password"`
  513. Domain Domain `json:"domain"`
  514. }
  515. type Domain struct {
  516. Name string `json:"name"`
  517. }
  518. const (
  519. ActionStart = "start"
  520. ActionStop = "stop"
  521. ActionRestart = "restart"
  522. ActionQueue = "queue"
  523. ActionDequeue = "dequeue"
  524. )
  525. type NotebookAction struct {
  526. Action string `json:"action"`
  527. }
  528. type NotebookActionResult struct {
  529. ErrorCode string `json:"error_code"`
  530. ErrorMsg string `json:"error_msg"`
  531. CurrentStatus string `json:"current_status"`
  532. PreviousState string `json:"previous_state"`
  533. }
  534. type NotebookGetJobTokenResult struct {
  535. ErrorCode string `json:"error_code"`
  536. ErrorMsg string `json:"error_msg"`
  537. Token string `json:"token"`
  538. }
  539. type NotebookDelResult struct {
  540. InstanceID string `json:"instance_id"`
  541. }
  542. type CreateTrainJobParams struct {
  543. JobName string `json:"job_name"`
  544. Description string `json:"job_desc"`
  545. Config Config `json:"config"`
  546. WorkspaceID string `json:"workspace_id"`
  547. }
  548. type Config struct {
  549. WorkServerNum int `json:"worker_server_num"`
  550. AppUrl string `json:"app_url"` //训练作业的代码目录
  551. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  552. Parameter []Parameter `json:"parameter"`
  553. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  554. //DatasetID string `json:"dataset_id"`
  555. //DataVersionID string `json:"dataset_version_id"`
  556. //DataSource []DataSource `json:"data_source"`
  557. //SpecID int64 `json:"spec_id"`
  558. EngineID int64 `json:"engine_id"`
  559. //ModelID int64 `json:"model_id"`
  560. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  561. LogUrl string `json:"log_url"`
  562. //UserImageUrl string `json:"user_image_url"`
  563. //UserCommand string `json:"user_command"`
  564. CreateVersion bool `json:"create_version"`
  565. //Volumes []Volumes `json:"volumes"`
  566. Flavor Flavor `json:"flavor"`
  567. PoolID string `json:"pool_id"`
  568. }
  569. type CreateTrainJobVersionParams struct {
  570. Description string `json:"job_desc"`
  571. Config TrainJobVersionConfig `json:"config"`
  572. }
  573. type TrainJobVersionConfig struct {
  574. WorkServerNum int `json:"worker_server_num"`
  575. AppUrl string `json:"app_url"` //训练作业的代码目录
  576. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  577. Parameter []Parameter `json:"parameter"`
  578. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  579. //DatasetID string `json:"dataset_id"`
  580. //DataVersionID string `json:"dataset_version_id"`
  581. //DataSource []DataSource `json:"data_source"`
  582. //SpecID int64 `json:"spec_id"`
  583. EngineID int64 `json:"engine_id"`
  584. //ModelID int64 `json:"model_id"`
  585. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  586. LogUrl string `json:"log_url"`
  587. //UserImageUrl string `json:"user_image_url"`
  588. //UserCommand string `json:"user_command"`
  589. //Volumes []Volumes `json:"volumes"`
  590. Flavor Flavor `json:"flavor"`
  591. PoolID string `json:"pool_id"`
  592. PreVersionId int64 `json:"pre_version_id"`
  593. }
  594. type CreateConfigParams struct {
  595. ConfigName string `json:"config_name"`
  596. Description string `json:"config_desc"`
  597. WorkServerNum int `json:"worker_server_num"`
  598. AppUrl string `json:"app_url"` //训练作业的代码目录
  599. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  600. Parameter []Parameter `json:"parameter"`
  601. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  602. //DatasetID string `json:"dataset_id"`
  603. //DataVersionID string `json:"dataset_version_id"`
  604. //DataSource []DataSource `json:"data_source"`
  605. //SpecID int64 `json:"spec_id"`
  606. EngineID int64 `json:"engine_id"`
  607. //ModelID int64 `json:"model_id"`
  608. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  609. LogUrl string `json:"log_url"`
  610. //UserImageUrl string `json:"user_image_url"`
  611. //UserCommand string `json:"user_command"`
  612. //CreateVersion bool `json:"create_version"`
  613. //Volumes []Volumes `json:"volumes"`
  614. Flavor Flavor `json:"flavor"`
  615. PoolID string `json:"pool_id"`
  616. }
  617. type Parameter struct {
  618. Label string `json:"label"`
  619. Value string `json:"value"`
  620. }
  621. type Parameters struct {
  622. Parameter []Parameter `json:"parameter"`
  623. }
  624. type DataSource struct {
  625. DatasetID string `json:"dataset_id"`
  626. DatasetVersion string `json:"dataset_version"`
  627. Type string `json:"type"`
  628. DataUrl string `json:"data_url"`
  629. }
  630. type Volumes struct {
  631. Nfs Nfs `json:"nfs"`
  632. HostPath HostPath `json:"host_path"`
  633. }
  634. type Nfs struct {
  635. ID string `json:"id"`
  636. SourcePath string `json:"src_path"`
  637. DestPath string `json:"dest_path"`
  638. ReadOnly bool `json:"read_only"`
  639. }
  640. type HostPath struct {
  641. SourcePath string `json:"src_path"`
  642. DestPath string `json:"dest_path"`
  643. ReadOnly bool `json:"read_only"`
  644. }
  645. type Flavor struct {
  646. Code string `json:"code"`
  647. }
  648. type CreateTrainJobResult struct {
  649. ErrorCode string `json:"error_code"`
  650. ErrorMsg string `json:"error_msg"`
  651. IsSuccess bool `json:"is_success"`
  652. JobName string `json:"job_name"`
  653. JobID int64 `json:"job_id"`
  654. Status int `json:"status"`
  655. CreateTime int64 `json:"create_time"`
  656. VersionID int64 `json:"version_id"`
  657. ResourceID string `json:"resource_id"`
  658. VersionName string `json:"version_name"`
  659. }
  660. type CreateTrainJobConfigResult struct {
  661. ErrorCode string `json:"error_code"`
  662. ErrorMsg string `json:"error_msg"`
  663. IsSuccess bool `json:"is_success"`
  664. }
  665. type GetResourceSpecsResult struct {
  666. ErrorCode string `json:"error_code"`
  667. ErrorMsg string `json:"error_msg"`
  668. IsSuccess bool `json:"is_success"`
  669. SpecTotalCount int `json:"spec_total_count"`
  670. Specs []Specs `json:"specs"`
  671. }
  672. type Specs struct {
  673. Core string `json:"core"`
  674. Cpu string `json:"cpu"`
  675. IsNoResource bool `json:"no_resource"`
  676. GpuType string `json:"gpu_type"`
  677. SpecID int64 `json:"spec_id"`
  678. GpuNum int `json:"gpu_num"`
  679. SpecCode string `json:"spec_code"`
  680. Storage string `json:"storage"`
  681. MaxNum int `json:"max_num"`
  682. UnitNum int `json:"unit_num"`
  683. InterfaceType int `json:"interface_type"`
  684. }
  685. type GetConfigListResult struct {
  686. ErrorCode string `json:"error_code"`
  687. ErrorMsg string `json:"error_msg"`
  688. IsSuccess bool `json:"is_success"`
  689. ConfigTotalCount int `json:"config_total_count"`
  690. ParaConfigs []ParaConfig `json:"configs"`
  691. }
  692. type ParaConfig struct {
  693. ConfigName string `json:"config_name"`
  694. ConfigDesc string `json:"config_desc"`
  695. CreateTime int64 `json:"create_time"`
  696. EngineType int `json:"engine_type"`
  697. EngineName string `json:"engine_name"`
  698. EngineId int64 `json:"engine_id"`
  699. EngineVersion string `json:"engine_version"`
  700. UserImageUrl string `json:"user_image_url"`
  701. UserCommand string `json:"user_command"`
  702. Result GetConfigResult
  703. }
  704. type GetConfigResult struct {
  705. ErrorCode string `json:"error_code"`
  706. ErrorMsg string `json:"error_msg"`
  707. IsSuccess bool `json:"is_success"`
  708. ConfigName string `json:"config_name"`
  709. Description string `json:"config_desc"`
  710. WorkServerNum int `json:"worker_server_num"`
  711. AppUrl string `json:"app_url"` //训练作业的代码目录
  712. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  713. Parameter []Parameter `json:"parameter"`
  714. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  715. //DatasetID string `json:"dataset_id"`
  716. //DataVersionID string `json:"dataset_version_id"`
  717. //DataSource []DataSource `json:"data_source"`
  718. //SpecID int64 `json:"spec_id"`
  719. EngineID int64 `json:"engine_id"`
  720. //ModelID int64 `json:"model_id"`
  721. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  722. LogUrl string `json:"log_url"`
  723. //UserImageUrl string `json:"user_image_url"`
  724. //UserCommand string `json:"user_command"`
  725. //CreateVersion bool `json:"create_version"`
  726. //Volumes []Volumes `json:"volumes"`
  727. Flavor Flavor `json:"flavor"`
  728. PoolID string `json:"pool_id"`
  729. }
  730. type ErrorResult struct {
  731. ErrorCode string `json:"error_code"`
  732. ErrorMsg string `json:"error_message"`
  733. IsSuccess bool `json:"is_success"`
  734. }
  735. type GetTrainJobResult struct {
  736. IsSuccess bool `json:"is_success"`
  737. JobName string `json:"job_name"`
  738. JobID int64 `json:"job_id"`
  739. Description string `json:"job_desc"`
  740. IntStatus int `json:"status"`
  741. Status string
  742. LongCreateTime int64 `json:"create_time"`
  743. CreateTime string
  744. Duration int64 `json:"duration"` //训练作业的运行时间,单位为毫秒
  745. TrainJobDuration string //训练作业的运行时间,格式为hh:mm:ss
  746. VersionID int64 `json:"version_id"`
  747. ResourceID string `json:"resource_id"`
  748. VersionName string `json:"version_name"`
  749. PreVersionID int64 `json:"pre_version_id"`
  750. WorkServerNum int `json:"worker_server_num"`
  751. AppUrl string `json:"app_url"` //训练作业的代码目录
  752. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  753. Parameter []Parameter `json:"parameter"`
  754. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  755. //DatasetID string `json:"dataset_id"`
  756. //DataVersionID string `json:"dataset_version_id"`
  757. //DataSource []DataSource `json:"data_source"`
  758. //SpecID int64 `json:"spec_id"`
  759. EngineID int64 `json:"engine_id"`
  760. EngineName string `json:"engine_name"`
  761. EngineVersion string `json:"engine_version"`
  762. //ModelID int64 `json:"model_id"`
  763. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  764. LogUrl string `json:"log_url"`
  765. //UserImageUrl string `json:"user_image_url"`
  766. //UserCommand string `json:"user_command"`
  767. //Volumes []Volumes `json:"volumes"`
  768. Flavor Flavor `json:"flavor"`
  769. PoolID string `json:"pool_id"`
  770. PoolName string `json:"pool_name"`
  771. NasMountPath string `json:"nas_mount_path"`
  772. NasShareAddr string `json:"nas_share_addr"`
  773. DatasetName string
  774. ModelMetricList string `json:"model_metric_list"` //列表里包含f1_score,recall,precision,accuracy,若有的话
  775. }
  776. type GetTrainJobLogResult struct {
  777. ErrorCode string `json:"error_code"`
  778. ErrorMsg string `json:"error_msg"`
  779. IsSuccess bool `json:"is_success"`
  780. Content string `json:"content"`
  781. Lines int `json:"lines"`
  782. StartLine string `json:"start_line"`
  783. EndLine string `json:"end_line"`
  784. }
  785. type GetTrainJobLogFileNamesResult struct {
  786. ErrorCode string `json:"error_code"`
  787. ErrorMsg string `json:"error_msg"`
  788. IsSuccess bool `json:"is_success"`
  789. LogFileList []string `json:"log_file_list"`
  790. }
  791. type TrainJobResult struct {
  792. ErrorCode string `json:"error_code"`
  793. ErrorMsg string `json:"error_msg"`
  794. IsSuccess bool `json:"is_success"`
  795. }
  796. type LogFile struct {
  797. Name string
  798. }
  799. func Cloudbrains(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) {
  800. sess := x.NewSession()
  801. defer sess.Close()
  802. var cond = builder.NewCond()
  803. if opts.RepoID > 0 {
  804. cond = cond.And(
  805. builder.Eq{"cloudbrain.repo_id": opts.RepoID},
  806. )
  807. }
  808. if opts.UserID > 0 {
  809. cond = cond.And(
  810. builder.Eq{"cloudbrain.user_id": opts.UserID},
  811. )
  812. }
  813. if (opts.JobID) != "" {
  814. cond = cond.And(
  815. builder.Eq{"cloudbrain.job_id": opts.JobID},
  816. )
  817. }
  818. if (opts.Type) >= 0 {
  819. cond = cond.And(
  820. builder.Eq{"cloudbrain.type": opts.Type},
  821. )
  822. }
  823. if (opts.JobType) != "" {
  824. cond = cond.And(
  825. builder.Eq{"cloudbrain.job_type": opts.JobType},
  826. )
  827. }
  828. if (opts.IsLatestVersion) != "" {
  829. cond = cond.And(
  830. builder.Eq{"cloudbrain.is_latest_version": opts.IsLatestVersion},
  831. )
  832. }
  833. // switch opts.JobStatus {
  834. // case JobWaiting:
  835. // cond.And(builder.Eq{"cloudbrain.status": int(JobWaiting)})
  836. // case JobFailed:
  837. // cond.And(builder.Eq{"cloudbrain.status": int(JobFailed)})
  838. // case JobStopped:
  839. // cond.And(builder.Eq{"cloudbrain.status": int(JobStopped)})
  840. // case JobSucceeded:
  841. // cond.And(builder.Eq{"cloudbrain.status": int(JobSucceeded)})
  842. // }
  843. if len(opts.CloudbrainIDs) > 0 {
  844. cond = cond.And(builder.In("cloudbrain.id", opts.CloudbrainIDs))
  845. }
  846. count, err := sess.Where(cond).Count(new(Cloudbrain))
  847. if err != nil {
  848. return nil, 0, fmt.Errorf("Count: %v", err)
  849. }
  850. if opts.Page >= 0 && opts.PageSize > 0 {
  851. var start int
  852. if opts.Page == 0 {
  853. start = 0
  854. } else {
  855. start = (opts.Page - 1) * opts.PageSize
  856. }
  857. sess.Limit(opts.PageSize, start)
  858. }
  859. sess.OrderBy("cloudbrain.created_unix DESC")
  860. cloudbrains := make([]*CloudbrainInfo, 0, setting.UI.IssuePagingNum)
  861. if err := sess.Table(&Cloudbrain{}).Where(cond).
  862. Join("left", "`user`", "cloudbrain.user_id = `user`.id").
  863. Find(&cloudbrains); err != nil {
  864. return nil, 0, fmt.Errorf("Find: %v", err)
  865. }
  866. sess.Close()
  867. return cloudbrains, count, nil
  868. }
  869. func CloudbrainsVersionList(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int, error) {
  870. sess := x.NewSession()
  871. defer sess.Close()
  872. var cond = builder.NewCond()
  873. if opts.RepoID > 0 {
  874. cond = cond.And(
  875. builder.Eq{"cloudbrain.repo_id": opts.RepoID},
  876. )
  877. }
  878. if opts.UserID > 0 {
  879. cond = cond.And(
  880. builder.Eq{"cloudbrain.user_id": opts.UserID},
  881. )
  882. }
  883. if (opts.Type) >= 0 {
  884. cond = cond.And(
  885. builder.Eq{"cloudbrain.type": opts.Type},
  886. )
  887. }
  888. if (opts.JobID) != "" {
  889. cond = cond.And(
  890. builder.Eq{"cloudbrain.job_id": opts.JobID},
  891. )
  892. }
  893. if (opts.JobType) != "" {
  894. cond = cond.And(
  895. builder.Eq{"cloudbrain.job_type": opts.JobType},
  896. )
  897. }
  898. if len(opts.CloudbrainIDs) > 0 {
  899. cond = cond.And(builder.In("cloudbrain.id", opts.CloudbrainIDs))
  900. }
  901. count, err := sess.Where(cond).Count(new(Cloudbrain))
  902. if err != nil {
  903. return nil, 0, fmt.Errorf("Count: %v", err)
  904. }
  905. if opts.Page >= 0 && opts.PageSize > 0 {
  906. var start int
  907. if opts.Page == 0 {
  908. start = 0
  909. } else {
  910. start = (opts.Page - 1) * opts.PageSize
  911. }
  912. sess.Limit(opts.PageSize, start)
  913. }
  914. sess.OrderBy("cloudbrain.created_unix DESC")
  915. cloudbrains := make([]*CloudbrainInfo, 0, setting.UI.IssuePagingNum)
  916. if err := sess.Table(&Cloudbrain{}).Where(cond).
  917. Join("left", "`user`", "cloudbrain.user_id = `user`.id").
  918. Find(&cloudbrains); err != nil {
  919. return nil, 0, fmt.Errorf("Find: %v", err)
  920. }
  921. sess.Close()
  922. return cloudbrains, int(count), nil
  923. }
  924. func CreateCloudbrain(cloudbrain *Cloudbrain) (err error) {
  925. if _, err = x.Insert(cloudbrain); err != nil {
  926. return err
  927. }
  928. return nil
  929. }
  930. func CreateTrainjobConfigDetail(trainjobConfigDetail *TrainjobConfigDetail) (err error) {
  931. if _, err = x.Insert(trainjobConfigDetail); err != nil {
  932. return err
  933. }
  934. return nil
  935. }
  936. func getRepoCloudBrain(cb *Cloudbrain) (*Cloudbrain, error) {
  937. has, err := x.Get(cb)
  938. if err != nil {
  939. return nil, err
  940. } else if !has {
  941. return nil, ErrJobNotExist{}
  942. }
  943. return cb, nil
  944. }
  945. func GetRepoCloudBrainByJobID(repoID int64, jobID string) (*Cloudbrain, error) {
  946. cb := &Cloudbrain{JobID: jobID, RepoID: repoID}
  947. return getRepoCloudBrain(cb)
  948. }
  949. func GetRepoCloudBrainByJobIDAndVersionName(repoID int64, jobID string, versionName string) (*Cloudbrain, error) {
  950. cb := &Cloudbrain{JobID: jobID, RepoID: repoID, VersionName: versionName}
  951. return getRepoCloudBrain(cb)
  952. }
  953. func GetCloudbrainByJobID(jobID string) (*Cloudbrain, error) {
  954. cb := &Cloudbrain{JobID: jobID}
  955. return getRepoCloudBrain(cb)
  956. }
  957. func GetCloudbrainByJobIDAndVersionName(jobID string, versionName string) (*Cloudbrain, error) {
  958. cb := &Cloudbrain{JobID: jobID, VersionName: versionName}
  959. return getRepoCloudBrain(cb)
  960. }
  961. func GetCloudbrainByJobIDAndIsLatestVersion(jobID string, isLatestVersion string) (*Cloudbrain, error) {
  962. cb := &Cloudbrain{JobID: jobID, IsLatestVersion: isLatestVersion}
  963. return getRepoCloudBrain(cb)
  964. }
  965. func GetCloudbrainsNeededStopByUserID(userID int64) ([]*Cloudbrain, error) {
  966. cloudBrains := make([]*Cloudbrain, 0)
  967. err := x.Cols("job_id", "status", "type").Where("user_id=? AND status !=?", userID, string(JobStopped)).Find(&cloudBrains)
  968. return cloudBrains, err
  969. }
  970. func GetCloudbrainsNeededStopByRepoID(repoID int64) ([]*Cloudbrain, error) {
  971. cloudBrains := make([]*Cloudbrain, 0)
  972. err := x.Cols("job_id", "status", "type").Where("repo_id=? AND status !=?", repoID, string(JobStopped)).Find(&cloudBrains)
  973. return cloudBrains, err
  974. }
  975. func SetCloudbrainStatusByJobID(jobID string, status CloudbrainStatus) (err error) {
  976. cb := &Cloudbrain{JobID: jobID, Status: string(status)}
  977. _, err = x.Cols("status").Where("cloudbrain.job_id=?", jobID).Update(cb)
  978. return
  979. }
  980. func SetTrainJobStatusByJobID(jobID string, status string, duration int64, trainjobduration string) (err error) {
  981. cb := &Cloudbrain{JobID: jobID, Status: string(status), Duration: duration, TrainJobDuration: trainjobduration}
  982. _, err = x.Cols("status", "duration", "train_job_duration").Where("cloudbrain.job_id=?", jobID).Update(cb)
  983. return
  984. }
  985. func SetVersionCountAndLatestVersionByJobIDAndVersionName(jobID string, versionName string, versionCount int, isLatestVersion string, totalVersionCount int) (err error) {
  986. cb := &Cloudbrain{JobID: jobID, VersionName: versionName, VersionCount: versionCount, IsLatestVersion: isLatestVersion, TotalVersionCount: totalVersionCount}
  987. _, err = x.Cols("version_Count", "is_latest_version", "total_version_count").Where("cloudbrain.job_id=? AND cloudbrain.version_name=?", jobID, versionName).Update(cb)
  988. return
  989. }
  990. func UpdateJob(job *Cloudbrain) error {
  991. return updateJob(x, job)
  992. }
  993. func updateJob(e Engine, job *Cloudbrain) error {
  994. var sess *xorm.Session
  995. sess = e.Where("job_id = ?", job.JobID)
  996. _, err := sess.Cols("status", "train_job_duration", "container_id", "container_ip").Update(job)
  997. return err
  998. }
  999. // func UpdateTrainJob(job *CloudbrainInfo) error {
  1000. // return updateTrainJob(x, job)
  1001. // }
  1002. // func updateTrainJob(e Engine, job *CloudbrainInfo) error {
  1003. // var sess *xorm.Session
  1004. // sess = e.Where("job_id = ?", job.Cloudbrain.JobID)
  1005. // _, err := sess.Cols("status", "container_id", "container_ip").Update(job)
  1006. // return err
  1007. // }
  1008. func DeleteJob(job *Cloudbrain) error {
  1009. return deleteJob(x, job)
  1010. }
  1011. func deleteJob(e Engine, job *Cloudbrain) error {
  1012. _, err := e.ID(job.ID).Delete(job)
  1013. return err
  1014. }
  1015. func DeleteJobVersion(job *Cloudbrain) error {
  1016. return deleteJobVersion(x, job)
  1017. }
  1018. func deleteJobVersion(e Engine, job *Cloudbrain) error {
  1019. _, err := e.ID(job.ID).Delete(job)
  1020. return err
  1021. }
  1022. func GetCloudbrainByName(jobName string) (*Cloudbrain, error) {
  1023. cb := &Cloudbrain{JobName: jobName}
  1024. return getRepoCloudBrain(cb)
  1025. }
  1026. func CanDelJob(isSigned bool, user *User, job *CloudbrainInfo) bool {
  1027. if !isSigned || (job.Status != string(JobStopped) && job.Status != string(JobFailed) && job.Status != string(ModelArtsStartFailed) && job.Status != string(ModelArtsCreateFailed)) {
  1028. return false
  1029. }
  1030. repo, err := GetRepositoryByID(job.RepoID)
  1031. if err != nil {
  1032. log.Error("GetRepositoryByID failed:%v", err.Error())
  1033. return false
  1034. }
  1035. permission, _ := GetUserRepoPermission(repo, user)
  1036. if err != nil {
  1037. log.Error("GetUserRepoPermission failed:%v", err.Error())
  1038. return false
  1039. }
  1040. if (user.ID == job.UserID && permission.AccessMode >= AccessModeWrite) || user.IsAdmin || permission.AccessMode >= AccessModeAdmin {
  1041. return true
  1042. }
  1043. return false
  1044. }