@@ -67,11 +67,12 @@ type WebhookAuthorizer struct {
6767 retryBackoff wait.Backoff
6868 decisionOnError authorizer.Decision
6969 metrics AuthorizerMetrics
70+ cluster string
7071}
7172
7273// NewFromInterface creates a WebhookAuthorizer using the given subjectAccessReview client
73- func NewFromInterface (subjectAccessReview authorizationv1client.AuthorizationV1Interface , authorizedTTL , unauthorizedTTL time.Duration , retryBackoff wait.Backoff , metrics AuthorizerMetrics ) (* WebhookAuthorizer , error ) {
74- return newWithBackoff (& subjectAccessReviewV1Client {subjectAccessReview .RESTClient ()}, authorizedTTL , unauthorizedTTL , retryBackoff , metrics )
74+ func NewFromInterface (subjectAccessReview authorizationv1client.AuthorizationV1Interface , authorizedTTL , unauthorizedTTL time.Duration , retryBackoff wait.Backoff , metrics AuthorizerMetrics , cluster string ) (* WebhookAuthorizer , error ) {
75+ return newWithBackoff (& subjectAccessReviewV1Client {subjectAccessReview .RESTClient (), cluster }, authorizedTTL , unauthorizedTTL , retryBackoff , metrics , cluster )
7576}
7677
7778// New creates a new WebhookAuthorizer from the provided kubeconfig file.
@@ -93,19 +94,19 @@ func NewFromInterface(subjectAccessReview authorizationv1client.AuthorizationV1I
9394//
9495// For additional HTTP configuration, refer to the kubeconfig documentation
9596// https://kubernetes.io/docs/user-guide/kubeconfig-file/.
96- func New (kubeConfigFile string , version string , authorizedTTL , unauthorizedTTL time.Duration , retryBackoff wait.Backoff , customDial utilnet.DialFunc ) (* WebhookAuthorizer , error ) {
97- subjectAccessReview , err := subjectAccessReviewInterfaceFromKubeconfig (kubeConfigFile , version , retryBackoff , customDial )
97+ func New (kubeConfigFile , version , cluster string , authorizedTTL , unauthorizedTTL time.Duration , retryBackoff wait.Backoff , customDial utilnet.DialFunc ) (* WebhookAuthorizer , error ) {
98+ subjectAccessReview , err := subjectAccessReviewInterfaceFromKubeconfig (kubeConfigFile , version , cluster , retryBackoff , customDial )
9899 if err != nil {
99100 return nil , err
100101 }
101102 return newWithBackoff (subjectAccessReview , authorizedTTL , unauthorizedTTL , retryBackoff , AuthorizerMetrics {
102103 RecordRequestTotal : noopMetrics {}.RecordRequestTotal ,
103104 RecordRequestLatency : noopMetrics {}.RecordRequestLatency ,
104- })
105+ }, cluster )
105106}
106107
107108// newWithBackoff allows tests to skip the sleep.
108- func newWithBackoff (subjectAccessReview subjectAccessReviewer , authorizedTTL , unauthorizedTTL time.Duration , retryBackoff wait.Backoff , metrics AuthorizerMetrics ) (* WebhookAuthorizer , error ) {
109+ func newWithBackoff (subjectAccessReview subjectAccessReviewer , authorizedTTL , unauthorizedTTL time.Duration , retryBackoff wait.Backoff , metrics AuthorizerMetrics , cluster string ) (* WebhookAuthorizer , error ) {
109110 return & WebhookAuthorizer {
110111 subjectAccessReview : subjectAccessReview ,
111112 responseCache : cache .NewLRUExpireCache (8192 ),
@@ -114,6 +115,7 @@ func newWithBackoff(subjectAccessReview subjectAccessReviewer, authorizedTTL, un
114115 retryBackoff : retryBackoff ,
115116 decisionOnError : authorizer .DecisionNoOpinion ,
116117 metrics : metrics ,
118+ cluster : cluster ,
117119 }, nil
118120}
119121
@@ -272,7 +274,7 @@ func convertToSARExtra(extra map[string][]string) map[string]authorizationv1.Ext
272274// subjectAccessReviewInterfaceFromKubeconfig builds a client from the specified kubeconfig file,
273275// and returns a SubjectAccessReviewInterface that uses that client. Note that the client submits SubjectAccessReview
274276// requests to the exact path specified in the kubeconfig file, so arbitrary non-API servers can be targeted.
275- func subjectAccessReviewInterfaceFromKubeconfig (kubeConfigFile string , version string , retryBackoff wait.Backoff , customDial utilnet.DialFunc ) (subjectAccessReviewer , error ) {
277+ func subjectAccessReviewInterfaceFromKubeconfig (kubeConfigFile , version , cluster string , retryBackoff wait.Backoff , customDial utilnet.DialFunc ) (subjectAccessReviewer , error ) {
276278 localScheme := runtime .NewScheme ()
277279 if err := scheme .AddToScheme (localScheme ); err != nil {
278280 return nil , err
@@ -288,7 +290,7 @@ func subjectAccessReviewInterfaceFromKubeconfig(kubeConfigFile string, version s
288290 if err != nil {
289291 return nil , err
290292 }
291- return & subjectAccessReviewV1ClientGW {gw .RestClient }, nil
293+ return & subjectAccessReviewV1ClientGW {gw .RestClient , cluster }, nil
292294
293295 case authorizationv1beta1 .SchemeGroupVersion .Version :
294296 groupVersions := []schema.GroupVersion {authorizationv1beta1 .SchemeGroupVersion }
@@ -299,7 +301,7 @@ func subjectAccessReviewInterfaceFromKubeconfig(kubeConfigFile string, version s
299301 if err != nil {
300302 return nil , err
301303 }
302- return & subjectAccessReviewV1beta1ClientGW {gw .RestClient }, nil
304+ return & subjectAccessReviewV1beta1ClientGW {gw .RestClient , cluster }, nil
303305
304306 default :
305307 return nil , fmt .Errorf (
@@ -312,13 +314,15 @@ func subjectAccessReviewInterfaceFromKubeconfig(kubeConfigFile string, version s
312314}
313315
314316type subjectAccessReviewV1Client struct {
315- client rest.Interface
317+ client rest.Interface
318+ cluster string
316319}
317320
318321func (t * subjectAccessReviewV1Client ) Create (ctx context.Context , subjectAccessReview * authorizationv1.SubjectAccessReview , opts metav1.CreateOptions ) (result * authorizationv1.SubjectAccessReview , statusCode int , err error ) {
319322 result = & authorizationv1.SubjectAccessReview {}
320323
321324 restResult := t .client .Post ().
325+ Cluster (t .cluster ).
322326 Resource ("subjectaccessreviews" ).
323327 VersionedParams (& opts , scheme .ParameterCodec ).
324328 Body (subjectAccessReview ).
@@ -331,14 +335,15 @@ func (t *subjectAccessReviewV1Client) Create(ctx context.Context, subjectAccessR
331335
332336// subjectAccessReviewV1ClientGW used by the generic webhook, doesn't specify GVR.
333337type subjectAccessReviewV1ClientGW struct {
334- client rest.Interface
338+ client rest.Interface
339+ cluster string
335340}
336341
337342func (t * subjectAccessReviewV1ClientGW ) Create (ctx context.Context , subjectAccessReview * authorizationv1.SubjectAccessReview , _ metav1.CreateOptions ) (* authorizationv1.SubjectAccessReview , int , error ) {
338343 var statusCode int
339344 result := & authorizationv1.SubjectAccessReview {}
340345
341- restResult := t .client .Post ().Body (subjectAccessReview ).Do (ctx )
346+ restResult := t .client .Post ().Cluster ( t . cluster ). Body (subjectAccessReview ).Do (ctx )
342347
343348 restResult .StatusCode (& statusCode )
344349 err := restResult .Into (result )
@@ -348,15 +353,16 @@ func (t *subjectAccessReviewV1ClientGW) Create(ctx context.Context, subjectAcces
348353
349354// subjectAccessReviewV1beta1ClientGW used by the generic webhook, doesn't specify GVR.
350355type subjectAccessReviewV1beta1ClientGW struct {
351- client rest.Interface
356+ client rest.Interface
357+ cluster string
352358}
353359
354360func (t * subjectAccessReviewV1beta1ClientGW ) Create (ctx context.Context , subjectAccessReview * authorizationv1.SubjectAccessReview , _ metav1.CreateOptions ) (* authorizationv1.SubjectAccessReview , int , error ) {
355361 var statusCode int
356362 v1beta1Review := & authorizationv1beta1.SubjectAccessReview {Spec : v1SpecToV1beta1Spec (& subjectAccessReview .Spec )}
357363 v1beta1Result := & authorizationv1beta1.SubjectAccessReview {}
358364
359- restResult := t .client .Post ().Body (v1beta1Review ).Do (ctx )
365+ restResult := t .client .Post ().Cluster ( t . cluster ). Body (v1beta1Review ).Do (ctx )
360366
361367 restResult .StatusCode (& statusCode )
362368 err := restResult .Into (v1beta1Result )
0 commit comments