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 37 kB

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