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