Skip to content

Commit 7e473bf

Browse files
authored
Automatically add the builder service account secrets to the signing process (kubernetes-sigs#344)
Both spec.imageRepoSecret and the builder secret are mounted as volumes under /docker_config Changes in signimage in another PR means it then walks this tree looking for secrets and the appropriate secret for the repo is used.
1 parent 258519a commit 7e473bf

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

internal/sign/job/signer.go

+27-1
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,26 @@ func (s *signer) MakeJobTemplate(
126126
utils.MakeSecretVolumeMount(signConfig.KeySecret, "/signingkey"),
127127
}
128128

129-
args = append(args, "-secretdir", "/docker_config/")
130129
imageSecret := mod.Spec.ImageRepoSecret
130+
buildImageSecret, err := s.getSAImageRepoSecret(ctx, &mod, constants.OCPBuilderServiceAccountName)
131+
if err != nil {
132+
return nil, fmt.Errorf("Failed to get secrets for service account %s: %v", constants.OCPBuilderServiceAccountName, err)
133+
}
134+
135+
args = append(args, "-secretdir", "/docker_config/")
131136
if imageSecret != nil {
132137
volumes = append(volumes, utils.MakeSecretVolume(imageSecret, "", ""))
133138
volumeMounts = append(volumeMounts, utils.MakeSecretVolumeMount(imageSecret, "/docker_config/"+imageSecret.Name))
134139
}
135140

141+
if len(buildImageSecret) > 0 {
142+
for _, secret := range buildImageSecret {
143+
buildSecret := &v1.LocalObjectReference{Name: secret.Name}
144+
volumes = append(volumes, utils.MakeSecretVolume(buildSecret, "", ""))
145+
volumeMounts = append(volumeMounts, utils.MakeSecretVolumeMount(buildSecret, "/docker_config/"+constants.OCPBuilderServiceAccountName+"/"+secret.Name))
146+
}
147+
}
148+
136149
specTemplate := v1.PodTemplateSpec{
137150
Spec: v1.PodSpec{
138151
Containers: []v1.Container{
@@ -187,6 +200,19 @@ func (s *signer) getHashAnnotationValue(ctx context.Context, privateSecret, publ
187200
return getHashValue(podTemplate, publicKeyData, privateKeyData)
188201
}
189202

203+
func (s *signer) getSAImageRepoSecret(ctx context.Context, mod *kmmv1beta1.Module, accountName string) ([]v1.ObjectReference, error) {
204+
serviceaccount := v1.ServiceAccount{}
205+
206+
namespacedName := types.NamespacedName{Name: accountName, Namespace: mod.Namespace}
207+
208+
err := s.client.Get(ctx, namespacedName, &serviceaccount)
209+
if err != nil {
210+
return nil, err
211+
}
212+
213+
return serviceaccount.Secrets, nil
214+
}
215+
190216
func (s *signer) getSecretData(ctx context.Context, secretName, secretDataKey, namespace string) ([]byte, error) {
191217
secret := v1.Secret{}
192218
namespacedName := types.NamespacedName{Name: secretName, Namespace: namespace}

internal/sign/job/signer_test.go

+19-1
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,12 @@ var _ = Describe("MakeJobTemplate", func() {
208208

209209
gomock.InOrder(
210210
helper.EXPECT().GetRelevantSign(mod.Spec, km, kernelVersion).Return(km.Sign, nil),
211+
clnt.EXPECT().Get(ctx, types.NamespacedName{Name: "builder", Namespace: mod.Namespace}, gomock.Any()).DoAndReturn(
212+
func(_ interface{}, _ interface{}, svcaccnt *v1.ServiceAccount, _ ...ctrlclient.GetOption) error {
213+
svcaccnt.Secrets = []v1.ObjectReference{}
214+
return nil
215+
},
216+
),
211217
clnt.EXPECT().Get(ctx, types.NamespacedName{Name: km.Sign.KeySecret.Name, Namespace: mod.Namespace}, gomock.Any()).DoAndReturn(
212218
func(_ interface{}, _ interface{}, secret *v1.Secret, _ ...ctrlclient.GetOption) error {
213219
secret.Data = privateSignData
@@ -255,6 +261,12 @@ var _ = Describe("MakeJobTemplate", func() {
255261

256262
gomock.InOrder(
257263
helper.EXPECT().GetRelevantSign(mod.Spec, km, kernelVersion).Return(km.Sign, nil),
264+
clnt.EXPECT().Get(ctx, types.NamespacedName{Name: "builder", Namespace: mod.Namespace}, gomock.Any()).DoAndReturn(
265+
func(_ interface{}, _ interface{}, svcaccnt *v1.ServiceAccount, _ ...ctrlclient.GetOption) error {
266+
svcaccnt.Secrets = []v1.ObjectReference{}
267+
return nil
268+
},
269+
),
258270
clnt.EXPECT().Get(ctx, types.NamespacedName{Name: km.Sign.KeySecret.Name, Namespace: mod.Namespace}, gomock.Any()).DoAndReturn(
259271
func(_ interface{}, _ interface{}, secret *v1.Secret, _ ...ctrlclient.GetOption) error {
260272
secret.Data = privateSignData
@@ -317,15 +329,21 @@ var _ = Describe("MakeJobTemplate", func() {
317329
CertSecret: &v1.LocalObjectReference{Name: "securebootcert"},
318330
},
319331
}
320-
321332
gomock.InOrder(
322333
helper.EXPECT().GetRelevantSign(mod.Spec, km, kernelVersion).Return(km.Sign, nil),
334+
clnt.EXPECT().Get(ctx, types.NamespacedName{Name: "builder", Namespace: mod.Namespace}, gomock.Any()).DoAndReturn(
335+
func(_ interface{}, _ interface{}, svcaccnt *v1.ServiceAccount, _ ...ctrlclient.GetOption) error {
336+
svcaccnt.Secrets = []v1.ObjectReference{}
337+
return nil
338+
},
339+
),
323340
clnt.EXPECT().Get(ctx, types.NamespacedName{Name: km.Sign.KeySecret.Name, Namespace: mod.Namespace}, gomock.Any()).DoAndReturn(
324341
func(_ interface{}, _ interface{}, secret *v1.Secret, _ ...ctrlclient.GetOption) error {
325342
secret.Data = privateSignData
326343
return nil
327344
},
328345
),
346+
329347
clnt.EXPECT().Get(ctx, types.NamespacedName{Name: km.Sign.CertSecret.Name, Namespace: mod.Namespace}, gomock.Any()).DoAndReturn(
330348
func(_ interface{}, _ interface{}, secret *v1.Secret, _ ...ctrlclient.GetOption) error {
331349
secret.Data = publicSignData

0 commit comments

Comments
 (0)