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

3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. package grampus
  2. import (
  3. "crypto/tls"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. "code.gitea.io/gitea/models"
  8. "code.gitea.io/gitea/modules/log"
  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. urlOpenApiV1 = "/openapi/v1/"
  19. urlGetToken = urlOpenApiV1 + "token"
  20. urlTrainJob = urlOpenApiV1 + "trainjob"
  21. urlGetResourceSpecs = urlOpenApiV1 + "resourcespec"
  22. urlGetAiCenter = urlOpenApiV1 + "sharescreen/aicenter"
  23. urlGetImages = urlOpenApiV1 + "image"
  24. urlNotebookJob = urlOpenApiV1 + "notebook"
  25. errorIllegalToken = 1005
  26. )
  27. type GetTokenParams struct {
  28. UserName string `json:"username"`
  29. Password string `json:"password"`
  30. }
  31. type GetTokenResult struct {
  32. Token string `json:"token"`
  33. Expiration int64 `json:"expiration"`
  34. }
  35. func getRestyClient() *resty.Client {
  36. if restyClient == nil {
  37. restyClient = resty.New()
  38. restyClient.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
  39. }
  40. return restyClient
  41. }
  42. func checkSetting() {
  43. if len(HOST) != 0 && len(TOKEN) != 0 && restyClient != nil {
  44. return
  45. }
  46. err := getToken()
  47. if err != nil {
  48. log.Error("getToken failed:%v", err)
  49. }
  50. }
  51. func getToken() error {
  52. HOST = setting.Grampus.Host
  53. client := getRestyClient()
  54. params := GetTokenParams{
  55. UserName: setting.Grampus.UserName,
  56. Password: setting.Grampus.Password,
  57. }
  58. var result GetTokenResult
  59. res, err := client.R().
  60. SetHeader("Content-Type", "application/json").
  61. SetBody(params).
  62. SetResult(&result).
  63. Post(HOST + urlGetToken)
  64. if err != nil {
  65. return fmt.Errorf("resty getToken: %v", err)
  66. }
  67. if res.StatusCode() != http.StatusOK {
  68. return fmt.Errorf("getToken failed:%s", res.String())
  69. }
  70. TOKEN = result.Token
  71. return nil
  72. }
  73. func createNotebookJob(req models.CreateGrampusNotebookRequest) (*models.GrampusNotebookResponse, error) {
  74. checkSetting()
  75. client := getRestyClient()
  76. var result models.GrampusNotebookResponse
  77. retry := 0
  78. sendjob:
  79. _, err := client.R().
  80. SetHeader("Content-Type", "application/json").
  81. SetAuthToken(TOKEN).
  82. SetBody(req).
  83. SetResult(&result).
  84. Post(HOST + urlNotebookJob)
  85. if err != nil {
  86. return nil, fmt.Errorf("resty CreateNotebookJob: %s", err)
  87. }
  88. if result.ErrorCode == errorIllegalToken && retry < 1 {
  89. retry++
  90. _ = getToken()
  91. goto sendjob
  92. }
  93. if result.ErrorCode != 0 {
  94. log.Error("CreateNotebookJob failed(%d): %s", result.ErrorCode, result.ErrorMsg)
  95. return &result, fmt.Errorf("CreateNotebookJob failed(%d): %s", result.ErrorCode, result.ErrorMsg)
  96. }
  97. return &result, nil
  98. }
  99. func createJob(req models.CreateGrampusJobRequest) (*models.CreateGrampusJobResponse, error) {
  100. checkSetting()
  101. client := getRestyClient()
  102. var result models.CreateGrampusJobResponse
  103. retry := 0
  104. sendjob:
  105. _, err := client.R().
  106. SetHeader("Content-Type", "application/json").
  107. SetAuthToken(TOKEN).
  108. SetBody(req).
  109. SetResult(&result).
  110. Post(HOST + urlTrainJob)
  111. if err != nil {
  112. return nil, fmt.Errorf("resty CreateJob: %s", err)
  113. }
  114. if result.ErrorCode == errorIllegalToken && retry < 1 {
  115. retry++
  116. _ = getToken()
  117. goto sendjob
  118. }
  119. if result.ErrorCode != 0 {
  120. log.Error("CreateJob failed(%d): %s", result.ErrorCode, result.ErrorMsg)
  121. return &result, fmt.Errorf("CreateJob failed(%d): %s", result.ErrorCode, result.ErrorMsg)
  122. }
  123. return &result, nil
  124. }
  125. func GetNotebookJob(jobID string) (*models.GrampusNotebookResponse, error) {
  126. checkSetting()
  127. client := getRestyClient()
  128. var result models.GrampusNotebookResponse
  129. retry := 0
  130. sendjob:
  131. _, err := client.R().
  132. SetAuthToken(TOKEN).
  133. SetResult(&result).
  134. Get(HOST + urlNotebookJob + "/" + jobID)
  135. if err != nil {
  136. return nil, fmt.Errorf("resty GetNotebookJob: %v", err)
  137. }
  138. if result.ErrorCode == errorIllegalToken && retry < 1 {
  139. retry++
  140. log.Info("retry get token")
  141. _ = getToken()
  142. goto sendjob
  143. }
  144. if result.ErrorCode != 0 {
  145. log.Error("GetNotebookJob failed(%d): %s", result.ErrorCode, result.ErrorMsg)
  146. return nil, fmt.Errorf("GetNotebookJob failed(%d): %s", result.ErrorCode, result.ErrorMsg)
  147. }
  148. return &result, nil
  149. }
  150. func GetJob(jobID string) (*models.GetGrampusJobResponse, error) {
  151. checkSetting()
  152. client := getRestyClient()
  153. var result models.GetGrampusJobResponse
  154. retry := 0
  155. sendjob:
  156. _, err := client.R().
  157. SetAuthToken(TOKEN).
  158. SetResult(&result).
  159. Get(HOST + urlTrainJob + "/" + jobID)
  160. if err != nil {
  161. return nil, fmt.Errorf("resty GetJob: %v", err)
  162. }
  163. if result.ErrorCode == errorIllegalToken && retry < 1 {
  164. retry++
  165. log.Info("retry get token")
  166. _ = getToken()
  167. goto sendjob
  168. }
  169. if result.ErrorCode != 0 {
  170. log.Error("GetJob failed(%d): %s", result.ErrorCode, result.ErrorMsg)
  171. return nil, fmt.Errorf("GetJob failed(%d): %s", result.ErrorCode, result.ErrorMsg)
  172. }
  173. return &result, nil
  174. }
  175. func GetResourceSpecs(processorType string) (*models.GetGrampusResourceSpecsResult, error) {
  176. checkSetting()
  177. client := getRestyClient()
  178. var result models.GetGrampusResourceSpecsResult
  179. retry := 0
  180. sendjob:
  181. _, err := client.R().
  182. SetAuthToken(TOKEN).
  183. SetResult(&result).
  184. Get(HOST + urlGetResourceSpecs + "?processorType=" + processorType)
  185. if err != nil {
  186. return nil, fmt.Errorf("resty GetResourceSpecs: %v", err)
  187. }
  188. if result.ErrorCode == errorIllegalToken && retry < 1 {
  189. retry++
  190. log.Info("retry get token")
  191. _ = getToken()
  192. goto sendjob
  193. }
  194. if result.ErrorCode != 0 {
  195. log.Error("GetResourceSpecs failed(%d): %s", result.ErrorCode, result.ErrorMsg)
  196. return &result, fmt.Errorf("GetResourceSpecs failed(%d): %s", result.ErrorCode, result.ErrorMsg)
  197. }
  198. return &result, nil
  199. }
  200. func GetImages(processorType string, jobType string) (*models.GetGrampusImagesResult, error) {
  201. checkSetting()
  202. client := getRestyClient()
  203. var result models.GetGrampusImagesResult
  204. retry := 0
  205. queryType := "TrainJob"
  206. if jobType == string(models.JobTypeDebug) {
  207. queryType = "Notebook"
  208. }
  209. sendjob:
  210. _, err := client.R().
  211. SetAuthToken(TOKEN).
  212. SetResult(&result).
  213. Get(HOST + urlGetImages + "?processorType=" + processorType + "&trainType=" + queryType)
  214. if err != nil {
  215. return nil, fmt.Errorf("resty GetImages: %v", err)
  216. }
  217. if result.ErrorCode == errorIllegalToken && retry < 1 {
  218. retry++
  219. log.Info("retry get token")
  220. _ = getToken()
  221. goto sendjob
  222. }
  223. if result.ErrorCode != 0 {
  224. log.Error("GetImages failed(%d): %s", result.ErrorCode, result.ErrorMsg)
  225. return &result, fmt.Errorf("GetImages failed(%d): %s", result.ErrorCode, result.ErrorMsg)
  226. }
  227. return &result, nil
  228. }
  229. func GetTrainJobLog(jobID string) (string, error) {
  230. checkSetting()
  231. client := getRestyClient()
  232. var logContent string
  233. res, err := client.R().
  234. SetAuthToken(TOKEN).
  235. SetResult(&logContent).
  236. Get(HOST + urlTrainJob + "/" + jobID + "/task/0/replica/0/log")
  237. if err != nil {
  238. return logContent, fmt.Errorf("resty GetTrainJobLog: %v", err)
  239. }
  240. if res.StatusCode() != http.StatusOK {
  241. var temp models.GrampusResult
  242. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  243. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  244. return logContent, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  245. }
  246. log.Error("GetTrainJobLog failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  247. return logContent, fmt.Errorf("GetTrainJobLog failed(%d):%d(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  248. }
  249. logContent = res.String()
  250. return logContent, nil
  251. }
  252. func GetGrampusMetrics(jobID string) (models.GetTrainJobMetricStatisticResult, error) {
  253. checkSetting()
  254. client := getRestyClient()
  255. var result models.GetTrainJobMetricStatisticResult
  256. res, err := client.R().
  257. SetAuthToken(TOKEN).
  258. Get(HOST + urlTrainJob + "/" + jobID + "/task/0/replica/0/metrics")
  259. if err != nil {
  260. return result, fmt.Errorf("resty GetTrainJobLog: %v", err)
  261. }
  262. if err = json.Unmarshal([]byte(res.String()), &result); err != nil {
  263. log.Error("GetGrampusMetrics json.Unmarshal failed(%s): %v", res.String(), err.Error())
  264. return result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  265. }
  266. if res.StatusCode() != http.StatusOK {
  267. log.Error("Call GrampusMetrics failed(%d):%s(%s)", res.StatusCode(), result.ErrorCode, result.ErrorMsg)
  268. return result, fmt.Errorf("Call GrampusMetrics failed(%d):%d(%s)", res.StatusCode(), result.ErrorCode, result.ErrorMsg)
  269. }
  270. if !result.IsSuccess {
  271. log.Error("GetGrampusMetrics(%s) failed", jobID)
  272. return result, fmt.Errorf("GetGrampusMetrics failed:%s", result.ErrorMsg)
  273. }
  274. return result, nil
  275. }
  276. func StopJob(jobID string, jobType ...string) (*models.GrampusStopJobResponse, error) {
  277. checkSetting()
  278. client := getRestyClient()
  279. var result models.GrampusStopJobResponse
  280. retry := 0
  281. url := urlTrainJob
  282. if len(jobType) > 0 {
  283. if jobType[0] == string(models.JobTypeDebug) {
  284. url = urlNotebookJob
  285. }
  286. }
  287. sendjob:
  288. _, err := client.R().
  289. //SetHeader("Content-Type", "application/json").
  290. SetAuthToken(TOKEN).
  291. SetResult(&result).
  292. Post(HOST + url + "/" + jobID + "/stop")
  293. if err != nil {
  294. return &result, fmt.Errorf("resty StopTrainJob: %v", err)
  295. }
  296. if result.ErrorCode == errorIllegalToken && retry < 1 {
  297. retry++
  298. log.Info("retry get token")
  299. _ = getToken()
  300. goto sendjob
  301. }
  302. if result.ErrorCode != 0 {
  303. log.Error("GetJob failed(%d): %s", result.ErrorCode, result.ErrorMsg)
  304. return &result, fmt.Errorf("GetJob failed(%d): %s", result.ErrorCode, result.ErrorMsg)
  305. }
  306. return &result, nil
  307. }
  308. func GetAiCenters(pageIndex, pageSize int) (*models.GetGrampusAiCentersResult, error) {
  309. checkSetting()
  310. client := getRestyClient()
  311. var result models.GetGrampusAiCentersResult
  312. retry := 0
  313. sendjob:
  314. _, err := client.R().
  315. SetAuthToken(TOKEN).
  316. SetResult(&result).
  317. Get(HOST + urlGetAiCenter + "?pageIndex=" + fmt.Sprint(pageIndex) + "&pageSize=" + fmt.Sprint(pageSize))
  318. if err != nil {
  319. return nil, fmt.Errorf("resty GetAiCenters: %v", err)
  320. }
  321. if result.ErrorCode == errorIllegalToken && retry < 1 {
  322. retry++
  323. log.Info("retry get token")
  324. _ = getToken()
  325. goto sendjob
  326. }
  327. if result.ErrorCode != 0 {
  328. log.Error("GetAiCenters failed(%d): %s", result.ErrorCode, result.ErrorMsg)
  329. return &result, fmt.Errorf("GetAiCenters failed(%d): %s", result.ErrorCode, result.ErrorMsg)
  330. }
  331. return &result, nil
  332. }
  333. func RestartNotebookJob(jobID string) (*models.GrampusNotebookRestartResponse, error) {
  334. checkSetting()
  335. client := getRestyClient()
  336. var restartResponse *models.GrampusNotebookRestartResponse
  337. retry := 0
  338. sendjob:
  339. res, err := client.R().
  340. SetAuthToken(TOKEN).
  341. SetResult(&restartResponse).
  342. Post(HOST + urlNotebookJob + "/" + jobID + "/start")
  343. if err != nil {
  344. return nil, fmt.Errorf("resty grampus restart note book job: %v", err)
  345. }
  346. if restartResponse.ErrorCode == errorIllegalToken && retry < 1 {
  347. retry++
  348. log.Info("retry get token")
  349. _ = getToken()
  350. goto sendjob
  351. }
  352. if res.StatusCode() != http.StatusOK {
  353. log.Error("resty grampus restart note book job failed(%s): %v", res.String(), err.Error())
  354. return nil, fmt.Errorf("resty grampus restart note book job failed: %v", err)
  355. }
  356. return restartResponse, nil
  357. }