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

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