6
6
"strings"
7
7
"sync"
8
8
9
+ operators "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
9
10
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/reconciler"
10
11
"github.com/sirupsen/logrus"
11
12
"golang.org/x/sync/errgroup"
@@ -16,6 +17,8 @@ import (
16
17
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
17
18
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
18
19
"k8s.io/apimachinery/pkg/runtime/schema"
20
+ "k8s.io/apimachinery/pkg/types"
21
+ "k8s.io/apimachinery/pkg/util/sets"
19
22
"k8s.io/client-go/metadata"
20
23
21
24
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/internal/alongside"
@@ -49,15 +52,18 @@ func JobFilter(getConfigMap func(namespace, name string) (metav1.Object, error))
49
52
}
50
53
}
51
54
55
+ func ServiceAccountFilter (isServiceAccountReferenced func (namespace , name string ) bool ) func (object metav1.Object ) bool {
56
+ return func (object metav1.Object ) bool {
57
+ return HasOLMOwnerRef (object ) || HasOLMLabel (object ) || isServiceAccountReferenced (object .GetNamespace (), object .GetName ())
58
+ }
59
+ }
60
+
52
61
var filters = map [schema.GroupVersionResource ]func (metav1.Object ) bool {
53
62
corev1 .SchemeGroupVersion .WithResource ("services" ): HasOLMOwnerRef ,
54
63
corev1 .SchemeGroupVersion .WithResource ("pods" ): func (object metav1.Object ) bool {
55
64
_ , ok := object .GetLabels ()[reconciler .CatalogSourceLabelKey ]
56
65
return ok
57
66
},
58
- corev1 .SchemeGroupVersion .WithResource ("serviceaccounts" ): func (object metav1.Object ) bool {
59
- return HasOLMOwnerRef (object ) || HasOLMLabel (object )
60
- },
61
67
appsv1 .SchemeGroupVersion .WithResource ("deployments" ): HasOLMOwnerRef ,
62
68
rbacv1 .SchemeGroupVersion .WithResource ("roles" ): HasOLMOwnerRef ,
63
69
rbacv1 .SchemeGroupVersion .WithResource ("rolebindings" ): HasOLMOwnerRef ,
@@ -73,7 +79,7 @@ var filters = map[schema.GroupVersionResource]func(metav1.Object) bool{
73
79
},
74
80
}
75
81
76
- func Validate (ctx context.Context , logger * logrus.Logger , metadataClient metadata.Interface ) (bool , error ) {
82
+ func Validate (ctx context.Context , logger * logrus.Logger , metadataClient metadata.Interface , operatorClient operators. Interface ) (bool , error ) {
77
83
okLock := sync.Mutex {}
78
84
ok := true
79
85
g , ctx := errgroup .WithContext (ctx )
@@ -96,6 +102,27 @@ func Validate(ctx context.Context, logger *logrus.Logger, metadataClient metadat
96
102
return previous != nil && previous (object ) && ContentHashFilter (object )
97
103
}
98
104
}
105
+
106
+ operatorGroups , err := operatorClient .OperatorsV1 ().OperatorGroups (metav1 .NamespaceAll ).List (ctx , metav1.ListOptions {})
107
+ if err != nil {
108
+ return false , err
109
+ }
110
+ userProvidedServiceAccounts := sets .New [types.NamespacedName ]()
111
+ for _ , operatorGroup := range operatorGroups .Items {
112
+ if operatorGroup .Spec .ServiceAccountName != "" {
113
+ userProvidedServiceAccounts .Insert (types.NamespacedName {
114
+ Namespace : operatorGroup .Namespace ,
115
+ Name : operatorGroup .Spec .ServiceAccountName ,
116
+ })
117
+ }
118
+ }
119
+ allFilters [corev1 .SchemeGroupVersion .WithResource ("serviceaccounts" )] = ServiceAccountFilter (func (namespace , name string ) bool {
120
+ return userProvidedServiceAccounts .Has (types.NamespacedName {
121
+ Namespace : namespace ,
122
+ Name : name ,
123
+ })
124
+ })
125
+
99
126
for gvr , filter := range allFilters {
100
127
gvr , filter := gvr , filter
101
128
g .Go (func () error {
0 commit comments