Skip to content

Commit 99461d2

Browse files
*: track and label user-provided service-accounts
Signed-off-by: Steve Kuznetsov <[email protected]>
1 parent d706d6b commit 99461d2

File tree

4 files changed

+51
-15
lines changed

4 files changed

+51
-15
lines changed

pkg/controller/operators/catalog/operator.go

+13-2
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
186186
return nil, err
187187
}
188188

189-
canFilter, err := labeller.Validate(ctx, logger, metadataClient)
189+
canFilter, err := labeller.Validate(ctx, logger, metadataClient, crClient)
190190
if err != nil {
191191
return nil, err
192192
}
@@ -455,7 +455,18 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
455455

456456
serviceaccountsgvk := corev1.SchemeGroupVersion.WithResource("serviceaccounts")
457457
if err := labelObjects(serviceaccountsgvk, serviceAccountInformer.Informer(), labeller.ObjectLabeler[*corev1.ServiceAccount, *corev1applyconfigurations.ServiceAccountApplyConfiguration](
458-
ctx, op.logger, labeller.Filter(serviceaccountsgvk),
458+
ctx, op.logger, labeller.ServiceAccountFilter(func(namespace, name string) bool {
459+
operatorGroups, err := operatorGroupInformer.Lister().OperatorGroups(namespace).List(labels.Everything())
460+
if err != nil {
461+
return false
462+
}
463+
for _, operatorGroup := range operatorGroups {
464+
if operatorGroup.Spec.ServiceAccountName == name {
465+
return true
466+
}
467+
}
468+
return false
469+
}),
459470
serviceAccountInformer.Lister().List,
460471
corev1applyconfigurations.ServiceAccount,
461472
func(namespace string, ctx context.Context, cfg *corev1applyconfigurations.ServiceAccountApplyConfiguration, opts metav1.ApplyOptions) (*corev1.ServiceAccount, error) {

pkg/controller/operators/labeller/filters.go

+29-4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"strings"
77
"sync"
88

9+
operators "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
910
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/reconciler"
1011
"github.com/sirupsen/logrus"
1112
"golang.org/x/sync/errgroup"
@@ -16,6 +17,8 @@ import (
1617
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1718
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1819
"k8s.io/apimachinery/pkg/runtime/schema"
20+
"k8s.io/apimachinery/pkg/types"
21+
"k8s.io/apimachinery/pkg/util/sets"
1922
"k8s.io/client-go/metadata"
2023

2124
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/internal/alongside"
@@ -45,15 +48,18 @@ func JobFilter(getConfigMap func(namespace, name string) (metav1.Object, error))
4548
}
4649
}
4750

51+
func ServiceAccountFilter(isServiceAccountReferenced func(namespace, name string) bool) func(object metav1.Object) bool {
52+
return func(object metav1.Object) bool {
53+
return HasOLMOwnerRef(object) || HasOLMLabel(object) || isServiceAccountReferenced(object.GetNamespace(), object.GetName())
54+
}
55+
}
56+
4857
var filters = map[schema.GroupVersionResource]func(metav1.Object) bool{
4958
corev1.SchemeGroupVersion.WithResource("services"): HasOLMOwnerRef,
5059
corev1.SchemeGroupVersion.WithResource("pods"): func(object metav1.Object) bool {
5160
_, ok := object.GetLabels()[reconciler.CatalogSourceLabelKey]
5261
return ok
5362
},
54-
corev1.SchemeGroupVersion.WithResource("serviceaccounts"): func(object metav1.Object) bool {
55-
return HasOLMOwnerRef(object) || HasOLMLabel(object)
56-
},
5763
appsv1.SchemeGroupVersion.WithResource("deployments"): HasOLMOwnerRef,
5864
rbacv1.SchemeGroupVersion.WithResource("roles"): HasOLMOwnerRef,
5965
rbacv1.SchemeGroupVersion.WithResource("rolebindings"): HasOLMOwnerRef,
@@ -69,7 +75,7 @@ var filters = map[schema.GroupVersionResource]func(metav1.Object) bool{
6975
},
7076
}
7177

72-
func Validate(ctx context.Context, logger *logrus.Logger, metadataClient metadata.Interface) (bool, error) {
78+
func Validate(ctx context.Context, logger *logrus.Logger, metadataClient metadata.Interface, operatorClient operators.Interface) (bool, error) {
7379
okLock := sync.Mutex{}
7480
ok := true
7581
g, ctx := errgroup.WithContext(ctx)
@@ -80,6 +86,25 @@ func Validate(ctx context.Context, logger *logrus.Logger, metadataClient metadat
8086
allFilters[batchv1.SchemeGroupVersion.WithResource("jobs")] = JobFilter(func(namespace, name string) (metav1.Object, error) {
8187
return metadataClient.Resource(corev1.SchemeGroupVersion.WithResource("configmaps")).Namespace(namespace).Get(ctx, name, metav1.GetOptions{})
8288
})
89+
operatorGroups, err := operatorClient.OperatorsV1().OperatorGroups(metav1.NamespaceAll).List(ctx, metav1.ListOptions{})
90+
if err != nil {
91+
return false, err
92+
}
93+
userProvidedServiceAccounts := sets.New[types.NamespacedName]()
94+
for _, operatorGroup := range operatorGroups.Items {
95+
if operatorGroup.Spec.ServiceAccountName != "" {
96+
userProvidedServiceAccounts.Insert(types.NamespacedName{
97+
Namespace: operatorGroup.Namespace,
98+
Name: operatorGroup.Spec.ServiceAccountName,
99+
})
100+
}
101+
}
102+
allFilters[corev1.SchemeGroupVersion.WithResource("serviceaccounts")] = ServiceAccountFilter(func(namespace, name string) bool {
103+
return userProvidedServiceAccounts.Has(types.NamespacedName{
104+
Namespace: namespace,
105+
Name: name,
106+
})
107+
})
83108
for gvr, filter := range allFilters {
84109
gvr, filter := gvr, filter
85110
g.Go(func() error {

pkg/controller/operators/olm/operator.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ func newOperatorWithConfig(ctx context.Context, config *operatorConfig) (*Operat
142142
return nil, err
143143
}
144144

145-
canFilter, err := labeller.Validate(ctx, config.logger, config.metadataClient)
145+
canFilter, err := labeller.Validate(ctx, config.logger, config.metadataClient, config.externalClient)
146146
if err != nil {
147147
return nil, err
148148
}

pkg/lib/scoped/syncer.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,6 @@ func (s *UserDefinedServiceAccountSyncer) SyncOperatorGroup(in *v1.OperatorGroup
7878
return
7979
}
8080

81-
// A service account has been specified, but likely does not have the labels we expect it to have so it will
82-
// show up in our listers, so let's add that and queue again later
83-
config := corev1applyconfigurations.ServiceAccount(serviceAccountName, namespace)
84-
config.Labels = map[string]string{install.OLMManagedLabelKey: install.OLMManagedLabelValue}
85-
if _, err := s.client.KubernetesInterface().CoreV1().ServiceAccounts(namespace).Apply(context.TODO(), config, metav1.ApplyOptions{FieldManager: "operator-lifecycle-manager"}); err != nil {
86-
return out, fmt.Errorf("failed to apply labels[%s]=%s to serviceaccount %s/%s: %w", install.OLMManagedLabelKey, install.OLMManagedLabelValue, namespace, serviceAccountName, err)
87-
}
88-
8981
// A service account has been specified, we need to update the status.
9082
sa, err := s.client.KubernetesInterface().CoreV1().ServiceAccounts(namespace).Get(context.TODO(), serviceAccountName, metav1.GetOptions{})
9183
if err != nil {
@@ -108,6 +100,14 @@ func (s *UserDefinedServiceAccountSyncer) SyncOperatorGroup(in *v1.OperatorGroup
108100
return
109101
}
110102

103+
// A service account has been specified, but likely does not have the labels we expect it to have so it will
104+
// show up in our listers, so let's add that and queue again later
105+
config := corev1applyconfigurations.ServiceAccount(serviceAccountName, namespace)
106+
config.Labels = map[string]string{install.OLMManagedLabelKey: install.OLMManagedLabelValue}
107+
if _, err := s.client.KubernetesInterface().CoreV1().ServiceAccounts(namespace).Apply(context.TODO(), config, metav1.ApplyOptions{FieldManager: "operator-lifecycle-manager"}); err != nil {
108+
return out, fmt.Errorf("failed to apply labels[%s]=%s to serviceaccount %s/%s: %w", install.OLMManagedLabelKey, install.OLMManagedLabelValue, namespace, serviceAccountName, err)
109+
}
110+
111111
ref, err := reference.GetReference(s.scheme, sa)
112112
if err != nil {
113113
return

0 commit comments

Comments
 (0)