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

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