Browse Source

完成flow定义

yjp 1 year ago
parent
commit
6e19152ed7

+ 1 - 0
approve_former/and.go

@@ -0,0 +1 @@
+package approve_former

+ 63 - 0
approve_former/flow.go

@@ -0,0 +1,63 @@
+package approve_former
+
+const flowTemplate = `apiVersion: argoproj.io/v1alpha1
+kind: WorkflowTemplate
+metadata:
+  name: {{ .name }}
+spec:
+  entrypoint: approve-flow
+  templates:
+    - name: approve-flow
+      dag:
+        tasks:
+          {{- if .nodeContent }}
+          {{ .nodeContent }}
+          {{- else }}
+          - name: node
+            template: approval
+          {{- end }}
+          
+    - name: approval
+      suspend: {}
+      inputs:
+          parameters:
+            - name: approve
+              default: '通过'
+              enum:
+                  - '通过'
+                  - '拒绝'
+      outputs:
+          parameters:
+            - name: approve
+              valueFrom:
+                  supplied: {}
+`
+
+type Flow struct {
+	Name  string
+	Nodes []Node
+}
+
+func NewFlow(name string, nodes ...Node) *Flow {
+	return &Flow{
+		Name:  name,
+		Nodes: nodes,
+	}
+}
+
+func (flow *Flow) Render() (string, error) {
+	nodeContents := make([]string, 0)
+	for _, node := range flow.Nodes {
+		nodeContent, err := node.Render()
+		if err != nil {
+			return "", err
+		}
+
+		nodeContents = append(nodeContents, nodeContent)
+	}
+
+	return render("flow", flowTemplate, map[string]any{
+		"name":  flow.Name,
+		"nodes": nodeContents,
+	})
+}

+ 27 - 0
approve_former/node.go

@@ -0,0 +1,27 @@
+package approve_former
+
+import (
+	"bytes"
+	"text/template"
+)
+
+type Node interface {
+	Render() (string, error)
+}
+
+func render(name string, templateStr string, templateParams map[string]any) (string, error) {
+	tpl := template.New(name)
+
+	tpl, err := tpl.Parse(templateStr)
+	if err != nil {
+		return "", err
+	}
+
+	buffer := &bytes.Buffer{}
+	err = tpl.Execute(buffer, templateParams)
+	if err != nil {
+		return "", err
+	}
+
+	return buffer.String(), nil
+}

+ 1 - 0
approve_former/or.go

@@ -0,0 +1 @@
+package approve_former

+ 3 - 0
approve_former/single.go

@@ -0,0 +1,3 @@
+package approve_former
+
+const singleTemplate = ``

+ 18 - 0
test/approve_former_test.go

@@ -0,0 +1,18 @@
+package test
+
+import (
+	"fmt"
+	"git.sxidc.com/go-tools/argo-api/approve_former"
+	"testing"
+)
+
+func TestApproveFormer(t *testing.T) {
+	flow := approve_former.NewFlow("test")
+
+	flowDefinition, err := flow.Render()
+	if err != nil {
+		t.Fatalf("%+v\n", err)
+	}
+
+	fmt.Println(flowDefinition)
+}

+ 3 - 3
test/definitions/approve_workflow.yaml

@@ -21,15 +21,15 @@ spec:
           - name: D
             template: approval
             depends: "B.Succeeded && C.Succeeded"
-            when: "(({{ tasks.B.outputs.parameters.approve }} == 通过 && {{ tasks.C.outputs.parameters.approve }} == 通过))"
+            when: "{{ tasks.B.outputs.parameters.approve }} == 通过 && {{ tasks.C.outputs.parameters.approve }} == 通过"
           - name: E
             template: approval
             depends: "B.Succeeded && C.Succeeded"
-            when: "({{ tasks.B.outputs.parameters.approve }} == 通过 && {{ tasks.C.outputs.parameters.approve }} == 通过)"
+            when: "{{ tasks.B.outputs.parameters.approve }} == 通过 && {{ tasks.C.outputs.parameters.approve }} == 通过"
           - name: F
             template: approval
             depends: "D.Succeeded && E.Succeeded"
-            when: "({{ tasks.D.outputs.parameters.approve }} == 通过 || {{ tasks.E.outputs.parameters.approve }} == 通过)"
+            when: "{{ tasks.D.outputs.parameters.approve }} == 通过 || {{ tasks.E.outputs.parameters.approve }} == 通过"
 
     - name: approval
       suspend: {}

+ 3 - 3
test/definitions/approve_workflow_template.yaml

@@ -21,15 +21,15 @@ spec:
           - name: D
             template: approval
             depends: "B.Succeeded && C.Succeeded"
-            when: "(({{ tasks.B.outputs.parameters.approve }} == 通过 && {{ tasks.C.outputs.parameters.approve }} == 通过))"
+            when: "{{ tasks.B.outputs.parameters.approve }} == 通过 && {{ tasks.C.outputs.parameters.approve }} == 通过"
           - name: E
             template: approval
             depends: "B.Succeeded && C.Succeeded"
-            when: "({{ tasks.B.outputs.parameters.approve }} == 通过 && {{ tasks.C.outputs.parameters.approve }} == 通过)"
+            when: "{{ tasks.B.outputs.parameters.approve }} == 通过 && {{ tasks.C.outputs.parameters.approve }} == 通过"
           - name: F
             template: approval
             depends: "D.Succeeded && E.Succeeded"
-            when: "({{ tasks.D.outputs.parameters.approve }} == 通过 || {{ tasks.E.outputs.parameters.approve }} == 通过)"
+            when: "{{ tasks.D.outputs.parameters.approve }} == 通过 || {{ tasks.E.outputs.parameters.approve }} == 通过"
           
     - name: approval
       suspend: {}