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

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