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