Skip to content

Commit eb7f91f

Browse files
authored
Merge pull request #5270 from MrFreezeex/helm-kube-api
helm: add support for kube-version and add cli args for both kube-version and api-versions
2 parents 413e01e + dc29923 commit eb7f91f

File tree

8 files changed

+251
-6
lines changed

8 files changed

+251
-6
lines changed

api/internal/builtins/HelmChartInflationGenerator.go

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/krusty/helmchartinflationgenerator_test.go

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,208 @@ spec:
684684
`)
685685
}
686686

687+
func TestHelmChartInflationGeneratorForMultipleKubeVersions(t *testing.T) {
688+
th := kusttest_test.MakeEnhancedHarnessWithTmpRoot(t)
689+
defer th.Reset()
690+
if err := th.ErrIfNoHelm(); err != nil {
691+
t.Skip("skipping: " + err.Error())
692+
}
693+
694+
copyValuesFilesTestChartsIntoHarness(t, th)
695+
696+
th.WriteK(th.GetRoot(), `
697+
namespace: default
698+
helmCharts:
699+
- name: minecraft
700+
repo: https://itzg.github.io/minecraft-server-charts
701+
version: 4.11.0
702+
releaseName: test
703+
kubeVersion: "1.16"
704+
valuesInline:
705+
minecraftServer:
706+
extraPorts:
707+
- name: map
708+
containerPort: 8123
709+
protocol: TCP
710+
service:
711+
enabled: false
712+
ingress:
713+
enabled: true
714+
`)
715+
716+
m := th.Run(th.GetRoot(), th.MakeOptionsPluginsEnabled())
717+
th.AssertActualEqualsExpected(m, `
718+
apiVersion: v1
719+
data:
720+
rcon-password: Q0hBTkdFTUUh
721+
kind: Secret
722+
metadata:
723+
labels:
724+
app: test-minecraft
725+
app.kubernetes.io/instance: test-minecraft
726+
app.kubernetes.io/name: minecraft
727+
app.kubernetes.io/version: 4.11.0
728+
chart: minecraft-4.11.0
729+
heritage: Helm
730+
release: test
731+
name: test-minecraft-rcon
732+
namespace: default
733+
type: Opaque
734+
---
735+
apiVersion: v1
736+
data:
737+
cf-api-key: Q0hBTkdFTUUh
738+
kind: Secret
739+
metadata:
740+
labels:
741+
app: test-minecraft
742+
app.kubernetes.io/instance: test-minecraft
743+
app.kubernetes.io/name: minecraft
744+
app.kubernetes.io/version: 4.11.0
745+
chart: minecraft-4.11.0
746+
heritage: Helm
747+
release: test
748+
name: test-minecraft-curseforge
749+
namespace: default
750+
type: Opaque
751+
---
752+
apiVersion: v1
753+
kind: Service
754+
metadata:
755+
labels:
756+
app: test-minecraft
757+
app.kubernetes.io/instance: test-minecraft
758+
app.kubernetes.io/name: minecraft
759+
app.kubernetes.io/version: 4.11.0
760+
chart: minecraft-4.11.0
761+
heritage: Helm
762+
release: test
763+
name: test-minecraft
764+
namespace: default
765+
spec:
766+
ports:
767+
- name: minecraft
768+
port: 25565
769+
protocol: TCP
770+
targetPort: minecraft
771+
selector:
772+
app: test-minecraft
773+
type: ClusterIP
774+
---
775+
apiVersion: networking.k8s.io/v1beta1
776+
kind: Ingress
777+
metadata:
778+
labels:
779+
app: test-minecraft-map
780+
app.kubernetes.io/instance: test-minecraft
781+
app.kubernetes.io/name: minecraft
782+
app.kubernetes.io/version: 4.11.0
783+
chart: minecraft-4.11.0
784+
heritage: Helm
785+
release: test
786+
name: test-minecraft-map
787+
namespace: default
788+
spec:
789+
rules: null
790+
`)
791+
792+
th.WriteK(th.GetRoot(), `
793+
namespace: default
794+
helmCharts:
795+
- name: minecraft
796+
repo: https://itzg.github.io/minecraft-server-charts
797+
version: 4.11.0
798+
releaseName: test
799+
kubeVersion: "1.27"
800+
valuesInline:
801+
minecraftServer:
802+
extraPorts:
803+
- name: map
804+
containerPort: 8123
805+
protocol: TCP
806+
service:
807+
enabled: false
808+
ingress:
809+
enabled: true
810+
`)
811+
812+
m = th.Run(th.GetRoot(), th.MakeOptionsPluginsEnabled())
813+
th.AssertActualEqualsExpected(m, `
814+
apiVersion: v1
815+
data:
816+
rcon-password: Q0hBTkdFTUUh
817+
kind: Secret
818+
metadata:
819+
labels:
820+
app: test-minecraft
821+
app.kubernetes.io/instance: test-minecraft
822+
app.kubernetes.io/name: minecraft
823+
app.kubernetes.io/version: 4.11.0
824+
chart: minecraft-4.11.0
825+
heritage: Helm
826+
release: test
827+
name: test-minecraft-rcon
828+
namespace: default
829+
type: Opaque
830+
---
831+
apiVersion: v1
832+
data:
833+
cf-api-key: Q0hBTkdFTUUh
834+
kind: Secret
835+
metadata:
836+
labels:
837+
app: test-minecraft
838+
app.kubernetes.io/instance: test-minecraft
839+
app.kubernetes.io/name: minecraft
840+
app.kubernetes.io/version: 4.11.0
841+
chart: minecraft-4.11.0
842+
heritage: Helm
843+
release: test
844+
name: test-minecraft-curseforge
845+
namespace: default
846+
type: Opaque
847+
---
848+
apiVersion: v1
849+
kind: Service
850+
metadata:
851+
labels:
852+
app: test-minecraft
853+
app.kubernetes.io/instance: test-minecraft
854+
app.kubernetes.io/name: minecraft
855+
app.kubernetes.io/version: 4.11.0
856+
chart: minecraft-4.11.0
857+
heritage: Helm
858+
release: test
859+
name: test-minecraft
860+
namespace: default
861+
spec:
862+
ports:
863+
- name: minecraft
864+
port: 25565
865+
protocol: TCP
866+
targetPort: minecraft
867+
selector:
868+
app: test-minecraft
869+
type: ClusterIP
870+
---
871+
apiVersion: networking.k8s.io/v1
872+
kind: Ingress
873+
metadata:
874+
labels:
875+
app: test-minecraft-map
876+
app.kubernetes.io/instance: test-minecraft
877+
app.kubernetes.io/name: minecraft
878+
app.kubernetes.io/version: 4.11.0
879+
chart: minecraft-4.11.0
880+
heritage: Helm
881+
release: test
882+
name: test-minecraft-map
883+
namespace: default
884+
spec:
885+
rules: null
886+
`)
887+
}
888+
687889
func copyValuesFilesTestChartsIntoHarness(t *testing.T, th *kusttest_test.HarnessEnhanced) {
688890
t.Helper()
689891

api/types/helmchartargs.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ type HelmChart struct {
8888
// ApiVersions is the kubernetes apiversions used for Capabilities.APIVersions
8989
ApiVersions []string `json:"apiVersions,omitempty" yaml:"apiVersions,omitempty"`
9090

91+
// KubeVersion is the kubernetes version used by Helm for Capabilities.KubeVersion"
92+
KubeVersion string `json:"kubeVersion,omitempty" yaml:"kubeVersion,omitempty"`
93+
9194
// NameTemplate is for specifying the name template used to name the release.
9295
NameTemplate string `json:"nameTemplate,omitempty" yaml:"nameTemplate,omitempty"`
9396

@@ -172,6 +175,10 @@ func (h HelmChart) AsHelmArgs(absChartHome string) []string {
172175
for _, apiVer := range h.ApiVersions {
173176
args = append(args, "--api-versions", apiVer)
174177
}
178+
if h.KubeVersion != "" {
179+
args = append(args, "--kube-version", h.KubeVersion)
180+
}
181+
175182
if h.IncludeCRDs {
176183
args = append(args, "--include-crds")
177184
}

api/types/helmchartargs_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ func TestAsHelmArgs(t *testing.T) {
1717
Version: "1.0.0",
1818
Repo: "https://helm.releases.hashicorp.com",
1919
ApiVersions: []string{"foo", "bar"},
20+
KubeVersion: "1.27",
2021
NameTemplate: "template",
2122
SkipTests: true,
2223
IncludeCRDs: true,
@@ -33,6 +34,7 @@ func TestAsHelmArgs(t *testing.T) {
3334
"-f", "values",
3435
"-f", "values1", "-f", "values2",
3536
"--api-versions", "foo", "--api-versions", "bar",
37+
"--kube-version", "1.27",
3638
"--include-crds",
3739
"--skip-tests",
3840
"--no-hooks"})

api/types/pluginconfig.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
package types
55

66
type HelmConfig struct {
7-
Enabled bool
8-
Command string
7+
Enabled bool
8+
Command string
9+
ApiVersions []string
10+
KubeVersion string
911
}
1012

1113
// PluginConfig holds plugin configuration.

kustomize/commands/build/build.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@ var theFlags struct {
2727
managedByLabel bool
2828
helm bool
2929
}
30-
helmCommand string
31-
loadRestrictor string
32-
reorderOutput string
33-
fnOptions types.FnPluginLoadingOptions
30+
helmCommand string
31+
helmApiVersions []string
32+
helmKubeVersion string
33+
loadRestrictor string
34+
reorderOutput string
35+
fnOptions types.FnPluginLoadingOptions
3436
}
3537

3638
type Help struct {
@@ -153,6 +155,8 @@ func HonorKustomizeFlags(kOpts *krusty.Options, flags *flag.FlagSet) *krusty.Opt
153155
kOpts.PluginConfig.HelmConfig.Enabled = theFlags.enable.helm
154156
}
155157
kOpts.PluginConfig.HelmConfig.Command = theFlags.helmCommand
158+
kOpts.PluginConfig.HelmConfig.ApiVersions = theFlags.helmApiVersions
159+
kOpts.PluginConfig.HelmConfig.KubeVersion = theFlags.helmKubeVersion
156160
kOpts.AddManagedbyLabel = isManagedByLabelEnabled()
157161
return kOpts
158162
}

kustomize/commands/build/flagenablehelm.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,14 @@ func AddFlagEnableHelm(set *pflag.FlagSet) {
2121
"helm-command",
2222
"helm", // default
2323
"helm command (path to executable)")
24+
set.StringArrayVar(
25+
&theFlags.helmApiVersions,
26+
"helm-api-versions",
27+
[]string{}, // default
28+
"Kubernetes api versions used by Helm for Capabilities.APIVersions")
29+
set.StringVar(
30+
&theFlags.helmKubeVersion,
31+
"helm-kube-version",
32+
"", // default
33+
"Kubernetes version used by Helm for Capabilities.KubeVersion")
2434
}

plugin/builtin/helmchartinflationgenerator/HelmChartInflationGenerator.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,15 @@ func (p *plugin) Config(
5959
if h.GeneralConfig().HelmConfig.Command == "" {
6060
return fmt.Errorf("must specify --helm-command")
6161
}
62+
63+
// CLI args takes precedence
64+
if h.GeneralConfig().HelmConfig.KubeVersion != "" {
65+
p.HelmChart.KubeVersion = h.GeneralConfig().HelmConfig.KubeVersion
66+
}
67+
if len(h.GeneralConfig().HelmConfig.ApiVersions) != 0 {
68+
p.HelmChart.ApiVersions = h.GeneralConfig().HelmConfig.ApiVersions
69+
}
70+
6271
p.h = h
6372
if err = yaml.Unmarshal(config, p); err != nil {
6473
return

0 commit comments

Comments
 (0)