Skip to content

Commit 80d0264

Browse files
authored
Support multiple ImagePullSecrets (#575)
* Support multiple ImagePullSecrets * add length check
1 parent 1583cb7 commit 80d0264

File tree

23 files changed

+511
-70
lines changed

23 files changed

+511
-70
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
changelog:
2+
- type: FIX
3+
issueLink: https://github.com/solo-io/skv2/issues/574
4+
description: >
5+
Add support for multiple ImagePullSecret references
6+
skipCI: "false"

codegen/cmd_test.go

Lines changed: 132 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package codegen_test
33
import (
44
"bytes"
55
"encoding/json"
6+
"errors"
67
"fmt"
8+
"io"
79
"os"
810
"os/exec"
911
"path/filepath"
@@ -41,6 +43,125 @@ var _ = Describe("Cmd", func() {
4143
skv2Imports.External["github.com/solo-io/cue"] = []string{
4244
"encoding/protobuf/cue/cue.proto",
4345
}
46+
47+
Describe("image pull secrets", Ordered, func() {
48+
BeforeAll(func() {
49+
cmd := &Command{
50+
Chart: &Chart{
51+
Data: Data{
52+
ApiVersion: "v1",
53+
Description: "",
54+
Name: "Painting Operator",
55+
Version: "v0.0.1",
56+
Home: "https://docs.solo.io/skv2/latest",
57+
Sources: []string{
58+
"https://github.com/solo-io/skv2",
59+
},
60+
},
61+
Operators: []Operator{{
62+
Name: "painter",
63+
Deployment: Deployment{
64+
Container: Container{
65+
Image: Image{
66+
Tag: "v0.0.0",
67+
Repository: "painter",
68+
Registry: "quay.io/solo-io",
69+
PullPolicy: "IfNotPresent",
70+
},
71+
},
72+
},
73+
Values: map[string]any{
74+
"imagePullSecrets": []v1.LocalObjectReference{},
75+
},
76+
}},
77+
},
78+
ManifestRoot: "codegen/test/chart/image-pull-secrets",
79+
}
80+
Expect(cmd.Execute()).NotTo(HaveOccurred(), "failed to execute command")
81+
})
82+
DescribeTable(
83+
"using",
84+
func(values any, shouldBeEmpty bool, expected ...v1.LocalObjectReference) {
85+
manifests := helmTemplate("./test/chart/image-pull-secrets", values)
86+
87+
var (
88+
renderedDeployment *appsv1.Deployment
89+
decoder = kubeyaml.NewYAMLOrJSONDecoder(bytes.NewBuffer(manifests), 4096)
90+
)
91+
for {
92+
var deployment appsv1.Deployment
93+
if err := decoder.Decode(&deployment); errors.Is(err, io.EOF) {
94+
break
95+
}
96+
97+
if deployment.GetName() == "painter" && deployment.Kind == "Deployment" {
98+
renderedDeployment = &deployment
99+
break
100+
}
101+
}
102+
Expect(renderedDeployment).NotTo(BeNil())
103+
if shouldBeEmpty {
104+
Expect(renderedDeployment.Spec.Template.Spec.ImagePullSecrets).To(BeEmpty())
105+
return
106+
}
107+
108+
Expect(renderedDeployment.Spec.Template.Spec.ImagePullSecrets).To(ContainElements(expected))
109+
},
110+
Entry(
111+
"empty",
112+
map[string]any{
113+
"painter": map[string]any{
114+
"enabled": true,
115+
},
116+
},
117+
true,
118+
nil,
119+
),
120+
Entry(
121+
"legacy pullSecret field",
122+
map[string]any{
123+
"painter": map[string]any{
124+
"enabled": true,
125+
"image": map[string]any{
126+
"pullSecret": "a-registry",
127+
},
128+
},
129+
},
130+
false,
131+
v1.LocalObjectReference{Name: "a-registry"},
132+
),
133+
Entry(
134+
"imagePullSecrets field",
135+
map[string]any{
136+
"painter": map[string]any{
137+
"enabled": true,
138+
"imagePullSecrets": []v1.LocalObjectReference{{
139+
Name: "b-registry",
140+
}},
141+
},
142+
},
143+
false,
144+
v1.LocalObjectReference{Name: "b-registry"},
145+
),
146+
Entry(
147+
"imagePullSecrets field with legacy",
148+
map[string]any{
149+
"painter": map[string]any{
150+
"enabled": true,
151+
"image": map[string]any{
152+
"pullSecret": "a-registry",
153+
},
154+
"imagePullSecrets": []v1.LocalObjectReference{{
155+
Name: "b-registry",
156+
}},
157+
},
158+
},
159+
false,
160+
v1.LocalObjectReference{Name: "a-registry"}, v1.LocalObjectReference{Name: "b-registry"},
161+
),
162+
)
163+
})
164+
44165
It("env variable priority", func() {
45166
cmd := &Command{
46167
Chart: &Chart{
@@ -58,7 +179,7 @@ var _ = Describe("Cmd", func() {
58179
Name: "painter",
59180
Deployment: Deployment{
60181
Container: Container{
61-
Image: Image{Repository: "painter", Tag: "v0.0.1"},
182+
Image: Image{Repository: "painter", Registry: "gcr.io/painter", Tag: "v0.0.1"},
62183
Env: []v1.EnvVar{{Name: "ENV_VAR", Value: "default"}},
63184
TemplateEnvVars: []TemplateEnvVar{
64185
{
@@ -3156,18 +3277,19 @@ func helmTemplate(path string, values interface{}) []byte {
31563277

31573278
defer os.RemoveAll(helmValuesFile.Name())
31583279

3159-
cc := exec.Command("helm", "template",
3280+
args := []string{
3281+
"template",
31603282
path,
31613283
"--values", helmValuesFile.Name(),
3162-
)
3163-
out, err := cc.CombinedOutput()
3164-
defer func(e error) {
3165-
if e == nil {
3166-
return
3167-
}
3168-
fmt.Printf("[Cameron]: failed to run %s\n", cc.String())
3169-
}(err)
3284+
}
31703285

3286+
if os.Getenv("HELM_DEBUG") != "" {
3287+
args = append(args, "--debug")
3288+
}
3289+
3290+
cc := exec.Command("helm", args...)
3291+
3292+
out, err := cc.CombinedOutput()
31713293
ExpectWithOffset(0, err).NotTo(HaveOccurred(), string(out))
31723294
return out
31733295
}

codegen/model/chart.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ type Deployment struct {
123123
CustomPodAnnotations map[string]string
124124
CustomDeploymentLabels map[string]string
125125
CustomDeploymentAnnotations map[string]string
126+
ImagePullSecrets []corev1.LocalObjectReference
126127
}
127128

128129
type ConditionalStrategy struct {

codegen/templates/chart/operator-deployment.yamltmpl

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -241,10 +241,16 @@ spec:
241241
{{- end }}
242242
[[- end ]]
243243
[[- end ]]
244-
{{- if $[[ $operatorVar ]]Image.pullSecret }}
245-
imagePullSecrets:
246-
- name: {{ $[[ $operatorVar ]]Image.pullSecret }}
247-
{{- end}}
244+
{{- $pullSecrets := (list) -}}
245+
{{- if $[[ $operatorVar ]]Image.pullSecret }}
246+
{{- $pullSecrets = concat $pullSecrets (list (dict "name" $[[ $operatorVar ]]Image.pullSecret)) -}}
247+
{{- end }}
248+
{{- if $[[ $operatorVar ]].imagePullSecrets }}
249+
{{- $pullSecrets = concat $pullSecrets $[[ $operatorVar ]].imagePullSecrets -}}
250+
{{- end }}
251+
{{- if gt (len $pullSecrets) 0 -}}
252+
{{- (dict "imagePullSecrets" $pullSecrets) | toYaml | nindent 6 }}
253+
{{- end }}
248254
{{- end }} {{/* define "[[ $operator.Name ]].deploymentSpec" */}}
249255

250256
{{/* Render [[ $operator.Name ]] deployment template with overrides from values*/}}

codegen/test/chart-conditional-deployment-strategy/templates/deployment.yaml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,16 @@ spec:
8888
drop:
8989
- ALL
9090
{{- end }}
91-
{{- if $painterImage.pullSecret }}
92-
imagePullSecrets:
93-
- name: {{ $painterImage.pullSecret }}
94-
{{- end}}
91+
{{- $pullSecrets := (list) -}}
92+
{{- if $painterImage.pullSecret }}
93+
{{- $pullSecrets = concat $pullSecrets (list (dict "name" $painterImage.pullSecret)) -}}
94+
{{- end }}
95+
{{- if $painter.imagePullSecrets }}
96+
{{- $pullSecrets = concat $pullSecrets $painter.imagePullSecrets -}}
97+
{{- end }}
98+
{{- if gt (len $pullSecrets) 0 -}}
99+
{{- (dict "imagePullSecrets" $pullSecrets) | toYaml | nindent 6 }}
100+
{{- end }}
95101
{{- end }} {{/* define "painter.deploymentSpec" */}}
96102

97103
{{/* Render painter deployment template with overrides from values*/}}

codegen/test/chart-deployment-strategy/templates/deployment.yaml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,16 @@ spec:
8484
drop:
8585
- ALL
8686
{{- end }}
87-
{{- if $painterImage.pullSecret }}
88-
imagePullSecrets:
89-
- name: {{ $painterImage.pullSecret }}
90-
{{- end}}
87+
{{- $pullSecrets := (list) -}}
88+
{{- if $painterImage.pullSecret }}
89+
{{- $pullSecrets = concat $pullSecrets (list (dict "name" $painterImage.pullSecret)) -}}
90+
{{- end }}
91+
{{- if $painter.imagePullSecrets }}
92+
{{- $pullSecrets = concat $pullSecrets $painter.imagePullSecrets -}}
93+
{{- end }}
94+
{{- if gt (len $pullSecrets) 0 -}}
95+
{{- (dict "imagePullSecrets" $pullSecrets) | toYaml | nindent 6 }}
96+
{{- end }}
9197
{{- end }} {{/* define "painter.deploymentSpec" */}}
9298

9399
{{/* Render painter deployment template with overrides from values*/}}

codegen/test/chart-envvars/templates/deployment.yaml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,16 @@ spec:
8080
drop:
8181
- ALL
8282
{{- end }}
83-
{{- if $painterImage.pullSecret }}
84-
imagePullSecrets:
85-
- name: {{ $painterImage.pullSecret }}
86-
{{- end}}
83+
{{- $pullSecrets := (list) -}}
84+
{{- if $painterImage.pullSecret }}
85+
{{- $pullSecrets = concat $pullSecrets (list (dict "name" $painterImage.pullSecret)) -}}
86+
{{- end }}
87+
{{- if $painter.imagePullSecrets }}
88+
{{- $pullSecrets = concat $pullSecrets $painter.imagePullSecrets -}}
89+
{{- end }}
90+
{{- if gt (len $pullSecrets) 0 -}}
91+
{{- (dict "imagePullSecrets" $pullSecrets) | toYaml | nindent 6 }}
92+
{{- end }}
8793
{{- end }} {{/* define "painter.deploymentSpec" */}}
8894

8995
{{/* Render painter deployment template with overrides from values*/}}

codegen/test/chart-no-desc/templates/deployment.yaml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,10 +152,16 @@ spec:
152152
port: 8080
153153
initialDelaySeconds: 30
154154
periodSeconds: 60
155-
{{- if $painterImage.pullSecret }}
156-
imagePullSecrets:
157-
- name: {{ $painterImage.pullSecret }}
158-
{{- end}}
155+
{{- $pullSecrets := (list) -}}
156+
{{- if $painterImage.pullSecret }}
157+
{{- $pullSecrets = concat $pullSecrets (list (dict "name" $painterImage.pullSecret)) -}}
158+
{{- end }}
159+
{{- if $painter.imagePullSecrets }}
160+
{{- $pullSecrets = concat $pullSecrets $painter.imagePullSecrets -}}
161+
{{- end }}
162+
{{- if gt (len $pullSecrets) 0 -}}
163+
{{- (dict "imagePullSecrets" $pullSecrets) | toYaml | nindent 6 }}
164+
{{- end }}
159165
{{- end }} {{/* define "painter.deploymentSpec" */}}
160166

161167
{{/* Render painter deployment template with overrides from values*/}}

codegen/test/chart-pod-security-context/templates/deployment.yaml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,16 @@ spec:
8383
drop:
8484
- ALL
8585
{{- end }}
86-
{{- if $painterImage.pullSecret }}
87-
imagePullSecrets:
88-
- name: {{ $painterImage.pullSecret }}
89-
{{- end}}
86+
{{- $pullSecrets := (list) -}}
87+
{{- if $painterImage.pullSecret }}
88+
{{- $pullSecrets = concat $pullSecrets (list (dict "name" $painterImage.pullSecret)) -}}
89+
{{- end }}
90+
{{- if $painter.imagePullSecrets }}
91+
{{- $pullSecrets = concat $pullSecrets $painter.imagePullSecrets -}}
92+
{{- end }}
93+
{{- if gt (len $pullSecrets) 0 -}}
94+
{{- (dict "imagePullSecrets" $pullSecrets) | toYaml | nindent 6 }}
95+
{{- end }}
9096
{{- end }} {{/* define "painter.deploymentSpec" */}}
9197

9298
{{/* Render painter deployment template with overrides from values*/}}

codegen/test/chart-readiness/templates/deployment.yaml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,16 @@ spec:
8787
scheme: HTTPS
8888
initialDelaySeconds: 5
8989
periodSeconds: 10
90-
{{- if $painterImage.pullSecret }}
91-
imagePullSecrets:
92-
- name: {{ $painterImage.pullSecret }}
93-
{{- end}}
90+
{{- $pullSecrets := (list) -}}
91+
{{- if $painterImage.pullSecret }}
92+
{{- $pullSecrets = concat $pullSecrets (list (dict "name" $painterImage.pullSecret)) -}}
93+
{{- end }}
94+
{{- if $painter.imagePullSecrets }}
95+
{{- $pullSecrets = concat $pullSecrets $painter.imagePullSecrets -}}
96+
{{- end }}
97+
{{- if gt (len $pullSecrets) 0 -}}
98+
{{- (dict "imagePullSecrets" $pullSecrets) | toYaml | nindent 6 }}
99+
{{- end }}
94100
{{- end }} {{/* define "painter.deploymentSpec" */}}
95101

96102
{{/* Render painter deployment template with overrides from values*/}}

0 commit comments

Comments
 (0)