@@ -21,11 +21,13 @@ import (
2121 "fmt"
2222 "strings"
2323
24- "knative.dev/eventing /pkg/apis/feature "
24+ "k8s.io/apimachinery /pkg/api/equality "
2525 duckv1 "knative.dev/pkg/apis/duck/v1"
2626 "knative.dev/pkg/kmeta"
2727 pkgreconciler "knative.dev/pkg/reconciler"
2828
29+ "knative.dev/eventing/pkg/apis/feature"
30+
2931 "go.uber.org/zap"
3032 v1 "k8s.io/api/core/v1"
3133 apierrs "k8s.io/apimachinery/pkg/api/errors"
@@ -37,6 +39,14 @@ import (
3739 "knative.dev/pkg/ptr"
3840)
3941
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+
4050// GetOIDCServiceAccountNameForResource returns the service account name to use
4151// for OIDC authentication for the given resource.
4252func GetOIDCServiceAccountNameForResource (gvk schema.GroupVersionKind , objectMeta metav1.ObjectMeta ) string {
@@ -76,28 +86,38 @@ func EnsureOIDCServiceAccountExistsForResource(ctx context.Context, serviceAccou
7686 saName := GetOIDCServiceAccountNameForResource (gvk , objectMeta )
7787 sa , err := serviceAccountLister .ServiceAccounts (objectMeta .Namespace ).Get (saName )
7888
89+ expected := GetOIDCServiceAccountForResource (gvk , objectMeta )
90+
7991 // If the resource doesn't exist, we'll create it.
8092 if apierrs .IsNotFound (err ) {
8193 logging .FromContext (ctx ).Debugw ("Creating OIDC service account" , zap .Error (err ))
8294
83- expected := GetOIDCServiceAccountForResource (gvk , objectMeta )
84-
8595 _ , err = kubeclient .CoreV1 ().ServiceAccounts (objectMeta .Namespace ).Create (ctx , expected , metav1.CreateOptions {})
8696 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 )
8898 }
8999
90100 return nil
91101 }
92-
93102 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 )
95104 }
96-
97105 if ! metav1 .IsControlledBy (& sa .ObjectMeta , & objectMeta ) {
98106 return fmt .Errorf ("service account %s not owned by %s %s" , sa .Name , gvk .Kind , objectMeta .Name )
99107 }
100108
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+
101121 return nil
102122}
103123
0 commit comments