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 22 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
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 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
5 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
5 years ago
5 years ago
4 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
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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719
  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. ModelArtsCreateQueue ModelArtsJobStatus = "CREATE_QUEUING" //免费资源创建排队中
  27. ModelArtsCreating ModelArtsJobStatus = "CREATING" //创建中
  28. ModelArtsCreateFailed ModelArtsJobStatus = "CREATE_FAILED" //创建失败
  29. ModelArtsStartQueuing ModelArtsJobStatus = "START_QUEUING" //免费资源启动排队中
  30. ModelArtsReadyToStart ModelArtsJobStatus = "READY_TO_START" //免费资源等待启动
  31. ModelArtsStarting ModelArtsJobStatus = "STARTING" //启动中
  32. ModelArtsRestarting ModelArtsJobStatus = "RESTARTING" //重启中
  33. ModelArtsStartFailed ModelArtsJobStatus = "START_FAILED" //启动失败
  34. ModelArtsRunning ModelArtsJobStatus = "RUNNING" //运行中
  35. ModelArtsStopping ModelArtsJobStatus = "STOPPING" //停止中
  36. ModelArtsStopped ModelArtsJobStatus = "STOPPED" //停止
  37. ModelArtsUnavailable ModelArtsJobStatus = "UNAVAILABLE" //故障
  38. ModelArtsDeleted ModelArtsJobStatus = "DELETED" //已删除
  39. ModelArtsResizing ModelArtsJobStatus = "RESIZING" //规格变更中
  40. ModelArtsResizFailed ModelArtsJobStatus = "RESIZE_FAILED" //规格变更失败
  41. )
  42. type Cloudbrain struct {
  43. ID int64 `xorm:"pk autoincr"`
  44. JobID string `xorm:"INDEX NOT NULL"`
  45. JobType string `xorm:"INDEX NOT NULL DEFAULT 'DEBUG'"`
  46. JobName string `xorm:"INDEX"`
  47. Status string `xorm:"INDEX"`
  48. UserID int64 `xorm:"INDEX"`
  49. RepoID int64 `xorm:"INDEX"`
  50. SubTaskName string `xorm:"INDEX"`
  51. ContainerID string
  52. ContainerIp string
  53. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  54. UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
  55. DeletedAt time.Time `xorm:"deleted"`
  56. CanDebug bool `xorm:"-"`
  57. CanDel bool `xorm:"-"`
  58. Type int `xorm:"INDEX DEFAULT 0"`
  59. User *User `xorm:"-"`
  60. Repo *Repository `xorm:"-"`
  61. }
  62. type CloudbrainInfo struct {
  63. Cloudbrain `xorm:"extends"`
  64. User `xorm:"extends"`
  65. }
  66. type CloudBrainLoginResult struct {
  67. Code string
  68. Msg string
  69. Payload map[string]interface{}
  70. }
  71. type TaskRole struct {
  72. Name string `json:"name"`
  73. TaskNumber int `json:"taskNumber"`
  74. MinSucceededTaskCount int `json:"minSucceededTaskCount"`
  75. MinFailedTaskCount int `json:"minFailedTaskCount"`
  76. CPUNumber int `json:"cpuNumber"`
  77. GPUNumber int `json:"gpuNumber"`
  78. MemoryMB int `json:"memoryMB"`
  79. ShmMB int `json:"shmMB"`
  80. Command string `json:"command"`
  81. NeedIBDevice bool `json:"needIBDevice"`
  82. IsMainRole bool `json:"isMainRole"`
  83. UseNNI bool `json:"useNNI"`
  84. }
  85. type StHostPath struct {
  86. Path string `json:"path"`
  87. MountPath string `json:"mountPath"`
  88. ReadOnly bool `json:"readOnly"`
  89. }
  90. type Volume struct {
  91. HostPath StHostPath `json:"hostPath"`
  92. }
  93. type CreateJobParams struct {
  94. JobName string `json:"jobName"`
  95. RetryCount int8 `json:"retryCount"`
  96. GpuType string `json:"gpuType"`
  97. Image string `json:"image"`
  98. TaskRoles []TaskRole `json:"taskRoles"`
  99. Volumes []Volume `json:"volumes"`
  100. }
  101. type CreateJobResult struct {
  102. Code string `json:"code"`
  103. Msg string `json:"msg"`
  104. Payload map[string]interface{} `json:"payload"`
  105. }
  106. type GetJobResult struct {
  107. Code string `json:"code"`
  108. Msg string `json:"msg"`
  109. Payload map[string]interface{} `json:"payload"`
  110. }
  111. type GetImagesResult struct {
  112. Code string `json:"code"`
  113. Msg string `json:"msg"`
  114. Payload GetImagesPayload `json:"payload"`
  115. }
  116. type GetImagesPayload struct {
  117. Count int `json:"count"`
  118. TotalPages int `json:"totalPages,omitempty"`
  119. ImageInfo []*ImageInfo `json:"rows"`
  120. }
  121. type CloudbrainsOptions struct {
  122. ListOptions
  123. RepoID int64 // include all repos if empty
  124. UserID int64
  125. JobID int64
  126. SortType string
  127. CloudbrainIDs []int64
  128. // JobStatus CloudbrainStatus
  129. Type int
  130. }
  131. type TaskPod struct {
  132. TaskRoleStatus struct {
  133. Name string `json:"name"`
  134. } `json:"taskRoleStatus"`
  135. //TaskStatuses []struct {
  136. // TaskIndex int `json:"taskIndex"`
  137. // PodUID string `json:"podUid"`
  138. // PodIP string `json:"podIp"`
  139. // PodName string `json:"podName"`
  140. // ContainerID string `json:"containerId"`
  141. // ContainerIP string `json:"containerIp"`
  142. // ContainerGpus string `json:"containerGpus"`
  143. // State string `json:"state"`
  144. // StartAt time.Time `json:"startAt"`
  145. // FinishedAt time.Time `json:"finishedAt"`
  146. // ExitCode int `json:"exitCode"`
  147. // ExitDiagnostics string `json:"exitDiagnostics"`
  148. // RetriedCount int `json:"retriedCount"`
  149. // StartTime string
  150. // FinishedTime string
  151. //} `json:"taskStatuses"`
  152. TaskStatuses []TaskStatuses `json:"taskStatuses"`
  153. }
  154. type TaskStatuses struct {
  155. TaskIndex int `json:"taskIndex"`
  156. PodUID string `json:"podUid"`
  157. PodIP string `json:"podIp"`
  158. PodName string `json:"podName"`
  159. ContainerID string `json:"containerId"`
  160. ContainerIP string `json:"containerIp"`
  161. ContainerGpus string `json:"containerGpus"`
  162. State string `json:"state"`
  163. StartAt time.Time `json:"startAt"`
  164. FinishedAt time.Time `json:"finishedAt"`
  165. ExitCode int `json:"exitCode"`
  166. ExitDiagnostics string `json:"exitDiagnostics"`
  167. RetriedCount int `json:"retriedCount"`
  168. StartTime string
  169. FinishedTime string
  170. }
  171. type TaskInfo struct {
  172. Username string `json:"username"`
  173. TaskName string `json:"task_name"`
  174. CodeName string `json:"code_name"`
  175. BenchmarkCategory []string `json:"selected_category"`
  176. CodeLink string `json:"code_link"`
  177. GpuType string `json:"gpu_type"`
  178. }
  179. func ConvertToTaskPod(input map[string]interface{}) (TaskPod, error) {
  180. data, _ := json.Marshal(input)
  181. var taskPod TaskPod
  182. err := json.Unmarshal(data, &taskPod)
  183. taskPod.TaskStatuses[0].StartTime = time.Unix(taskPod.TaskStatuses[0].StartAt.Unix()+8*3600, 0).UTC().Format("2006-01-02 15:04:05")
  184. taskPod.TaskStatuses[0].FinishedTime = time.Unix(taskPod.TaskStatuses[0].FinishedAt.Unix()+8*3600, 0).UTC().Format("2006-01-02 15:04:05")
  185. //if the task is not finished or stopped,the cloudbrain renturns 0001-01-01 08:00:00, the finishedTime shows with -
  186. if strings.HasPrefix(taskPod.TaskStatuses[0].FinishedTime, "0001") {
  187. taskPod.TaskStatuses[0].FinishedTime = "-"
  188. }
  189. return taskPod, err
  190. }
  191. type JobResultPayload struct {
  192. ID string `json:"id"`
  193. Name string `json:"name"`
  194. Platform string `json:"platform"`
  195. JobStatus struct {
  196. Username string `json:"username"`
  197. State string `json:"state"`
  198. SubState string `json:"subState"`
  199. ExecutionType string `json:"executionType"`
  200. Retries int `json:"retries"`
  201. CreatedTime int64 `json:"createdTime"`
  202. CompletedTime int64 `json:"completedTime"`
  203. AppID string `json:"appId"`
  204. AppProgress string `json:"appProgress"`
  205. AppTrackingURL string `json:"appTrackingUrl"`
  206. AppLaunchedTime int64 `json:"appLaunchedTime"`
  207. AppCompletedTime interface{} `json:"appCompletedTime"`
  208. AppExitCode int `json:"appExitCode"`
  209. AppExitDiagnostics string `json:"appExitDiagnostics"`
  210. AppExitType interface{} `json:"appExitType"`
  211. VirtualCluster string `json:"virtualCluster"`
  212. StartTime string
  213. EndTime string
  214. } `json:"jobStatus"`
  215. TaskRoles map[string]interface{} `json:"taskRoles"`
  216. Resource struct {
  217. CPU int `json:"cpu"`
  218. Memory string `json:"memory"`
  219. NvidiaComGpu int `json:"nvidia.com/gpu"`
  220. } `json:"resource"`
  221. Config struct {
  222. Image string `json:"image"`
  223. JobID string `json:"jobId"`
  224. GpuType string `json:"gpuType"`
  225. JobName string `json:"jobName"`
  226. JobType string `json:"jobType"`
  227. TaskRoles []struct {
  228. Name string `json:"name"`
  229. ShmMB int `json:"shmMB"`
  230. Command string `json:"command"`
  231. MemoryMB int `json:"memoryMB"`
  232. CPUNumber int `json:"cpuNumber"`
  233. GpuNumber int `json:"gpuNumber"`
  234. IsMainRole bool `json:"isMainRole"`
  235. TaskNumber int `json:"taskNumber"`
  236. NeedIBDevice bool `json:"needIBDevice"`
  237. MinFailedTaskCount int `json:"minFailedTaskCount"`
  238. MinSucceededTaskCount int `json:"minSucceededTaskCount"`
  239. } `json:"taskRoles"`
  240. RetryCount int `json:"retryCount"`
  241. } `json:"config"`
  242. Userinfo struct {
  243. User string `json:"user"`
  244. OrgID string `json:"org_id"`
  245. } `json:"userinfo"`
  246. }
  247. func ConvertToJobResultPayload(input map[string]interface{}) (JobResultPayload, error) {
  248. data, _ := json.Marshal(input)
  249. var jobResultPayload JobResultPayload
  250. err := json.Unmarshal(data, &jobResultPayload)
  251. jobResultPayload.JobStatus.StartTime = time.Unix(jobResultPayload.JobStatus.CreatedTime/1000, 0).Format("2006-01-02 15:04:05")
  252. jobResultPayload.JobStatus.EndTime = time.Unix(jobResultPayload.JobStatus.CompletedTime/1000, 0).Format("2006-01-02 15:04:05")
  253. if jobResultPayload.JobStatus.State == string(JobWaiting) {
  254. jobResultPayload.JobStatus.StartTime = "-"
  255. jobResultPayload.JobStatus.EndTime = "-"
  256. }
  257. return jobResultPayload, err
  258. }
  259. type ImagesResultPayload struct {
  260. Images []struct {
  261. ID int `json:"id"`
  262. Name string `json:"name"`
  263. Place string `json:"place"`
  264. Description string `json:"description"`
  265. Provider string `json:"provider"`
  266. Createtime string `json:"createtime"`
  267. Remark string `json:"remark"`
  268. } `json:"taskStatuses"`
  269. }
  270. type ImageInfo struct {
  271. ID int `json:"id"`
  272. Name string `json:"name"`
  273. Place string `json:"place"`
  274. Description string `json:"description"`
  275. Provider string `json:"provider"`
  276. Createtime string `json:"createtime"`
  277. Remark string `json:"remark"`
  278. IsPublic int `json:"isPublic"`
  279. PlaceView string
  280. }
  281. type Categories struct {
  282. Category []*Category `json:"category"`
  283. }
  284. type Category struct {
  285. Id int `json:"id"`
  286. Value string `json:"value"`
  287. }
  288. type GpuInfos struct {
  289. GpuInfo []*GpuInfo `json:"gpu_type"`
  290. }
  291. type GpuInfo struct {
  292. Id int `json:"id"`
  293. Value string `json:"value"`
  294. Queue string `json:"queue"`
  295. }
  296. type ResourceSpecs struct {
  297. ResourceSpec []*ResourceSpec `json:"resorce_specs"`
  298. }
  299. type ResourceSpec struct {
  300. Id int `json:"id"`
  301. CpuNum int `json:"cpu"`
  302. GpuNum int `json:"gpu"`
  303. MemMiB int `json:"memMiB"`
  304. ShareMemMiB int `json:"shareMemMiB"`
  305. }
  306. type FlavorInfos struct {
  307. FlavorInfo []*FlavorInfo `json:"flavor_info"`
  308. }
  309. type FlavorInfo struct {
  310. Id int `json:"id"`
  311. Value string `json:"value"`
  312. }
  313. type PoolInfos struct {
  314. PoolInfo []*PoolInfo `json:"pool_info"`
  315. }
  316. type PoolInfo struct {
  317. PoolId string `json:"pool_id"`
  318. PoolName string `json:"pool_name"`
  319. PoolType string `json:"pool_type"`
  320. }
  321. type CommitImageParams struct {
  322. Ip string `json:"ip"`
  323. TaskContainerId string `json:"taskContainerId"`
  324. ImageTag string `json:"imageTag"`
  325. ImageDescription string `json:"imageDescription"`
  326. }
  327. type CommitImageResult struct {
  328. Code string `json:"code"`
  329. Msg string `json:"msg"`
  330. Payload map[string]interface{} `json:"payload"`
  331. }
  332. type CloudBrainResult struct {
  333. Code string `json:"code"`
  334. Msg string `json:"msg"`
  335. }
  336. type CreateNotebookParams struct {
  337. JobName string `json:"name"`
  338. Description string `json:"description"`
  339. ProfileID string `json:"profile_id"`
  340. Flavor string `json:"flavor"`
  341. Spec Spec `json:"spec"`
  342. Workspace Workspace `json:"workspace"`
  343. Pool Pool `json:"pool"`
  344. }
  345. type Pool struct {
  346. ID string `json:"id"`
  347. Name string `json:"name"`
  348. Type string `json:"type"`
  349. }
  350. type Workspace struct {
  351. ID string `json:"id"`
  352. }
  353. type Spec struct {
  354. Storage Storage `json:"storage"`
  355. AutoStop AutoStop `json:"auto_stop"`
  356. }
  357. type AutoStop struct {
  358. Enable bool `json:"enable"`
  359. Duration int `json:"duration"`
  360. }
  361. type Storage struct {
  362. Type string `json:"type"`
  363. Location Location `json:"location"`
  364. }
  365. type Location struct {
  366. Path string `json:"path"`
  367. }
  368. type NotebookResult struct {
  369. ErrorCode string `json:"error_code"`
  370. ErrorMsg string `json:"error_msg"`
  371. }
  372. type CreateNotebookResult struct {
  373. ErrorCode string `json:"error_code"`
  374. ErrorMsg string `json:"error_msg"`
  375. ID string `json:"id"`
  376. Name string `json:"name"`
  377. Description string `json:"description"`
  378. Status string `json:"status"`
  379. CreationTimestamp string `json:"creation_timestamp"`
  380. LatestUpdateTimestamp string `json:"latest_update_timestamp"`
  381. Profile struct {
  382. ID string `json:"id"`
  383. Name string `json:"name"`
  384. Description string `json:"description"`
  385. DeType string `json:"de_type"`
  386. FlavorType string `json:"flavor_type"`
  387. } `json:"profile"`
  388. Flavor string `json:"flavor"`
  389. FlavorDetails struct {
  390. Name string `json:"name"`
  391. Status string `json:"status"`
  392. QueuingNum int `json:"queuing_num"`
  393. QueueLeftTime int `json:"queue_left_time"` //s
  394. Duration int `json:"duration"` //auto_stop_time s
  395. } `json:"flavor_details"`
  396. }
  397. type GetNotebookResult struct {
  398. ErrorCode string `json:"error_code"`
  399. ErrorMsg string `json:"error_msg"`
  400. ID string `json:"id"`
  401. Name string `json:"name"`
  402. Description string `json:"description"`
  403. Status string `json:"status"`
  404. CreationTimestamp string `json:"creation_timestamp"`
  405. CreateTime string
  406. LatestUpdateTimestamp string `json:"latest_update_timestamp"`
  407. LatestUpdateTime string
  408. Profile struct {
  409. ID string `json:"id"`
  410. Name string `json:"name"`
  411. Description string `json:"description"`
  412. DeType string `json:"de_type"`
  413. FlavorType string `json:"flavor_type"`
  414. } `json:"profile"`
  415. Flavor string `json:"flavor"`
  416. FlavorDetails struct {
  417. Name string `json:"name"`
  418. Status string `json:"status"`
  419. QueuingNum int `json:"queuing_num"`
  420. QueueLeftTime int `json:"queue_left_time"` //s
  421. Duration int `json:"duration"` //auto_stop_time s
  422. } `json:"flavor_details"`
  423. QueuingInfo struct {
  424. ID string `json:"id"`
  425. Name string `json:"name"`
  426. Flavor string `json:"flavor"`
  427. DeType string `json:"de_type"`
  428. Status string `json:"status"`
  429. BeginTimestamp int `json:"begin_timestamp"` //time of instance begin in queue
  430. BeginTime string
  431. RemainTime int `json:"remain_time"` //remain time of instance
  432. EndTimestamp int `json:"end_timestamp"` //
  433. EndTime string
  434. Rank int `json:"rank"` //rank of instance in queue
  435. } `json:"queuing_info"`
  436. Spec struct {
  437. Annotations struct {
  438. TargetDomain string `json:"target_domain"`
  439. Url string `json:"url"`
  440. } `json:"annotations"`
  441. } `json:"spec"`
  442. }
  443. type GetTokenParams struct {
  444. Auth Auth `json:"auth"`
  445. }
  446. type Auth struct {
  447. Identity Identity `json:"identity"`
  448. Scope Scope `json:"scope"`
  449. }
  450. type Scope struct {
  451. Project Project `json:"project"`
  452. }
  453. type Project struct {
  454. Name string `json:"name"`
  455. }
  456. type Identity struct {
  457. Methods []string `json:"methods"`
  458. Password Password `json:"password"`
  459. }
  460. type Password struct {
  461. User NotebookUser `json:"user"`
  462. }
  463. type NotebookUser struct {
  464. Name string `json:"name"`
  465. Password string `json:"password"`
  466. Domain Domain `json:"domain"`
  467. }
  468. type Domain struct {
  469. Name string `json:"name"`
  470. }
  471. const (
  472. ActionStart = "start"
  473. ActionStop = "stop"
  474. ActionRestart = "restart"
  475. ActionQueue = "queue"
  476. ActionDequeue = "dequeue"
  477. )
  478. type NotebookAction struct {
  479. Action string `json:"action"`
  480. }
  481. type NotebookActionResult struct {
  482. ErrorCode string `json:"error_code"`
  483. ErrorMsg string `json:"error_msg"`
  484. CurrentStatus string `json:"current_status"`
  485. PreviousState string `json:"previous_state"`
  486. }
  487. type NotebookGetJobTokenResult struct {
  488. ErrorCode string `json:"error_code"`
  489. ErrorMsg string `json:"error_msg"`
  490. Token string `json:"token"`
  491. }
  492. type NotebookDelResult struct {
  493. InstanceID string `json:"instance_id"`
  494. }
  495. func Cloudbrains(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) {
  496. sess := x.NewSession()
  497. defer sess.Close()
  498. var cond = builder.NewCond()
  499. if opts.RepoID > 0 {
  500. cond = cond.And(
  501. builder.Eq{"cloudbrain.repo_id": opts.RepoID},
  502. )
  503. }
  504. if opts.UserID > 0 {
  505. cond = cond.And(
  506. builder.Eq{"cloudbrain.user_id": opts.UserID},
  507. )
  508. }
  509. if (opts.JobID) > 0 {
  510. cond = cond.And(
  511. builder.Eq{"cloudbrain.job_id": opts.JobID},
  512. )
  513. }
  514. if (opts.Type) >= 0 {
  515. cond = cond.And(
  516. builder.Eq{"cloudbrain.type": opts.Type},
  517. )
  518. }
  519. // switch opts.JobStatus {
  520. // case JobWaiting:
  521. // cond.And(builder.Eq{"cloudbrain.status": int(JobWaiting)})
  522. // case JobFailed:
  523. // cond.And(builder.Eq{"cloudbrain.status": int(JobFailed)})
  524. // case JobStopped:
  525. // cond.And(builder.Eq{"cloudbrain.status": int(JobStopped)})
  526. // case JobSucceeded:
  527. // cond.And(builder.Eq{"cloudbrain.status": int(JobSucceeded)})
  528. // }
  529. if len(opts.CloudbrainIDs) > 0 {
  530. cond = cond.And(builder.In("cloudbrain.id", opts.CloudbrainIDs))
  531. }
  532. count, err := sess.Where(cond).Count(new(Cloudbrain))
  533. if err != nil {
  534. return nil, 0, fmt.Errorf("Count: %v", err)
  535. }
  536. if opts.Page >= 0 && opts.PageSize > 0 {
  537. var start int
  538. if opts.Page == 0 {
  539. start = 0
  540. } else {
  541. start = (opts.Page - 1) * opts.PageSize
  542. }
  543. sess.Limit(opts.PageSize, start)
  544. }
  545. sess.OrderBy("cloudbrain.created_unix DESC")
  546. cloudbrains := make([]*CloudbrainInfo, 0, setting.UI.IssuePagingNum)
  547. if err := sess.Table(&Cloudbrain{}).Where(cond).
  548. Join("left", "`user`", "cloudbrain.user_id = `user`.id").
  549. Find(&cloudbrains); err != nil {
  550. return nil, 0, fmt.Errorf("Find: %v", err)
  551. }
  552. sess.Close()
  553. return cloudbrains, count, nil
  554. }
  555. func CreateCloudbrain(cloudbrain *Cloudbrain) (err error) {
  556. if _, err = x.Insert(cloudbrain); err != nil {
  557. return err
  558. }
  559. return nil
  560. }
  561. func getRepoCloudBrain(cb *Cloudbrain) (*Cloudbrain, error) {
  562. has, err := x.Get(cb)
  563. if err != nil {
  564. return nil, err
  565. } else if !has {
  566. return nil, ErrJobNotExist{}
  567. }
  568. return cb, nil
  569. }
  570. func GetRepoCloudBrainByJobID(repoID int64, jobID string) (*Cloudbrain, error) {
  571. cb := &Cloudbrain{JobID: jobID, RepoID: repoID}
  572. return getRepoCloudBrain(cb)
  573. }
  574. func GetCloudbrainByJobID(jobID string) (*Cloudbrain, error) {
  575. cb := &Cloudbrain{JobID: jobID}
  576. return getRepoCloudBrain(cb)
  577. }
  578. func GetCloudbrainsNeededStopByUserID(userID int64) ([]*Cloudbrain, error) {
  579. cloudBrains := make([]*Cloudbrain, 0)
  580. err := x.Cols("job_id", "status", "type").Where("user_id=? AND status !=?", userID, string(JobStopped)).Find(&cloudBrains)
  581. return cloudBrains, err
  582. }
  583. func GetCloudbrainsNeededStopByRepoID(repoID int64) ([]*Cloudbrain, error) {
  584. cloudBrains := make([]*Cloudbrain, 0)
  585. err := x.Cols("job_id", "status", "type").Where("repo_id=? AND status !=?", repoID, string(JobStopped)).Find(&cloudBrains)
  586. return cloudBrains, err
  587. }
  588. func SetCloudbrainStatusByJobID(jobID string, status CloudbrainStatus) (err error) {
  589. cb := &Cloudbrain{JobID: jobID, Status: string(status)}
  590. _, err = x.Cols("status").Where("cloudbrain.job_id=?", jobID).Update(cb)
  591. return
  592. }
  593. func UpdateJob(job *Cloudbrain) error {
  594. return updateJob(x, job)
  595. }
  596. func updateJob(e Engine, job *Cloudbrain) error {
  597. var sess *xorm.Session
  598. sess = e.Where("job_id = ?", job.JobID)
  599. _, err := sess.Cols("status", "container_id", "container_ip").Update(job)
  600. return err
  601. }
  602. func DeleteJob(job *Cloudbrain) error {
  603. return deleteJob(x, job)
  604. }
  605. func deleteJob(e Engine, job *Cloudbrain) error {
  606. _, err := e.ID(job.ID).Delete(job)
  607. return err
  608. }
  609. func GetCloudbrainByName(jobName string) (*Cloudbrain, error) {
  610. cb := &Cloudbrain{JobName: jobName}
  611. return getRepoCloudBrain(cb)
  612. }
  613. func CanDelJob(isSigned bool, user *User, job *CloudbrainInfo) bool {
  614. if !isSigned || (job.Status != string(JobStopped) && job.Status != string(JobFailed) && job.Status != string(ModelArtsStartFailed) && job.Status != string(ModelArtsCreateFailed)){
  615. return false
  616. }
  617. repo, err := GetRepositoryByID(job.RepoID)
  618. if err != nil {
  619. log.Error("GetRepositoryByID failed:%v", err.Error())
  620. return false
  621. }
  622. permission, _ := GetUserRepoPermission(repo, user)
  623. if err != nil {
  624. log.Error("GetUserRepoPermission failed:%v", err.Error())
  625. return false
  626. }
  627. if (user.ID == job.UserID && permission.AccessMode >= AccessModeWrite) || user.IsAdmin || permission.AccessMode >= AccessModeAdmin {
  628. return true
  629. }
  630. return false
  631. }