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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package models
  2. import (
  3. "fmt"
  4. "code.gitea.io/gitea/modules/setting"
  5. "code.gitea.io/gitea/modules/timeutil"
  6. "xorm.io/builder"
  7. )
  8. type CloudbrainStatus int8
  9. const (
  10. JobWaiting CloudbrainStatus = iota
  11. JobStopped
  12. JobSucceeded
  13. JobFailed
  14. )
  15. type Cloudbrain struct {
  16. ID int64 `xorm:"pk autoincr"`
  17. JobID string
  18. // Title string `xorm:"INDEX NOT NULL"`
  19. Status int32 `xorm:"INDEX"`
  20. UserID int64 `xorm:"INDEX"`
  21. RepoID int64 `xorm:"INDEX"`
  22. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  23. UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
  24. User *User `xorm:"-"`
  25. Repo *Repository `xorm:"-"`
  26. }
  27. type CloudBrainLoginResult struct {
  28. Code string
  29. Msg string
  30. Payload struct {
  31. UserID string `json:"userId"`
  32. RealName string `json:"realName"`
  33. Token string `json:"token"`
  34. Admin bool `json:"admin"`
  35. }
  36. }
  37. type TaskRole struct {
  38. Name string `json:"name"`
  39. TaskNumber int8 `json:"taskNumber"`
  40. MinSucceededTaskCount int8 `json:"minSucceededTaskCount"`
  41. MinFailedTaskCount int8 `json:"minFailedTaskCount"`
  42. CPUNumber int8 `json:"cpuNumber"`
  43. GPUNumber int8 `json:"gpuNumber"`
  44. MemoryMB int `json:"memoryMB"`
  45. ShmMB int `json:"shmMB"`
  46. Command string `json:"command"`
  47. NeedIBDevice bool `json:"needIBDevice"`
  48. IsMainRole bool `json:"isMainRole"`
  49. }
  50. type CreateJobParams struct {
  51. JobName string `json:"jobName"`
  52. RetryCount int8 `json:"retryCount"`
  53. GpuType string `json:"gpuType"`
  54. Image string `json:"image"`
  55. TaskRoles []TaskRole `json:"taskRoles"`
  56. }
  57. type CreateJobResult struct {
  58. Code string
  59. Msg string
  60. Payload struct {
  61. JobID string `json:"jobId"`
  62. }
  63. }
  64. type GetJobResult struct {
  65. Code string
  66. Msg string
  67. Payload struct {
  68. ID string `json:"Id"`
  69. Name string
  70. Platform string
  71. JobStatus struct {
  72. Username string
  73. State string
  74. SubState string `json:"subState"`
  75. ExecutionType string `json:"executionType"`
  76. Retries int8 `json:"retries"`
  77. CreatedTime int64 `json:"createdTime"`
  78. CompletedTime int64 `json:"completedTime"`
  79. AppID string `json:"appId"`
  80. AppProgress string `json:"appProgress"`
  81. AppTrackingURL string `json:"appTrackingUrl"`
  82. AppLaunchedTime int64 `json:"appLaunchedTime"`
  83. AppCompletedTime int64 `json:"appCompletedTime"`
  84. AppExitCode int8 `json:"appExitCode"`
  85. AppExitDiagnostics string `json:"appExitDiagnostics"`
  86. AppExitType string `json:"appExitType"`
  87. VirtualCluster string `json:"virtualCluster"`
  88. } `json:"jobStatus"`
  89. TaskRoles string `json:"taskRoles"`
  90. Resource struct {
  91. CPU int8 `json:"cpu"`
  92. Memory string
  93. GPU string `json:"nvidia.com/gpu"`
  94. } `json:"resource"`
  95. Config struct {
  96. Image string
  97. JobID string `json:"jobId"`
  98. GpuType string `json:"gpuType"`
  99. JobName string `json:"jobName"`
  100. JobType string `json:"jobType"`
  101. RetryCount int8 `json:"retryCount"`
  102. TaskRoles []struct {
  103. Name string `json:"name"`
  104. ShmMB int32 `json:"shmMB"`
  105. Command string `json:"command"`
  106. MemoryMB int64 `json:"memoryMB"`
  107. CPUNumber int8 `json:"cpuNumber"`
  108. GPUNumber int8 `json:"gpuNumber"`
  109. IsMainRole bool `json:"isMainRole"`
  110. TaskNumber int32 `json:"taskNumber"`
  111. NeedIBDevice bool `json:"needIBDevice"`
  112. MinFailedTaskCount int8 `json:"minFailedTaskCount"`
  113. MinSucceededTaskCount int8 `json:"minSucceededTaskCount"`
  114. } `json:"taskRoles"`
  115. }
  116. Userinfo struct {
  117. User string
  118. OrgID string `json:"org_id"`
  119. }
  120. }
  121. }
  122. type CloudbrainsOptions struct {
  123. ListOptions
  124. RepoID int64 // include all repos if empty
  125. UserID int64
  126. JobStatus CloudbrainStatus
  127. SortType string
  128. CloudbrainIDs []int64
  129. }
  130. func Cloudbrains(opts *CloudbrainsOptions) ([]*Cloudbrain, int64, error) {
  131. sess := x.NewSession()
  132. defer sess.Close()
  133. var cond = builder.NewCond()
  134. if opts.RepoID > 0 {
  135. cond.And(
  136. builder.Eq{"cloudbrain.repo_id": opts.RepoID},
  137. )
  138. }
  139. if opts.UserID > 0 {
  140. cond.And(
  141. builder.Eq{"cloudbrain.user_id": opts.UserID},
  142. )
  143. }
  144. switch opts.JobStatus {
  145. case JobWaiting:
  146. cond.And(builder.Eq{"cloudbrain.status": int(JobWaiting)})
  147. case JobFailed:
  148. cond.And(builder.Eq{"cloudbrain.status": int(JobFailed)})
  149. case JobStopped:
  150. cond.And(builder.Eq{"cloudbrain.status": int(JobStopped)})
  151. case JobSucceeded:
  152. cond.And(builder.Eq{"cloudbrain.status": int(JobSucceeded)})
  153. }
  154. if len(opts.CloudbrainIDs) > 0 {
  155. cond.And(builder.In("cloudbrain.id", opts.CloudbrainIDs))
  156. }
  157. count, err := sess.Where(cond).Count(new(Cloudbrain))
  158. if err != nil {
  159. return nil, 0, fmt.Errorf("Count: %v", err)
  160. }
  161. if opts.Page >= 0 && opts.PageSize > 0 {
  162. var start int
  163. if opts.Page == 0 {
  164. start = 0
  165. } else {
  166. start = (opts.Page - 1) * opts.PageSize
  167. }
  168. sess.Limit(opts.PageSize, start)
  169. }
  170. sess.OrderBy("cloudbrain.created_unix DESC")
  171. cloudbrains := make([]*Cloudbrain, 0, setting.UI.IssuePagingNum)
  172. if err := sess.Find(&cloudbrains); err != nil {
  173. return nil, 0, fmt.Errorf("Find: %v", err)
  174. }
  175. sess.Close()
  176. return cloudbrains, count, nil
  177. }
  178. func CreateCloudbrain(cloudbrain *Cloudbrain) (err error) {
  179. if _, err = x.Insert(cloudbrain); err != nil {
  180. return err
  181. }
  182. return nil
  183. }