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.

resty.go 6.2 kB

3 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
3 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
3 years ago
4 years ago
4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. package cloudbrain
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strings"
  6. "code.gitea.io/gitea/modules/log"
  7. "code.gitea.io/gitea/models"
  8. "code.gitea.io/gitea/modules/setting"
  9. "github.com/go-resty/resty/v2"
  10. )
  11. var (
  12. restyClient *resty.Client
  13. HOST string
  14. TOKEN string
  15. ImagesUrlMap = map[string]string{Public: "/rest-server/api/v1/image/public/list/", Custom: "/rest-server/api/v1/image/list/"}
  16. )
  17. const (
  18. JobHasBeenStopped = "S410"
  19. Public = "public"
  20. Custom = "custom"
  21. )
  22. func getRestyClient() *resty.Client {
  23. if restyClient == nil {
  24. restyClient = resty.New()
  25. }
  26. return restyClient
  27. }
  28. func checkSetting() {
  29. if len(HOST) != 0 && len(TOKEN) != 0 && restyClient != nil {
  30. return
  31. }
  32. _ = loginCloudbrain()
  33. }
  34. func loginCloudbrain() error {
  35. conf := setting.GetCloudbrainConfig()
  36. username := conf.Username
  37. password := conf.Password
  38. HOST = conf.Host
  39. var loginResult models.CloudBrainLoginResult
  40. client := getRestyClient()
  41. res, err := client.R().
  42. SetHeader("Content-Type", "application/json").
  43. SetBody(map[string]interface{}{"username": username, "password": password, "expiration": "604800"}).
  44. SetResult(&loginResult).
  45. Post(HOST + "/rest-server/api/v1/token")
  46. if err != nil {
  47. return fmt.Errorf("resty loginCloudbrain: %s", err)
  48. }
  49. if loginResult.Code != Success {
  50. return fmt.Errorf("%s: %s", loginResult.Msg, res.String())
  51. }
  52. TOKEN = loginResult.Payload["token"].(string)
  53. return nil
  54. }
  55. func CreateJob(jobName string, createJobParams models.CreateJobParams) (*models.CreateJobResult, error) {
  56. checkSetting()
  57. client := getRestyClient()
  58. var jobResult models.CreateJobResult
  59. retry := 0
  60. sendjob:
  61. res, err := client.R().
  62. SetHeader("Content-Type", "application/json").
  63. SetAuthToken(TOKEN).
  64. SetBody(createJobParams).
  65. SetResult(&jobResult).
  66. Post(HOST + "/rest-server/api/v1/jobs/")
  67. if err != nil {
  68. if res != nil {
  69. var response models.CloudBrainResult
  70. json.Unmarshal(res.Body(), &response)
  71. log.Error("code(%s), msg(%s)", response.Code, response.Msg)
  72. return nil, fmt.Errorf(response.Msg)
  73. }
  74. return nil, fmt.Errorf("resty create job: %s", err)
  75. }
  76. if jobResult.Code == "S401" && retry < 1 {
  77. retry++
  78. _ = loginCloudbrain()
  79. goto sendjob
  80. }
  81. if jobResult.Code != Success {
  82. return &jobResult, fmt.Errorf("jobResult err: %s", res.String())
  83. }
  84. return &jobResult, nil
  85. }
  86. func GetJob(jobID string) (*models.GetJobResult, error) {
  87. checkSetting()
  88. // http://192.168.204.24/rest-server/api/v1/jobs/90e26e500c4b3011ea0a251099a987938b96
  89. client := getRestyClient()
  90. var getJobResult models.GetJobResult
  91. retry := 0
  92. sendjob:
  93. res, err := client.R().
  94. SetHeader("Content-Type", "application/json").
  95. SetAuthToken(TOKEN).
  96. SetResult(&getJobResult).
  97. Get(HOST + "/rest-server/api/v1/jobs/" + jobID)
  98. if err != nil {
  99. return nil, fmt.Errorf("resty GetJob: %v", err)
  100. }
  101. if getJobResult.Code == "S401" && retry < 1 {
  102. retry++
  103. _ = loginCloudbrain()
  104. goto sendjob
  105. }
  106. if getJobResult.Code != Success {
  107. return &getJobResult, fmt.Errorf("jobResult GetJob err: %s", res.String())
  108. }
  109. return &getJobResult, nil
  110. }
  111. func GetImages() (*models.GetImagesResult, error) {
  112. return GetImagesPageable(1, 100, Custom, "")
  113. }
  114. func GetPublicImages() (*models.GetImagesResult, error) {
  115. return GetImagesPageable(1, 100, Public, "")
  116. }
  117. func GetImagesPageable(page int, size int, imageType string, name string) (*models.GetImagesResult, error) {
  118. checkSetting()
  119. client := getRestyClient()
  120. var getImagesResult models.GetImagesResult
  121. retry := 0
  122. sendjob:
  123. res, err := client.R().
  124. SetHeader("Content-Type", "application/json").
  125. SetAuthToken(TOKEN).
  126. SetQueryString(getQueryString(page, size, name)).
  127. SetResult(&getImagesResult).
  128. Get(HOST + ImagesUrlMap[imageType])
  129. if err != nil {
  130. return nil, fmt.Errorf("resty GetImages: %v", err)
  131. }
  132. var response models.CloudBrainResult
  133. err = json.Unmarshal(res.Body(), &response)
  134. if err != nil {
  135. log.Error("json.Unmarshal failed: %s", err.Error())
  136. return &getImagesResult, fmt.Errorf("json.Unmarshal failed: %s", err.Error())
  137. }
  138. if response.Code == "S401" && retry < 1 {
  139. retry++
  140. _ = loginCloudbrain()
  141. goto sendjob
  142. }
  143. if getImagesResult.Code != Success {
  144. return &getImagesResult, fmt.Errorf("getImagesResult err: %s", res.String())
  145. }
  146. getImagesResult.Payload.TotalPages = getTotalPages(getImagesResult, size)
  147. return &getImagesResult, nil
  148. }
  149. func getTotalPages(getImagesResult models.GetImagesResult, size int) int {
  150. totalCount := getImagesResult.Payload.Count
  151. var totalPages int
  152. if totalCount%size != 0 {
  153. totalPages = totalCount/size + 1
  154. } else {
  155. totalPages = totalCount / size
  156. }
  157. return totalPages
  158. }
  159. func getQueryString(page int, size int, name string) string {
  160. if strings.TrimSpace(name) == "" {
  161. return fmt.Sprintf("pageIndex=%d&pageSize=%d", page, size)
  162. }
  163. return fmt.Sprintf("pageIndex=%d&pageSize=%d&name=%s", page, size, name)
  164. }
  165. func CommitImage(jobID string, params models.CommitImageParams) error {
  166. checkSetting()
  167. client := getRestyClient()
  168. var result models.CommitImageResult
  169. retry := 0
  170. sendjob:
  171. res, err := client.R().
  172. SetHeader("Content-Type", "application/json").
  173. SetAuthToken(TOKEN).
  174. SetBody(params).
  175. SetResult(&result).
  176. Post(HOST + "/rest-server/api/v1/jobs/" + jobID + "/commitImage")
  177. if err != nil {
  178. return fmt.Errorf("resty CommitImage: %v", err)
  179. }
  180. if result.Code == "S401" && retry < 1 {
  181. retry++
  182. _ = loginCloudbrain()
  183. goto sendjob
  184. }
  185. if result.Code != Success {
  186. return fmt.Errorf("CommitImage err: %s", res.String())
  187. }
  188. return nil
  189. }
  190. func StopJob(jobID string) error {
  191. checkSetting()
  192. client := getRestyClient()
  193. var result models.CloudBrainResult
  194. retry := 0
  195. sendjob:
  196. res, err := client.R().
  197. SetHeader("Content-Type", "application/json").
  198. SetAuthToken(TOKEN).
  199. SetResult(&result).
  200. Delete(HOST + "/rest-server/api/v1/jobs/" + jobID)
  201. if err != nil {
  202. return fmt.Errorf("resty StopJob: %v", err)
  203. }
  204. if result.Code == "S401" && retry < 1 {
  205. retry++
  206. _ = loginCloudbrain()
  207. goto sendjob
  208. }
  209. if result.Code != Success {
  210. if result.Code == JobHasBeenStopped {
  211. log.Info("StopJob(%s) failed:%s", jobID, result.Msg)
  212. } else {
  213. return fmt.Errorf("StopJob err: %s", res.String())
  214. }
  215. }
  216. return nil
  217. }