mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-05-17 18:25:26 +00:00
* fix: performance recession when propagating namespace to helm * fix: handle passing namespace downstream more elegant * Revert "fix: handle passing namespace downstream more elegant" This reverts commit976a7cf2aa. * Revert "fix: performance recession when propagating namespace to helm" This reverts commitc7612d1dba. * fix: use annotation to identify helm chart generated resources * fix: deduplicate code * fix: missing import in NamespaceTransformer.go * ci: allow manual trigger of pipeline in fork * Revert "ci: allow manual trigger of pipeline in fork" This reverts commit8948788fe2. * fix: test cases * chore: fix code comment was on wrong line * chore: fix code comment was on wrong line pt2
1028 lines
24 KiB
Go
1028 lines
24 KiB
Go
// Copyright 2022 The Kubernetes Authors.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package main_test
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest"
|
|
"sigs.k8s.io/kustomize/kyaml/copyutil"
|
|
)
|
|
|
|
func TestHelmChartInflationGenerator(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
|
|
rm := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: myPipeline
|
|
name: ocp-pipeline
|
|
namespace: mynamespace
|
|
version: 0.1.16
|
|
repo: https://bcgov.github.io/helm-charts
|
|
releaseName: moria
|
|
valuesInline:
|
|
releaseNamespace: ""
|
|
rbac:
|
|
create: true
|
|
rules:
|
|
- apiGroups: [""]
|
|
verbs: ["*"]
|
|
resouces: ["*"]
|
|
`)
|
|
|
|
th.AssertActualEqualsExpected(rm, `
|
|
apiVersion: v1
|
|
data:
|
|
config: eyJleGFtcGxlIjoidmFsdWUifQ==
|
|
kind: Secret
|
|
metadata:
|
|
labels:
|
|
chart: ocp-pipeline-0.1.16
|
|
heritage: Helm
|
|
release: moria
|
|
name: moria-config
|
|
type: Opaque
|
|
---
|
|
apiVersion: v1
|
|
data:
|
|
WebHookSecretKey: MTIzNDU2Nzg=
|
|
kind: Secret
|
|
metadata:
|
|
labels:
|
|
chart: ocp-pipeline-0.1.16
|
|
heritage: Helm
|
|
release: moria
|
|
name: moria-git-webhook-secret
|
|
type: Opaque
|
|
---
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: Role
|
|
metadata:
|
|
name: moria-ocp-pipeline
|
|
namespace: mynamespace
|
|
rules:
|
|
- apiGroups:
|
|
- ""
|
|
resouces:
|
|
- '*'
|
|
verbs:
|
|
- '*'
|
|
---
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: RoleBinding
|
|
metadata:
|
|
name: moria-ocp-pipeline
|
|
namespace: mynamespace
|
|
roleRef:
|
|
apiGroup: rbac.authorization.k8s.io
|
|
kind: Role
|
|
name: moria-ocp-pipeline
|
|
subjects:
|
|
- kind: ServiceAccount
|
|
name: jenkins
|
|
namespace: mynamespace
|
|
---
|
|
apiVersion: build.openshift.io/v1
|
|
kind: BuildConfig
|
|
metadata:
|
|
labels:
|
|
app: ocp-pipeline
|
|
chart: ocp-pipeline-0.1.16
|
|
heritage: Helm
|
|
release: moria
|
|
name: moria-ocp-pipeline-deploy
|
|
namespace: null
|
|
spec:
|
|
nodeSelector: {}
|
|
resources:
|
|
limits:
|
|
cpu: 4000m
|
|
memory: 8G
|
|
requests:
|
|
cpu: 2000m
|
|
memory: 4G
|
|
strategy:
|
|
jenkinsPipelineStrategy:
|
|
jenkinsfile: |-
|
|
def helmName = "helm-v3.1.0-linux-amd64.tar.gz"
|
|
def chartName = "metadata-curator"
|
|
def chartRepo = "http://bcgov.github.io/helm-charts"
|
|
def releaseName = "mc"
|
|
def releaseNamespace = ""
|
|
def forceRecreate = "false"
|
|
def callAnotherPipe = "false"
|
|
def useEnv = "false"
|
|
def fromEnv = "commit"
|
|
def setFlag = "image.tag"
|
|
|
|
node("nodejs") {
|
|
stage("deploy (it's already built)") {
|
|
sh """
|
|
curl -L -O https://get.helm.sh/${helmName}
|
|
tar -zxvf ${helmName}
|
|
cd linux-amd64
|
|
|
|
curl -L -O https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux32
|
|
chmod ugo+x ./jq-linux32
|
|
npm install -g json2yaml
|
|
|
|
export CONF1=`+"`"+`oc get secret moria-config -o json | ./jq-linux32 .data.config`+"`"+`
|
|
export CONF2=`+"`"+`sed -e 's/^"//' -e 's/"\$//' <<<"\$CONF1"`+"`"+`
|
|
export CONF3=`+"`"+`echo \$CONF2 | base64 -d -`+"`"+`
|
|
export CONF=`+"`"+`echo \$CONF3 | json2yaml`+"`"+`
|
|
|
|
echo "\$CONF" > ./config.yaml
|
|
oc project ${releaseNamespace}
|
|
./helm repo add chart ${chartRepo}
|
|
./helm repo update
|
|
if [ "${forceRecreate}" = "true" ]; then
|
|
./helm upgrade ${releaseName} chart/${chartName} -f ./config.yaml --install --set hashLabel="${releaseName}\$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 32 | head -n 1)"
|
|
elif [ "${useEnv}" = "true" ]; then
|
|
./helm upgrade ${releaseName} chart/${chartName} -f ./config.yaml --install --set ${setFlag}=${env[fromEnv]}
|
|
else
|
|
./helm upgrade ${releaseName} chart/${chartName} -f ./config.yaml --install
|
|
fi
|
|
|
|
if [ "${callAnotherPipe}" = "true" ]; then
|
|
curl -d '' http://otherwebhookUrl
|
|
fi
|
|
"""
|
|
}
|
|
}
|
|
type: JenkinsPipeline
|
|
triggers:
|
|
- generic:
|
|
allowEnv: true
|
|
secretReference:
|
|
name: moria-git-webhook-secret
|
|
type: generic
|
|
status:
|
|
lastVersion: 0
|
|
`)
|
|
}
|
|
|
|
const expectedInflationFmt = `
|
|
apiVersion: v1
|
|
data:
|
|
rcon-password: Q0hBTkdFTUUh
|
|
kind: Secret
|
|
metadata:
|
|
labels:
|
|
app: moria-minecraft
|
|
chart: minecraft-3.1.3
|
|
heritage: Helm
|
|
release: moria
|
|
name: moria-minecraft
|
|
type: Opaque
|
|
---
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
labels:
|
|
app: moria-minecraft
|
|
chart: minecraft-3.1.3
|
|
heritage: Helm
|
|
release: moria
|
|
name: moria-minecraft
|
|
spec:
|
|
ports:
|
|
- name: minecraft
|
|
port: 25565
|
|
protocol: TCP
|
|
targetPort: minecraft
|
|
selector:
|
|
app: moria-minecraft
|
|
type: ClusterIP
|
|
---
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
labels:
|
|
app: moria-minecraft
|
|
chart: minecraft-3.1.3
|
|
heritage: Helm
|
|
release: moria
|
|
name: moria-minecraft-rcon
|
|
spec:
|
|
ports:
|
|
- name: rcon
|
|
port: 25575
|
|
protocol: TCP
|
|
targetPort: rcon
|
|
selector:
|
|
app: moria-minecraft
|
|
type: LoadBalancer
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
labels:
|
|
app: moria-minecraft
|
|
chart: minecraft-3.1.3
|
|
heritage: Helm
|
|
release: moria
|
|
name: moria-minecraft
|
|
spec:
|
|
selector:
|
|
matchLabels:
|
|
app: moria-minecraft
|
|
strategy:
|
|
type: Recreate
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: moria-minecraft
|
|
spec:
|
|
containers:
|
|
- env:
|
|
- name: EULA
|
|
value: "true"
|
|
- name: TYPE
|
|
value: VANILLA
|
|
- name: VERSION
|
|
value: LATEST
|
|
- name: DIFFICULTY
|
|
value: %s
|
|
- name: WHITELIST
|
|
value: ""
|
|
- name: OPS
|
|
value: ""
|
|
- name: ICON
|
|
value: ""
|
|
- name: MAX_PLAYERS
|
|
value: "20"
|
|
- name: MAX_WORLD_SIZE
|
|
value: "10000"
|
|
- name: ALLOW_NETHER
|
|
value: "true"
|
|
- name: ANNOUNCE_PLAYER_ACHIEVEMENTS
|
|
value: "true"
|
|
- name: ENABLE_COMMAND_BLOCK
|
|
value: "true"
|
|
- name: FORCE_GAMEMODE
|
|
value: "false"
|
|
- name: GENERATE_STRUCTURES
|
|
value: "true"
|
|
- name: HARDCORE
|
|
value: "false"
|
|
- name: MAX_BUILD_HEIGHT
|
|
value: "256"
|
|
- name: MAX_TICK_TIME
|
|
value: "60000"
|
|
- name: SPAWN_ANIMALS
|
|
value: "true"
|
|
- name: SPAWN_MONSTERS
|
|
value: "true"
|
|
- name: SPAWN_NPCS
|
|
value: "true"
|
|
- name: VIEW_DISTANCE
|
|
value: "10"
|
|
- name: SEED
|
|
value: ""
|
|
- name: MODE
|
|
value: survival
|
|
- name: MOTD
|
|
value: Welcome to Minecraft on Kubernetes!
|
|
- name: PVP
|
|
value: "false"
|
|
- name: LEVEL_TYPE
|
|
value: DEFAULT
|
|
- name: GENERATOR_SETTINGS
|
|
value: ""
|
|
- name: LEVEL
|
|
value: world
|
|
- name: ONLINE_MODE
|
|
value: "true"
|
|
- name: MEMORY
|
|
value: 1024M
|
|
- name: JVM_OPTS
|
|
value: ""
|
|
- name: JVM_XX_OPTS
|
|
value: ""
|
|
- name: ENABLE_RCON
|
|
value: "true"
|
|
- name: RCON_PASSWORD
|
|
valueFrom:
|
|
secretKeyRef:
|
|
key: rcon-password
|
|
name: moria-minecraft
|
|
image: itzg/minecraft-server:latest
|
|
imagePullPolicy: Always
|
|
livenessProbe:
|
|
failureThreshold: 10
|
|
initialDelaySeconds: 30
|
|
periodSeconds: 5
|
|
successThreshold: 1
|
|
tcpSocket:
|
|
port: 25565
|
|
timeoutSeconds: 1
|
|
name: moria-minecraft
|
|
ports:
|
|
- containerPort: 25565
|
|
name: minecraft
|
|
protocol: TCP
|
|
- containerPort: 25575
|
|
name: rcon
|
|
protocol: TCP
|
|
readinessProbe:
|
|
failureThreshold: 10
|
|
initialDelaySeconds: 30
|
|
periodSeconds: 5
|
|
successThreshold: 1
|
|
tcpSocket:
|
|
port: 25565
|
|
timeoutSeconds: 1
|
|
resources:
|
|
requests:
|
|
cpu: %dm
|
|
memory: %dMi
|
|
volumeMounts:
|
|
- mountPath: /data
|
|
name: datadir
|
|
securityContext:
|
|
fsGroup: 2000
|
|
runAsUser: 1000
|
|
volumes:
|
|
- emptyDir: {}
|
|
name: datadir
|
|
`
|
|
|
|
func TestHelmChartInflationGeneratorWithValuesInlineOverride(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
rm := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: myMc
|
|
name: minecraft
|
|
version: 3.1.3
|
|
repo: https://itzg.github.io/minecraft-server-charts
|
|
releaseName: moria
|
|
valuesInline:
|
|
minecraftServer:
|
|
eula: true
|
|
difficulty: hard
|
|
rcon:
|
|
enabled: true
|
|
`)
|
|
th.AssertActualEqualsExpected(
|
|
rm, fmt.Sprintf(expectedInflationFmt,
|
|
"hard", // difficulty
|
|
500, // cpu
|
|
512, // memory
|
|
))
|
|
}
|
|
|
|
func TestHelmChartInflationGeneratorWithLocalValuesFile(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
th.WriteF(filepath.Join(th.GetRoot(), "myValues.yaml"), `
|
|
minecraftServer:
|
|
eula: true
|
|
difficulty: peaceful
|
|
rcon:
|
|
enabled: true
|
|
resources:
|
|
requests:
|
|
cpu: 888m
|
|
memory: 666Mi
|
|
`)
|
|
rm := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: myMc
|
|
name: minecraft
|
|
version: 3.1.3
|
|
repo: https://itzg.github.io/minecraft-server-charts
|
|
releaseName: moria
|
|
valuesFile: myValues.yaml
|
|
`)
|
|
th.AssertActualEqualsExpected(
|
|
rm, fmt.Sprintf(expectedInflationFmt,
|
|
"peaceful", // difficulty
|
|
888, // cpu
|
|
666, // memory
|
|
))
|
|
}
|
|
|
|
func TestHelmChartInflationGeneratorWithInLineReplace(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
rm := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: myMc
|
|
name: minecraft
|
|
version: 3.1.3
|
|
repo: https://itzg.github.io/minecraft-server-charts
|
|
releaseName: moria
|
|
valuesInline:
|
|
minecraftServer:
|
|
eula: true
|
|
difficulty: OMG_PLEASE_NO
|
|
rcon:
|
|
enabled: true
|
|
resources:
|
|
requests:
|
|
cpu: 555m
|
|
memory: 111Mi
|
|
valuesMerge: replace
|
|
`)
|
|
th.AssertActualEqualsExpected(
|
|
rm, fmt.Sprintf(expectedInflationFmt,
|
|
"OMG_PLEASE_NO", // difficulty
|
|
555, // cpu
|
|
111, // memory
|
|
))
|
|
}
|
|
|
|
func TestHelmChartInflationGeneratorWithIncludeCRDs(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
|
|
// we store this data outside of the _test.go file as its sort of huge
|
|
// and has backticks, which makes string literals wonky
|
|
testData, err := os.ReadFile("include_crds_testdata.txt")
|
|
if err != nil {
|
|
t.Error(fmt.Errorf("unable to read test data for includeCRDs: %w", err))
|
|
}
|
|
|
|
rm := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: terraform
|
|
name: terraform
|
|
version: 1.0.0
|
|
repo: https://helm.releases.hashicorp.com
|
|
releaseName: terraforming-mars
|
|
includeCRDs: true
|
|
valuesInline:
|
|
global:
|
|
enabled: false
|
|
tests:
|
|
enabled: false
|
|
`)
|
|
th.AssertActualEqualsExpected(rm, string(testData))
|
|
}
|
|
|
|
func TestHelmChartInflationGeneratorWithExcludeCRDs(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
|
|
// we choose this helm chart as it has the ability to turn
|
|
// everything off, except CRDs.
|
|
rm := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: terraform
|
|
name: terraform
|
|
version: 1.0.0
|
|
repo: https://helm.releases.hashicorp.com
|
|
releaseName: terraforming-mars
|
|
includeCRDs: false
|
|
valuesInline:
|
|
global:
|
|
enabled: false
|
|
tests:
|
|
enabled: false
|
|
`)
|
|
th.AssertActualEqualsExpected(rm, "")
|
|
}
|
|
|
|
func TestHelmChartInflationGeneratorWithSkipHooks(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
|
|
// we choose this helm chart as it has the ability to turn
|
|
// everything off, except CRDs.
|
|
rm := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: terraform
|
|
name: terraform
|
|
version: 1.0.0
|
|
repo: https://helm.releases.hashicorp.com
|
|
releaseName: terraforming-mars
|
|
includeCRDs: false
|
|
skipHooks: true
|
|
valuesInline:
|
|
global:
|
|
enabled: false
|
|
`)
|
|
th.AssertActualEqualsExpected(rm, "")
|
|
}
|
|
|
|
func TestHelmChartInflationGeneratorWithIncludeCRDsNotSpecified(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
|
|
rm := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: terraform
|
|
name: terraform
|
|
version: 1.0.0
|
|
repo: https://helm.releases.hashicorp.com
|
|
releaseName: terraforming-mars
|
|
valuesInline:
|
|
global:
|
|
enabled: false
|
|
tests:
|
|
enabled: false
|
|
`)
|
|
th.AssertActualEqualsExpected(rm, "")
|
|
}
|
|
|
|
func TestHelmChartInflationGeneratorIssue4905(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
|
|
copyTestChartsIntoHarness(t, th)
|
|
|
|
rm := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: issue4905
|
|
name: issue4905
|
|
releaseName: issue4905
|
|
chartHome: ./charts
|
|
valuesInline:
|
|
config:
|
|
item1: 1
|
|
item2: 2
|
|
`)
|
|
|
|
th.AssertActualEqualsExpected(rm, `
|
|
apiVersion: v1
|
|
data:
|
|
config.yaml: |-
|
|
item1: 1
|
|
item2: 2
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: issue4905
|
|
`)
|
|
}
|
|
|
|
func TestHelmChartInflationGeneratorValuesOverride(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
|
|
copyTestChartsIntoHarness(t, th)
|
|
|
|
rm := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: values-merge
|
|
name: values-merge
|
|
releaseName: values-merge
|
|
valuesMerge: override
|
|
valuesInline:
|
|
a: 4
|
|
c: 3
|
|
list:
|
|
- c
|
|
map:
|
|
a: 7
|
|
c: 6
|
|
`)
|
|
|
|
th.AssertActualEqualsExpected(rm, `
|
|
apiVersion: test.kustomize.io/v1
|
|
kind: ValuesMergeTest
|
|
metadata:
|
|
name: values-merge
|
|
obj:
|
|
a: 4
|
|
b: 2
|
|
c: 3
|
|
list:
|
|
- c
|
|
map:
|
|
a: 7
|
|
b: 5
|
|
c: 6
|
|
`)
|
|
}
|
|
|
|
func TestHelmChartInflationGeneratorValuesReplace(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
|
|
copyTestChartsIntoHarness(t, th)
|
|
|
|
th.WriteF(filepath.Join(th.GetRoot(), "replacedValues.yaml"), `
|
|
a: 7
|
|
b: 7
|
|
c: 7
|
|
list:
|
|
- g
|
|
map:
|
|
a: 7
|
|
b: 7
|
|
c: 7
|
|
`)
|
|
|
|
rm := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: values-merge
|
|
name: values-merge
|
|
releaseName: values-merge
|
|
valuesMerge: replace
|
|
valuesFile: replacedValues.yaml
|
|
valuesInline:
|
|
a: 1
|
|
b: 2
|
|
list:
|
|
- c
|
|
map:
|
|
a: 4
|
|
b: 5
|
|
`)
|
|
|
|
// replace option does not ignore values file from the chart
|
|
// it only replaces the values files specified in the kustomization
|
|
th.AssertActualEqualsExpected(rm, `
|
|
apiVersion: test.kustomize.io/v1
|
|
kind: ValuesMergeTest
|
|
metadata:
|
|
name: values-merge
|
|
obj:
|
|
a: 1
|
|
b: 2
|
|
c: null
|
|
list:
|
|
- c
|
|
map:
|
|
a: 4
|
|
b: 5
|
|
c: null
|
|
`)
|
|
}
|
|
|
|
func TestHelmChartInflationGeneratorValuesMerge(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
|
|
copyTestChartsIntoHarness(t, th)
|
|
|
|
rm := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: values-merge
|
|
name: values-merge
|
|
releaseName: values-merge
|
|
valuesMerge: merge
|
|
valuesInline:
|
|
a: 4
|
|
c: 3
|
|
list:
|
|
- c
|
|
map:
|
|
a: 7
|
|
c: 6
|
|
`)
|
|
|
|
th.AssertActualEqualsExpected(rm, `
|
|
apiVersion: test.kustomize.io/v1
|
|
kind: ValuesMergeTest
|
|
metadata:
|
|
name: values-merge
|
|
obj:
|
|
a: 1
|
|
b: 2
|
|
c: 3
|
|
list:
|
|
- a
|
|
- b
|
|
map:
|
|
a: 4
|
|
b: 5
|
|
c: 6
|
|
`)
|
|
}
|
|
|
|
func copyTestChartsIntoHarness(t *testing.T, th *kusttest_test.HarnessEnhanced) {
|
|
t.Helper()
|
|
|
|
thDir := filepath.Join(th.GetRoot(), "charts")
|
|
chartDir := "testdata/charts"
|
|
|
|
require.NoError(t, copyutil.CopyDir(th.GetFSys(), chartDir, thDir))
|
|
}
|
|
|
|
func TestHelmChartInflationGeneratorWithSameChartMultipleVersions(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
chartName string
|
|
repo string
|
|
version string
|
|
releaseName string
|
|
}{
|
|
{
|
|
name: "terraform chart with no version grabs latest",
|
|
chartName: "terraform",
|
|
repo: "https://helm.releases.hashicorp.com",
|
|
version: "",
|
|
releaseName: "terraform-latest",
|
|
},
|
|
{
|
|
name: "terraform chart with version 1.1.1",
|
|
chartName: "terraform",
|
|
repo: "https://helm.releases.hashicorp.com",
|
|
version: "1.1.1",
|
|
releaseName: "terraform-1.1.1",
|
|
},
|
|
{
|
|
name: "terraform chart with version 1.1.1 again",
|
|
chartName: "terraform",
|
|
repo: "https://helm.releases.hashicorp.com",
|
|
version: "1.1.1",
|
|
releaseName: "terraform-1.1.1-1",
|
|
},
|
|
{
|
|
name: "terraform chart with version 1.1.2",
|
|
chartName: "terraform",
|
|
repo: "https://helm.releases.hashicorp.com",
|
|
version: "1.1.2",
|
|
releaseName: "terraform-1.1.2",
|
|
},
|
|
{
|
|
name: "terraform chart with version 1.1.2 but without repo",
|
|
chartName: "terraform",
|
|
version: "1.1.2",
|
|
releaseName: "terraform-1.1.2",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
config := fmt.Sprintf(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: %s
|
|
name: %s
|
|
version: %s
|
|
repo: %s
|
|
releaseName: %s
|
|
`, tt.chartName, tt.chartName, tt.version, tt.repo, tt.releaseName)
|
|
|
|
rm := th.LoadAndRunGenerator(config)
|
|
assert.True(t, len(rm.Resources()) > 0)
|
|
|
|
var chartDir string
|
|
if tt.version != "" && tt.repo != "" {
|
|
chartDir = fmt.Sprintf("charts/%s-%s/%s", tt.chartName, tt.version, tt.chartName)
|
|
} else {
|
|
chartDir = fmt.Sprintf("charts/%s", tt.chartName)
|
|
}
|
|
|
|
fmt.Printf("%s: %s\n", tt.name, chartDir)
|
|
|
|
d, err := th.GetFSys().ReadFile(filepath.Join(th.GetRoot(), chartDir, "Chart.yaml"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
assert.Contains(t, string(d), fmt.Sprintf("name: %s", tt.chartName))
|
|
if tt.version != "" {
|
|
assert.Contains(t, string(d), fmt.Sprintf("version: %s", tt.version))
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// Test that verifies +1 instances of same chart with different versions
|
|
// https://github.com/kubernetes-sigs/kustomize/issues/4813
|
|
func TestHelmChartInflationGeneratorWithMultipleInstancesSameChartDifferentVersions(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
|
|
podinfo1 := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: podinfo
|
|
name: podinfo
|
|
version: 6.2.1
|
|
repo: https://stefanprodan.github.io/podinfo
|
|
releaseName: podinfo1
|
|
`)
|
|
|
|
podinfo2 := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: podinfo
|
|
name: podinfo
|
|
version: 6.1.8
|
|
repo: https://stefanprodan.github.io/podinfo
|
|
releaseName: podinfo2
|
|
`)
|
|
|
|
podinfo1Img, err := podinfo1.Resources()[1].GetFieldValue("spec.template.spec.containers.0.image")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "ghcr.io/stefanprodan/podinfo:6.2.1", podinfo1Img)
|
|
|
|
podinfo2Img, err := podinfo2.Resources()[1].GetFieldValue("spec.template.spec.containers.0.image")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "ghcr.io/stefanprodan/podinfo:6.1.8", podinfo2Img)
|
|
|
|
podinfo1ChartsDir := filepath.Join(th.GetRoot(), "charts/podinfo-6.2.1/podinfo")
|
|
assert.True(t, th.GetFSys().Exists(podinfo1ChartsDir))
|
|
|
|
podinfo2ChartsDir := filepath.Join(th.GetRoot(), "charts/podinfo-6.1.8/podinfo")
|
|
assert.True(t, th.GetFSys().Exists(podinfo2ChartsDir))
|
|
|
|
podinfo1ChartContents, err := th.GetFSys().ReadFile(filepath.Join(podinfo1ChartsDir, "Chart.yaml"))
|
|
require.NoError(t, err)
|
|
assert.Contains(t, string(podinfo1ChartContents), "version: 6.2.1")
|
|
|
|
podinfo2ChartContents, err := th.GetFSys().ReadFile(filepath.Join(podinfo2ChartsDir, "Chart.yaml"))
|
|
require.NoError(t, err)
|
|
assert.Contains(t, string(podinfo2ChartContents), "version: 6.1.8")
|
|
}
|
|
|
|
// Reference: https://github.com/kubernetes-sigs/kustomize/issues/5163
|
|
func TestHelmChartInflationGeneratorUsingVersionWithoutRepo(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
|
|
copyTestChartsIntoHarness(t, th)
|
|
|
|
rm := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: test-chart
|
|
name: test-chart
|
|
version: 1.0.0
|
|
releaseName: test
|
|
chartHome: ./charts
|
|
`)
|
|
|
|
cm, err := rm.Resources()[0].GetFieldValue("metadata.name")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "bar", cm)
|
|
|
|
chartDir := filepath.Join(th.GetRoot(), "charts/test-chart")
|
|
assert.True(t, th.GetFSys().Exists(chartDir))
|
|
|
|
chartYamlContent, err := th.GetFSys().ReadFile(filepath.Join(chartDir, "Chart.yaml"))
|
|
require.NoError(t, err)
|
|
assert.Contains(t, string(chartYamlContent), "name: test-chart")
|
|
assert.Contains(t, string(chartYamlContent), "version: 1.0.0")
|
|
}
|
|
|
|
func TestHelmChartInflationGeneratorWithDebug(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
copyTestChartsIntoHarness(t, th)
|
|
|
|
rm := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: test-chart
|
|
name: test-chart
|
|
version: 1.0.0
|
|
releaseName: test
|
|
chartHome: ./charts
|
|
debug: true
|
|
`)
|
|
|
|
cm, err := rm.Resources()[0].GetFieldValue("metadata.name")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "bar", cm)
|
|
|
|
chartDir := filepath.Join(th.GetRoot(), "charts/test-chart")
|
|
assert.True(t, th.GetFSys().Exists(chartDir))
|
|
|
|
chartYamlContent, err := th.GetFSys().ReadFile(filepath.Join(chartDir, "Chart.yaml"))
|
|
require.NoError(t, err)
|
|
assert.Contains(t, string(chartYamlContent), "name: test-chart")
|
|
assert.Contains(t, string(chartYamlContent), "version: 1.0.0")
|
|
}
|
|
|
|
func TestHelmChartInflationGeneratorWithDevel(t *testing.T) {
|
|
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t).
|
|
PrepBuiltin("HelmChartInflationGenerator")
|
|
defer th.Reset()
|
|
if err := th.ErrIfNoHelm(); err != nil {
|
|
t.Skip("skipping: " + err.Error())
|
|
}
|
|
copyTestChartsIntoHarness(t, th)
|
|
|
|
rm := th.LoadAndRunGenerator(`
|
|
apiVersion: builtin
|
|
kind: HelmChartInflationGenerator
|
|
metadata:
|
|
name: sm-operator
|
|
name: sm-operator
|
|
version: 0.1.0-Beta
|
|
repo: https://charts.bitwarden.com/
|
|
releaseName: sm-operator
|
|
chartHome: ./charts
|
|
devel: true
|
|
`)
|
|
cm, err := rm.Resources()[0].GetFieldValue("metadata.name")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "sm-operator-controller-manager", cm)
|
|
|
|
chartDir := filepath.Join(th.GetRoot(), "charts/sm-operator-0.1.0-Beta/sm-operator")
|
|
assert.True(t, th.GetFSys().Exists(chartDir))
|
|
|
|
chartYamlContent, err := th.GetFSys().ReadFile(filepath.Join(chartDir, "Chart.yaml"))
|
|
require.NoError(t, err)
|
|
assert.Contains(t, string(chartYamlContent), "name: sm-operator")
|
|
assert.Contains(t, string(chartYamlContent), "version: 0.1.0-Beta")
|
|
}
|