Skip to content

Commit 60221e6

Browse files
OCPBUGS-65867: add config map service account to unpack jobs (#3732)
* add config map service account * add service account lister to configmapunpacker in test * add the service account to the job pod spec * fix formatting issues. * remove setting ns and name as sa object already does this
1 parent 7890bdc commit 60221e6

3 files changed

Lines changed: 57 additions & 12 deletions

File tree

pkg/controller/bundle/bundle_unpacker.go

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,9 @@ func (c *ConfigMapUnpacker) job(cmRef *corev1.ObjectReference, bundlePath string
117117
// By setting restartPolicy = "Never" the pods don't get cleaned up since they're not running after a failure.
118118
// Keeping the pods around after failures helps in inspecting the logs of a failed bundle unpack job.
119119
// See: https://kubernetes.io/docs/concepts/workloads/controllers/job/#pod-backoff-failure-policy
120-
RestartPolicy: corev1.RestartPolicyNever,
121-
ImagePullSecrets: secrets,
120+
RestartPolicy: corev1.RestartPolicyNever,
121+
ServiceAccountName: cmRef.Name,
122+
ImagePullSecrets: secrets,
122123
SecurityContext: &corev1.PodSecurityContext{
123124
SeccompProfile: &corev1.SeccompProfile{
124125
Type: corev1.SeccompProfileTypeRuntimeDefault,
@@ -337,6 +338,7 @@ type ConfigMapUnpacker struct {
337338
podLister listerscorev1.PodLister
338339
roleLister listersrbacv1.RoleLister
339340
rbLister listersrbacv1.RoleBindingLister
341+
saLister listerscorev1.ServiceAccountLister
340342
loader *configmap.BundleLoader
341343
now func() metav1.Time
342344
unpackTimeout time.Duration
@@ -424,6 +426,12 @@ func WithRoleBindingLister(rbLister listersrbacv1.RoleBindingLister) ConfigMapUn
424426
}
425427
}
426428

429+
func WithServiceAccountLister(saLister listerscorev1.ServiceAccountLister) ConfigMapUnpackerOption {
430+
return func(unpacker *ConfigMapUnpacker) {
431+
unpacker.saLister = saLister
432+
}
433+
}
434+
427435
func WithNow(now func() metav1.Time) ConfigMapUnpackerOption {
428436
return func(unpacker *ConfigMapUnpacker) {
429437
unpacker.now = now
@@ -536,6 +544,11 @@ func (c *ConfigMapUnpacker) UnpackBundle(lookup *operatorsv1alpha1.BundleLookup,
536544
return
537545
}
538546

547+
_, err = c.ensureServiceAccount(cmRef)
548+
if err != nil {
549+
return
550+
}
551+
539552
_, err = c.ensureRoleBinding(cmRef)
540553
if err != nil {
541554
return
@@ -791,13 +804,36 @@ func (c *ConfigMapUnpacker) ensureRole(cmRef *corev1.ObjectReference) (role *rba
791804
return
792805
}
793806

807+
func (c *ConfigMapUnpacker) ensureServiceAccount(cmRef *corev1.ObjectReference) (serviceAccount *corev1.ServiceAccount, err error) {
808+
fresh := &corev1.ServiceAccount{
809+
ObjectMeta: metav1.ObjectMeta{
810+
Name: cmRef.Name,
811+
Namespace: cmRef.Namespace,
812+
},
813+
}
814+
815+
fresh.SetOwnerReferences([]metav1.OwnerReference{ownerRef(cmRef)})
816+
fresh.SetLabels(map[string]string{install.OLMManagedLabelKey: install.OLMManagedLabelValue})
817+
818+
serviceAccount, err = c.saLister.ServiceAccounts(fresh.GetNamespace()).Get(fresh.GetName())
819+
820+
if err != nil {
821+
if apierrors.IsNotFound(err) {
822+
serviceAccount, err = c.client.CoreV1().ServiceAccounts(fresh.GetNamespace()).Create(context.TODO(), fresh, metav1.CreateOptions{})
823+
}
824+
return
825+
}
826+
827+
return
828+
}
829+
794830
func (c *ConfigMapUnpacker) ensureRoleBinding(cmRef *corev1.ObjectReference) (roleBinding *rbacv1.RoleBinding, err error) {
795831
fresh := &rbacv1.RoleBinding{
796832
Subjects: []rbacv1.Subject{
797833
{
798834
Kind: "ServiceAccount",
799835
APIGroup: "",
800-
Name: "default",
836+
Name: cmRef.Name,
801837
Namespace: cmRef.Namespace,
802838
},
803839
},

pkg/controller/bundle/bundle_unpacker_test.go

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,9 @@ func TestConfigMapUnpacker(t *testing.T) {
274274
},
275275
},
276276
Spec: corev1.PodSpec{
277-
RestartPolicy: corev1.RestartPolicyNever,
278-
ImagePullSecrets: []corev1.LocalObjectReference{{Name: "my-secret"}},
277+
RestartPolicy: corev1.RestartPolicyNever,
278+
ServiceAccountName: pathHash,
279+
ImagePullSecrets: []corev1.LocalObjectReference{{Name: "my-secret"}},
279280
SecurityContext: &corev1.PodSecurityContext{
280281
RunAsNonRoot: ptr.To(bool(true)),
281282
RunAsUser: ptr.To(int64(runAsUser)),
@@ -450,7 +451,7 @@ func TestConfigMapUnpacker(t *testing.T) {
450451
{
451452
Kind: "ServiceAccount",
452453
APIGroup: "",
453-
Name: "default",
454+
Name: pathHash,
454455
Namespace: "ns-a",
455456
},
456457
},
@@ -494,7 +495,8 @@ func TestConfigMapUnpacker(t *testing.T) {
494495
},
495496
},
496497
Spec: corev1.PodSpec{
497-
RestartPolicy: corev1.RestartPolicyNever,
498+
RestartPolicy: corev1.RestartPolicyNever,
499+
ServiceAccountName: digestHash,
498500
SecurityContext: &corev1.PodSecurityContext{
499501
RunAsNonRoot: ptr.To(bool(true)),
500502
RunAsUser: ptr.To(int64(runAsUser)),
@@ -753,7 +755,8 @@ func TestConfigMapUnpacker(t *testing.T) {
753755
},
754756
},
755757
Spec: corev1.PodSpec{
756-
RestartPolicy: corev1.RestartPolicyNever,
758+
RestartPolicy: corev1.RestartPolicyNever,
759+
ServiceAccountName: digestHash,
757760
SecurityContext: &corev1.PodSecurityContext{
758761
RunAsNonRoot: ptr.To(bool(true)),
759762
RunAsUser: ptr.To(int64(runAsUser)),
@@ -941,7 +944,7 @@ func TestConfigMapUnpacker(t *testing.T) {
941944
{
942945
Kind: "ServiceAccount",
943946
APIGroup: "",
944-
Name: "default",
947+
Name: digestHash,
945948
Namespace: "ns-a",
946949
},
947950
},
@@ -1007,7 +1010,8 @@ func TestConfigMapUnpacker(t *testing.T) {
10071010
},
10081011
},
10091012
Spec: corev1.PodSpec{
1010-
RestartPolicy: corev1.RestartPolicyNever,
1013+
RestartPolicy: corev1.RestartPolicyNever,
1014+
ServiceAccountName: pathHash,
10111015
SecurityContext: &corev1.PodSecurityContext{
10121016
RunAsNonRoot: ptr.To(bool(true)),
10131017
RunAsUser: ptr.To(int64(runAsUser)),
@@ -1231,7 +1235,8 @@ func TestConfigMapUnpacker(t *testing.T) {
12311235
},
12321236
},
12331237
Spec: corev1.PodSpec{
1234-
RestartPolicy: corev1.RestartPolicyNever,
1238+
RestartPolicy: corev1.RestartPolicyNever,
1239+
ServiceAccountName: pathHash,
12351240
SecurityContext: &corev1.PodSecurityContext{
12361241
RunAsNonRoot: ptr.To(bool(true)),
12371242
RunAsUser: ptr.To(int64(runAsUser)),
@@ -1468,7 +1473,8 @@ func TestConfigMapUnpacker(t *testing.T) {
14681473
},
14691474
},
14701475
Spec: corev1.PodSpec{
1471-
RestartPolicy: corev1.RestartPolicyNever,
1476+
RestartPolicy: corev1.RestartPolicyNever,
1477+
ServiceAccountName: pathHash,
14721478
SecurityContext: &corev1.PodSecurityContext{
14731479
RunAsNonRoot: ptr.To(bool(true)),
14741480
RunAsUser: ptr.To(int64(runAsUser)),
@@ -1618,6 +1624,7 @@ func TestConfigMapUnpacker(t *testing.T) {
16181624
podLister := factory.Core().V1().Pods().Lister()
16191625
roleLister := factory.Rbac().V1().Roles().Lister()
16201626
rbLister := factory.Rbac().V1().RoleBindings().Lister()
1627+
saLister := factory.Core().V1().ServiceAccounts().Lister()
16211628

16221629
stop := make(chan struct{})
16231630
defer close(stop)
@@ -1639,6 +1646,7 @@ func TestConfigMapUnpacker(t *testing.T) {
16391646
WithPodLister(podLister),
16401647
WithRoleLister(roleLister),
16411648
WithRoleBindingLister(rbLister),
1649+
WithServiceAccountLister(saLister),
16421650
WithOPMImage(opmImage),
16431651
WithUtilImage(utilImage),
16441652
WithNow(now),

pkg/controller/operators/catalog/operator.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,7 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
736736
bundle.WithPodLister(buPodInformer.Lister()),
737737
bundle.WithRoleLister(roleInformer.Lister()),
738738
bundle.WithRoleBindingLister(roleBindingInformer.Lister()),
739+
bundle.WithServiceAccountLister(serviceAccountInformer.Lister()),
739740
bundle.WithOPMImage(opmImage),
740741
bundle.WithUtilImage(utilImage),
741742
bundle.WithNow(op.now),

0 commit comments

Comments
 (0)