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"
@@ -45,15 +48,18 @@ func JobFilter(getConfigMap func(namespace, name string) (metav1.Object, error))
45
48
}
46
49
}
47
50
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
+
48
57
var filters = map [schema.GroupVersionResource ]func (metav1.Object ) bool {
49
58
corev1 .SchemeGroupVersion .WithResource ("services" ): HasOLMOwnerRef ,
50
59
corev1 .SchemeGroupVersion .WithResource ("pods" ): func (object metav1.Object ) bool {
51
60
_ , ok := object .GetLabels ()[reconciler .CatalogSourceLabelKey ]
52
61
return ok
53
62
},
54
- corev1 .SchemeGroupVersion .WithResource ("serviceaccounts" ): func (object metav1.Object ) bool {
55
- return HasOLMOwnerRef (object ) || HasOLMLabel (object )
56
- },
57
63
appsv1 .SchemeGroupVersion .WithResource ("deployments" ): HasOLMOwnerRef ,
58
64
rbacv1 .SchemeGroupVersion .WithResource ("roles" ): HasOLMOwnerRef ,
59
65
rbacv1 .SchemeGroupVersion .WithResource ("rolebindings" ): HasOLMOwnerRef ,
@@ -69,7 +75,7 @@ var filters = map[schema.GroupVersionResource]func(metav1.Object) bool{
69
75
},
70
76
}
71
77
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 ) {
73
79
okLock := sync.Mutex {}
74
80
ok := true
75
81
g , ctx := errgroup .WithContext (ctx )
@@ -80,6 +86,25 @@ func Validate(ctx context.Context, logger *logrus.Logger, metadataClient metadat
80
86
allFilters [batchv1 .SchemeGroupVersion .WithResource ("jobs" )] = JobFilter (func (namespace , name string ) (metav1.Object , error ) {
81
87
return metadataClient .Resource (corev1 .SchemeGroupVersion .WithResource ("configmaps" )).Namespace (namespace ).Get (ctx , name , metav1.GetOptions {})
82
88
})
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
+ })
83
108
for gvr , filter := range allFilters {
84
109
gvr , filter := gvr , filter
85
110
g .Go (func () error {
0 commit comments