workflow.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. package client
  2. const (
  3. createWorkflowRelativeUrl = "/api/v1/workflows/{namespace}"
  4. deleteWorkflowRelativeUrl = "/api/v1/workflows/{namespace}/{name}"
  5. getWorkflowsInNamespaceRelativeUrl = "/api/v1/workflows/{namespace}"
  6. getWorkflowRelativeUrl = "/api/v1/workflows/{namespace}/{name}"
  7. lintWorkflowRelativeUrl = "/api/v1/workflows/{namespace}/lint"
  8. submitWorkflowRelativeUrl = "/api/v1/workflows/{namespace}/submit"
  9. resubmitWorkflowRelativeUrl = "/api/v1/workflows/{namespace}/{name}/resubmit"
  10. retryWorkflowRelativeUrl = "/api/v1/workflows/{namespace}/{name}/retry"
  11. stopWorkflowRelativeUrl = "/api/v1/workflows/{namespace}/{name}/stop"
  12. terminateWorkflowRelativeUrl = "/api/v1/workflows/{namespace}/{name}/terminate"
  13. setWorkflowRelativeUrl = "/api/v1/workflows/{namespace}/{name}/set"
  14. suspendWorkflowRelativeUrl = "/api/v1/workflows/{namespace}/{name}/suspend"
  15. resumeWorkflowRelativeUrl = "/api/v1/workflows/{namespace}/{name}/resume"
  16. getWorkflowEventsStreamRelativeUrl = "/api/v1/workflow-events/{namespace}"
  17. )
  18. //
  19. //type CreateWorkflowParams struct {
  20. // Namespace string
  21. // WorkflowDefinition map[string]any
  22. //}
  23. //
  24. //// CreateWorkflow 创建工作流
  25. //func (c *Client) CreateWorkflow(params CreateWorkflowParams) (string, error) {
  26. // responseMap := make(map[string]any)
  27. //
  28. // resp, err := c.restyClient.R().
  29. // SetHeader("Content-Type", "application/json").
  30. // SetAuthToken(c.token).
  31. // SetPathParams(map[string]string{
  32. // "namespace": params.Namespace,
  33. // }).
  34. // SetBody(map[string]any{
  35. // "namespace": params.Namespace,
  36. // "workflow": params.WorkflowDefinition,
  37. // }).
  38. // SetResult(&responseMap).
  39. // SetError(&responseMap).
  40. // Post(createWorkflowRelativeUrl)
  41. // if err != nil {
  42. // return "", errors.New(err.Error())
  43. // }
  44. //
  45. // switch resp.StatusCode() {
  46. // case http.StatusOK:
  47. // metadata, ok := responseMap["metadata"]
  48. // if !ok {
  49. // return "", errors.New("metadata为空")
  50. // }
  51. //
  52. // metadataMap, ok := metadata.(map[string]any)
  53. // if !ok {
  54. // return "", errors.New("metadata不是map")
  55. // }
  56. //
  57. // workflowName, ok := metadataMap["name"]
  58. // if !ok {
  59. // return "", errors.New("metadata中没有工作流名称")
  60. // }
  61. //
  62. // workflowNameStr, ok := workflowName.(string)
  63. // if !ok {
  64. // return "", errors.New("工作流名称不是字符串")
  65. // }
  66. //
  67. // return workflowNameStr, nil
  68. // case http.StatusConflict:
  69. // return "", errors.New("工作流已存在")
  70. // default:
  71. // message, ok := responseMap["message"]
  72. // if !ok {
  73. // return "", errors.Errorf("%v", resp.Status())
  74. // }
  75. //
  76. // return "", errors.Errorf("%v, %v", resp.Status(), message)
  77. // }
  78. //}
  79. //
  80. //type DeleteWorkflowParams struct {
  81. // Namespace string
  82. // Name string
  83. //}
  84. //
  85. //// DeleteWorkflow 删除工作流
  86. //func (c *Client) DeleteWorkflow(params DeleteWorkflowParams) error {
  87. // responseMap := make(map[string]any)
  88. //
  89. // resp, err := c.restyClient.R().
  90. // SetHeader("Content-Type", "application/json").
  91. // SetAuthToken(c.token).
  92. // SetPathParams(map[string]string{
  93. // "namespace": params.Namespace,
  94. // "name": params.Name,
  95. // }).
  96. // SetResult(&responseMap).
  97. // SetError(&responseMap).
  98. // Delete(deleteWorkflowRelativeUrl)
  99. // if err != nil {
  100. // return errors.New(err.Error())
  101. // }
  102. //
  103. // switch resp.StatusCode() {
  104. // case http.StatusOK:
  105. // return nil
  106. // default:
  107. // message, ok := responseMap["message"]
  108. // if !ok {
  109. // return errors.Errorf("%v", resp.Status())
  110. // }
  111. //
  112. // return errors.Errorf("%v, %v", resp.Status(), message)
  113. // }
  114. //}
  115. //
  116. //type GetWorkflowsInNamespaceParams struct {
  117. // Namespace string
  118. //}
  119. //
  120. //// GetWorkflowsInNamespace 获取命名空间下的工作流
  121. //func (c *Client) GetWorkflowsInNamespace(params GetWorkflowsInNamespaceParams) ([]map[string]any, error) {
  122. // responseMap := make(map[string]any)
  123. //
  124. // resp, err := c.restyClient.R().
  125. // SetHeader("Content-Type", "application/json").
  126. // SetAuthToken(c.token).
  127. // SetPathParams(map[string]string{
  128. // "namespace": params.Namespace,
  129. // }).
  130. // SetResult(&responseMap).
  131. // SetError(&responseMap).
  132. // Get(getWorkflowsInNamespaceRelativeUrl)
  133. // if err != nil {
  134. // return nil, errors.New(err.Error())
  135. // }
  136. //
  137. // switch resp.StatusCode() {
  138. // case http.StatusOK:
  139. // itemsValue, ok := responseMap["items"]
  140. // if !ok {
  141. // return nil, errors.New("没有获取到items参数")
  142. // }
  143. //
  144. // items, ok := itemsValue.([]any)
  145. // if !ok {
  146. // return nil, errors.New("items不是slice")
  147. // }
  148. //
  149. // templateDefinitions := make([]map[string]any, len(items))
  150. // for i, item := range items {
  151. // templateDefinition, ok := item.(map[string]any)
  152. // if !ok {
  153. // return nil, errors.New("item无法转换为map[string]any")
  154. // }
  155. //
  156. // templateDefinitions[i] = templateDefinition
  157. // }
  158. //
  159. // return templateDefinitions, nil
  160. // default:
  161. // message, ok := responseMap["message"]
  162. // if !ok {
  163. // return nil, errors.Errorf("%v", resp.Status())
  164. // }
  165. //
  166. // return nil, errors.Errorf("%v, %v", resp.Status(), message)
  167. // }
  168. //}
  169. //
  170. //type GetWorkflowParams struct {
  171. // Namespace string
  172. // Name string
  173. //}
  174. //
  175. //// GetWorkflow 获取指定的工作流
  176. //func (c *Client) GetWorkflow(params GetWorkflowParams) (map[string]any, error) {
  177. // responseMap := make(map[string]any)
  178. //
  179. // resp, err := c.restyClient.R().
  180. // SetHeader("Content-Type", "application/json").
  181. // SetAuthToken(c.token).
  182. // SetPathParams(map[string]string{
  183. // "namespace": params.Namespace,
  184. // "name": params.Name,
  185. // }).
  186. // SetResult(&responseMap).
  187. // SetError(&responseMap).
  188. // Get(getWorkflowRelativeUrl)
  189. // if err != nil {
  190. // return nil, errors.New(err.Error())
  191. // }
  192. //
  193. // switch resp.StatusCode() {
  194. // case http.StatusOK:
  195. // return responseMap, nil
  196. // default:
  197. // message, ok := responseMap["message"]
  198. // if !ok {
  199. // return nil, errors.Errorf("%v", resp.Status())
  200. // }
  201. //
  202. // return nil, errors.Errorf("%v, %v", resp.Status(), message)
  203. // }
  204. //}
  205. //
  206. //type LintWorkflowParams struct {
  207. // Namespace string
  208. // WorkflowDefinition map[string]any
  209. //}
  210. //
  211. //// LintWorkflow 检查工作流定义语法
  212. //func (c *Client) LintWorkflow(params LintWorkflowParams) error {
  213. // responseMap := make(map[string]any)
  214. //
  215. // resp, err := c.restyClient.R().
  216. // SetHeader("Content-Type", "application/json").
  217. // SetAuthToken(c.token).
  218. // SetPathParams(map[string]string{
  219. // "namespace": params.Namespace,
  220. // }).
  221. // SetBody(map[string]any{
  222. // "namespace": params.Namespace,
  223. // "workflow": params.WorkflowDefinition,
  224. // }).
  225. // SetResult(&responseMap).
  226. // SetError(&responseMap).
  227. // Post(lintWorkflowRelativeUrl)
  228. // if err != nil {
  229. // return errors.New(err.Error())
  230. // }
  231. //
  232. // switch resp.StatusCode() {
  233. // case http.StatusOK:
  234. // return nil
  235. // default:
  236. // message, ok := responseMap["message"]
  237. // if !ok {
  238. // return errors.Errorf("%v", resp.Status())
  239. // }
  240. //
  241. // return errors.Errorf("%v, %v", resp.Status(), message)
  242. // }
  243. //}
  244. //
  245. //type SubmitWorkflowFromWorkflowTemplateParams struct {
  246. // Namespace string
  247. // TemplateName string
  248. // Parameters []string
  249. //}
  250. //
  251. //// SubmitWorkflowFromWorkflowTemplate 基于工作流模板提交工作流
  252. //func (c *Client) SubmitWorkflowFromWorkflowTemplate(params SubmitWorkflowFromWorkflowTemplateParams) (string, error) {
  253. // responseMap := make(map[string]any)
  254. //
  255. // resp, err := c.restyClient.R().
  256. // SetHeader("Content-Type", "application/json").
  257. // SetAuthToken(c.token).
  258. // SetPathParams(map[string]string{
  259. // "namespace": params.Namespace,
  260. // }).
  261. // SetBody(map[string]any{
  262. // "namespace": params.Namespace,
  263. // "resourceKind": "WorkflowTemplate",
  264. // "resourceName": params.TemplateName,
  265. // "submitOptions": map[string]any{
  266. // "parameters": params.Parameters,
  267. // },
  268. // }).
  269. // SetResult(&responseMap).
  270. // SetError(&responseMap).
  271. // Post(submitWorkflowRelativeUrl)
  272. // if err != nil {
  273. // return "", errors.New(err.Error())
  274. // }
  275. //
  276. // switch resp.StatusCode() {
  277. // case http.StatusOK:
  278. // metadata, ok := responseMap["metadata"]
  279. // if !ok {
  280. // return "", errors.New("metadata为空")
  281. // }
  282. //
  283. // metadataMap, ok := metadata.(map[string]any)
  284. // if !ok {
  285. // return "", errors.New("metadata不是map")
  286. // }
  287. //
  288. // workflowName, ok := metadataMap["name"]
  289. // if !ok {
  290. // return "", errors.New("metadata中没有工作流名称")
  291. // }
  292. //
  293. // workflowNameStr, ok := workflowName.(string)
  294. // if !ok {
  295. // return "", errors.New("工作流名称不是字符串")
  296. // }
  297. //
  298. // return workflowNameStr, nil
  299. // default:
  300. // message, ok := responseMap["message"]
  301. // if !ok {
  302. // return "", errors.Errorf("%v", resp.Status())
  303. // }
  304. //
  305. // return "", errors.Errorf("%v, %v", resp.Status(), message)
  306. // }
  307. //}
  308. //
  309. //type ResubmitWorkflowParams struct {
  310. // Namespace string
  311. // Name string
  312. // Memoized bool
  313. // ResubmitParameters []string
  314. //}
  315. //
  316. //// ResubmitWorkflow 重提交工作流
  317. //// 有三种方式可以用来重复提交(可以结合使用):重新运行,基于缓存的和传递重提交参数
  318. //// 基于缓存的必须在Error和Failed的工作流上才可以使用
  319. //func (c *Client) ResubmitWorkflow(params ResubmitWorkflowParams) (string, error) {
  320. // responseMap := make(map[string]any)
  321. //
  322. // resp, err := c.restyClient.R().
  323. // SetHeader("Content-Type", "application/json").
  324. // SetAuthToken(c.token).
  325. // SetPathParams(map[string]string{
  326. // "namespace": params.Namespace,
  327. // "name": params.Name,
  328. // }).
  329. // SetBody(map[string]any{
  330. // "namespace": params.Namespace,
  331. // "name": params.Name,
  332. // "memoized": params.Memoized,
  333. // "parameters": params.ResubmitParameters,
  334. // }).
  335. // SetResult(&responseMap).
  336. // SetError(&responseMap).
  337. // Put(resubmitWorkflowRelativeUrl)
  338. // if err != nil {
  339. // return "", errors.New(err.Error())
  340. // }
  341. //
  342. // switch resp.StatusCode() {
  343. // case http.StatusOK:
  344. // metadata, ok := responseMap["metadata"]
  345. // if !ok {
  346. // return "", errors.New("metadata为空")
  347. // }
  348. //
  349. // metadataMap, ok := metadata.(map[string]any)
  350. // if !ok {
  351. // return "", errors.New("metadata不是map")
  352. // }
  353. //
  354. // workflowName, ok := metadataMap["name"]
  355. // if !ok {
  356. // return "", errors.New("metadata中没有工作流名称")
  357. // }
  358. //
  359. // workflowNameStr, ok := workflowName.(string)
  360. // if !ok {
  361. // return "", errors.New("工作流名称不是字符串")
  362. // }
  363. //
  364. // return workflowNameStr, nil
  365. // default:
  366. // message, ok := responseMap["message"]
  367. // if !ok {
  368. // return "", errors.Errorf("%v", resp.Status())
  369. // }
  370. //
  371. // return "", errors.Errorf("%v, %v", resp.Status(), message)
  372. // }
  373. //}
  374. //
  375. //type RetryWorkflowParams struct {
  376. // Namespace string
  377. // Name string
  378. // RetryParameters []string
  379. // RetryOnSuccessfulWorkflow bool
  380. // RetryWorkflowNodeFieldSelector string
  381. //}
  382. //
  383. //// RetryWorkflow 重新运行工作流(默认只能失败的工作流上重新运行)
  384. //func (c *Client) RetryWorkflow(params RetryWorkflowParams) error {
  385. // responseMap := make(map[string]any)
  386. //
  387. // resp, err := c.restyClient.R().
  388. // SetHeader("Content-Type", "application/json").
  389. // SetAuthToken(c.token).
  390. // SetPathParams(map[string]string{
  391. // "namespace": params.Namespace,
  392. // "name": params.Name,
  393. // }).
  394. // SetBody(map[string]any{
  395. // "namespace": params.Namespace,
  396. // "name": params.Name,
  397. // "parameters": params.RetryParameters,
  398. // "restartSuccessful": params.RetryOnSuccessfulWorkflow,
  399. // "nodeFieldSelector": params.RetryWorkflowNodeFieldSelector,
  400. // }).
  401. // SetResult(&responseMap).
  402. // SetError(&responseMap).
  403. // Put(retryWorkflowRelativeUrl)
  404. // if err != nil {
  405. // return errors.New(err.Error())
  406. // }
  407. //
  408. // switch resp.StatusCode() {
  409. // case http.StatusOK:
  410. // return nil
  411. // default:
  412. // message, ok := responseMap["message"]
  413. // if !ok {
  414. // return errors.Errorf("%v", resp.Status())
  415. // }
  416. //
  417. // return errors.Errorf("%v, %v", resp.Status(), message)
  418. // }
  419. //}
  420. //
  421. //type StopWorkflowParams struct {
  422. // Namespace string
  423. // Name string
  424. // NodeFieldSelector string
  425. // Message string
  426. //}
  427. //
  428. //// StopWorkflow 终止工作流运行,会调用所有的退出处理器
  429. //func (c *Client) StopWorkflow(params StopWorkflowParams) error {
  430. // responseMap := make(map[string]any)
  431. //
  432. // resp, err := c.restyClient.R().
  433. // SetHeader("Content-Type", "application/json").
  434. // SetAuthToken(c.token).
  435. // SetPathParams(map[string]string{
  436. // "namespace": params.Namespace,
  437. // "name": params.Name,
  438. // }).
  439. // SetBody(map[string]any{
  440. // "namespace": params.Namespace,
  441. // "name": params.Name,
  442. // "nodeFieldSelector": params.NodeFieldSelector,
  443. // "message": params.Message,
  444. // }).
  445. // SetResult(&responseMap).
  446. // SetError(&responseMap).
  447. // Put(stopWorkflowRelativeUrl)
  448. // if err != nil {
  449. // return errors.New(err.Error())
  450. // }
  451. //
  452. // switch resp.StatusCode() {
  453. // case http.StatusOK:
  454. // return nil
  455. // default:
  456. // message, ok := responseMap["message"]
  457. // if !ok {
  458. // return errors.Errorf("%v", resp.Status())
  459. // }
  460. //
  461. // return errors.Errorf("%v, %v", resp.Status(), message)
  462. // }
  463. //}
  464. //
  465. //type TerminateWorkflowParams struct {
  466. // Namespace string
  467. // Name string
  468. //}
  469. //
  470. //// TerminateWorkflow 终止工作流运行,不调用所有的退出处理器
  471. //func (c *Client) TerminateWorkflow(params TerminateWorkflowParams) error {
  472. // responseMap := make(map[string]any)
  473. //
  474. // resp, err := c.restyClient.R().
  475. // SetHeader("Content-Type", "application/json").
  476. // SetAuthToken(c.token).
  477. // SetPathParams(map[string]string{
  478. // "namespace": params.Namespace,
  479. // "name": params.Name,
  480. // }).
  481. // SetBody(map[string]any{
  482. // "namespace": params.Namespace,
  483. // "name": params.Name,
  484. // }).
  485. // SetResult(&responseMap).
  486. // SetError(&responseMap).
  487. // Put(terminateWorkflowRelativeUrl)
  488. // if err != nil {
  489. // return errors.New(err.Error())
  490. // }
  491. //
  492. // switch resp.StatusCode() {
  493. // case http.StatusOK:
  494. // return nil
  495. // default:
  496. // message, ok := responseMap["message"]
  497. // if !ok {
  498. // return errors.Errorf("%v", resp.Status())
  499. // }
  500. //
  501. // return errors.Errorf("%v, %v", resp.Status(), message)
  502. // }
  503. //}
  504. //
  505. //type SetWorkflowParams struct {
  506. // Namespace string
  507. // Name string
  508. // NodeFieldSelector string
  509. // OutputParameters string
  510. // Message string
  511. // Phase string
  512. //}
  513. //
  514. //// SetWorkflow 设置工作流的参数
  515. //func (c *Client) SetWorkflow(params SetWorkflowParams) error {
  516. // responseMap := make(map[string]any)
  517. //
  518. // resp, err := c.restyClient.R().
  519. // SetHeader("Content-Type", "application/json").
  520. // SetAuthToken(c.token).
  521. // SetPathParams(map[string]string{
  522. // "namespace": params.Namespace,
  523. // "name": params.Name,
  524. // }).
  525. // SetBody(map[string]any{
  526. // "namespace": params.Namespace,
  527. // "name": params.Name,
  528. // "nodeFieldSelector": params.NodeFieldSelector,
  529. // "outputParameters": params.OutputParameters,
  530. // "message": params.Message,
  531. // "phase": params.Phase,
  532. // }).
  533. // SetResult(&responseMap).
  534. // SetError(&responseMap).
  535. // Put(setWorkflowRelativeUrl)
  536. // if err != nil {
  537. // return errors.New(err.Error())
  538. // }
  539. //
  540. // switch resp.StatusCode() {
  541. // case http.StatusOK:
  542. // return nil
  543. // default:
  544. // message, ok := responseMap["message"]
  545. // if !ok {
  546. // return errors.Errorf("%v", resp.Status())
  547. // }
  548. //
  549. // return errors.Errorf("%v, %v", resp.Status(), message)
  550. // }
  551. //}
  552. //
  553. //type SuspendWorkflowParams struct {
  554. // Namespace string
  555. // Name string
  556. //}
  557. //
  558. //// SuspendWorkflow 挂起工作流
  559. //func (c *Client) SuspendWorkflow(params SuspendWorkflowParams) error {
  560. // responseMap := make(map[string]any)
  561. //
  562. // resp, err := c.restyClient.R().
  563. // SetHeader("Content-Type", "application/json").
  564. // SetAuthToken(c.token).
  565. // SetPathParams(map[string]string{
  566. // "namespace": params.Namespace,
  567. // "name": params.Name,
  568. // }).
  569. // SetBody(map[string]any{
  570. // "namespace": params.Namespace,
  571. // "name": params.Name,
  572. // }).
  573. // SetResult(&responseMap).
  574. // SetError(&responseMap).
  575. // Put(suspendWorkflowRelativeUrl)
  576. // if err != nil {
  577. // return errors.New(err.Error())
  578. // }
  579. //
  580. // switch resp.StatusCode() {
  581. // case http.StatusOK:
  582. // return nil
  583. // default:
  584. // message, ok := responseMap["message"]
  585. // if !ok {
  586. // return errors.Errorf("%v", resp.Status())
  587. // }
  588. //
  589. // return errors.Errorf("%v, %v", resp.Status(), message)
  590. // }
  591. //}
  592. //
  593. //type ResumeWorkflowParams struct {
  594. // Namespace string
  595. // Name string
  596. // NodeFieldSelector string
  597. //}
  598. //
  599. //// ResumeWorkflow 恢复被挂起的工作流
  600. //func (c *Client) ResumeWorkflow(params ResumeWorkflowParams) error {
  601. // responseMap := make(map[string]any)
  602. //
  603. // resp, err := c.restyClient.R().
  604. // SetHeader("Content-Type", "application/json").
  605. // SetAuthToken(c.token).
  606. // SetPathParams(map[string]string{
  607. // "namespace": params.Namespace,
  608. // "name": params.Name,
  609. // }).
  610. // SetBody(map[string]any{
  611. // "namespace": params.Namespace,
  612. // "name": params.Name,
  613. // }).
  614. // SetResult(&responseMap).
  615. // SetError(&responseMap).
  616. // Put(resumeWorkflowRelativeUrl)
  617. // if err != nil {
  618. // return errors.New(err.Error())
  619. // }
  620. //
  621. // switch resp.StatusCode() {
  622. // case http.StatusOK:
  623. // return nil
  624. // default:
  625. // message, ok := responseMap["message"]
  626. // if !ok {
  627. // return errors.Errorf("%v", resp.Status())
  628. // }
  629. //
  630. // return errors.Errorf("%v, %v", resp.Status(), message)
  631. // }
  632. //}
  633. //
  634. //type EventCallback func(event map[string]any, eventErr error) error
  635. //
  636. //type GetWorkflowEventsStreamParams struct {
  637. // Namespace string
  638. // Name string
  639. //}
  640. //
  641. //// GetWorkflowEventsStream 监听工作流事件
  642. //func (c *Client) GetWorkflowEventsStream(params GetWorkflowEventsStreamParams, callback EventCallback) error {
  643. // return nil
  644. //}