@@ -337,6 +337,7 @@ type ConfigMapUnpacker struct {
337337 podLister listerscorev1.PodLister
338338 roleLister listersrbacv1.RoleLister
339339 rbLister listersrbacv1.RoleBindingLister
340+ saLister listerscorev1.ServiceAccountLister
340341 loader * configmap.BundleLoader
341342 now func () metav1.Time
342343 unpackTimeout time.Duration
@@ -424,6 +425,12 @@ func WithRoleBindingLister(rbLister listersrbacv1.RoleBindingLister) ConfigMapUn
424425 }
425426}
426427
428+ func WithServiceAccountLister (saLister listerscorev1.ServiceAccountLister ) ConfigMapUnpackerOption {
429+ return func (unpacker * ConfigMapUnpacker ) {
430+ unpacker .saLister = saLister
431+ }
432+ }
433+
427434func WithNow (now func () metav1.Time ) ConfigMapUnpackerOption {
428435 return func (unpacker * ConfigMapUnpacker ) {
429436 unpacker .now = now
@@ -536,6 +543,11 @@ func (c *ConfigMapUnpacker) UnpackBundle(lookup *operatorsv1alpha1.BundleLookup,
536543 return
537544 }
538545
546+ _ , err = c .ensureServiceAccount (cmRef )
547+ if err != nil {
548+ return
549+ }
550+
539551 _ , err = c .ensureRoleBinding (cmRef )
540552 if err != nil {
541553 return
@@ -791,13 +803,39 @@ func (c *ConfigMapUnpacker) ensureRole(cmRef *corev1.ObjectReference) (role *rba
791803 return
792804}
793805
806+ func (c * ConfigMapUnpacker ) ensureServiceAccount (cmRef * corev1.ObjectReference ) (serviceAccount * corev1.ServiceAccount , err error ) {
807+
808+ fresh := & corev1.ServiceAccount {
809+ ObjectMeta : metav1.ObjectMeta {
810+ Name : cmRef .Name ,
811+ Namespace : cmRef .Namespace ,
812+ },
813+ }
814+
815+ fresh .SetNamespace (cmRef .Namespace )
816+ fresh .SetName (cmRef .Name )
817+ fresh .SetOwnerReferences ([]metav1.OwnerReference {ownerRef (cmRef )})
818+ fresh .SetLabels (map [string ]string {install .OLMManagedLabelKey : install .OLMManagedLabelValue })
819+
820+ serviceAccount , err = c .saLister .ServiceAccounts (fresh .GetNamespace ()).Get (fresh .GetName ())
821+
822+ if err != nil {
823+ if apierrors .IsNotFound (err ) {
824+ serviceAccount , err = c .client .CoreV1 ().ServiceAccounts (fresh .GetNamespace ()).Create (context .TODO (), fresh , metav1.CreateOptions {})
825+ }
826+ return
827+ }
828+
829+ return
830+ }
831+
794832func (c * ConfigMapUnpacker ) ensureRoleBinding (cmRef * corev1.ObjectReference ) (roleBinding * rbacv1.RoleBinding , err error ) {
795833 fresh := & rbacv1.RoleBinding {
796834 Subjects : []rbacv1.Subject {
797835 {
798836 Kind : "ServiceAccount" ,
799837 APIGroup : "" ,
800- Name : "default" ,
838+ Name : cmRef . Name ,
801839 Namespace : cmRef .Namespace ,
802840 },
803841 },
0 commit comments