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