@@ -21,11 +21,13 @@ import (
21
21
"fmt"
22
22
"strings"
23
23
24
- "knative.dev/eventing /pkg/apis/feature "
24
+ "k8s.io/apimachinery /pkg/api/equality "
25
25
duckv1 "knative.dev/pkg/apis/duck/v1"
26
26
"knative.dev/pkg/kmeta"
27
27
pkgreconciler "knative.dev/pkg/reconciler"
28
28
29
+ "knative.dev/eventing/pkg/apis/feature"
30
+
29
31
"go.uber.org/zap"
30
32
v1 "k8s.io/api/core/v1"
31
33
apierrs "k8s.io/apimachinery/pkg/api/errors"
@@ -37,6 +39,14 @@ import (
37
39
"knative.dev/pkg/ptr"
38
40
)
39
41
42
+ const (
43
+ // OIDCLabelKey is used to filter out all the informers that related to OIDC work
44
+ OIDCLabelKey = "eventing.knative.dev/oidc"
45
+
46
+ // OIDCLabelSelector is the label selector for the OIDC resources
47
+ OIDCLabelSelector = OIDCLabelKey
48
+ )
49
+
40
50
// GetOIDCServiceAccountNameForResource returns the service account name to use
41
51
// for OIDC authentication for the given resource.
42
52
func GetOIDCServiceAccountNameForResource (gvk schema.GroupVersionKind , objectMeta metav1.ObjectMeta ) string {
@@ -76,28 +86,38 @@ func EnsureOIDCServiceAccountExistsForResource(ctx context.Context, serviceAccou
76
86
saName := GetOIDCServiceAccountNameForResource (gvk , objectMeta )
77
87
sa , err := serviceAccountLister .ServiceAccounts (objectMeta .Namespace ).Get (saName )
78
88
89
+ expected := GetOIDCServiceAccountForResource (gvk , objectMeta )
90
+
79
91
// If the resource doesn't exist, we'll create it.
80
92
if apierrs .IsNotFound (err ) {
81
93
logging .FromContext (ctx ).Debugw ("Creating OIDC service account" , zap .Error (err ))
82
94
83
- expected := GetOIDCServiceAccountForResource (gvk , objectMeta )
84
-
85
95
_ , err = kubeclient .CoreV1 ().ServiceAccounts (objectMeta .Namespace ).Create (ctx , expected , metav1.CreateOptions {})
86
96
if err != nil {
87
- return fmt .Errorf ("could not create OIDC service account %s/%s for %s: %w" , objectMeta .Name , objectMeta .Namespace , gvk .Kind , err )
97
+ return fmt .Errorf ("could not create OIDC service account %s/%s for %s: %w" , objectMeta .Namespace , objectMeta .Name , gvk .Kind , err )
88
98
}
89
99
90
100
return nil
91
101
}
92
-
93
102
if err != nil {
94
- return fmt .Errorf ("could not get OIDC service account %s/%s for %s: %w" , objectMeta .Name , objectMeta .Namespace , gvk .Kind , err )
103
+ return fmt .Errorf ("could not get OIDC service account %s/%s for %s: %w" , objectMeta .Namespace , objectMeta .Name , gvk .Kind , err )
95
104
}
96
-
97
105
if ! metav1 .IsControlledBy (& sa .ObjectMeta , & objectMeta ) {
98
106
return fmt .Errorf ("service account %s not owned by %s %s" , sa .Name , gvk .Kind , objectMeta .Name )
99
107
}
100
108
109
+ if ! equality .Semantic .DeepDerivative (expected , sa ) {
110
+ expected .ResourceVersion = sa .ResourceVersion
111
+
112
+ _ , err = kubeclient .CoreV1 ().ServiceAccounts (objectMeta .Namespace ).Update (ctx , expected , metav1.UpdateOptions {})
113
+ if err != nil {
114
+ return fmt .Errorf ("could not update OIDC service account %s/%s for %s: %w" , objectMeta .Namespace , objectMeta .Name , gvk .Kind , err )
115
+ }
116
+
117
+ return nil
118
+
119
+ }
120
+
101
121
return nil
102
122
}
103
123
0 commit comments