diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index e64246d..21002f5 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -27,6 +27,7 @@ jobs: tags: | type=ref,event=branch type=ref,event=pr + type=semver,pattern={{raw}} type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} latest @@ -43,4 +44,4 @@ jobs: with: context: . push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta.outputs.tags }} \ No newline at end of file + tags: ${{ steps.meta.outputs.tags }} diff --git a/chart/orkestra/templates/deployment.yaml b/chart/orkestra/templates/deployment.yaml index 554b2c1..4b0b1b4 100644 --- a/chart/orkestra/templates/deployment.yaml +++ b/chart/orkestra/templates/deployment.yaml @@ -45,7 +45,10 @@ spec: {{- if .Values.cleanup.enabled }} - --cleanup-downloaded-charts {{- end }} - - --debug={{ .Values.debug.level }} + {{ if .Values.debug.enabled }} + - --debug + {{- end }} + - --log-level={{ .Values.logLevel | default 0 }} env: - name: WORKFLOW_NAMESPACE value: {{ .Release.Namespace }} diff --git a/chart/orkestra/values.yaml b/chart/orkestra/values.yaml index 0b87b3f..fc15d72 100644 --- a/chart/orkestra/values.yaml +++ b/chart/orkestra/values.yaml @@ -47,7 +47,9 @@ cleanup: # set to dev mode until MVP debug: - level: 5 + enabled: true + +logLevel: 5 # Dependency overlay values diff --git a/controllers/appgroup_reconciler.go b/controllers/appgroup_reconciler.go index 8179b4b..2ffaab4 100644 --- a/controllers/appgroup_reconciler.go +++ b/controllers/appgroup_reconciler.go @@ -99,30 +99,41 @@ func (r *ApplicationGroupReconciler) reconcileApplications(l logr.Logger, appGro } if appCh.Dependencies() != nil { - for _, sc := range appCh.Dependencies() { - cs := v1alpha1.ChartStatus{ - Version: sc.Metadata.Version, - } - appGroup.Status.Applications[i].Subcharts[sc.Name()] = cs + // take account of all embedded subcharts found in the application chart + embeddedSubcharts := make(map[string]bool) + for _, d := range appCh.Dependencies() { + embeddedSubcharts[d.Name()] = true + } + + // Remove all explicit subchart entries from tracking map + for _, d := range appGroup.Spec.Applications[i].Spec.Subcharts { + delete(embeddedSubcharts, d.Name) + } + + // Use the remaining set of dependencies that are not explicitly declared and + // add them to the groups application spec's subcharts list + for name := range embeddedSubcharts { + appGroup.Spec.Applications[i].Spec.Subcharts = append(appGroup.Spec.Applications[i].Spec.Subcharts, v1alpha1.DAG{Name: name}) } stagingRepoName := r.StagingRepoName - // If Dependencies - extract subchart and push each to staging registry - // if isDependenciesEmbedded(appCh) { + // Package and push all application subcharts staging registry for _, sc := range appCh.Dependencies() { - cs := v1alpha1.ChartStatus{ + chartStatus := v1alpha1.ChartStatus{ Version: sc.Metadata.Version, + Staged: false, + Error: "", } - // copy sc + // copy the subchart scc := &chart.Chart{} _ = copier.Copy(scc, sc) if err := scc.Validate(); err != nil { ll.Error(err, "failed to validate application subchart for staging registry") err = fmt.Errorf("failed to validate application subchart for staging registry : %w", err) - cs.Error = err.Error() - appGroup.Status.Applications[i].Subcharts[sc.Name()] = cs + chartStatus.Error = err.Error() + appGroup.Status.Applications[i].Subcharts[sc.Name()] = chartStatus return err } @@ -141,8 +152,8 @@ func (r *ApplicationGroupReconciler) reconcileApplications(l logr.Logger, appGro if err != nil { ll.Error(err, "failed to save subchart package as tgz") err = fmt.Errorf("failed to save subchart package as tgz at location %s : %w", path, err) - cs.Error = err.Error() - appGroup.Status.Applications[i].Subcharts[sc.Name()] = cs + chartStatus.Error = err.Error() + appGroup.Status.Applications[i].Subcharts[sc.Name()] = chartStatus return err } @@ -150,16 +161,14 @@ func (r *ApplicationGroupReconciler) reconcileApplications(l logr.Logger, appGro if err != nil { ll.Error(err, "failed to push application subchart to staging registry") err = fmt.Errorf("failed to push application subchart to staging registry : %w", err) - cs.Error = err.Error() - appGroup.Status.Applications[i].Subcharts[sc.Name()] = cs + chartStatus.Error = err.Error() + appGroup.Status.Applications[i].Subcharts[sc.Name()] = chartStatus return err } - cs.Staged = true - cs.Version = sc.Metadata.Version - cs.Error = "" + chartStatus.Staged = true - appGroup.Status.Applications[i].Subcharts[sc.Name()] = cs + appGroup.Status.Applications[i].Subcharts[sc.Name()] = chartStatus } } diff --git a/pkg/workflow/argo.go b/pkg/workflow/argo.go index df5dbf1..7d4ebfc 100644 --- a/pkg/workflow/argo.go +++ b/pkg/workflow/argo.go @@ -21,6 +21,15 @@ import ( "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) +const ( + // The set of executor actions which can be performed on a helmrelease object + Install ExecutorAction = "install" + Delete ExecutorAction = "delete" +) + +// ExecutorAction defines the set of executor actions which can be performed on a helmrelease object +type ExecutorAction string + type argo struct { scheme *runtime.Scheme cli client.Client @@ -288,7 +297,7 @@ func (a *argo) generateReverseWorkflow(ctx context.Context, l logr.Logger, nodes Parameters: []v1alpha12.Parameter{ { Name: HelmReleaseArg, - Value: utils.ToStrPtr(utils.HrToYaml(hr)), + Value: utils.ToStrPtr(base64.StdEncoding.EncodeToString([]byte(utils.HrToYaml(hr)))), }, }, }, @@ -306,7 +315,7 @@ func (a *argo) generateReverseWorkflow(ctx context.Context, l logr.Logger, nodes updateWorkflowTemplates(a.rwf, entry) - updateWorkflowTemplates(a.rwf, defaultReverseExecutor()) + updateWorkflowTemplates(a.rwf, defaultExecutor(HelmReleaseReverseExecutorName, Delete)) return nil } @@ -344,7 +353,7 @@ func (a *argo) generateAppGroupTpls(ctx context.Context, g *v1alpha1.Application // TODO: Add the executor template // This should eventually be configurable - updateWorkflowTemplates(a.wf, defaultExecutor()) + updateWorkflowTemplates(a.wf, defaultExecutor(HelmReleaseExecutorName, Install)) return nil } @@ -598,10 +607,10 @@ func updateWorkflowTemplates(wf *v1alpha12.Workflow, tpls ...v1alpha12.Template) wf.Spec.Templates = append(wf.Spec.Templates, tpls...) } -func defaultExecutor() v1alpha12.Template { - executorArgs := []string{"--spec", "{{inputs.parameters.helmrelease}}", "--timeout", "{{inputs.parameters.timeout}}", "--interval", "10s"} +func defaultExecutor(tplName string, action ExecutorAction) v1alpha12.Template { + executorArgs := []string{"--spec", "{{inputs.parameters.helmrelease}}", "--action", string(action), "--timeout", "{{inputs.parameters.timeout}}", "--interval", "10s"} return v1alpha12.Template{ - Name: HelmReleaseExecutorName, + Name: tplName, ServiceAccountName: workflowServiceAccountName(), Inputs: v1alpha12.Inputs{ Parameters: []v1alpha12.Parameter{ @@ -626,28 +635,6 @@ func defaultExecutor() v1alpha12.Template { } } -func defaultReverseExecutor() v1alpha12.Template { - return v1alpha12.Template{ - Name: HelmReleaseReverseExecutorName, - ServiceAccountName: workflowServiceAccountName(), - Inputs: v1alpha12.Inputs{ - Parameters: []v1alpha12.Parameter{ - { - Name: "helmrelease", - }, - }, - }, - Executor: &v1alpha12.ExecutorConfig{ - ServiceAccountName: workflowServiceAccountName(), - }, - Resource: &v1alpha12.ResourceTemplate{ - // SetOwnerReference: true, - Action: "delete", - Manifest: "{{inputs.parameters.helmrelease}}", - }, - } -} - func generateSubchartHelmRelease(a v1alpha1.Application, appName, scName, version, repo, targetNS string, isStaged bool) (*fluxhelmv2beta1.HelmRelease, error) { hr := &fluxhelmv2beta1.HelmRelease{ TypeMeta: v1.TypeMeta{ diff --git a/pkg/workflow/consts.go b/pkg/workflow/consts.go index 07b7d4c..eef5adb 100644 --- a/pkg/workflow/consts.go +++ b/pkg/workflow/consts.go @@ -15,7 +15,7 @@ const ( ExecutorName = "executor" ExecutorImage = "azureorkestra/executor" - ExecutorImageTag = "v0.2.0" + ExecutorImageTag = "v0.3.0" ChartMuseumName = "chartmuseum" )