diff --git a/cmd/flux/diff_kustomization_test.go b/cmd/flux/diff_kustomization_test.go index fc2a9c67ce..a381a61f0a 100644 --- a/cmd/flux/diff_kustomization_test.go +++ b/cmd/flux/diff_kustomization_test.go @@ -91,6 +91,12 @@ func TestDiffKustomization(t *testing.T) { objectFile: "./testdata/diff-kustomization/stringdata-sops-secret.yaml", assert: assertGoldenFile("./testdata/diff-kustomization/diff-with-drifted-stringdata-sops-secret.golden"), }, + { + name: "diff where kustomization file has multiple objects with the same name", + args: "diff kustomization podinfo --path ./testdata/build-kustomization/podinfo --progress-bar=false --kustomization-file ./testdata/diff-kustomization/flux-kustomization-multiobj.yaml", + objectFile: "", + assert: assertGoldenFile("./testdata/diff-kustomization/nothing-is-deployed.golden"), + }, } tmpl := map[string]string{ diff --git a/cmd/flux/testdata/diff-kustomization/flux-kustomization-multiobj.yaml b/cmd/flux/testdata/diff-kustomization/flux-kustomization-multiobj.yaml new file mode 100644 index 0000000000..53b03336ff --- /dev/null +++ b/cmd/flux/testdata/diff-kustomization/flux-kustomization-multiobj.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: podinfo + +--- +apiVersion: kustomize.toolkit.fluxcd.io/v1 +kind: Kustomization +metadata: + name: podinfo +spec: + interval: 5m0s + path: ./kustomize + force: true + prune: true + sourceRef: + kind: GitRepository + name: podinfo + targetNamespace: default diff --git a/internal/build/build.go b/internal/build/build.go index a9e55c6840..f05ce12391 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -333,7 +333,7 @@ func (b *Builder) unMarshallKustomization() (*kustomizev1.Kustomization, error) k := &kustomizev1.Kustomization{} decoder := k8syaml.NewYAMLOrJSONDecoder(bytes.NewBuffer(data), len(data)) // check for kustomization in yaml with the same name and namespace - for !(k.Name == b.name && (k.Namespace == b.namespace || k.Namespace == "")) { + for { err = decoder.Decode(k) if err != nil { if err == io.EOF { @@ -343,6 +343,13 @@ func (b *Builder) unMarshallKustomization() (*kustomizev1.Kustomization, error) return nil, fmt.Errorf("failed to unmarshall kustomization file %s: %w", b.kustomizationFile, err) } } + + if strings.HasPrefix(k.APIVersion, kustomizev1.GroupVersion.Group+"/") && + k.Kind == kustomizev1.KustomizationKind && + k.Name == b.name && + (k.Namespace == b.namespace || k.Namespace == "") { + break + } } return k, nil } diff --git a/internal/build/build_test.go b/internal/build/build_test.go index cb40c82c03..be62abc50c 100644 --- a/internal/build/build_test.go +++ b/internal/build/build_test.go @@ -189,6 +189,12 @@ func Test_unMarshallKustomization(t *testing.T) { wantErr: true, errString: "failed find kustomization with name", }, + { + name: "yaml containing other resource with same name as kustomization", + localKsFile: "testdata/local-kustomization/invalid-resource.yaml", + wantErr: true, + errString: "failed find kustomization with name", + }, } b := &Builder{ @@ -324,7 +330,10 @@ func Test_ResolveKustomization(t *testing.T) { }, } - b := &Builder{} + b := &Builder{ + name: "podinfo", + namespace: "flux-system", + } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { b.kustomizationFile = tt.localKsFile diff --git a/internal/build/testdata/local-kustomization/invalid-resource.yaml b/internal/build/testdata/local-kustomization/invalid-resource.yaml new file mode 100644 index 0000000000..51287766a0 --- /dev/null +++ b/internal/build/testdata/local-kustomization/invalid-resource.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: podinfo