261 lines
5.3 KiB
Go
261 lines
5.3 KiB
Go
/*
|
|
Copyright 2021 The Flux authors
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package postrender
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
|
|
. "github.com/onsi/gomega"
|
|
"sigs.k8s.io/yaml"
|
|
|
|
"github.com/fluxcd/pkg/apis/kustomize"
|
|
|
|
v2 "github.com/fluxcd/helm-controller/api/v2"
|
|
)
|
|
|
|
const replaceImageMock = `apiVersion: v1
|
|
kind: Pod
|
|
metadata:
|
|
name: image
|
|
spec:
|
|
containers:
|
|
- image: repository/image:tag
|
|
`
|
|
|
|
const json6902Mock = `apiVersion: v1
|
|
kind: Pod
|
|
metadata:
|
|
annotations:
|
|
c: foo
|
|
name: json6902
|
|
`
|
|
|
|
const strategicMergeMock = `apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: nginx
|
|
spec:
|
|
template:
|
|
spec:
|
|
containers:
|
|
- name: nginx
|
|
image: nignx:v1.0.0
|
|
`
|
|
|
|
func Test_postRendererKustomize_Run(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
renderedManifests string
|
|
patches string
|
|
images string
|
|
expectManifests string
|
|
expectErr bool
|
|
}{
|
|
{
|
|
name: "image tag",
|
|
renderedManifests: replaceImageMock,
|
|
images: `
|
|
- name: repository/image
|
|
newTag: 0.1.0
|
|
`,
|
|
expectManifests: `apiVersion: v1
|
|
kind: Pod
|
|
metadata:
|
|
name: image
|
|
spec:
|
|
containers:
|
|
- image: repository/image:0.1.0
|
|
`,
|
|
},
|
|
{
|
|
name: "image name",
|
|
renderedManifests: replaceImageMock,
|
|
images: `
|
|
- name: repository/image
|
|
newName: repository/new-image
|
|
`,
|
|
expectManifests: `apiVersion: v1
|
|
kind: Pod
|
|
metadata:
|
|
name: image
|
|
spec:
|
|
containers:
|
|
- image: repository/new-image:tag
|
|
`,
|
|
},
|
|
{
|
|
name: "image digest",
|
|
renderedManifests: replaceImageMock,
|
|
images: `
|
|
- name: repository/image
|
|
digest: sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3
|
|
`,
|
|
expectManifests: `apiVersion: v1
|
|
kind: Pod
|
|
metadata:
|
|
name: image
|
|
spec:
|
|
containers:
|
|
- image: repository/image@sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3
|
|
`,
|
|
},
|
|
{
|
|
name: "json 6902",
|
|
renderedManifests: json6902Mock,
|
|
patches: `
|
|
- target:
|
|
version: v1
|
|
kind: Pod
|
|
name: json6902
|
|
patch: |
|
|
- op: test
|
|
path: /metadata/annotations/c
|
|
value: foo
|
|
- op: remove
|
|
path: /metadata/annotations/c
|
|
- op: add
|
|
path: /metadata/annotations/c
|
|
value: [ "foo", "bar" ]
|
|
- op: replace
|
|
path: /metadata/annotations/c
|
|
value: 42
|
|
- op: move
|
|
from: /metadata/annotations/c
|
|
path: /metadata/annotations/d
|
|
- op: copy
|
|
from: /metadata/annotations/d
|
|
path: /metadata/annotations/e
|
|
`,
|
|
expectManifests: `apiVersion: v1
|
|
kind: Pod
|
|
metadata:
|
|
annotations:
|
|
d: "42"
|
|
e: "42"
|
|
name: json6902
|
|
`,
|
|
},
|
|
{
|
|
name: "targeted json 6902",
|
|
renderedManifests: json6902Mock,
|
|
patches: `
|
|
- target:
|
|
version: v1
|
|
kind: Pod
|
|
name: json6902
|
|
patch: |
|
|
- op: test
|
|
path: /metadata/annotations/c
|
|
value: foo
|
|
- op: remove
|
|
path: /metadata/annotations/c
|
|
- op: add
|
|
path: /metadata/annotations/c
|
|
value: [ "foo", "bar" ]
|
|
- op: replace
|
|
path: /metadata/annotations/c
|
|
value: 42
|
|
- op: move
|
|
from: /metadata/annotations/c
|
|
path: /metadata/annotations/d
|
|
- op: copy
|
|
from: /metadata/annotations/d
|
|
path: /metadata/annotations/e
|
|
`,
|
|
expectManifests: `apiVersion: v1
|
|
kind: Pod
|
|
metadata:
|
|
annotations:
|
|
d: "42"
|
|
e: "42"
|
|
name: json6902
|
|
`,
|
|
},
|
|
{
|
|
name: "targeted strategic merge test",
|
|
renderedManifests: strategicMergeMock,
|
|
patches: `
|
|
- target:
|
|
group: apps
|
|
version: v1
|
|
kind: Deployment
|
|
name: nginx
|
|
patch: |
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: nginx
|
|
spec:
|
|
template:
|
|
spec:
|
|
containers:
|
|
- name: nginx
|
|
image: nignx:latest
|
|
`,
|
|
expectManifests: `apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: nginx
|
|
spec:
|
|
template:
|
|
spec:
|
|
containers:
|
|
- image: nignx:latest
|
|
name: nginx
|
|
`,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
g := NewWithT(t)
|
|
|
|
spec, err := mockKustomize(tt.patches, tt.images)
|
|
g.Expect(err).ToNot(HaveOccurred())
|
|
|
|
k := &Kustomize{
|
|
Patches: spec.Patches,
|
|
Images: spec.Images,
|
|
}
|
|
gotModifiedManifests, err := k.Run(bytes.NewBufferString(tt.renderedManifests))
|
|
if tt.expectErr {
|
|
g.Expect(err).ToNot(HaveOccurred())
|
|
g.Expect(gotModifiedManifests.String()).To(BeEmpty())
|
|
return
|
|
}
|
|
|
|
g.Expect(err).ToNot(HaveOccurred())
|
|
g.Expect(gotModifiedManifests).To(Equal(bytes.NewBufferString(tt.expectManifests)))
|
|
})
|
|
}
|
|
}
|
|
|
|
func mockKustomize(patches, images string) (*v2.Kustomize, error) {
|
|
var targeted []kustomize.Patch
|
|
if err := yaml.Unmarshal([]byte(patches), &targeted); err != nil {
|
|
return nil, err
|
|
}
|
|
var imgs []kustomize.Image
|
|
if err := yaml.Unmarshal([]byte(images), &imgs); err != nil {
|
|
return nil, err
|
|
}
|
|
return &v2.Kustomize{
|
|
Patches: targeted,
|
|
Images: imgs,
|
|
}, nil
|
|
}
|