yjp 1 жил өмнө
parent
commit
1a813cfec7

+ 72 - 16
client/workflow.go

@@ -11,7 +11,7 @@ const (
 	getWorkflowsInNamespaceRelativeUrl = "/api/v1/workflows/{namespace}"
 	getWorkflowRelativeUrl             = "/api/v1/workflows/{namespace}/{name}"
 	lintWorkflowRelativeUrl            = "/api/v1/workflows/{namespace}/lint"
-	submitWorkflowRelativeUrl          = "/api/v1/workflows/{namespace}/{name}/submit"
+	submitWorkflowRelativeUrl          = "/api/v1/workflows/{namespace}/submit"
 	resubmitWorkflowRelativeUrl        = "/api/v1/workflows/{namespace}/{name}/resubmit"
 	resumeWorkflowRelativeUrl          = "/api/v1/workflows/{namespace}/{name}/resume"
 	retryWorkflowRelativeUrl           = "/api/v1/workflows/{namespace}/{name}/retry"
@@ -246,19 +246,75 @@ func (c *Client) LintWorkflow(params LintWorkflowParams) error {
 	}
 }
 
-type SubmitWorkflowParams struct {
-	Namespace string
-	Name      string
+type SubmitWorkflowFromWorkflowTemplateParams struct {
+	Namespace    string
+	TemplateName string
+	Parameters   []string
 }
 
-func (c *Client) SubmitWorkflow(params SubmitWorkflowParams) error {
-	return nil
+func (c *Client) SubmitWorkflowFromWorkflowTemplate(params SubmitWorkflowFromWorkflowTemplateParams) (string, error) {
+	responseMap := make(map[string]any)
+
+	resp, err := c.restyClient.R().
+		SetHeader("Content-Type", "application/json").
+		SetAuthToken(c.token).
+		SetPathParams(map[string]string{
+			"namespace": params.Namespace,
+		}).
+		SetBody(map[string]any{
+			"namespace":    params.Namespace,
+			"resourceKind": "WorkflowTemplate",
+			"resourceName": params.TemplateName,
+			"submitOptions": map[string]any{
+				"parameters": params.Parameters,
+			},
+		}).
+		SetResult(&responseMap).
+		SetError(&responseMap).
+		Post(submitWorkflowRelativeUrl)
+	if err != nil {
+		return "", errors.New(err.Error())
+	}
+
+	switch resp.StatusCode() {
+	case http.StatusOK:
+		metadata, ok := responseMap["metadata"]
+		if !ok {
+			return "", errors.New("metadata为空")
+		}
+
+		metadataMap, ok := metadata.(map[string]any)
+		if !ok {
+			return "", errors.New("metadata不是map")
+		}
+
+		workflowName, ok := metadataMap["name"]
+		if !ok {
+			return "", errors.New("metadata中没有工作流名称")
+		}
+
+		workflowNameStr, ok := workflowName.(string)
+		if !ok {
+			return "", errors.New("工作流名称不是字符串")
+		}
+
+		return workflowNameStr, nil
+	case http.StatusConflict:
+		return "", errors.New("工作流已存在")
+	default:
+		message, ok := responseMap["message"]
+		if !ok {
+			return "", errors.Errorf("%v", resp.Status())
+		}
+
+		return "", errors.Errorf("%v, %v", resp.Status(), message)
+	}
 }
 
 type ResubmitWorkflowParams struct {
-	Namespace              string
-	Name                   string
-	ResubmitParametersJson string
+	Namespace          string
+	Name               string
+	ResubmitParameters []string
 }
 
 func (c *Client) ResubmitWorkflow(params ResubmitWorkflowParams) error {
@@ -277,7 +333,7 @@ func (c *Client) ResumeWorkflow(params ResumeWorkflowParams) error {
 type RetryWorkflowParams struct {
 	Namespace                               string
 	Name                                    string
-	RetryParametersJson                     string
+	RetryParameters                         []string
 	RetryOnSuccessWorkflowNodeFieldSelector string
 }
 
@@ -286,12 +342,12 @@ func (c *Client) RetryWorkflow(params RetryWorkflowParams) error {
 }
 
 type SetWorkflowParams struct {
-	Namespace            string
-	Name                 string
-	NodeFieldSelector    string
-	Message              string
-	Phase                string
-	OutputParametersJson string
+	Namespace         string
+	Name              string
+	NodeFieldSelector string
+	Message           string
+	Phase             string
+	OutputParameters  []string
 }
 
 func (c *Client) SetWorkflow(params SetWorkflowParams) error {

+ 10 - 6
test/common.go

@@ -8,18 +8,22 @@ import (
 )
 
 const (
-	baseUrl              = "https://localhost:32337"
-	token                = `eyJhbGciOiJSUzI1NiIsImtpZCI6ImFOek1kOTJRUVZWSl9lVTNIRTRVVHNsWjl3YTg5VEp4XzNrQ0QxcU9xY0UifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImFyZ28tYXBpLnNlcnZpY2UtYWNjb3VudC10b2tlbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhcmdvLWFwaSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImU3YzJhNzhhLTg5ZTctNDJlMy04ODdkLTNmNjQ4MzY4NzczNSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmFyZ28tYXBpIn0.FSxOIUkZsqp6y4duWBe1IwDfpBlx1VYMwK0o13JAt_pkmT7HYfNsTYnbLaKcxWJHR6Gyij9EtkFF6bmWths6-8QeIDbhSF8fcoRm3M-q_7L6lS77G7C2XbC2m0ZvlhjJ81Sy2wR_t3iOK0p4-WXql2ATTvAtvte_1al7Q9rNvSxoMd1WA1wfnXcd3Y0kw3G8GtgYYtPKfnIeHnNcclrERodqCkFh8fOR9XuuEOLIb8-n0Au2NR3OlS4j4oh80KWDcO2XVAXIiWuc40VbV_MiDylQnj7O-Pnp1N0UnDXB5DBry3vibI3FPKCJuzdHf-gNDnftDhEQRbakhLubeoX_WQ`
-	namespace            = "argo-api"
-	workflowTemplateName = "approve"
+	baseUrl                        = "https://localhost:32337"
+	token                          = `eyJhbGciOiJSUzI1NiIsImtpZCI6ImFOek1kOTJRUVZWSl9lVTNIRTRVVHNsWjl3YTg5VEp4XzNrQ0QxcU9xY0UifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJhcmdvLWFwaSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhcmdvLWFwaS5zZXJ2aWNlLWFjY291bnQtdG9rZW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiYXJnby1hcGkiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIzNTc4MjE5Yy1jNzEzLTQxY2EtOTVhZS1lZjBkZmZiM2E4YmUiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6YXJnby1hcGk6YXJnby1hcGkifQ.Qda3JQvEV5v35ocP9-TNsPT8dDv4zpY2P3iQIXDAGtD-W5X9ZiPFIXDNFSxaGTOOBgkdUVTqu7OGdklU-BeVzXUJA9kMHbXT5jq5LK2wcvlTb3QJdQIsWOoXCgcKR-SgVAV7hgT0gXFieHPt9SRV6bDZ27aI0CAkDEgq-AJYce_u0zOpoXDJS5A9kGMPOmEPXikOp9dhRFFCIgU6nONm11VQ8QOcq281EcXmMJ4pwd-h2rr3EgpJfYs38b2_3Zd8-UF2Lke4PsF8f18GUAZLmiBRYPMXhqJzkgBphDNDY0rFOSVm1kuBP95VPt5n24OXTFpSl1dqjEAJGLK5ekNBXw`
+	namespace                      = "argo-api"
+	workflowTemplateName           = "approve"
+	workflowTemplateWithParamsName = "hello"
 )
 
-//go:embed approve_workflow_template.yaml
+//go:embed definitions/approve_workflow_template.yaml
 var templateYamlStr []byte
 
-//go:embed approve_workflow.yaml
+//go:embed definitions/approve_workflow.yaml
 var workflowYamlStr []byte
 
+//go:embed definitions/workflow_template_with_params.yaml
+var workflowTemplateWithParamsYamlStr []byte
+
 func compareDefinitionMap(t *testing.T, definitionMap map[string]any, checkDefinitionMaps map[string]any) {
 	keys := make([]string, 0)
 	for key, _ := range definitionMap {

+ 0 - 0
test/approve_workflow.yaml → test/definitions/approve_workflow.yaml


+ 0 - 0
test/approve_workflow_template.yaml → test/definitions/approve_workflow_template.yaml


+ 20 - 0
test/definitions/workflow_template_with_params.yaml

@@ -0,0 +1,20 @@
+apiVersion: argoproj.io/v1alpha1
+kind: WorkflowTemplate
+metadata:
+  name: hello
+spec:
+  entrypoint: whalesay
+  arguments:
+    parameters:
+      - name: message
+        value: hello world
+
+  templates:
+    - name: whalesay
+      inputs:
+        parameters:
+          - name: message
+      container:
+        image: docker/whalesay
+        command: [cowsay]
+        args: ["{{inputs.parameters.message}}"]

+ 5 - 0
test/token/delete_token.sh

@@ -0,0 +1,5 @@
+#!/bin/sh
+kubectl delete secret argo-api.service-account-token -n argo-api
+kubectl delete rolebinding argo-api -n argo-api
+kubectl delete sa argo-api -n argo-api
+kubectl delete role argo-api -n argo-api

+ 31 - 0
test/token/generate_token.sh

@@ -0,0 +1,31 @@
+#!/bin/sh
+kubectl apply -n argo-api -f - <<EOF
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+  name: argo-api
+rules:
+  - apiGroups: [""]
+    resources: ["pods"]
+    verbs: ["get", "list", "watch", "create", "delete", "update", "patch"]
+  - apiGroups: ["argoproj.io"]
+    resources: ["workflows"]
+    verbs: ["list", "update"]
+EOF
+
+kubectl create sa argo-api --namespace=argo-api
+kubectl create rolebinding argo-api --role=argo-api --serviceaccount=argo:argo-api --namespace=argo-api
+
+kubectl apply -n argo-api -f - <<EOF
+apiVersion: v1
+kind: Secret
+metadata:
+  name: argo-api.service-account-token
+  annotations:
+    kubernetes.io/service-account.name: argo-api
+type: kubernetes.io/service-account-token
+EOF
+
+ARGO_TOKEN="Bearer $(kubectl get secret argo-api.service-account-token -o=jsonpath='{.data.token}' -n argo-api | base64 --decode)"
+echo "$ARGO_TOKEN"
+curl https://localhost:32337/api/v1/workflows/argo -H "Authorization: $ARGO_TOKEN" --insecure

+ 59 - 0
test/workflow_test.go

@@ -1,6 +1,7 @@
 package test
 
 import (
+	"fmt"
 	"git.sxidc.com/go-tools/argo-api"
 	"git.sxidc.com/go-tools/argo-api/client"
 	"github.com/pkg/errors"
@@ -66,3 +67,61 @@ func TestWorkflowBase(t *testing.T) {
 	compareDefinitionMap(t, createdWorkflowDefinition, createdWorkflowDefinitions[0])
 	compareDefinitionMap(t, createdWorkflowDefinitions[0], createdWorkflowDefinition)
 }
+
+func TestSubmitWorkflow(t *testing.T) {
+	argo.Init(baseUrl, token, client.WithTimeoutSec(10))
+	defer argo.Destroy()
+
+	templateDefinition := make(map[string]any)
+	err := yaml.Unmarshal(workflowTemplateWithParamsYamlStr, &templateDefinition)
+	if err != nil {
+		panic(err)
+	}
+
+	err = argo.GetInstance().CreateWorkflowTemplate(client.CreateWorkflowTemplateParams{
+		Namespace:          namespace,
+		TemplateDefinition: templateDefinition,
+	})
+	if err != nil {
+		t.Fatalf("%+v\n", err)
+	}
+
+	defer func() {
+		err := argo.GetInstance().DeleteWorkflowTemplate(client.DeleteWorkflowTemplateParams{
+			Namespace: namespace,
+			Name:      workflowTemplateWithParamsName,
+		})
+		if err != nil {
+			t.Fatalf("%+v\n", err)
+		}
+	}()
+
+	submitWorkflowName, err := argo.GetInstance().SubmitWorkflowFromWorkflowTemplate(client.SubmitWorkflowFromWorkflowTemplateParams{
+		Namespace:    namespace,
+		TemplateName: workflowTemplateWithParamsName,
+		Parameters:   []string{"message=Hello Submit"},
+	})
+	if err != nil {
+		t.Fatalf("%+v\n", err)
+	}
+
+	defer func() {
+		err := argo.GetInstance().DeleteWorkflow(client.DeleteWorkflowParams{
+			Namespace: namespace,
+			Name:      submitWorkflowName,
+		})
+		if err != nil {
+			t.Fatalf("%+v\n", err)
+		}
+	}()
+
+	submittedWorkflowDefinition, err := argo.GetInstance().GetWorkflow(client.GetWorkflowParams{
+		Namespace: namespace,
+		Name:      submitWorkflowName,
+	})
+	if err != nil {
+		t.Fatalf("%+v\n", err)
+	}
+
+	fmt.Println(submittedWorkflowDefinition)
+}