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 39 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
3 years ago
3 years ago
3 years ago
3 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
3 years ago
3 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
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
3 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
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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311
  1. package modelarts
  2. import (
  3. "crypto/tls"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. "strconv"
  8. "code.gitea.io/gitea/models"
  9. "code.gitea.io/gitea/modules/log"
  10. "code.gitea.io/gitea/modules/setting"
  11. "github.com/go-resty/resty/v2"
  12. )
  13. var (
  14. restyClient *resty.Client
  15. HOST string
  16. TOKEN string
  17. )
  18. const (
  19. methodPassword = "password"
  20. urlGetToken = "/v3/auth/tokens"
  21. urlNotebook = "/demanager/instances"
  22. urlTrainJob = "/training-jobs"
  23. urlResourceSpecs = "/job/resource-specs"
  24. urlTrainJobConfig = "/training-job-configs"
  25. errorCodeExceedLimit = "ModelArts.0118"
  26. //notebook 2.0
  27. urlNotebook2 = "/notebooks"
  28. //error code
  29. modelartsIllegalToken = "ModelArts.6401"
  30. NotebookNotFound = "ModelArts.6404"
  31. NotebookNoPermission = "ModelArts.6407"
  32. NotebookInvalid = "ModelArts.6400"
  33. UnknownErrorPrefix = "UNKNOWN:"
  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.ModelArtsHost
  53. client := getRestyClient()
  54. params := models.GetTokenParams{
  55. Auth: models.Auth{
  56. Identity: models.Identity{
  57. Methods: []string{methodPassword},
  58. Password: models.Password{
  59. User: models.NotebookUser{
  60. Name: setting.ModelArtsUsername,
  61. Password: setting.ModelArtsPassword,
  62. Domain: models.Domain{
  63. Name: setting.ModelArtsDomain,
  64. },
  65. },
  66. },
  67. },
  68. Scope: models.Scope{
  69. Project: models.Project{
  70. Name: setting.ProjectName,
  71. },
  72. },
  73. },
  74. }
  75. res, err := client.R().
  76. SetHeader("Content-Type", "application/json").
  77. SetBody(params).
  78. Post(setting.IamHost + urlGetToken)
  79. if err != nil {
  80. return fmt.Errorf("resty getToken: %v", err)
  81. }
  82. if res.StatusCode() != http.StatusCreated {
  83. return fmt.Errorf("getToken failed:%s", res.String())
  84. }
  85. TOKEN = res.Header().Get("X-Subject-Token")
  86. return nil
  87. }
  88. func CreateJob(createJobParams models.CreateNotebookParams) (*models.CreateNotebookResult, error) {
  89. checkSetting()
  90. client := getRestyClient()
  91. var result models.CreateNotebookResult
  92. retry := 0
  93. sendjob:
  94. res, err := client.R().
  95. SetHeader("Content-Type", "application/json").
  96. SetAuthToken(TOKEN).
  97. SetBody(createJobParams).
  98. SetResult(&result).
  99. Post(HOST + "/v1/" + setting.ProjectID + urlNotebook)
  100. if err != nil {
  101. return nil, fmt.Errorf("resty create notebook: %s", err)
  102. }
  103. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  104. retry++
  105. _ = getToken()
  106. goto sendjob
  107. }
  108. var response models.NotebookResult
  109. err = json.Unmarshal(res.Body(), &response)
  110. if err != nil {
  111. log.Error("json.Unmarshal failed: %s", err.Error())
  112. return &result, fmt.Errorf("son.Unmarshal failed: %s", err.Error())
  113. }
  114. if len(response.ErrorCode) != 0 {
  115. log.Error("createNotebook failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  116. if response.ErrorCode == errorCodeExceedLimit {
  117. response.ErrorMsg = "所选规格使用数量已超过最大配额限制。"
  118. }
  119. return &result, fmt.Errorf("createNotebook failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  120. }
  121. return &result, nil
  122. }
  123. func GetJob(jobID string) (*models.GetNotebookResult, error) {
  124. checkSetting()
  125. client := getRestyClient()
  126. var result models.GetNotebookResult
  127. retry := 0
  128. sendjob:
  129. res, err := client.R().
  130. SetHeader("Content-Type", "application/json").
  131. SetAuthToken(TOKEN).
  132. SetResult(&result).
  133. Get(HOST + "/v1/" + setting.ProjectID + urlNotebook + "/" + jobID)
  134. if err != nil {
  135. return nil, fmt.Errorf("resty GetJob: %v", err)
  136. }
  137. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  138. retry++
  139. _ = getToken()
  140. goto sendjob
  141. }
  142. var response models.NotebookResult
  143. err = json.Unmarshal(res.Body(), &response)
  144. if err != nil {
  145. log.Error("json.Unmarshal failed: %s", err.Error())
  146. return &result, fmt.Errorf("son.Unmarshal failed: %s", err.Error())
  147. }
  148. if len(response.ErrorCode) != 0 {
  149. log.Error("GetJob failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  150. return &result, fmt.Errorf("GetJob failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  151. }
  152. return &result, nil
  153. }
  154. func GetNotebook2(jobID string) (*models.GetNotebook2Result, error) {
  155. checkSetting()
  156. client := getRestyClient()
  157. var result models.GetNotebook2Result
  158. retry := 0
  159. sendjob:
  160. res, err := client.R().
  161. SetHeader("Content-Type", "application/json").
  162. SetAuthToken(TOKEN).
  163. SetResult(&result).
  164. Get(HOST + "/v1/" + setting.ProjectID + urlNotebook2 + "/" + jobID)
  165. if err != nil {
  166. return nil, fmt.Errorf("resty GetJob: %v", err)
  167. }
  168. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  169. retry++
  170. _ = getToken()
  171. goto sendjob
  172. }
  173. var response models.NotebookResult
  174. err = json.Unmarshal(res.Body(), &response)
  175. if err != nil {
  176. log.Error("json.Unmarshal failed: %s", err.Error())
  177. return &result, fmt.Errorf("son.Unmarshal failed: %s", err.Error())
  178. }
  179. if len(response.ErrorCode) != 0 {
  180. log.Error("GetJob failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  181. if response.ErrorCode == modelartsIllegalToken && retry < 1 {
  182. retry++
  183. _ = getToken()
  184. goto sendjob
  185. }
  186. return &result, fmt.Errorf("GetJob failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  187. }
  188. return &result, nil
  189. }
  190. func ManageNotebook(jobID string, param models.NotebookAction) (*models.NotebookActionResult, error) {
  191. checkSetting()
  192. client := getRestyClient()
  193. var result models.NotebookActionResult
  194. retry := 0
  195. sendjob:
  196. res, err := client.R().
  197. SetHeader("Content-Type", "application/json").
  198. SetBody(param).
  199. SetAuthToken(TOKEN).
  200. SetResult(&result).
  201. Post(HOST + "/v1/" + setting.ProjectID + urlNotebook + "/" + jobID + "/action")
  202. if err != nil {
  203. return &result, fmt.Errorf("resty StopJob: %v", err)
  204. }
  205. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  206. retry++
  207. _ = getToken()
  208. goto sendjob
  209. }
  210. var response models.NotebookResult
  211. err = json.Unmarshal(res.Body(), &response)
  212. if err != nil {
  213. log.Error("json.Unmarshal failed: %s", err.Error())
  214. return &result, fmt.Errorf("son.Unmarshal failed: %s", err.Error())
  215. }
  216. if len(response.ErrorCode) != 0 {
  217. log.Error("ManageNotebook failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  218. return &result, fmt.Errorf("ManageNotebook failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  219. }
  220. return &result, nil
  221. }
  222. func ManageNotebook2(jobID string, param models.NotebookAction) (*models.NotebookActionResult, error) {
  223. checkSetting()
  224. client := getRestyClient()
  225. var result models.NotebookActionResult
  226. retry := 0
  227. sendjob:
  228. res, err := client.R().
  229. SetHeader("Content-Type", "application/json").
  230. SetAuthToken(TOKEN).
  231. SetResult(&result).
  232. Post(HOST + "/v1/" + setting.ProjectID + urlNotebook2 + "/" + jobID + "/" + param.Action + "?duration=" + strconv.Itoa(autoStopDurationMs))
  233. if err != nil {
  234. return &result, fmt.Errorf("resty ManageNotebook2: %v", err)
  235. }
  236. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  237. retry++
  238. _ = getToken()
  239. goto sendjob
  240. }
  241. var response models.NotebookResult
  242. err = json.Unmarshal(res.Body(), &response)
  243. if err != nil {
  244. log.Error("json.Unmarshal failed: %s", err.Error())
  245. return &result, fmt.Errorf("son.Unmarshal failed: %s", err.Error())
  246. }
  247. if res.StatusCode() == http.StatusBadGateway {
  248. return &result, fmt.Errorf(UnknownErrorPrefix+"createNotebook2 failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  249. }
  250. if len(response.ErrorCode) != 0 {
  251. log.Error("ManageNotebook2 failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  252. if response.ErrorCode == modelartsIllegalToken && retry < 1 {
  253. retry++
  254. _ = getToken()
  255. goto sendjob
  256. }
  257. return &result, fmt.Errorf("ManageNotebook2 failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  258. }
  259. return &result, nil
  260. }
  261. func DelNotebook(jobID string) (*models.NotebookDelResult, error) {
  262. checkSetting()
  263. client := getRestyClient()
  264. var result models.NotebookDelResult
  265. retry := 0
  266. sendjob:
  267. res, err := client.R().
  268. SetHeader("Content-Type", "application/json").
  269. SetAuthToken(TOKEN).
  270. SetResult(&result).
  271. Delete(HOST + "/v1/" + setting.ProjectID + urlNotebook + "/" + jobID)
  272. if err != nil {
  273. return &result, fmt.Errorf("resty DelJob: %v", err)
  274. }
  275. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  276. retry++
  277. _ = getToken()
  278. goto sendjob
  279. }
  280. var response models.NotebookResult
  281. err = json.Unmarshal(res.Body(), &response)
  282. if err != nil {
  283. log.Error("json.Unmarshal failed: %s", err.Error())
  284. return &result, fmt.Errorf("son.Unmarshal failed: %s", err.Error())
  285. }
  286. if len(response.ErrorCode) != 0 {
  287. log.Error("DelJob failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  288. return &result, fmt.Errorf("DelJob failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  289. }
  290. return &result, nil
  291. }
  292. func DelNotebook2(jobID string) (*models.NotebookDelResult, error) {
  293. checkSetting()
  294. client := getRestyClient()
  295. var result models.NotebookDelResult
  296. retry := 0
  297. sendjob:
  298. res, err := client.R().
  299. SetHeader("Content-Type", "application/json").
  300. SetAuthToken(TOKEN).
  301. SetResult(&result).
  302. Delete(HOST + "/v1/" + setting.ProjectID + urlNotebook2 + "/" + jobID)
  303. if err != nil {
  304. return &result, fmt.Errorf("resty DelJob: %v", err)
  305. }
  306. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  307. retry++
  308. _ = getToken()
  309. goto sendjob
  310. }
  311. var response models.NotebookResult
  312. err = json.Unmarshal(res.Body(), &response)
  313. if err != nil {
  314. log.Error("json.Unmarshal failed: %s", err.Error())
  315. return &result, fmt.Errorf("son.Unmarshal failed: %s", err.Error())
  316. }
  317. if len(response.ErrorCode) != 0 {
  318. log.Error("DelNotebook2 failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  319. if response.ErrorCode == modelartsIllegalToken && retry < 1 {
  320. retry++
  321. _ = getToken()
  322. goto sendjob
  323. }
  324. return &result, fmt.Errorf("DelNotebook2 failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  325. }
  326. return &result, nil
  327. }
  328. func DelJob(jobID string) (*models.NotebookDelResult, error) {
  329. checkSetting()
  330. client := getRestyClient()
  331. var result models.NotebookDelResult
  332. retry := 0
  333. sendjob:
  334. res, err := client.R().
  335. SetHeader("Content-Type", "application/json").
  336. SetAuthToken(TOKEN).
  337. SetResult(&result).
  338. Delete(HOST + "/v1/" + setting.ProjectID + urlNotebook + "/" + jobID)
  339. if err != nil {
  340. return &result, fmt.Errorf("resty DelJob: %v", err)
  341. }
  342. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  343. retry++
  344. _ = getToken()
  345. goto sendjob
  346. }
  347. var response models.NotebookResult
  348. err = json.Unmarshal(res.Body(), &response)
  349. if err != nil {
  350. log.Error("json.Unmarshal failed: %s", err.Error())
  351. return &result, fmt.Errorf("son.Unmarshal failed: %s", err.Error())
  352. }
  353. if len(response.ErrorCode) != 0 {
  354. log.Error("DelJob failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  355. return &result, fmt.Errorf("DelJob failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  356. }
  357. return &result, nil
  358. }
  359. func GetJobToken(jobID string) (*models.NotebookGetJobTokenResult, error) {
  360. checkSetting()
  361. client := getRestyClient()
  362. var result models.NotebookGetJobTokenResult
  363. retry := 0
  364. sendjob:
  365. res, err := client.R().
  366. SetHeader("Content-Type", "application/json").
  367. SetAuthToken(TOKEN).
  368. SetResult(&result).
  369. Get(HOST + "/v1/" + setting.ProjectID + urlNotebook + "/" + jobID + "/token")
  370. if err != nil {
  371. return &result, fmt.Errorf("resty GetJobToken: %v", err)
  372. }
  373. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  374. retry++
  375. _ = getToken()
  376. goto sendjob
  377. }
  378. var response models.NotebookResult
  379. err = json.Unmarshal(res.Body(), &response)
  380. if err != nil {
  381. log.Error("json.Unmarshal failed: %s", err.Error())
  382. return &result, fmt.Errorf("son.Unmarshal failed: %s", err.Error())
  383. }
  384. if len(response.ErrorCode) != 0 {
  385. log.Error("GetJobToken failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  386. return &result, fmt.Errorf("GetJobToken failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  387. }
  388. return &result, nil
  389. }
  390. func createTrainJob(createJobParams models.CreateTrainJobParams) (*models.CreateTrainJobResult, error) {
  391. checkSetting()
  392. client := getRestyClient()
  393. var result models.CreateTrainJobResult
  394. retry := 0
  395. sendjob:
  396. res, err := client.R().
  397. SetHeader("Content-Type", "application/json").
  398. SetAuthToken(TOKEN).
  399. SetBody(createJobParams).
  400. SetResult(&result).
  401. Post(HOST + "/v1/" + setting.ProjectID + urlTrainJob)
  402. if err != nil {
  403. return nil, fmt.Errorf("resty create train-job: %s", err)
  404. }
  405. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  406. retry++
  407. _ = getToken()
  408. goto sendjob
  409. }
  410. if res.StatusCode() != http.StatusOK {
  411. var temp models.ErrorResult
  412. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  413. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  414. return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  415. }
  416. log.Error("createTrainJob failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  417. bootFileErrorMsg := "Invalid OBS path '" + createJobParams.Config.BootFileUrl + "'."
  418. dataSetErrorMsg := "Invalid OBS path '" + createJobParams.Config.DataUrl + "'."
  419. if temp.ErrorMsg == bootFileErrorMsg {
  420. log.Error("启动文件错误!createTrainJob failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  421. return &result, fmt.Errorf("启动文件错误!")
  422. }
  423. if temp.ErrorMsg == dataSetErrorMsg {
  424. log.Error("数据集错误!createTrainJob failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  425. return &result, fmt.Errorf("数据集错误!")
  426. }
  427. if res.StatusCode() == http.StatusBadGateway {
  428. return &result, fmt.Errorf(UnknownErrorPrefix+"createTrainJob failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  429. } else {
  430. return &result, fmt.Errorf("createTrainJob failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  431. }
  432. }
  433. if !result.IsSuccess {
  434. log.Error("createTrainJob failed(%s): %s", result.ErrorCode, result.ErrorMsg)
  435. return &result, fmt.Errorf("createTrainJob failed(%s): %s", result.ErrorCode, result.ErrorMsg)
  436. }
  437. return &result, nil
  438. }
  439. func createTrainJobVersion(createJobVersionParams models.CreateTrainJobVersionParams, jobID string) (*models.CreateTrainJobResult, error) {
  440. checkSetting()
  441. client := getRestyClient()
  442. var result models.CreateTrainJobResult
  443. retry := 0
  444. sendjob:
  445. res, err := client.R().
  446. SetHeader("Content-Type", "application/json").
  447. SetAuthToken(TOKEN).
  448. SetBody(createJobVersionParams).
  449. SetResult(&result).
  450. Post(HOST + "/v1/" + setting.ProjectID + urlTrainJob + "/" + jobID + "/versions")
  451. if err != nil {
  452. return nil, fmt.Errorf("resty create train-job version: %s", err)
  453. }
  454. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  455. retry++
  456. _ = getToken()
  457. goto sendjob
  458. }
  459. if res.StatusCode() != http.StatusOK {
  460. var temp models.ErrorResult
  461. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  462. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  463. return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  464. }
  465. log.Error("createTrainJobVersion failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  466. bootFileErrorMsg := "Invalid OBS path '" + createJobVersionParams.Config.BootFileUrl + "'."
  467. dataSetErrorMsg := "Invalid OBS path '" + createJobVersionParams.Config.DataUrl + "'."
  468. if temp.ErrorMsg == bootFileErrorMsg {
  469. log.Error("启动文件错误!createTrainJobVersion failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  470. return &result, fmt.Errorf("启动文件错误!")
  471. }
  472. if temp.ErrorMsg == dataSetErrorMsg {
  473. log.Error("数据集错误!createTrainJobVersion failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  474. return &result, fmt.Errorf("数据集错误!")
  475. }
  476. if res.StatusCode() == http.StatusBadGateway {
  477. return &result, fmt.Errorf(UnknownErrorPrefix+"createTrainJobVersion failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  478. } else {
  479. return &result, fmt.Errorf("createTrainJobVersion failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  480. }
  481. }
  482. if !result.IsSuccess {
  483. log.Error("createTrainJobVersion failed(%s): %s", result.ErrorCode, result.ErrorMsg)
  484. return &result, fmt.Errorf("createTrainJobVersion failed(%s): %s", result.ErrorCode, result.ErrorMsg)
  485. }
  486. return &result, nil
  487. }
  488. func GetResourceSpecs() (*models.GetResourceSpecsResult, error) {
  489. checkSetting()
  490. client := getRestyClient()
  491. var result models.GetResourceSpecsResult
  492. retry := 0
  493. sendjob:
  494. res, err := client.R().
  495. SetHeader("Content-Type", "application/json").
  496. SetAuthToken(TOKEN).
  497. SetResult(&result).
  498. Get(HOST + "/v1/" + setting.ProjectID + urlResourceSpecs)
  499. if err != nil {
  500. return nil, fmt.Errorf("resty GetResourceSpecs: %v", err)
  501. }
  502. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  503. retry++
  504. _ = getToken()
  505. goto sendjob
  506. }
  507. if res.StatusCode() != http.StatusOK {
  508. var temp models.ErrorResult
  509. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  510. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  511. return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  512. }
  513. log.Error("GetResourceSpecs failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  514. return &result, fmt.Errorf("GetResourceSpecs failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  515. }
  516. if !result.IsSuccess {
  517. log.Error("GetResourceSpecs failed(%s): %s", result.ErrorCode, result.ErrorMsg)
  518. return &result, fmt.Errorf("GetResourceSpecs failed(%s): %s", result.ErrorCode, result.ErrorMsg)
  519. }
  520. return &result, nil
  521. }
  522. func CreateTrainJobConfig(req models.CreateConfigParams) (*models.CreateTrainJobConfigResult, error) {
  523. checkSetting()
  524. client := getRestyClient()
  525. var result models.CreateTrainJobConfigResult
  526. retry := 0
  527. sendjob:
  528. res, err := client.R().
  529. SetHeader("Content-Type", "application/json").
  530. SetAuthToken(TOKEN).
  531. SetBody(req).
  532. SetResult(&result).
  533. Post(HOST + "/v1/" + setting.ProjectID + urlTrainJobConfig)
  534. if err != nil {
  535. return nil, fmt.Errorf("resty CreateTrainJobConfig: %s", err)
  536. }
  537. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  538. retry++
  539. _ = getToken()
  540. goto sendjob
  541. }
  542. if res.StatusCode() != http.StatusOK {
  543. var temp models.ErrorResult
  544. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  545. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  546. return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  547. }
  548. log.Error("CreateTrainJobConfig failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  549. return &result, fmt.Errorf("CreateTrainJobConfig failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  550. }
  551. if !result.IsSuccess {
  552. log.Error("CreateTrainJobConfig failed(%s): %s", result.ErrorCode, result.ErrorMsg)
  553. return &result, fmt.Errorf("CreateTrainJobConfig failed(%s): %s", result.ErrorCode, result.ErrorMsg)
  554. }
  555. return &result, nil
  556. }
  557. func GetConfigList(perPage, page int, sortBy, order, searchContent, configType string) (*models.GetConfigListResult, error) {
  558. checkSetting()
  559. client := getRestyClient()
  560. var result models.GetConfigListResult
  561. retry := 0
  562. sendjob:
  563. res, err := client.R().
  564. SetQueryParams(map[string]string{
  565. "per_page": strconv.Itoa(perPage),
  566. "page": strconv.Itoa(page),
  567. "sortBy": sortBy,
  568. "order": order,
  569. "search_content": searchContent,
  570. "config_type": configType,
  571. }).
  572. SetAuthToken(TOKEN).
  573. SetResult(&result).
  574. Get(HOST + "/v1/" + setting.ProjectID + urlTrainJobConfig)
  575. if err != nil {
  576. return nil, fmt.Errorf("resty GetConfigList: %v", err)
  577. }
  578. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  579. retry++
  580. _ = getToken()
  581. goto sendjob
  582. }
  583. if res.StatusCode() != http.StatusOK {
  584. var temp models.ErrorResult
  585. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  586. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  587. return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  588. }
  589. log.Error("GetConfigList failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  590. return &result, fmt.Errorf("获取参数配置列表失败(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  591. }
  592. if !result.IsSuccess {
  593. log.Error("GetConfigList failed(%s): %s", result.ErrorCode, result.ErrorMsg)
  594. return &result, fmt.Errorf("获取参数配置列表失败(%s): %s", result.ErrorCode, result.ErrorMsg)
  595. }
  596. return &result, nil
  597. }
  598. func GetParaConfig(configName, configType string) (models.GetConfigResult, error) {
  599. checkSetting()
  600. client := getRestyClient()
  601. var result models.GetConfigResult
  602. retry := 0
  603. sendjob:
  604. res, err := client.R().
  605. SetQueryParams(map[string]string{
  606. "config_type": configType,
  607. }).
  608. SetAuthToken(TOKEN).
  609. SetResult(&result).
  610. Get(HOST + "/v1/" + setting.ProjectID + urlTrainJobConfig + "/" + configName)
  611. if err != nil {
  612. return result, fmt.Errorf("resty GetParaConfig: %v", err)
  613. }
  614. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  615. retry++
  616. _ = getToken()
  617. goto sendjob
  618. }
  619. if res.StatusCode() != http.StatusOK {
  620. var temp models.ErrorResult
  621. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  622. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  623. return result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  624. }
  625. log.Error("GetParaConfig failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  626. return result, fmt.Errorf("获取参数配置详情失败(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  627. }
  628. if !result.IsSuccess {
  629. log.Error("GetParaConfig failed(%s): %s", result.ErrorCode, result.ErrorMsg)
  630. return result, fmt.Errorf("获取参数配置详情失败(%s): %s", result.ErrorCode, result.ErrorMsg)
  631. }
  632. return result, nil
  633. }
  634. func GetTrainJob(jobID, versionID string) (*models.GetTrainJobResult, error) {
  635. checkSetting()
  636. client := getRestyClient()
  637. var result models.GetTrainJobResult
  638. retry := 0
  639. sendjob:
  640. res, err := client.R().
  641. SetAuthToken(TOKEN).
  642. SetResult(&result).
  643. Get(HOST + "/v1/" + setting.ProjectID + urlTrainJob + "/" + jobID + "/versions/" + versionID)
  644. if err != nil {
  645. return nil, fmt.Errorf("resty GetTrainJob: %v", err)
  646. }
  647. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  648. retry++
  649. _ = getToken()
  650. goto sendjob
  651. }
  652. if res.StatusCode() != http.StatusOK {
  653. var temp models.ErrorResult
  654. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  655. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  656. return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  657. }
  658. log.Error("GetTrainJob failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  659. return &result, fmt.Errorf("获取作业详情失败(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  660. }
  661. if !result.IsSuccess {
  662. log.Error("GetTrainJob(%s) failed", jobID)
  663. return &result, fmt.Errorf("获取作业详情失败")
  664. }
  665. return &result, nil
  666. }
  667. func GetTrainJobLog(jobID, versionID, baseLine, logFile, order string, lines int) (*models.GetTrainJobLogResult, error) {
  668. checkSetting()
  669. client := getRestyClient()
  670. var result models.GetTrainJobLogResult
  671. retry := 0
  672. sendjob:
  673. res, err := client.R().
  674. SetQueryParams(map[string]string{
  675. "base_line": baseLine,
  676. "lines": strconv.Itoa(lines),
  677. "log_file": logFile,
  678. "order": order,
  679. }).
  680. SetAuthToken(TOKEN).
  681. SetResult(&result).
  682. Get(HOST + "/v1/" + setting.ProjectID + urlTrainJob + "/" + jobID + "/versions/" + versionID + "/aom-log")
  683. if err != nil {
  684. return nil, fmt.Errorf("resty GetTrainJobLog: %v", err)
  685. }
  686. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  687. retry++
  688. _ = getToken()
  689. goto sendjob
  690. }
  691. if res.StatusCode() != http.StatusOK {
  692. var temp models.ErrorResult
  693. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  694. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  695. return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  696. }
  697. log.Error("GetTrainJobLog failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  698. return &result, fmt.Errorf("获取作业日志失败(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  699. }
  700. if !result.IsSuccess {
  701. log.Error("GetTrainJobLog(%s) failed", jobID)
  702. return &result, fmt.Errorf("获取作业日志失败:%s", result.ErrorMsg)
  703. }
  704. return &result, nil
  705. }
  706. func GetTrainJobLogFileNames(jobID, versionID string) (*models.GetTrainJobLogFileNamesResult, error) {
  707. checkSetting()
  708. client := getRestyClient()
  709. var result models.GetTrainJobLogFileNamesResult
  710. retry := 0
  711. sendjob:
  712. res, err := client.R().
  713. SetAuthToken(TOKEN).
  714. SetResult(&result).
  715. Get(HOST + "/v1/" + setting.ProjectID + urlTrainJob + "/" + jobID + "/versions/" + versionID + "/log/file-names")
  716. if err != nil {
  717. return nil, fmt.Errorf("resty GetTrainJobLogFileNames: %v", err)
  718. }
  719. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  720. retry++
  721. _ = getToken()
  722. goto sendjob
  723. }
  724. if res.StatusCode() != http.StatusOK {
  725. var temp models.ErrorResult
  726. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  727. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  728. return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  729. }
  730. log.Error("GetTrainJobLogFileNames failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  731. return &result, fmt.Errorf("GetTrainJobLogFileNames failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  732. }
  733. if !result.IsSuccess {
  734. log.Error("GetTrainJobLogFileNames(%s) failed", jobID)
  735. return &result, fmt.Errorf("获取作业日志文件失败:%s", result.ErrorMsg)
  736. }
  737. return &result, nil
  738. }
  739. func DelTrainJob(jobID string) (*models.TrainJobResult, error) {
  740. checkSetting()
  741. client := getRestyClient()
  742. var result models.TrainJobResult
  743. retry := 0
  744. sendjob:
  745. res, err := client.R().
  746. SetAuthToken(TOKEN).
  747. SetResult(&result).
  748. Delete(HOST + "/v1/" + setting.ProjectID + urlTrainJob + "/" + jobID)
  749. if err != nil {
  750. return &result, fmt.Errorf("resty DelTrainJob: %v", err)
  751. }
  752. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  753. retry++
  754. _ = getToken()
  755. goto sendjob
  756. }
  757. if res.StatusCode() != http.StatusOK {
  758. var temp models.ErrorResult
  759. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  760. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  761. return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  762. }
  763. log.Error("DelTrainJob failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  764. return &result, fmt.Errorf("删除训练作业失败(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  765. }
  766. if !result.IsSuccess {
  767. log.Error("DelTrainJob(%s) failed", jobID)
  768. return &result, fmt.Errorf("删除训练作业失败:%s", result.ErrorMsg)
  769. }
  770. return &result, nil
  771. }
  772. func StopTrainJob(jobID, versionID string) (*models.TrainJobResult, error) {
  773. checkSetting()
  774. client := getRestyClient()
  775. var result models.TrainJobResult
  776. retry := 0
  777. sendjob:
  778. res, err := client.R().
  779. SetAuthToken(TOKEN).
  780. SetResult(&result).
  781. Post(HOST + "/v1/" + setting.ProjectID + urlTrainJob + "/" + jobID + "/versions/" + versionID + "/stop")
  782. if err != nil {
  783. return &result, fmt.Errorf("resty StopTrainJob: %v", err)
  784. }
  785. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  786. retry++
  787. _ = getToken()
  788. goto sendjob
  789. }
  790. if res.StatusCode() != http.StatusOK {
  791. var temp models.ErrorResult
  792. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  793. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  794. return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  795. }
  796. log.Error("StopTrainJob failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  797. return &result, fmt.Errorf("停止训练作业失败(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  798. }
  799. if !result.IsSuccess {
  800. log.Error("StopTrainJob(%s) failed", jobID)
  801. return &result, fmt.Errorf("停止训练作业失败:%s", result.ErrorMsg)
  802. }
  803. return &result, nil
  804. }
  805. func DelTrainJobVersion(jobID string, versionID string) (*models.TrainJobResult, error) {
  806. checkSetting()
  807. client := getRestyClient()
  808. var result models.TrainJobResult
  809. retry := 0
  810. sendjob:
  811. res, err := client.R().
  812. SetAuthToken(TOKEN).
  813. SetResult(&result).
  814. Delete(HOST + "/v1/" + setting.ProjectID + urlTrainJob + "/" + jobID + "/versions/" + versionID)
  815. if err != nil {
  816. return &result, fmt.Errorf("resty DelTrainJobVersion: %v", err)
  817. }
  818. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  819. retry++
  820. _ = getToken()
  821. goto sendjob
  822. }
  823. if res.StatusCode() != http.StatusOK {
  824. var temp models.ErrorResult
  825. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  826. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  827. return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  828. }
  829. log.Error("DelTrainJob failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  830. return &result, fmt.Errorf("删除训练作业版本失败(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  831. }
  832. if !result.IsSuccess {
  833. log.Error("DelTrainJob(%s) failed", jobID)
  834. return &result, fmt.Errorf("删除训练作业版本失败:%s", result.ErrorMsg)
  835. }
  836. return &result, nil
  837. }
  838. func createInferenceJob(createJobParams models.CreateInferenceJobParams) (*models.CreateTrainJobResult, error) {
  839. checkSetting()
  840. client := getRestyClient()
  841. var result models.CreateTrainJobResult
  842. retry := 0
  843. sendjob:
  844. res, err := client.R().
  845. SetHeader("Content-Type", "application/json").
  846. SetAuthToken(TOKEN).
  847. SetBody(createJobParams).
  848. SetResult(&result).
  849. Post(HOST + "/v1/" + setting.ProjectID + urlTrainJob)
  850. if err != nil {
  851. return nil, fmt.Errorf("resty create inference-job: %s", err)
  852. }
  853. req, _ := json.Marshal(createJobParams)
  854. log.Info("%s", req)
  855. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  856. retry++
  857. _ = getToken()
  858. goto sendjob
  859. }
  860. if res.StatusCode() != http.StatusOK {
  861. var temp models.ErrorResult
  862. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  863. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  864. return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  865. }
  866. log.Error("createInferenceJob failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  867. BootFileErrorMsg := "Invalid OBS path '" + createJobParams.InfConfig.BootFileUrl + "'."
  868. DataSetErrorMsg := "Invalid OBS path '" + createJobParams.InfConfig.DataUrl + "'."
  869. if temp.ErrorMsg == BootFileErrorMsg {
  870. log.Error("启动文件错误!createInferenceJob failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  871. return &result, fmt.Errorf("启动文件错误!")
  872. }
  873. if temp.ErrorMsg == DataSetErrorMsg {
  874. log.Error("数据集错误!createInferenceJob failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  875. return &result, fmt.Errorf("数据集错误!")
  876. }
  877. if res.StatusCode() == http.StatusBadGateway {
  878. return &result, fmt.Errorf(UnknownErrorPrefix+"createInferenceJob failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  879. } else {
  880. return &result, fmt.Errorf("createInferenceJob failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  881. }
  882. }
  883. if !result.IsSuccess {
  884. log.Error("createInferenceJob failed(%s): %s", result.ErrorCode, result.ErrorMsg)
  885. return &result, fmt.Errorf("createInferenceJob failed(%s): %s", result.ErrorCode, result.ErrorMsg)
  886. }
  887. return &result, nil
  888. }
  889. func createNotebook2(createJobParams models.CreateNotebook2Params) (*models.CreateNotebookResult, error) {
  890. checkSetting()
  891. client := getRestyClient()
  892. var result models.CreateNotebookResult
  893. retry := 0
  894. sendjob:
  895. res, err := client.R().
  896. SetHeader("Content-Type", "application/json").
  897. SetAuthToken(TOKEN).
  898. SetBody(createJobParams).
  899. SetResult(&result).
  900. Post(HOST + "/v1/" + setting.ProjectID + urlNotebook2)
  901. if err != nil {
  902. return nil, fmt.Errorf("resty create notebook2: %s", err)
  903. }
  904. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  905. retry++
  906. _ = getToken()
  907. goto sendjob
  908. }
  909. var response models.NotebookResult
  910. err = json.Unmarshal(res.Body(), &response)
  911. if err != nil {
  912. log.Error("json.Unmarshal failed: %s", err.Error())
  913. return &result, fmt.Errorf("json.Unmarshal failed: %s", err.Error())
  914. }
  915. if res.StatusCode() == http.StatusBadGateway {
  916. return &result, fmt.Errorf(UnknownErrorPrefix+"createNotebook2 failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  917. }
  918. if len(response.ErrorCode) != 0 {
  919. log.Error("createNotebook2 failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  920. if response.ErrorCode == errorCodeExceedLimit {
  921. response.ErrorMsg = "所选规格使用数量已超过最大配额限制。"
  922. }
  923. if response.ErrorCode == modelartsIllegalToken && retry < 1 {
  924. retry++
  925. _ = getToken()
  926. goto sendjob
  927. }
  928. return &result, fmt.Errorf("createNotebook2 failed(%s): %s", response.ErrorCode, response.ErrorMsg)
  929. }
  930. return &result, nil
  931. }
  932. func GetTrainJobMetricStatistic(jobID, versionID, podName string) (*models.GetTrainJobMetricStatisticResult, error) {
  933. checkSetting()
  934. client := getRestyClient()
  935. var result models.GetTrainJobMetricStatisticResult
  936. retry := 0
  937. sendjob:
  938. res, err := client.R().
  939. SetAuthToken(TOKEN).
  940. SetResult(&result).
  941. Get(HOST + "/v1/" + setting.ProjectID + urlTrainJob + "/" + jobID + "/versions/" + versionID + "/pod/" + podName + "/metric-statistic?statistic_type=each")
  942. if err != nil {
  943. return nil, fmt.Errorf("resty GetTrainJobMetricStatistic: %v", err)
  944. }
  945. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  946. retry++
  947. _ = getToken()
  948. goto sendjob
  949. }
  950. if res.StatusCode() != http.StatusOK {
  951. var temp models.ErrorResult
  952. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  953. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  954. return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  955. }
  956. log.Error("GetTrainJobMetricStatistic failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  957. return &result, fmt.Errorf("GetTrainJobMetricStatistic failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  958. }
  959. if !result.IsSuccess {
  960. log.Error("GetTrainJobMetricStatistic(%s) failed", jobID)
  961. return &result, fmt.Errorf("获取任务资源占用情况失败:%s", result.ErrorMsg)
  962. }
  963. return &result, nil
  964. }
  965. func GetTrainJobList(perPage, page int, sortBy, order, searchContent, status string) (*models.GetTrainJobListResult, error) {
  966. checkSetting()
  967. client := getRestyClient()
  968. var result models.GetTrainJobListResult
  969. retry := 0
  970. sendjob:
  971. res, err := client.R().
  972. SetQueryParams(map[string]string{
  973. "per_page": strconv.Itoa(perPage),
  974. "page": strconv.Itoa(page),
  975. "sortBy": sortBy,
  976. "order": order,
  977. "search_content": searchContent,
  978. }).
  979. SetAuthToken(TOKEN).
  980. SetResult(&result).
  981. Get(HOST + "/v1/" + setting.ProjectID + urlTrainJob)
  982. if err != nil {
  983. return nil, fmt.Errorf("resty GetTrainJobList: %v", err)
  984. }
  985. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  986. retry++
  987. _ = getToken()
  988. goto sendjob
  989. }
  990. if res.StatusCode() != http.StatusOK {
  991. var temp models.ErrorResult
  992. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  993. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  994. return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  995. }
  996. log.Error("GetTrainJobList failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  997. return &result, fmt.Errorf(temp.ErrorMsg)
  998. }
  999. if !result.IsSuccess {
  1000. log.Error("GetTrainJobList failed(%s): %s", result.ErrorCode, result.ErrorMsg)
  1001. return &result, fmt.Errorf(result.ErrorMsg)
  1002. }
  1003. return &result, nil
  1004. }
  1005. func GetTrainJobVersionList(perPage, page int, jobID string) (*models.GetTrainJobVersionListResult, error) {
  1006. checkSetting()
  1007. client := getRestyClient()
  1008. var result models.GetTrainJobVersionListResult
  1009. retry := 0
  1010. sendjob:
  1011. res, err := client.R().
  1012. SetQueryParams(map[string]string{
  1013. "per_page": strconv.Itoa(perPage),
  1014. "page": strconv.Itoa(page),
  1015. }).
  1016. SetAuthToken(TOKEN).
  1017. SetResult(&result).
  1018. Get(HOST + "/v1/" + setting.ProjectID + urlTrainJob + "/" + jobID + "/versions")
  1019. if err != nil {
  1020. return nil, fmt.Errorf("resty GetTrainJobVersionList: %v", err)
  1021. }
  1022. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  1023. retry++
  1024. _ = getToken()
  1025. goto sendjob
  1026. }
  1027. if res.StatusCode() != http.StatusOK {
  1028. var temp models.ErrorResult
  1029. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  1030. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  1031. return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  1032. }
  1033. log.Error("GetTrainJobVersionList failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  1034. return &result, fmt.Errorf(temp.ErrorMsg)
  1035. }
  1036. if !result.IsSuccess {
  1037. log.Error("GetTrainJobVersionList failed(%s): %s", result.ErrorCode, result.ErrorMsg)
  1038. return &result, fmt.Errorf(result.ErrorMsg)
  1039. }
  1040. return &result, nil
  1041. }
  1042. func GetNotebookList(limit, page int, sortBy, order, searchContent, status string) (*models.GetNotebookListResult, error) {
  1043. checkSetting()
  1044. client := getRestyClient()
  1045. var result models.GetNotebookListResult
  1046. retry := 0
  1047. sendjob:
  1048. res, err := client.R().
  1049. SetQueryParams(map[string]string{
  1050. "limit": strconv.Itoa(limit),
  1051. "name": searchContent,
  1052. "sort_key": sortBy,
  1053. "sort_dir": order,
  1054. }).
  1055. SetAuthToken(TOKEN).
  1056. SetResult(&result).
  1057. Get(HOST + "/v1/" + setting.ProjectID + urlNotebook2)
  1058. if err != nil {
  1059. return nil, fmt.Errorf("resty GetNotebookList: %v", err)
  1060. }
  1061. if res.StatusCode() == http.StatusUnauthorized && retry < 1 {
  1062. retry++
  1063. _ = getToken()
  1064. goto sendjob
  1065. }
  1066. if res.StatusCode() != http.StatusOK {
  1067. var temp models.ErrorResult
  1068. if err = json.Unmarshal([]byte(res.String()), &temp); err != nil {
  1069. log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  1070. return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error())
  1071. }
  1072. log.Error("GetNotebookList failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg)
  1073. return &result, fmt.Errorf(temp.ErrorMsg)
  1074. }
  1075. return &result, nil
  1076. }