From b40dd4253ad6caef59572537380f8824a7e808c7 Mon Sep 17 00:00:00 2001 From: chris kery Date: Fri, 22 Mar 2024 22:05:23 +0800 Subject: [PATCH 1/3] Fixed the Indent length for CronJob which has args --- examples/app/templates/cron-job.yaml | 3 +- examples/app/values.yaml | 2 ++ pkg/processor/daemonset/daemonset.go | 2 +- pkg/processor/deployment/deployment.go | 2 +- pkg/processor/job/cron.go | 2 +- pkg/processor/job/job.go | 2 +- pkg/processor/pod/pod.go | 46 ++++++++++++++++++------ pkg/processor/pod/pod_test.go | 8 ++--- pkg/processor/statefulset/statefulset.go | 2 +- test_data/sample-app.yaml | 2 ++ 10 files changed, 51 insertions(+), 20 deletions(-) diff --git a/examples/app/templates/cron-job.yaml b/examples/app/templates/cron-job.yaml index 453b05a2..5016b062 100644 --- a/examples/app/templates/cron-job.yaml +++ b/examples/app/templates/cron-job.yaml @@ -10,7 +10,8 @@ spec: template: spec: containers: - - command: + - args: {{- toYaml .Values.cronJob.hello.args | nindent 12 }} + command: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster diff --git a/examples/app/values.yaml b/examples/app/values.yaml index 6f23e91d..78190464 100644 --- a/examples/app/values.yaml +++ b/examples/app/values.yaml @@ -6,6 +6,8 @@ batchJob: tag: 5.34.0 cronJob: hello: + args: + - --health-probe-bind-address=:8081 image: repository: busybox tag: "1.28" diff --git a/pkg/processor/daemonset/daemonset.go b/pkg/processor/daemonset/daemonset.go index 851abe36..49787dbe 100644 --- a/pkg/processor/daemonset/daemonset.go +++ b/pkg/processor/daemonset/daemonset.go @@ -98,7 +98,7 @@ func (d daemonset) Process(appMeta helmify.AppMetadata, obj *unstructured.Unstru } nameCamel := strcase.ToLowerCamel(name) - specMap, podValues, err := pod.ProcessSpec(nameCamel, appMeta, dae.Spec.Template.Spec) + specMap, podValues, err := pod.ProcessSpec(nameCamel, appMeta, dae.Spec.Template.Spec, 0) if err != nil { return true, nil, err } diff --git a/pkg/processor/deployment/deployment.go b/pkg/processor/deployment/deployment.go index b96f7b0d..563e4d24 100644 --- a/pkg/processor/deployment/deployment.go +++ b/pkg/processor/deployment/deployment.go @@ -115,7 +115,7 @@ func (d deployment) Process(appMeta helmify.AppMetadata, obj *unstructured.Unstr } nameCamel := strcase.ToLowerCamel(name) - specMap, podValues, err := pod.ProcessSpec(nameCamel, appMeta, depl.Spec.Template.Spec) + specMap, podValues, err := pod.ProcessSpec(nameCamel, appMeta, depl.Spec.Template.Spec, 0) if err != nil { return true, nil, err } diff --git a/pkg/processor/job/cron.go b/pkg/processor/job/cron.go index 1baf186e..37dc59b7 100644 --- a/pkg/processor/job/cron.go +++ b/pkg/processor/job/cron.go @@ -105,7 +105,7 @@ func (p cron) Process(appMeta helmify.AppMetadata, obj *unstructured.Unstructure } // process job pod template: - podSpecMap, podValues, err := pod.ProcessSpec(nameCamelCase, appMeta, jobObj.Spec.JobTemplate.Spec.Template.Spec) + podSpecMap, podValues, err := pod.ProcessSpec(nameCamelCase, appMeta, jobObj.Spec.JobTemplate.Spec.Template.Spec, 4) if err != nil { return true, nil, err } diff --git a/pkg/processor/job/job.go b/pkg/processor/job/job.go index 5f1ec53e..9e3be75d 100644 --- a/pkg/processor/job/job.go +++ b/pkg/processor/job/job.go @@ -104,7 +104,7 @@ func (p job) Process(appMeta helmify.AppMetadata, obj *unstructured.Unstructured } } // process job pod template: - podSpecMap, podValues, err := pod.ProcessSpec(nameCamelCase, appMeta, jobObj.Spec.Template.Spec) + podSpecMap, podValues, err := pod.ProcessSpec(nameCamelCase, appMeta, jobObj.Spec.Template.Spec, 0) if err != nil { return true, nil, err } diff --git a/pkg/processor/pod/pod.go b/pkg/processor/pod/pod.go index 09979abd..cef970c7 100644 --- a/pkg/processor/pod/pod.go +++ b/pkg/processor/pod/pod.go @@ -16,7 +16,12 @@ import ( const imagePullPolicyTemplate = "{{ .Values.%[1]s.%[2]s.imagePullPolicy }}" const envValue = "{{ quote .Values.%[1]s.%[2]s.%[3]s.%[4]s }}" -func ProcessSpec(objName string, appMeta helmify.AppMetadata, spec corev1.PodSpec) (map[string]interface{}, helmify.Values, error) { +func ProcessSpec( + objName string, + appMeta helmify.AppMetadata, + spec corev1.PodSpec, + indentOffset uint, +) (map[string]interface{}, helmify.Values, error) { values, err := processPodSpec(objName, appMeta, &spec) if err != nil { return nil, nil, err @@ -39,12 +44,12 @@ func ProcessSpec(objName string, appMeta helmify.AppMetadata, spec corev1.PodSpe return nil, nil, fmt.Errorf("%w: unable to convert podSpec to map", err) } - specMap, values, err = processNestedContainers(specMap, objName, values, "containers") + specMap, values, err = processNestedContainers(specMap, objName, values, "containers", indentOffset) if err != nil { return nil, nil, err } - specMap, values, err = processNestedContainers(specMap, objName, values, "initContainers") + specMap, values, err = processNestedContainers(specMap, objName, values, "initContainers", indentOffset) if err != nil { return nil, nil, err } @@ -76,14 +81,20 @@ func ProcessSpec(objName string, appMeta helmify.AppMetadata, spec corev1.PodSpe return specMap, values, nil } -func processNestedContainers(specMap map[string]interface{}, objName string, values map[string]interface{}, containerKey string) (map[string]interface{}, map[string]interface{}, error) { +func processNestedContainers( + specMap map[string]interface{}, + objName string, + values map[string]interface{}, + containerKey string, + indentOffset uint, +) (map[string]interface{}, map[string]interface{}, error) { containers, _, err := unstructured.NestedSlice(specMap, containerKey) if err != nil { return nil, nil, err } if len(containers) > 0 { - containers, values, err = processContainers(objName, values, containerKey, containers) + containers, values, err = processContainers(objName, values, containerKey, containers, indentOffset) if err != nil { return nil, nil, err } @@ -97,26 +108,41 @@ func processNestedContainers(specMap map[string]interface{}, objName string, val return specMap, values, nil } -func processContainers(objName string, values helmify.Values, containerType string, containers []interface{}) ([]interface{}, helmify.Values, error) { +func processContainers( + objName string, + values helmify.Values, + containerType string, + containers []interface{}, + indentOffset uint, +) ([]interface{}, helmify.Values, error) { for i := range containers { - containerName := strcase.ToLowerCamel((containers[i].(map[string]interface{})["name"]).(string)) + container := containers[i].(map[string]interface{}) + containerName := strcase.ToLowerCamel(container["name"].(string)) res, exists, err := unstructured.NestedMap(values, objName, containerName, "resources") if err != nil { return nil, nil, err } if exists && len(res) > 0 { - err = unstructured.SetNestedField(containers[i].(map[string]interface{}), fmt.Sprintf(`{{- toYaml .Values.%s.%s.resources | nindent 10 }}`, objName, containerName), "resources") + err = unstructured.SetNestedField( + container, + fmt.Sprintf(`{{- toYaml .Values.%s.%s.resources | nindent %d }}`, objName, containerName, 10+indentOffset), + "resources", + ) if err != nil { return nil, nil, err } } - args, exists, err := unstructured.NestedStringSlice(containers[i].(map[string]interface{}), "args") + args, exists, err := unstructured.NestedStringSlice(container, "args") if err != nil { return nil, nil, err } if exists && len(args) > 0 { - err = unstructured.SetNestedField(containers[i].(map[string]interface{}), fmt.Sprintf(`{{- toYaml .Values.%[1]s.%[2]s.args | nindent 8 }}`, objName, containerName), "args") + err = unstructured.SetNestedField( + container, + fmt.Sprintf(`{{- toYaml .Values.%[1]s.%[2]s.args | nindent %d }}`, objName, containerName, 8+indentOffset), + "args", + ) if err != nil { return nil, nil, err } diff --git a/pkg/processor/pod/pod_test.go b/pkg/processor/pod/pod_test.go index c55b4fc2..4cc37942 100644 --- a/pkg/processor/pod/pod_test.go +++ b/pkg/processor/pod/pod_test.go @@ -118,7 +118,7 @@ func Test_pod_Process(t *testing.T) { var deploy appsv1.Deployment obj := internal.GenerateObj(strDeployment) err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, &deploy) - specMap, tmpl, err := ProcessSpec("nginx", &metadata.Service{}, deploy.Spec.Template.Spec) + specMap, tmpl, err := ProcessSpec("nginx", &metadata.Service{}, deploy.Spec.Template.Spec, 0) assert.NoError(t, err) assert.Equal(t, map[string]interface{}{ @@ -162,7 +162,7 @@ func Test_pod_Process(t *testing.T) { var deploy appsv1.Deployment obj := internal.GenerateObj(strDeploymentWithNoArgs) err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, &deploy) - specMap, tmpl, err := ProcessSpec("nginx", &metadata.Service{}, deploy.Spec.Template.Spec) + specMap, tmpl, err := ProcessSpec("nginx", &metadata.Service{}, deploy.Spec.Template.Spec, 0) assert.NoError(t, err) assert.Equal(t, map[string]interface{}{ @@ -201,7 +201,7 @@ func Test_pod_Process(t *testing.T) { var deploy appsv1.Deployment obj := internal.GenerateObj(strDeploymentWithTagAndDigest) err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, &deploy) - specMap, tmpl, err := ProcessSpec("nginx", &metadata.Service{}, deploy.Spec.Template.Spec) + specMap, tmpl, err := ProcessSpec("nginx", &metadata.Service{}, deploy.Spec.Template.Spec, 0) assert.NoError(t, err) assert.Equal(t, map[string]interface{}{ @@ -240,7 +240,7 @@ func Test_pod_Process(t *testing.T) { var deploy appsv1.Deployment obj := internal.GenerateObj(strDeploymentWithPort) err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, &deploy) - specMap, tmpl, err := ProcessSpec("nginx", &metadata.Service{}, deploy.Spec.Template.Spec) + specMap, tmpl, err := ProcessSpec("nginx", &metadata.Service{}, deploy.Spec.Template.Spec, 0) assert.NoError(t, err) assert.Equal(t, map[string]interface{}{ diff --git a/pkg/processor/statefulset/statefulset.go b/pkg/processor/statefulset/statefulset.go index 1091151a..4a832dd8 100644 --- a/pkg/processor/statefulset/statefulset.go +++ b/pkg/processor/statefulset/statefulset.go @@ -108,7 +108,7 @@ func (d statefulset) Process(appMeta helmify.AppMetadata, obj *unstructured.Unst } // process pod spec: - podSpecMap, podValues, err := pod.ProcessSpec(nameCamel, appMeta, ssSpec.Template.Spec) + podSpecMap, podValues, err := pod.ProcessSpec(nameCamel, appMeta, ssSpec.Template.Spec, 0) if err != nil { return true, nil, err } diff --git a/test_data/sample-app.yaml b/test_data/sample-app.yaml index a80e04e8..11de67d1 100644 --- a/test_data/sample-app.yaml +++ b/test_data/sample-app.yaml @@ -287,6 +287,8 @@ spec: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster + args: + - --health-probe-bind-address=:8081 restartPolicy: OnFailure --- apiVersion: v1 From 80a1b418c782de91b334c886c993a91fd322bd17 Mon Sep 17 00:00:00 2001 From: chris kery Date: Fri, 22 Mar 2024 22:09:01 +0800 Subject: [PATCH 2/3] Execute fmt --- pkg/app/context.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/app/context.go b/pkg/app/context.go index 2c4e52eb..5aef94c5 100644 --- a/pkg/app/context.go +++ b/pkg/app/context.go @@ -75,7 +75,7 @@ func (c *appContext) CreateHelm(stop <-chan struct{}) error { default: } } - return c.output.Create(c.config.ChartDir, c.config.ChartName, c.config.Crd, c.config.CertManagerAsSubchart, c.config.CertManagerVersion , templates, filenames) + return c.output.Create(c.config.ChartDir, c.config.ChartName, c.config.Crd, c.config.CertManagerAsSubchart, c.config.CertManagerVersion, templates, filenames) } func (c *appContext) process(obj *unstructured.Unstructured) (helmify.Template, error) { From e8b92194a4b9414cd7c28a4935aac113b5860da6 Mon Sep 17 00:00:00 2001 From: chris kery Date: Fri, 22 Mar 2024 22:38:22 +0800 Subject: [PATCH 3/3] Add resource for CronJOb --- examples/app/templates/cron-job.yaml | 2 +- examples/app/values.yaml | 3 +++ test_data/sample-app.yaml | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/app/templates/cron-job.yaml b/examples/app/templates/cron-job.yaml index 5016b062..422155df 100644 --- a/examples/app/templates/cron-job.yaml +++ b/examples/app/templates/cron-job.yaml @@ -22,6 +22,6 @@ spec: | default .Chart.AppVersion }} imagePullPolicy: {{ .Values.cronJob.hello.imagePullPolicy }} name: hello - resources: {} + resources: {{- toYaml .Values.cronJob.hello.resources | nindent 14 }} restartPolicy: OnFailure schedule: {{ .Values.cronJob.schedule | quote }} \ No newline at end of file diff --git a/examples/app/values.yaml b/examples/app/values.yaml index 78190464..76f6e6b0 100644 --- a/examples/app/values.yaml +++ b/examples/app/values.yaml @@ -12,6 +12,9 @@ cronJob: repository: busybox tag: "1.28" imagePullPolicy: IfNotPresent + resources: + requests: + storage: 1Gi schedule: '* * * * *' fluentdElasticsearch: fluentdElasticsearch: diff --git a/test_data/sample-app.yaml b/test_data/sample-app.yaml index 11de67d1..3fef3f99 100644 --- a/test_data/sample-app.yaml +++ b/test_data/sample-app.yaml @@ -289,6 +289,9 @@ spec: - date; echo Hello from the Kubernetes cluster args: - --health-probe-bind-address=:8081 + resources: + requests: + storage: 1Gi restartPolicy: OnFailure --- apiVersion: v1