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 7.0 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
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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. package modelarts
  2. import (
  3. "code.gitea.io/gitea/modules/log"
  4. "crypto/tls"
  5. "encoding/json"
  6. "fmt"
  7. "net/http"
  8. "code.gitea.io/gitea/models"
  9. "code.gitea.io/gitea/modules/setting"
  10. "github.com/go-resty/resty/v2"
  11. )
  12. var (
  13. restyClient *resty.Client
  14. HOST string
  15. TOKEN string
  16. )
  17. const (
  18. methodPassword = "password"
  19. urlGetToken = "/v3/auth/tokens"
  20. urlNotebook = "/demanager/instances"
  21. errorCodeExceedLimit = "ModelArts.0118"
  22. )
  23. func getRestyClient() *resty.Client {
  24. if restyClient == nil {
  25. restyClient = resty.New()
  26. restyClient.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
  27. }
  28. return restyClient
  29. }
  30. func checkSetting() {
  31. if len(HOST) != 0 && len(TOKEN) != 0 && restyClient != nil {
  32. return
  33. }
  34. err := getToken()
  35. if err != nil {
  36. log.Error("getToken failed:%v", err)
  37. }
  38. }
  39. func getToken() error {
  40. HOST = setting.ModelArtsHost
  41. client := getRestyClient()
  42. params := models.GetTokenParams{
  43. Auth: models.Auth{
  44. Identity: models.Identity{
  45. Methods: []string{methodPassword},
  46. Password: models.Password{
  47. User: models.NotebookUser{
  48. Name: setting.ModelArtsUsername,
  49. Password: setting.ModelArtsPassword,
  50. Domain: models.Domain{
  51. Name: setting.ModelArtsDomain,
  52. },
  53. },
  54. },
  55. },
  56. Scope: models.Scope{
  57. Project: models.Project{
  58. Name: setting.ProjectName,
  59. },
  60. },
  61. },
  62. }
  63. res, err := client.R().
  64. SetHeader("Content-Type", "application/json").
  65. SetBody(params).
  66. Post(setting.IamHost + urlGetToken)
  67. if err != nil {
  68. return fmt.Errorf("resty getToken: %v", err)
  69. }
  70. if res.StatusCode() != http.StatusCreated {
  71. return fmt.Errorf("getToken failed:%s", res.String())
  72. }
  73. TOKEN = res.Header().Get("X-Subject-Token")
  74. return nil
  75. }
  76. func CreateJob(createJobParams models.CreateNotebookParams) (*models.CreateNotebookResult, error) {
  77. checkSetting()
  78. client := getRestyClient()
  79. var result models.CreateNotebookResult
  80. retry := 0
  81. sendjob:
  82. res, err := client.R().
  83. SetHeader("Content-Type", "application/json").
  84. SetAuthToken(TOKEN).
  85. SetBody(createJobParams).
  86. SetResult(&result).
  87. Post(HOST + "/v1/" + setting.ProjectID + urlNotebook)
  88. if err != nil {
  89. return nil, fmt.Errorf("resty create job: %s", err)
  90. }
  91. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  92. retry++
  93. _ = getToken()
  94. goto sendjob
  95. }
  96. var response models.NotebookResult
  97. err = json.Unmarshal(res.Body(), &response)
  98. if err != nil {
  99. log.Error("json.Unmarshal failed: %s", err.Error())
  100. return &result, fmt.Errorf("son.Unmarshal failed: %s", err.Error())
  101. }
  102. if len(response.ErrorCode) != 0 {
  103. log.Error("CreateJob failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  104. if response.ErrorCode == errorCodeExceedLimit {
  105. response.ErrorMsg = "所选规格使用数量已超过最大配额限制。"
  106. }
  107. return &result, fmt.Errorf("CreateJob failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  108. }
  109. return &result, nil
  110. }
  111. func GetJob(jobID string) (*models.GetNotebookResult, error) {
  112. checkSetting()
  113. client := getRestyClient()
  114. var result models.GetNotebookResult
  115. retry := 0
  116. sendjob:
  117. res, err := client.R().
  118. SetHeader("Content-Type", "application/json").
  119. SetAuthToken(TOKEN).
  120. SetResult(&result).
  121. Get(HOST + "/v1/" + setting.ProjectID + urlNotebook + "/" + jobID)
  122. if err != nil {
  123. return nil, fmt.Errorf("resty GetJob: %v", err)
  124. }
  125. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  126. retry++
  127. _ = getToken()
  128. goto sendjob
  129. }
  130. var response models.NotebookResult
  131. err = json.Unmarshal(res.Body(), &response)
  132. if err != nil {
  133. log.Error("json.Unmarshal failed: %s", err.Error())
  134. return &result, fmt.Errorf("son.Unmarshal failed: %s", err.Error())
  135. }
  136. if len(response.ErrorCode) != 0 {
  137. log.Error("GetJob failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  138. return &result, fmt.Errorf("GetJob failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  139. }
  140. return &result, nil
  141. }
  142. func StopJob(jobID string, param models.NotebookAction) (*models.NotebookActionResult, error) {
  143. checkSetting()
  144. client := getRestyClient()
  145. var result models.NotebookActionResult
  146. retry := 0
  147. sendjob:
  148. res, err := client.R().
  149. SetHeader("Content-Type", "application/json").
  150. SetBody(param).
  151. SetAuthToken(TOKEN).
  152. SetResult(&result).
  153. Post(HOST + "/v1/" + setting.ProjectID + urlNotebook + "/" + jobID + "/action")
  154. if err != nil {
  155. return &result, fmt.Errorf("resty StopJob: %v", err)
  156. }
  157. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  158. retry++
  159. _ = getToken()
  160. goto sendjob
  161. }
  162. var response models.NotebookResult
  163. err = json.Unmarshal(res.Body(), &response)
  164. if err != nil {
  165. log.Error("json.Unmarshal failed: %s", err.Error())
  166. return &result, fmt.Errorf("son.Unmarshal failed: %s", err.Error())
  167. }
  168. if len(response.ErrorCode) != 0 {
  169. log.Error("StopJob failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  170. return &result, fmt.Errorf("StopJob failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  171. }
  172. return &result, nil
  173. }
  174. func DelJob(jobID string) (*models.NotebookDelResult, error) {
  175. checkSetting()
  176. client := getRestyClient()
  177. var result models.NotebookDelResult
  178. retry := 0
  179. sendjob:
  180. res, err := client.R().
  181. SetHeader("Content-Type", "application/json").
  182. SetAuthToken(TOKEN).
  183. SetResult(&result).
  184. Delete(HOST + "/v1/" + setting.ProjectID + urlNotebook + "/" + jobID)
  185. if err != nil {
  186. return &result, fmt.Errorf("resty DelJob: %v", err)
  187. }
  188. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  189. retry++
  190. _ = getToken()
  191. goto sendjob
  192. }
  193. var response models.NotebookResult
  194. err = json.Unmarshal(res.Body(), &response)
  195. if err != nil {
  196. log.Error("json.Unmarshal failed: %s", err.Error())
  197. return &result, fmt.Errorf("son.Unmarshal failed: %s", err.Error())
  198. }
  199. if len(response.ErrorCode) != 0 {
  200. log.Error("DelJob failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  201. return &result, fmt.Errorf("DelJob failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  202. }
  203. return &result, nil
  204. }
  205. func GetJobToken(jobID string) (*models.NotebookGetJobTokenResult, error) {
  206. checkSetting()
  207. client := getRestyClient()
  208. var result models.NotebookGetJobTokenResult
  209. retry := 0
  210. sendjob:
  211. res, err := client.R().
  212. SetHeader("Content-Type", "application/json").
  213. SetAuthToken(TOKEN).
  214. SetResult(&result).
  215. Get(HOST + "/v1/" + setting.ProjectID + urlNotebook + "/" + jobID + "/token")
  216. if err != nil {
  217. return &result, fmt.Errorf("resty GetJobToken: %v", err)
  218. }
  219. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  220. retry++
  221. _ = getToken()
  222. goto sendjob
  223. }
  224. var response models.NotebookResult
  225. err = json.Unmarshal(res.Body(), &response)
  226. if err != nil {
  227. log.Error("json.Unmarshal failed: %s", err.Error())
  228. return &result, fmt.Errorf("son.Unmarshal failed: %s", err.Error())
  229. }
  230. if len(response.ErrorCode) != 0 {
  231. log.Error("GetJobToken failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  232. return &result, fmt.Errorf("GetJobToken failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  233. }
  234. return &result, nil
  235. }