From 77be1eb24ca0558da463ed9aec87fd786f63457e Mon Sep 17 00:00:00 2001 From: Arthur Outhenin-Chalandre Date: Fri, 8 Dec 2023 17:35:23 +0100 Subject: [PATCH] feat(kustomize): add support for new args to pass api and kube versions Signed-off-by: Arthur Outhenin-Chalandre --- reposerver/repository/repository.go | 7 +++++-- util/kustomize/kustomize.go | 30 ++++++++++++++++++++--------- util/kustomize/kustomize_test.go | 17 +++++++++------- 3 files changed, 36 insertions(+), 18 deletions(-) diff --git a/reposerver/repository/repository.go b/reposerver/repository/repository.go index f66bc71ac4621..46807d7d36a4b 100644 --- a/reposerver/repository/repository.go +++ b/reposerver/repository/repository.go @@ -1374,7 +1374,10 @@ func GenerateManifests(ctx context.Context, appPath, repoRoot, revision string, kustomizeBinary = q.KustomizeOptions.BinaryPath } k := kustomize.NewKustomizeApp(appPath, q.Repo.GetGitCreds(gitCredsStore), repoURL, kustomizeBinary) - targetObjs, _, err = k.Build(q.ApplicationSource.Kustomize, q.KustomizeOptions, env) + targetObjs, _, err = k.Build(q.ApplicationSource.Kustomize, q.KustomizeOptions, env, &kustomize.BuildOpts{ + KubeVersion: q.KubeVersion, + APIVersions: q.ApiVersions, + }) case v1alpha1.ApplicationSourceTypePlugin: pluginName := "" if q.ApplicationSource.Plugin != nil { @@ -2115,7 +2118,7 @@ func populateKustomizeAppDetails(res *apiclient.RepoAppDetailsResponse, q *apicl ApplicationSource: q.Source, } env := newEnv(&fakeManifestRequest, reversion) - _, images, err := k.Build(q.Source.Kustomize, q.KustomizeOptions, env) + _, images, err := k.Build(q.Source.Kustomize, q.KustomizeOptions, env, nil) if err != nil { return err } diff --git a/util/kustomize/kustomize.go b/util/kustomize/kustomize.go index 2487b14b4903b..b1afd81e96313 100644 --- a/util/kustomize/kustomize.go +++ b/util/kustomize/kustomize.go @@ -28,10 +28,15 @@ import ( // represents a Docker image in the format NAME[:TAG]. type Image = string +type BuildOpts struct { + KubeVersion string + APIVersions []string +} + // Kustomize provides wrapper functionality around the `kustomize` command. type Kustomize interface { // Build returns a list of unstructured objects from a `kustomize build` command and extract supported parameters - Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOptions *v1alpha1.KustomizeOptions, envVars *v1alpha1.Env) ([]*unstructured.Unstructured, []Image, error) + Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOptions *v1alpha1.KustomizeOptions, envVars *v1alpha1.Env, buildOpts *BuildOpts) ([]*unstructured.Unstructured, []Image, error) } // NewKustomizeApp create a new wrapper to run commands on the `kustomize` command-line tool. @@ -85,7 +90,7 @@ func mapToEditAddArgs(val map[string]string) []string { return args } -func (k *kustomize) Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOptions *v1alpha1.KustomizeOptions, envVars *v1alpha1.Env) ([]*unstructured.Unstructured, []Image, error) { +func (k *kustomize) Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOptions *v1alpha1.KustomizeOptions, envVars *v1alpha1.Env, buildOpts *BuildOpts) ([]*unstructured.Unstructured, []Image, error) { env := os.Environ() if envVars != nil { @@ -293,13 +298,20 @@ func (k *kustomize) Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOp } } - var cmd *exec.Cmd + buildOptsParams := []string{"build", k.path} + if buildOpts != nil { + if buildOpts.KubeVersion != "" { + buildOptsParams = append(buildOptsParams, "--helm-kube-version", buildOpts.KubeVersion) + } + for _, v := range buildOpts.APIVersions { + buildOptsParams = append(buildOptsParams, "--helm-api-versions", v) + } + } if kustomizeOptions != nil && kustomizeOptions.BuildOptions != "" { - params := parseKustomizeBuildOptions(k.path, kustomizeOptions.BuildOptions) - cmd = exec.Command(k.getBinaryPath(), params...) - } else { - cmd = exec.Command(k.getBinaryPath(), "build", k.path) + buildOptsParams = append(buildOptsParams, parseKustomizeBuildOptions(kustomizeOptions.BuildOptions)...) } + + cmd := exec.Command(k.getBinaryPath(), buildOptsParams...) cmd.Env = env out, err := executil.Run(cmd) if err != nil { @@ -314,8 +326,8 @@ func (k *kustomize) Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOp return objs, getImageParameters(objs), nil } -func parseKustomizeBuildOptions(path, buildOptions string) []string { - return append([]string{"build", path}, strings.Split(buildOptions, " ")...) +func parseKustomizeBuildOptions(buildOptions string) []string { + return strings.Split(buildOptions, " ") } var KustomizationNames = []string{"kustomization.yaml", "kustomization.yml", "Kustomization"} diff --git a/util/kustomize/kustomize_test.go b/util/kustomize/kustomize_test.go index a6275cf01ae1b..e9e252c24f0ba 100644 --- a/util/kustomize/kustomize_test.go +++ b/util/kustomize/kustomize_test.go @@ -69,7 +69,10 @@ func TestKustomizeBuild(t *testing.T) { }, }, } - objs, images, err := kustomize.Build(&kustomizeSource, nil, env) + objs, images, err := kustomize.Build(&kustomizeSource, nil, env, &BuildOpts{ + KubeVersion: "1.27", + APIVersions: []string{"foo", "bar"}, + }) assert.Nil(t, err) if err != nil { assert.Equal(t, len(objs), 2) @@ -132,7 +135,7 @@ func TestFailKustomizeBuild(t *testing.T) { }, }, } - _, _, err = kustomize.Build(&kustomizeSource, nil, nil) + _, _, err = kustomize.Build(&kustomizeSource, nil, nil, nil) assert.EqualError(t, err, "expected integer value for count. Received: garbage") } @@ -223,7 +226,7 @@ func TestKustomizeBuildForceCommonLabels(t *testing.T) { appPath, err := testDataDir(t, tc.TestData) assert.Nil(t, err) kustomize := NewKustomizeApp(appPath, git.NopCreds{}, "", "") - objs, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env) + objs, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil) switch tc.ExpectErr { case true: assert.Error(t, err) @@ -315,7 +318,7 @@ func TestKustomizeBuildForceCommonAnnotations(t *testing.T) { appPath, err := testDataDir(t, tc.TestData) assert.Nil(t, err) kustomize := NewKustomizeApp(appPath, git.NopCreds{}, "", "") - objs, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env) + objs, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil) switch tc.ExpectErr { case true: assert.Error(t, err) @@ -341,7 +344,7 @@ func TestKustomizeCustomVersion(t *testing.T) { env := &v1alpha1.Env{ &v1alpha1.EnvEntry{Name: "ARGOCD_APP_NAME", Value: "argo-cd-tests"}, } - objs, images, err := kustomize.Build(&kustomizeSource, nil, env) + objs, images, err := kustomize.Build(&kustomizeSource, nil, env, nil) assert.Nil(t, err) if err != nil { assert.Equal(t, len(objs), 2) @@ -361,7 +364,7 @@ func TestKustomizeBuildComponents(t *testing.T) { kustomizeSource := v1alpha1.ApplicationSourceKustomize{ Components: []string{"./components"}, } - objs, _, err := kustomize.Build(&kustomizeSource, nil, nil) + objs, _, err := kustomize.Build(&kustomizeSource, nil, nil, nil) assert.Nil(t, err) obj := objs[0] assert.Equal(t, "nginx-deployment", obj.GetName()) @@ -394,7 +397,7 @@ func TestKustomizeBuildPatches(t *testing.T) { }, }, } - objs, _, err := kustomize.Build(&kustomizeSource, nil, nil) + objs, _, err := kustomize.Build(&kustomizeSource, nil, nil, nil) assert.Nil(t, err) obj := objs[0] containers, found, err := unstructured.NestedSlice(obj.Object, "spec", "template", "spec", "containers")