Skip to content

Commit 37b8d31

Browse files
committed
fixup! Support serviceaccount pull secrets
1 parent 2196977 commit 37b8d31

File tree

5 files changed

+58
-61
lines changed

5 files changed

+58
-61
lines changed

cmd/catalogd/main.go

Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,6 @@ import (
3030

3131
"github.com/containers/image/v5/types"
3232
"github.com/spf13/cobra"
33-
corev1 "k8s.io/api/core/v1"
34-
"k8s.io/apimachinery/pkg/fields"
35-
k8slabels "k8s.io/apimachinery/pkg/labels"
3633
"k8s.io/apimachinery/pkg/runtime"
3734
k8stypes "k8s.io/apimachinery/pkg/types"
3835
apimachineryrand "k8s.io/apimachinery/pkg/util/rand"
@@ -64,6 +61,7 @@ import (
6461
sharedcontrollers "github.com/operator-framework/operator-controller/internal/shared/controllers"
6562
fsutil "github.com/operator-framework/operator-controller/internal/shared/util/fs"
6663
imageutil "github.com/operator-framework/operator-controller/internal/shared/util/image"
64+
"github.com/operator-framework/operator-controller/internal/shared/util/pullsecretcache"
6765
sautil "github.com/operator-framework/operator-controller/internal/shared/util/sa"
6866
"github.com/operator-framework/operator-controller/internal/shared/version"
6967
)
@@ -251,37 +249,17 @@ func run(ctx context.Context) error {
251249

252250
saKey, err := sautil.GetServiceAccount()
253251
if err != nil {
254-
setupLog.Error(err, "Unable to get pod namesapce and serviceaccount")
252+
setupLog.Error(err, "Failed to extract serviceaccount from JWT")
255253
return err
256254
}
255+
setupLog.Info("Successfully extracted serviceaccount from JWT", "serviceaccount",
256+
fmt.Sprintf("%s/%s", saKey.Namespace, saKey.Name))
257257

258-
setupLog.Info("Read token", "serviceaccount", saKey)
259-
cacheOptions.ByObject[&corev1.ServiceAccount{}] = crcache.ByObject{
260-
Namespaces: map[string]crcache.Config{
261-
saKey.Namespace: {
262-
LabelSelector: k8slabels.Everything(),
263-
FieldSelector: fields.SelectorFromSet(map[string]string{
264-
"metadata.name": saKey.Name,
265-
}),
266-
},
267-
},
268-
}
269-
270-
secretCache := crcache.ByObject{}
271-
secretCache.Namespaces = make(map[string]crcache.Config, 2)
272-
secretCache.Namespaces[saKey.Namespace] = crcache.Config{
273-
LabelSelector: k8slabels.Everything(),
274-
FieldSelector: fields.Everything(),
275-
}
276-
if cfg.globalPullSecretKey != nil {
277-
secretCache.Namespaces[cfg.globalPullSecretKey.Namespace] = crcache.Config{
278-
LabelSelector: k8slabels.Everything(),
279-
FieldSelector: fields.SelectorFromSet(map[string]string{
280-
"metadata.name": cfg.globalPullSecretKey.Name,
281-
}),
282-
}
258+
err = pullsecretcache.SetupPullSecretCache(&cacheOptions, cfg.globalPullSecretKey, saKey)
259+
if err != nil {
260+
setupLog.Error(err, "Unable to setup pull-secret cache")
261+
return err
283262
}
284-
cacheOptions.ByObject[&corev1.Secret{}] = secretCache
285263

286264
// Create manager
287265
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{

cmd/operator-controller/main.go

Lines changed: 8 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,8 @@ import (
3030

3131
"github.com/containers/image/v5/types"
3232
"github.com/spf13/cobra"
33-
corev1 "k8s.io/api/core/v1"
3433
rbacv1 "k8s.io/api/rbac/v1"
3534
apiextensionsv1client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
36-
"k8s.io/apimachinery/pkg/fields"
3735
k8slabels "k8s.io/apimachinery/pkg/labels"
3836
k8stypes "k8s.io/apimachinery/pkg/types"
3937
apimachineryrand "k8s.io/apimachinery/pkg/util/rand"
@@ -75,6 +73,7 @@ import (
7573
fsutil "github.com/operator-framework/operator-controller/internal/shared/util/fs"
7674
httputil "github.com/operator-framework/operator-controller/internal/shared/util/http"
7775
imageutil "github.com/operator-framework/operator-controller/internal/shared/util/image"
76+
"github.com/operator-framework/operator-controller/internal/shared/util/pullsecretcache"
7877
sautil "github.com/operator-framework/operator-controller/internal/shared/util/sa"
7978
"github.com/operator-framework/operator-controller/internal/shared/version"
8079
)
@@ -222,37 +221,17 @@ func run() error {
222221

223222
saKey, err := sautil.GetServiceAccount()
224223
if err != nil {
225-
setupLog.Error(err, "Unable to get pod namesapce and serviceaccount")
224+
setupLog.Error(err, "Failed to extract serviceaccount from JWT")
226225
return err
227226
}
227+
setupLog.Info("Successfully extracted serviceaccount from JWT", "serviceaccount",
228+
fmt.Sprintf("%s/%s", saKey.Namespace, saKey.Name))
228229

229-
setupLog.Info("Read token", "serviceaccount", saKey)
230-
cacheOptions.ByObject[&corev1.ServiceAccount{}] = crcache.ByObject{
231-
Namespaces: map[string]crcache.Config{
232-
saKey.Namespace: {
233-
LabelSelector: k8slabels.Everything(),
234-
FieldSelector: fields.SelectorFromSet(map[string]string{
235-
"metadata.name": saKey.Name,
236-
}),
237-
},
238-
},
239-
}
240-
241-
secretCache := crcache.ByObject{}
242-
secretCache.Namespaces = make(map[string]crcache.Config, 2)
243-
secretCache.Namespaces[saKey.Namespace] = crcache.Config{
244-
LabelSelector: k8slabels.Everything(),
245-
FieldSelector: fields.Everything(),
246-
}
247-
if globalPullSecretKey != nil {
248-
secretCache.Namespaces[globalPullSecretKey.Namespace] = crcache.Config{
249-
LabelSelector: k8slabels.Everything(),
250-
FieldSelector: fields.SelectorFromSet(map[string]string{
251-
"metadata.name": globalPullSecretKey.Name,
252-
}),
253-
}
230+
err = pullsecretcache.SetupPullSecretCache(&cacheOptions, globalPullSecretKey, saKey)
231+
if err != nil {
232+
setupLog.Error(err, "Unable to setup pull-secret cache")
233+
return err
254234
}
255-
cacheOptions.ByObject[&corev1.Secret{}] = secretCache
256235

257236
metricsServerOptions := server.Options{}
258237
if len(cfg.certFile) > 0 && len(cfg.keyFile) > 0 {

internal/shared/controllers/pull_secret_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func (r *PullSecretReconciler) Reconcile(ctx context.Context, _ ctrl.Request) (c
5151

5252
secrets := []*corev1.Secret{}
5353

54-
if r.SecretKey != nil { //nolint:nestif
54+
if r.SecretKey != nil {
5555
secret, err := r.getSecret(ctx, logger, *r.SecretKey)
5656
if err != nil {
5757
return ctrl.Result{}, err
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package pullsecretcache
2+
3+
import (
4+
corev1 "k8s.io/api/core/v1"
5+
"k8s.io/apimachinery/pkg/fields"
6+
"k8s.io/apimachinery/pkg/labels"
7+
"k8s.io/apimachinery/pkg/types"
8+
"sigs.k8s.io/controller-runtime/pkg/cache"
9+
)
10+
11+
func SetupPullSecretCache(cacheOptions *cache.Options, globalPullSecretKey *types.NamespacedName, saKey types.NamespacedName) error {
12+
cacheOptions.ByObject[&corev1.ServiceAccount{}] = cache.ByObject{
13+
Namespaces: map[string]cache.Config{
14+
saKey.Namespace: {
15+
LabelSelector: labels.Everything(),
16+
FieldSelector: fields.SelectorFromSet(map[string]string{
17+
"metadata.name": saKey.Name,
18+
}),
19+
},
20+
},
21+
}
22+
23+
secretCache := cache.ByObject{}
24+
secretCache.Namespaces = make(map[string]cache.Config, 2)
25+
secretCache.Namespaces[saKey.Namespace] = cache.Config{
26+
LabelSelector: labels.Everything(),
27+
FieldSelector: fields.Everything(),
28+
}
29+
if globalPullSecretKey != nil {
30+
secretCache.Namespaces[globalPullSecretKey.Namespace] = cache.Config{
31+
LabelSelector: labels.Everything(),
32+
FieldSelector: fields.SelectorFromSet(map[string]string{
33+
"metadata.name": globalPullSecretKey.Name,
34+
}),
35+
}
36+
}
37+
cacheOptions.ByObject[&corev1.Secret{}] = secretCache
38+
39+
return nil
40+
}

internal/shared/util/sa/serviceaccount.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func getServiceAccountInternal(data []byte, err error) (k8stypes.NamespacedName,
4444
return k8stypes.NamespacedName{}, err
4545
}
4646
subjects := strings.Split(subject, ":")
47-
if len(subjects) != 4 {
47+
if len(subjects) != 4 || subjects[2] == "" || subjects[3] == "" {
4848
return k8stypes.NamespacedName{}, fmt.Errorf("badly formatted subject: %s", subject)
4949
}
5050
return k8stypes.NamespacedName{Namespace: subjects[2], Name: subjects[3]}, nil

0 commit comments

Comments
 (0)