Skip to content

Commit f3a7f05

Browse files
committed
expose RunOnce method on RequestHeaderAuthRequest controller
1 parent cb4b4cb commit f3a7f05

File tree

4 files changed

+52
-30
lines changed

4 files changed

+52
-30
lines changed

staging/src/k8s.io/apiserver/pkg/authentication/request/headerrequest/requestheader_controller.go

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ type RequestHeaderAuthRequestController struct {
6969
configmapName string
7070
configmapNamespace string
7171

72+
client kubernetes.Interface
7273
configmapLister corev1listers.ConfigMapNamespaceLister
7374
configmapInformer cache.SharedIndexInformer
7475
configmapInformerSynced cache.InformerSynced
@@ -89,10 +90,12 @@ func NewRequestHeaderAuthRequestController(
8990
cmName string,
9091
cmNamespace string,
9192
client kubernetes.Interface,
92-
usernameHeadersKey, groupHeadersKey, extraHeaderPrefixesKey, allowedClientNamesKey string) (*RequestHeaderAuthRequestController, error) {
93+
usernameHeadersKey, groupHeadersKey, extraHeaderPrefixesKey, allowedClientNamesKey string) *RequestHeaderAuthRequestController {
9394
c := &RequestHeaderAuthRequestController{
9495
name: "RequestHeaderAuthRequestController",
9596

97+
client: client,
98+
9699
configmapName: cmName,
97100
configmapNamespace: cmNamespace,
98101

@@ -104,11 +107,6 @@ func NewRequestHeaderAuthRequestController(
104107
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "RequestHeaderAuthRequestController"),
105108
}
106109

107-
// use the live client to prime the controller
108-
if err := c.syncOnce(client); err != nil {
109-
return nil, err
110-
}
111-
112110
// we construct our own informer because we need such a small subset of the information available. Just one namespace.
113111
c.configmapInformer = coreinformers.NewFilteredConfigMapInformer(client, c.configmapNamespace, 12*time.Hour, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, func(listOptions *metav1.ListOptions) {
114112
listOptions.FieldSelector = fields.OneTermEqualSelector("metadata.name", c.configmapName).String()
@@ -144,7 +142,7 @@ func NewRequestHeaderAuthRequestController(
144142
c.configmapLister = corev1listers.NewConfigMapLister(c.configmapInformer.GetIndexer()).ConfigMaps(c.configmapNamespace)
145143
c.configmapInformerSynced = c.configmapInformer.HasSynced
146144

147-
return c, nil
145+
return c
148146
}
149147

150148
func (c *RequestHeaderAuthRequestController) UsernameHeaders() []string {
@@ -184,6 +182,24 @@ func (c *RequestHeaderAuthRequestController) Run(workers int, stopCh <-chan stru
184182
<-stopCh
185183
}
186184

185+
// // RunOnce runs a single sync loop
186+
func (c *RequestHeaderAuthRequestController) RunOnce() error {
187+
configMap, err := c.client.CoreV1().ConfigMaps(c.configmapNamespace).Get(context.TODO(), c.configmapName, metav1.GetOptions{})
188+
switch {
189+
case errors.IsNotFound(err):
190+
// ignore, authConfigMap is nil now
191+
return nil
192+
case errors.IsForbidden(err):
193+
klog.Warningf("Unable to get configmap/%s in %s. Usually fixed by "+
194+
"'kubectl create rolebinding -n %s ROLEBINDING_NAME --role=%s --serviceaccount=YOUR_NS:YOUR_SA'",
195+
c.configmapName, c.configmapNamespace, c.configmapNamespace, authenticationRoleName)
196+
return err
197+
case err != nil:
198+
return err
199+
}
200+
return c.syncConfigMap(configMap)
201+
}
202+
187203
func (c *RequestHeaderAuthRequestController) runWorker() {
188204
for c.processNextWorkItem() {
189205
}
@@ -208,23 +224,6 @@ func (c *RequestHeaderAuthRequestController) processNextWorkItem() bool {
208224
return true
209225
}
210226

211-
func (c *RequestHeaderAuthRequestController) syncOnce(client kubernetes.Interface) error {
212-
configMap, err := client.CoreV1().ConfigMaps(c.configmapNamespace).Get(context.TODO(), c.configmapName, metav1.GetOptions{})
213-
switch {
214-
case errors.IsNotFound(err):
215-
// ignore, authConfigMap is nil now
216-
return nil
217-
case errors.IsForbidden(err):
218-
klog.Warningf("Unable to get configmap/%s in %s. Usually fixed by "+
219-
"'kubectl create rolebinding -n %s ROLEBINDING_NAME --role=%s --serviceaccount=YOUR_NS:YOUR_SA'",
220-
c.configmapName, c.configmapNamespace, c.configmapNamespace, authenticationRoleName)
221-
return err
222-
case err != nil:
223-
return err
224-
}
225-
return c.syncConfigMap(configMap)
226-
}
227-
228227
// sync reads the config and propagates the changes to exportedRequestHeaderBundle
229228
// which is exposed by the set of methods that are used to fill RequestHeaderConfig struct
230229
func (c *RequestHeaderAuthRequestController) sync() error {

staging/src/k8s.io/apiserver/pkg/authentication/request/headerrequest/requestheader_controller_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,10 @@ func TestRequestHeaderAuthRequestControllerSyncOnce(t *testing.T) {
218218
// test data
219219
target := newDefaultTarget()
220220
fakeKubeClient := fake.NewSimpleClientset(scenario.cm)
221+
target.client = fakeKubeClient
221222

222223
// act
223-
err := target.syncOnce(fakeKubeClient)
224+
err := target.RunOnce()
224225

225226
if err != nil && !scenario.expectErr {
226227
t.Errorf("got unexpected error %v", err)

staging/src/k8s.io/apiserver/pkg/server/options/authentication.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,11 @@ func (s *DelegatingAuthenticationOptions) createRequestHeaderConfig(client kuber
335335
return nil, fmt.Errorf("unable to create request header authentication config: %v", err)
336336
}
337337

338+
// look up authentication configuration in the cluster and in case of an err defer to authentication-tolerate-lookup-failure flag
339+
if err := dynamicRequestHeaderProvider.RunOnce(); err != nil {
340+
return nil, err
341+
}
342+
338343
return &authenticatorfactory.RequestHeaderConfig{
339344
CAContentProvider: dynamicRequestHeaderProvider,
340345
UsernameHeaders: headerrequest.StringSliceProvider(headerrequest.StringSliceProviderFunc(dynamicRequestHeaderProvider.UsernameHeaders)),

staging/src/k8s.io/apiserver/pkg/server/options/authentication_dynamic_request_header.go

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,25 @@
1+
/*
2+
Copyright 2020 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
117
package options
218

319
import (
420
"fmt"
521

22+
"k8s.io/apimachinery/pkg/util/errors"
623
"k8s.io/apiserver/pkg/authentication/request/headerrequest"
724
"k8s.io/apiserver/pkg/server/dynamiccertificates"
825
"k8s.io/client-go/kubernetes"
@@ -33,7 +50,7 @@ func newDynamicRequestHeaderController(client kubernetes.Interface) (*DynamicReq
3350
return nil, fmt.Errorf("unable to create DynamicCAFromConfigMap controller: %v", err)
3451
}
3552

36-
requestHeaderAuthRequestController, err := headerrequest.NewRequestHeaderAuthRequestController(
53+
requestHeaderAuthRequestController := headerrequest.NewRequestHeaderAuthRequestController(
3754
authenticationConfigMapName,
3855
authenticationConfigMapNamespace,
3956
client,
@@ -42,17 +59,17 @@ func newDynamicRequestHeaderController(client kubernetes.Interface) (*DynamicReq
4259
"requestheader-extra-headers-prefix",
4360
"requestheader-allowed-names",
4461
)
45-
if err != nil {
46-
return nil, fmt.Errorf("unable to create RequestHeaderAuthRequest controller: %v", err)
47-
}
4862
return &DynamicRequestHeaderController{
4963
ConfigMapCAController: requestHeaderCAController,
5064
RequestHeaderAuthRequestController: requestHeaderAuthRequestController,
5165
}, nil
5266
}
5367

5468
func (c *DynamicRequestHeaderController) RunOnce() error {
55-
return c.ConfigMapCAController.RunOnce()
69+
errs := []error{}
70+
errs = append(errs, c.ConfigMapCAController.RunOnce())
71+
errs = append(errs, c.RequestHeaderAuthRequestController.RunOnce())
72+
return errors.NewAggregate(errs)
5673
}
5774

5875
func (c *DynamicRequestHeaderController) Run(workers int, stopCh <-chan struct{}) {

0 commit comments

Comments
 (0)