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 38 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
5 years ago
4 years ago
4 years ago
4 years ago
5 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
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
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
5 years ago
4 years ago
3 years ago
5 years ago
3 years ago
5 years ago
3 years ago
3 years ago
3 years ago
5 years ago
4 years ago
3 years ago
3 years ago
4 years ago
4 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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176
  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. JobVersionName JobType = "V0001"
  28. ModelArtsCreateQueue ModelArtsJobStatus = "CREATE_QUEUING" //免费资源创建排队中
  29. ModelArtsCreating ModelArtsJobStatus = "CREATING" //创建中
  30. ModelArtsCreateFailed ModelArtsJobStatus = "CREATE_FAILED" //创建失败
  31. ModelArtsStartQueuing ModelArtsJobStatus = "START_QUEUING" //免费资源启动排队中
  32. ModelArtsReadyToStart ModelArtsJobStatus = "READY_TO_START" //免费资源等待启动
  33. ModelArtsStarting ModelArtsJobStatus = "STARTING" //启动中
  34. ModelArtsRestarting ModelArtsJobStatus = "RESTARTING" //重启中
  35. ModelArtsStartFailed ModelArtsJobStatus = "START_FAILED" //启动失败
  36. ModelArtsRunning ModelArtsJobStatus = "RUNNING" //运行中
  37. ModelArtsStopping ModelArtsJobStatus = "STOPPING" //停止中
  38. ModelArtsStopped ModelArtsJobStatus = "STOPPED" //停止
  39. ModelArtsUnavailable ModelArtsJobStatus = "UNAVAILABLE" //故障
  40. ModelArtsDeleted ModelArtsJobStatus = "DELETED" //已删除
  41. ModelArtsResizing ModelArtsJobStatus = "RESIZING" //规格变更中
  42. ModelArtsResizFailed ModelArtsJobStatus = "RESIZE_FAILED" //规格变更失败
  43. )
  44. type Cloudbrain struct {
  45. ID int64 `xorm:"pk autoincr"`
  46. JobID string `xorm:"INDEX NOT NULL"`
  47. JobType string `xorm:"INDEX NOT NULL DEFAULT 'DEBUG'"`
  48. JobName string `xorm:"INDEX"`
  49. Status string `xorm:"INDEX"`
  50. UserID int64 `xorm:"INDEX"`
  51. RepoID int64 `xorm:"INDEX"`
  52. SubTaskName string `xorm:"INDEX"`
  53. ContainerID string
  54. ContainerIp string
  55. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  56. UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
  57. Duration int64 `xorm:"INDEX duration"`
  58. TrainJobDuration string
  59. DeletedAt time.Time `xorm:"deleted"`
  60. CanDebug bool `xorm:"-"`
  61. CanDel bool `xorm:"-"`
  62. Type int `xorm:"INDEX DEFAULT 0"`
  63. VersionID int64 `xorm:"INDEX DEFAULT 0"`
  64. VersionName string `xorm:"INDEX"`
  65. Uuid string
  66. DatasetName string
  67. VersionCount int `xorm:"INDEX DEFAULT 1"`
  68. IsLatestVersion string
  69. CommitID string
  70. FatherVersionName string
  71. ComputeResource string
  72. EngineID int64
  73. TrainUrl string
  74. BranchName string
  75. Parameters string
  76. BootFile string
  77. DataUrl string
  78. LogUrl string
  79. PreVersionId int64
  80. FlavorCode string
  81. Description string
  82. WorkServerNumber int
  83. FlavorName string
  84. EngineName string
  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) (err error) {
  986. cb := &Cloudbrain{JobID: jobID, VersionName: versionName, VersionCount: versionCount, IsLatestVersion: isLatestVersion}
  987. _, err = x.Cols("version_Count", "is_latest_version").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", "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 GetCloudbrainByName(jobName string) (*Cloudbrain, error) {
  1016. cb := &Cloudbrain{JobName: jobName}
  1017. return getRepoCloudBrain(cb)
  1018. }
  1019. func CanDelJob(isSigned bool, user *User, job *CloudbrainInfo) bool {
  1020. if !isSigned || (job.Status != string(JobStopped) && job.Status != string(JobFailed) && job.Status != string(ModelArtsStartFailed) && job.Status != string(ModelArtsCreateFailed)) {
  1021. return false
  1022. }
  1023. repo, err := GetRepositoryByID(job.RepoID)
  1024. if err != nil {
  1025. log.Error("GetRepositoryByID failed:%v", err.Error())
  1026. return false
  1027. }
  1028. permission, _ := GetUserRepoPermission(repo, user)
  1029. if err != nil {
  1030. log.Error("GetUserRepoPermission failed:%v", err.Error())
  1031. return false
  1032. }
  1033. if (user.ID == job.UserID && permission.AccessMode >= AccessModeWrite) || user.IsAdmin || permission.AccessMode >= AccessModeAdmin {
  1034. return true
  1035. }
  1036. return false
  1037. }