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