From 80476af59c29555ebc9124f517529de43051fb5c Mon Sep 17 00:00:00 2001 From: rushtehrani Date: Tue, 5 May 2020 20:40:18 -0700 Subject: [PATCH 1/7] update curl template to take http method --- pkg/workflow_execution.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/pkg/workflow_execution.go b/pkg/workflow_execution.go index 7990a67..e264329 100644 --- a/pkg/workflow_execution.go +++ b/pkg/workflow_execution.go @@ -14,6 +14,7 @@ import ( "github.com/onepanelio/core/pkg/util/ptr" "io" "io/ioutil" + "net/http" "regexp" "strconv" "strings" @@ -508,6 +509,7 @@ func (c *Client) CronStartWorkflowExecutionStatisticInsert(namespace, name strin "namespace": namespace, "phase": wfv1.NodePending, "cron_workflow_id": cronWorkflow.ID, + "parameters": "[]", } _, err = sb.Insert("workflow_executions"). @@ -1277,7 +1279,7 @@ func (c *Client) GetWorkflowExecutionStatisticsForTemplates(workflowTemplates .. Will build a template that makes a CURL request to the onepanel-core API, with statistics about the workflow that was just executed. */ -func getCURLNodeTemplate(name, curlPath, curlBody string) (template *wfv1.Template, err error) { +func getCURLNodeTemplate(name, curlMethod, curlPath, curlBody string) (template *wfv1.Template, err error) { host := env.GetEnv("ONEPANEL_CORE_SERVICE_HOST", "onepanel-core.onepanel.svc.cluster.local") if host == "" { err = errors.New("ONEPANEL_CORE_SERVICE_HOST is empty.") @@ -1296,7 +1298,8 @@ func getCURLNodeTemplate(name, curlPath, curlBody string) (template *wfv1.Templa Image: "curlimages/curl", Command: []string{"sh", "-c"}, Args: []string{ - "SERVICE_ACCOUNT_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) && curl -s -o /dev/null -w '%{http_code}' '" + endpoint + "' -H \"Content-Type: application/json\" -H 'Connection: keep-alive' -H 'Accept: application/json' " + + "SERVICE_ACCOUNT_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) " + + "&& curl -X " + curlMethod + " -s -o /dev/null -w '%{http_code}' '" + endpoint + "' -H \"Content-Type: application/json\" -H 'Connection: keep-alive' -H 'Accept: application/json' " + "-H 'Authorization: Bearer '\"$SERVICE_ACCOUNT_TOKEN\"'' " + "--data '" + curlBody + "' --compressed", }, @@ -1315,7 +1318,7 @@ func injectExitHandlerWorkflowExecutionStatistic(wf *wfv1.Workflow, namespace st if err != nil { return err } - statsTemplate, err := getCURLNodeTemplate("sys-send-exit-stats", curlPath, string(statisticsBytes)) + statsTemplate, err := getCURLNodeTemplate("sys-send-exit-stats", http.MethodPost, curlPath, string(statisticsBytes)) if err != nil { return err } @@ -1361,7 +1364,7 @@ func injectInitHandlerWorkflowExecutionStatistic(wf *wfv1.Workflow, namespace st if err != nil { return err } - containerTemplate, err := getCURLNodeTemplate("sys-send-init-stats", curlPath, string(statisticsBytes)) + containerTemplate, err := getCURLNodeTemplate("sys-send-init-stats", http.MethodPost, curlPath, string(statisticsBytes)) if err != nil { return err } From 5ebb1db0515f626c04de21a28a44a1d0850239b0 Mon Sep 17 00:00:00 2001 From: rushtehrani Date: Tue, 5 May 2020 20:52:36 -0700 Subject: [PATCH 2/7] make code more modular --- pkg/cron_workflow.go | 198 ++++++++++++++++--------------------------- 1 file changed, 74 insertions(+), 124 deletions(-) diff --git a/pkg/cron_workflow.go b/pkg/cron_workflow.go index 91f2aa5..4bb28d8 100644 --- a/pkg/cron_workflow.go +++ b/pkg/cron_workflow.go @@ -387,6 +387,76 @@ func (c *Client) CountCronWorkflows(namespace, workflowTemplateUID string) (coun return } +func (c *Client) buildCronWorkflowDefinition(namespace string, workflowTemplateId *uint64, wf *wfv1.Workflow, cwf *wfv1.CronWorkflow, opts *WorkflowExecutionOptions) (cronWorkflow *wfv1.CronWorkflow, err error) { + if opts == nil { + opts = &WorkflowExecutionOptions{} + } + + if opts.Name != "" { + cwf.ObjectMeta.Name = opts.Name + } + if opts.GenerateName != "" { + cwf.ObjectMeta.GenerateName = opts.GenerateName + } + if opts.Entrypoint != "" { + cwf.Spec.WorkflowSpec.Entrypoint = opts.Entrypoint + } + if opts.ServiceAccount != "" { + cwf.Spec.WorkflowSpec.ServiceAccountName = opts.ServiceAccount + } + if len(opts.Parameters) > 0 { + newParams := make([]wfv1.Parameter, 0) + passedParams := make(map[string]bool) + for _, param := range opts.Parameters { + newParams = append(newParams, wfv1.Parameter{ + Name: param.Name, + Value: param.Value, + }) + passedParams[param.Name] = true + } + + for _, param := range cwf.Spec.WorkflowSpec.Arguments.Parameters { + if _, ok := passedParams[param.Name]; ok { + // this parameter was overridden via command line + continue + } + newParams = append(newParams, param) + } + cwf.Spec.WorkflowSpec.Arguments.Parameters = newParams + wf.Spec.Arguments.Parameters = newParams + } + if opts.Labels != nil { + cwf.ObjectMeta.Labels = *opts.Labels + } + + err = injectExitHandlerWorkflowExecutionStatistic(wf, namespace, workflowTemplateId) + if err != nil { + return nil, err + } + err = injectInitHandlerWorkflowExecutionStatistic(wf, namespace, workflowTemplateId) + if err != nil { + return nil, err + } + if err = c.injectAutomatedFields(namespace, wf, opts); err != nil { + return nil, err + } + + cwf.Spec.WorkflowSpec = wf.Spec + cwf.Spec.WorkflowMetadata = &wf.ObjectMeta + + //merge the labels + mergedLabels := wf.ObjectMeta.Labels + if mergedLabels == nil { + mergedLabels = make(map[string]string) + } + for k, v := range *opts.Labels { + mergedLabels[k] = v + } + cwf.Spec.WorkflowMetadata.Labels = mergedLabels + + return cwf, nil +} + func (c *Client) updateCronWorkflow(namespace string, name string, workflowTemplateId *uint64, wf *wfv1.Workflow, cwf *wfv1.CronWorkflow, opts *WorkflowExecutionOptions) (updatedCronWorkflow *wfv1.CronWorkflow, err error) { //Make sure the CronWorkflow exists before we edit it toUpdateCWF, err := c.ArgoprojV1alpha1().CronWorkflows(namespace).Get(name, metav1.GetOptions{}) @@ -399,71 +469,10 @@ func (c *Client) updateCronWorkflow(namespace string, name string, workflowTempl return nil, util.NewUserError(codes.NotFound, "CronWorkflow not found.") } - if opts == nil { - opts = &WorkflowExecutionOptions{} - } - - if opts.Name != "" { - cwf.ObjectMeta.Name = opts.Name - } - if opts.GenerateName != "" { - cwf.ObjectMeta.GenerateName = opts.GenerateName - } - if opts.Entrypoint != "" { - cwf.Spec.WorkflowSpec.Entrypoint = opts.Entrypoint - } - if opts.ServiceAccount != "" { - cwf.Spec.WorkflowSpec.ServiceAccountName = opts.ServiceAccount - } - if len(opts.Parameters) > 0 { - newParams := make([]wfv1.Parameter, 0) - passedParams := make(map[string]bool) - for _, param := range opts.Parameters { - newParams = append(newParams, wfv1.Parameter{ - Name: param.Name, - Value: param.Value, - }) - passedParams[param.Name] = true - } - - for _, param := range cwf.Spec.WorkflowSpec.Arguments.Parameters { - if _, ok := passedParams[param.Name]; ok { - // this parameter was overridden via command line - continue - } - newParams = append(newParams, param) - } - cwf.Spec.WorkflowSpec.Arguments.Parameters = newParams - wf.Spec.Arguments.Parameters = newParams - } - if opts.Labels != nil { - cwf.ObjectMeta.Labels = *opts.Labels - } - - err = injectExitHandlerWorkflowExecutionStatistic(wf, namespace, workflowTemplateId) + cwf, err = c.buildCronWorkflowDefinition(namespace, workflowTemplateId, wf, cwf, opts) if err != nil { - return nil, err + return } - err = injectInitHandlerWorkflowExecutionStatistic(wf, namespace, workflowTemplateId) - if err != nil { - return nil, err - } - if err = c.injectAutomatedFields(namespace, wf, opts); err != nil { - return nil, err - } - - cwf.Spec.WorkflowSpec = wf.Spec - cwf.Spec.WorkflowMetadata = &wf.ObjectMeta - - //merge the labels - mergedLabels := wf.ObjectMeta.Labels - if mergedLabels == nil { - mergedLabels = make(map[string]string) - } - for k, v := range *opts.Labels { - mergedLabels[k] = v - } - cwf.Spec.WorkflowMetadata.Labels = mergedLabels cwf.Name = name cwf.ResourceVersion = toUpdateCWF.ResourceVersion @@ -476,70 +485,11 @@ func (c *Client) updateCronWorkflow(namespace string, name string, workflowTempl } func (c *Client) createCronWorkflow(namespace string, workflowTemplateId *uint64, wf *wfv1.Workflow, cwf *wfv1.CronWorkflow, opts *WorkflowExecutionOptions) (createdCronWorkflow *wfv1.CronWorkflow, err error) { - if opts == nil { - opts = &WorkflowExecutionOptions{} - } - - if opts.Name != "" { - cwf.ObjectMeta.Name = opts.Name - } - if opts.GenerateName != "" { - cwf.ObjectMeta.GenerateName = opts.GenerateName - } - if opts.Entrypoint != "" { - cwf.Spec.WorkflowSpec.Entrypoint = opts.Entrypoint - } - if opts.ServiceAccount != "" { - cwf.Spec.WorkflowSpec.ServiceAccountName = opts.ServiceAccount - } - if len(opts.Parameters) > 0 { - newParams := make([]wfv1.Parameter, 0) - passedParams := make(map[string]bool) - for _, param := range opts.Parameters { - newParams = append(newParams, wfv1.Parameter{ - Name: param.Name, - Value: param.Value, - }) - passedParams[param.Name] = true - } - - for _, param := range cwf.Spec.WorkflowSpec.Arguments.Parameters { - if _, ok := passedParams[param.Name]; ok { - // this parameter was overridden via command line - continue - } - newParams = append(newParams, param) - } - cwf.Spec.WorkflowSpec.Arguments.Parameters = newParams - wf.Spec.Arguments.Parameters = newParams - } - if opts.Labels != nil { - cwf.ObjectMeta.Labels = *opts.Labels - } - err = injectExitHandlerWorkflowExecutionStatistic(wf, namespace, workflowTemplateId) + cwf, err = c.buildCronWorkflowDefinition(namespace, workflowTemplateId, wf, cwf, opts) if err != nil { - return nil, err - } - err = injectInitHandlerWorkflowExecutionStatistic(wf, namespace, workflowTemplateId) - if err != nil { - return nil, err - } - if err = c.injectAutomatedFields(namespace, wf, opts); err != nil { - return nil, err + return } - cwf.Spec.WorkflowSpec = wf.Spec - cwf.Spec.WorkflowMetadata = &wf.ObjectMeta - - //merge the labels - mergedLabels := wf.ObjectMeta.Labels - if mergedLabels == nil { - mergedLabels = make(map[string]string) - } - for k, v := range *opts.Labels { - mergedLabels[k] = v - } - cwf.Spec.WorkflowMetadata.Labels = mergedLabels createdCronWorkflow, err = c.ArgoprojV1alpha1().CronWorkflows(namespace).Create(cwf) if err != nil { return nil, err From 7d19a8543b0b4d9a2179e54fdcb74f20fcbd765a Mon Sep 17 00:00:00 2001 From: rushtehrani Date: Tue, 5 May 2020 22:16:00 -0700 Subject: [PATCH 3/7] add sys-uid as a param to all workflows --- pkg/workflow_execution.go | 16 +++++++++++++++- pkg/workspace_template.go | 28 +++++++++++++++++++--------- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/pkg/workflow_execution.go b/pkg/workflow_execution.go index e264329..206acfa 100644 --- a/pkg/workflow_execution.go +++ b/pkg/workflow_execution.go @@ -103,6 +103,20 @@ func (c *Client) injectAutomatedFields(namespace string, wf *wfv1.Workflow, opts } } + uid := wf.Labels[label.WorkflowUid] + if uid == "" { + uid = "00000000-0000-0000-0000-000000000000" + } + if &wf.Spec.Arguments == nil { + wf.Spec.Arguments = wfv1.Arguments{ + Parameters: []wfv1.Parameter{}, + } + } + wf.Spec.Arguments.Parameters = append(wf.Spec.Arguments.Parameters, wfv1.Parameter{ + Name: "sys-uid", + Value: ptr.String(uid), + }) + addSecretValsToTemplate := true secret, err := c.GetSecret(namespace, "onepanel-default-env") if err != nil { @@ -384,7 +398,7 @@ func (c *Client) CreateWorkflowExecution(namespace string, workflow *WorkflowExe workflow.ID = id workflow.Name = createdWorkflow.Name workflow.CreatedAt = createdWorkflow.CreationTimestamp.UTC() - workflow.UID = string(createdWorkflow.ObjectMeta.UID) + workflow.UID = workflowUid workflow.WorkflowTemplate = workflowTemplate // Manifests could get big, don't return them in this case. workflow.WorkflowTemplate.Manifest = "" diff --git a/pkg/workspace_template.go b/pkg/workspace_template.go index da86e27..b242a71 100644 --- a/pkg/workspace_template.go +++ b/pkg/workspace_template.go @@ -14,6 +14,7 @@ import ( networking "istio.io/api/networking/v1alpha3" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "net/http" "sigs.k8s.io/yaml" ) @@ -41,12 +42,6 @@ func generateArguments(spec *WorkspaceSpec, config map[string]string) (err error }) // TODO: These can be removed when lint validation of workflows work - // Workspace UID - spec.Arguments.Parameters = append(spec.Arguments.Parameters, Parameter{ - Name: "sys-uid", - Value: ptr.String("00000000-0000-0000-0000-000000000000"), - Type: "input.hidden", - }) // Resource action parameter spec.Arguments.Parameters = append(spec.Arguments.Parameters, Parameter{ Name: "sys-resource-action", @@ -287,6 +282,20 @@ metadata: When: "{{workflow.parameters.sys-workspace-action}} == delete", WithItems: volumeClaimItems, }, + { + Name: "sys-set-phase-running", + Template: "sys-update-status", + Dependencies: []string{"stateful-set"}, + Arguments: wfv1.Arguments{ + Parameters: []wfv1.Parameter{ + { + Name: "sys-workspace-phase", + Value: ptr.String(string(WorkspaceRunning)), + }, + }, + }, + When: "{{workflow.parameters.sys-workspace-action}} == create", + }, { Name: spec.PostExecutionWorkflow.Entrypoint, Template: spec.PostExecutionWorkflow.Entrypoint, @@ -335,24 +344,25 @@ metadata: }, }, } + // Add curl template curlPath := fmt.Sprintf("/apis/v1beta1/{{workflow.namespace}}/workspaces/{{workflow.parameters.sys-uid}}/status") status := map[string]interface{}{ - "phase": "{{input.parameters.phase}}", + "phase": "{{input.parameters.sys-workspace-phase}}", } statusBytes, err := json.Marshal(status) if err != nil { return } - curlNodeTemplate, err := getCURLNodeTemplate("update-workspace-status", curlPath, string(statusBytes)) + curlNodeTemplate, err := getCURLNodeTemplate("sys-update-status", http.MethodPut, curlPath, string(statusBytes)) if err != nil { return } templates = append(templates, *curlNodeTemplate) + // Add postExecutionWorkflow if it exists if spec.PostExecutionWorkflow != nil { templates = append(templates, spec.PostExecutionWorkflow.Templates...) } - // TODO: Consider storing this as a Go template in a "settings" database table workflowTemplateSpec := map[string]interface{}{ "arguments": spec.Arguments, "entrypoint": "workspace", From ff51502a0a5342f858007c5579ea7e69b331c8b4 Mon Sep 17 00:00:00 2001 From: rushtehrani Date: Tue, 5 May 2020 22:48:31 -0700 Subject: [PATCH 4/7] fix IsAuthorized and statefulsets group --- server/auth/auth.go | 3 +++ server/workspace_server.go | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/server/auth/auth.go b/server/auth/auth.go index e7e482b..cce863c 100644 --- a/server/auth/auth.go +++ b/server/auth/auth.go @@ -78,6 +78,9 @@ func IsAuthorized(c *v1.Client, namespace, verb, group, resource, name string) ( return false, status.Error(codes.PermissionDenied, "Permission denied.") } allowed = review.Status.Allowed + if !allowed { + return false, status.Error(codes.PermissionDenied, "Permission denied.") + } return } diff --git a/server/workspace_server.go b/server/workspace_server.go index 5d3ba42..ba27e76 100644 --- a/server/workspace_server.go +++ b/server/workspace_server.go @@ -32,7 +32,7 @@ func NewWorkspaceServer() *WorkspaceServer { func (s *WorkspaceServer) CreateWorkspace(ctx context.Context, req *api.CreateWorkspaceRequest) (*api.Workspace, error) { client := ctx.Value("kubeClient").(*v1.Client) - allowed, err := auth.IsAuthorized(client, req.Namespace, "create", "apps/v1", "statefulsets", "") + allowed, err := auth.IsAuthorized(client, req.Namespace, "create", "apps", "statefulsets", "") if err != nil || !allowed { return nil, err } @@ -62,7 +62,7 @@ func (s *WorkspaceServer) CreateWorkspace(ctx context.Context, req *api.CreateWo func (s *WorkspaceServer) UpdateWorkspaceStatus(ctx context.Context, req *api.UpdateWorkspaceStatusRequest) (*empty.Empty, error) { client := ctx.Value("kubeClient").(*v1.Client) - allowed, err := auth.IsAuthorized(client, req.Namespace, "update", "apps/v1", "statefulsets", "") + allowed, err := auth.IsAuthorized(client, req.Namespace, "update", "apps", "statefulsets", "") if err != nil || !allowed { return &empty.Empty{}, err } From 1f98997bb3276fa4b67c1bbcc5fd42f39161592c Mon Sep 17 00:00:00 2001 From: rushtehrani Date: Tue, 5 May 2020 22:57:45 -0700 Subject: [PATCH 5/7] fix token --- pkg/workspace_template.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/workspace_template.go b/pkg/workspace_template.go index b242a71..e63b48f 100644 --- a/pkg/workspace_template.go +++ b/pkg/workspace_template.go @@ -347,7 +347,7 @@ metadata: // Add curl template curlPath := fmt.Sprintf("/apis/v1beta1/{{workflow.namespace}}/workspaces/{{workflow.parameters.sys-uid}}/status") status := map[string]interface{}{ - "phase": "{{input.parameters.sys-workspace-phase}}", + "phase": "{{inputs.parameters.sys-workspace-phase}}", } statusBytes, err := json.Marshal(status) if err != nil { From 7ca68b6dfa6e5fd8985e5f599f4eb3bdc1c89477 Mon Sep 17 00:00:00 2001 From: rushtehrani Date: Wed, 6 May 2020 10:44:40 -0700 Subject: [PATCH 6/7] allow inputs for curlNodeTemplate --- pkg/workflow_execution.go | 9 +++++---- pkg/workspace_template.go | 7 ++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/pkg/workflow_execution.go b/pkg/workflow_execution.go index 206acfa..46ddc83 100644 --- a/pkg/workflow_execution.go +++ b/pkg/workflow_execution.go @@ -1293,7 +1293,7 @@ func (c *Client) GetWorkflowExecutionStatisticsForTemplates(workflowTemplates .. Will build a template that makes a CURL request to the onepanel-core API, with statistics about the workflow that was just executed. */ -func getCURLNodeTemplate(name, curlMethod, curlPath, curlBody string) (template *wfv1.Template, err error) { +func getCURLNodeTemplate(name, curlMethod, curlPath, curlBody string, inputs wfv1.Inputs) (template *wfv1.Template, err error) { host := env.GetEnv("ONEPANEL_CORE_SERVICE_HOST", "onepanel-core.onepanel.svc.cluster.local") if host == "" { err = errors.New("ONEPANEL_CORE_SERVICE_HOST is empty.") @@ -1306,7 +1306,8 @@ func getCURLNodeTemplate(name, curlMethod, curlPath, curlBody string) (template } endpoint := fmt.Sprintf("http://%s:%s%s", host, port, curlPath) template = &wfv1.Template{ - Name: name, + Name: name, + Inputs: inputs, Container: &corev1.Container{ Name: "curl", Image: "curlimages/curl", @@ -1332,7 +1333,7 @@ func injectExitHandlerWorkflowExecutionStatistic(wf *wfv1.Workflow, namespace st if err != nil { return err } - statsTemplate, err := getCURLNodeTemplate("sys-send-exit-stats", http.MethodPost, curlPath, string(statisticsBytes)) + statsTemplate, err := getCURLNodeTemplate("sys-send-exit-stats", http.MethodPost, curlPath, string(statisticsBytes), wfv1.Inputs{}) if err != nil { return err } @@ -1378,7 +1379,7 @@ func injectInitHandlerWorkflowExecutionStatistic(wf *wfv1.Workflow, namespace st if err != nil { return err } - containerTemplate, err := getCURLNodeTemplate("sys-send-init-stats", http.MethodPost, curlPath, string(statisticsBytes)) + containerTemplate, err := getCURLNodeTemplate("sys-send-init-stats", http.MethodPost, curlPath, string(statisticsBytes), wfv1.Inputs{}) if err != nil { return err } diff --git a/pkg/workspace_template.go b/pkg/workspace_template.go index e63b48f..560df3a 100644 --- a/pkg/workspace_template.go +++ b/pkg/workspace_template.go @@ -353,7 +353,12 @@ metadata: if err != nil { return } - curlNodeTemplate, err := getCURLNodeTemplate("sys-update-status", http.MethodPut, curlPath, string(statusBytes)) + inputs := wfv1.Inputs{ + Parameters: []wfv1.Parameter{ + {Name: "sys-workspace-phase"}, + }, + } + curlNodeTemplate, err := getCURLNodeTemplate("sys-update-status", http.MethodPut, curlPath, string(statusBytes), inputs) if err != nil { return } From ca5d69e3f8e7a922d6fdd083f56c43e23a4ae5b7 Mon Sep 17 00:00:00 2001 From: rushtehrani Date: Wed, 6 May 2020 12:44:01 -0700 Subject: [PATCH 7/7] additional status curl calls --- pkg/workflow_execution.go | 70 ++++++++++++++++++++++----------------- pkg/workspace_template.go | 28 ++++++++++++++++ 2 files changed, 68 insertions(+), 30 deletions(-) diff --git a/pkg/workflow_execution.go b/pkg/workflow_execution.go index 46ddc83..9a8d804 100644 --- a/pkg/workflow_execution.go +++ b/pkg/workflow_execution.go @@ -87,6 +87,45 @@ func UnmarshalWorkflows(wfBytes []byte, strict bool) (wfs []wfv1.Workflow, err e return } +func addSystemUIDParameter(wf *wfv1.Workflow) { + for _, p := range wf.Spec.Arguments.Parameters { + if p.Name == "sys-uid" { + return + } + } + + uid := wf.Labels[label.WorkflowUid] + if uid == "" { + uid = "00000000-0000-0000-0000-000000000000" + } + if wf.Spec.Arguments.Parameters == nil { + wf.Spec.Arguments.Parameters = make([]wfv1.Parameter, 0) + } + wf.Spec.Arguments.Parameters = append(wf.Spec.Arguments.Parameters, wfv1.Parameter{ + Name: "sys-uid", + Value: ptr.String(uid), + }) + + return +} + +func addEnvToTemplate(template *wfv1.Template, key string, value string) { + //Flag to prevent over-writing user's envs + overwriteUserEnv := true + for _, templateEnv := range template.Container.Env { + if templateEnv.Name == key { + overwriteUserEnv = false + break + } + } + if overwriteUserEnv { + template.Container.Env = append(template.Container.Env, corev1.EnvVar{ + Name: key, + Value: value, + }) + } +} + func (c *Client) injectAutomatedFields(namespace string, wf *wfv1.Workflow, opts *WorkflowExecutionOptions) (err error) { if opts.PodGCStrategy == nil { if wf.Spec.PodGC == nil { @@ -103,19 +142,7 @@ func (c *Client) injectAutomatedFields(namespace string, wf *wfv1.Workflow, opts } } - uid := wf.Labels[label.WorkflowUid] - if uid == "" { - uid = "00000000-0000-0000-0000-000000000000" - } - if &wf.Spec.Arguments == nil { - wf.Spec.Arguments = wfv1.Arguments{ - Parameters: []wfv1.Parameter{}, - } - } - wf.Spec.Arguments.Parameters = append(wf.Spec.Arguments.Parameters, wfv1.Parameter{ - Name: "sys-uid", - Value: ptr.String(uid), - }) + addSystemUIDParameter(wf) addSecretValsToTemplate := true secret, err := c.GetSecret(namespace, "onepanel-default-env") @@ -196,23 +223,6 @@ func (c *Client) injectAutomatedFields(namespace string, wf *wfv1.Workflow, opts return } -func addEnvToTemplate(template *wfv1.Template, key string, value string) { - //Flag to prevent over-writing user's envs - overwriteUserEnv := true - for _, templateEnv := range template.Container.Env { - if templateEnv.Name == key { - overwriteUserEnv = false - break - } - } - if overwriteUserEnv { - template.Container.Env = append(template.Container.Env, corev1.EnvVar{ - Name: key, - Value: value, - }) - } -} - func (c *Client) createWorkflow(namespace string, workflowTemplateId uint64, workflowTemplateVersionId uint64, wf *wfv1.Workflow, opts *WorkflowExecutionOptions) (newDbId uint64, createdWorkflow *wfv1.Workflow, err error) { if opts == nil { opts = &WorkflowExecutionOptions{} diff --git a/pkg/workspace_template.go b/pkg/workspace_template.go index 560df3a..a6a46eb 100644 --- a/pkg/workspace_template.go +++ b/pkg/workspace_template.go @@ -296,6 +296,34 @@ metadata: }, When: "{{workflow.parameters.sys-workspace-action}} == create", }, + { + Name: "sys-set-phase-pausing", + Template: "sys-update-status", + Dependencies: []string{"delete-stateful-set"}, + Arguments: wfv1.Arguments{ + Parameters: []wfv1.Parameter{ + { + Name: "sys-workspace-phase", + Value: ptr.String(string(WorkspacePausing)), + }, + }, + }, + When: "{{workflow.parameters.sys-workspace-action}} == pause", + }, + { + Name: "sys-set-phase-terminating", + Template: "sys-update-status", + Dependencies: []string{"delete-pvc"}, + Arguments: wfv1.Arguments{ + Parameters: []wfv1.Parameter{ + { + Name: "sys-workspace-phase", + Value: ptr.String(string(WorkspaceTerminating)), + }, + }, + }, + When: "{{workflow.parameters.sys-workspace-action}} == delete", + }, { Name: spec.PostExecutionWorkflow.Entrypoint, Template: spec.PostExecutionWorkflow.Entrypoint,