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

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