Skip to content

Commit 4638ba9

Browse files
committed
client-go/tools/cache: add APIs with context parameter
The context is used for cancellation and to support contextual logging. In most cases, alternative *WithContext APIs get added, except for NewIntegerResourceVersionMutationCache where code searches indicate that the API is not used downstream. An API break around SharedInformer couldn't be avoided because the alternative (keeping the interface unchanged and adding a second one with the new method) would have been worse. controller-runtime needs to be updated because it implements that interface in a test package. Downstream consumers of controller-runtime will work unless they use those test package. Converting Kubernetes to use the other new alternatives will follow. In the meantime, usage of the new alternatives cannot be enforced via logcheck yet (see kubernetes#126379 for the process). Passing context through and checking it for cancellation is tricky for event handlers. A better approach is to map the context cancellation to the normal removal of an event handler via a helper goroutine. Thanks to the new HandleErrorWithLogr and HandleCrashWithLogr, remembering the logger is sufficient for handling problems at runtime.
1 parent 0ba4373 commit 4638ba9

File tree

29 files changed

+854
-344
lines changed

29 files changed

+854
-344
lines changed

cmd/kube-controller-manager/app/controllermanager.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -805,6 +805,7 @@ func startServiceAccountTokenController(ctx context.Context, controllerContext C
805805
return nil, false, fmt.Errorf("failed to build token generator: %v", err)
806806
}
807807
tokenController, err := serviceaccountcontroller.NewTokensController(
808+
logger,
808809
controllerContext.InformerFactory.Core().V1().ServiceAccounts(),
809810
controllerContext.InformerFactory.Core().V1().Secrets(),
810811
rootClientBuilder.ClientOrDie("tokens-controller"),

hack/golangci-hints.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ linters-settings: # please keep this alphabetized
143143
contextual k8s.io/api/.*
144144
contextual k8s.io/apimachinery/pkg/util/runtime/.*
145145
contextual k8s.io/client-go/metadata/.*
146+
contextual k8s.io/client-go/tools/cache/.*
146147
contextual k8s.io/client-go/tools/events/.*
147148
contextual k8s.io/client-go/tools/record/.*
148149
contextual k8s.io/component-helpers/.*

hack/golangci-strict.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ linters-settings: # please keep this alphabetized
189189
contextual k8s.io/api/.*
190190
contextual k8s.io/apimachinery/pkg/util/runtime/.*
191191
contextual k8s.io/client-go/metadata/.*
192+
contextual k8s.io/client-go/tools/cache/.*
192193
contextual k8s.io/client-go/tools/events/.*
193194
contextual k8s.io/client-go/tools/record/.*
194195
contextual k8s.io/component-helpers/.*

hack/golangci.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ linters-settings: # please keep this alphabetized
191191
contextual k8s.io/api/.*
192192
contextual k8s.io/apimachinery/pkg/util/runtime/.*
193193
contextual k8s.io/client-go/metadata/.*
194+
contextual k8s.io/client-go/tools/cache/.*
194195
contextual k8s.io/client-go/tools/events/.*
195196
contextual k8s.io/client-go/tools/record/.*
196197
contextual k8s.io/component-helpers/.*

hack/logcheck.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ structured k8s.io/apiserver/pkg/server/options/encryptionconfig/.*
2727
contextual k8s.io/api/.*
2828
contextual k8s.io/apimachinery/pkg/util/runtime/.*
2929
contextual k8s.io/client-go/metadata/.*
30+
contextual k8s.io/client-go/tools/cache/.*
3031
contextual k8s.io/client-go/tools/events/.*
3132
contextual k8s.io/client-go/tools/record/.*
3233
contextual k8s.io/component-helpers/.*

pkg/controller/resourceclaim/controller.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ func NewController(
146146

147147
metrics.RegisterMetrics()
148148

149-
if _, err := podInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
149+
if _, err := podInformer.Informer().AddEventHandlerWithOptions(cache.ResourceEventHandlerFuncs{
150150
AddFunc: func(obj interface{}) {
151151
ec.enqueuePod(logger, obj, false)
152152
},
@@ -156,10 +156,10 @@ func NewController(
156156
DeleteFunc: func(obj interface{}) {
157157
ec.enqueuePod(logger, obj, true)
158158
},
159-
}); err != nil {
159+
}, cache.HandlerOptions{Logger: &logger}); err != nil {
160160
return nil, err
161161
}
162-
if _, err := claimInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
162+
if _, err := claimInformer.Informer().AddEventHandlerWithOptions(cache.ResourceEventHandlerFuncs{
163163
AddFunc: func(obj interface{}) {
164164
logger.V(6).Info("new claim", "claimDump", obj)
165165
ec.enqueueResourceClaim(logger, nil, obj)
@@ -172,7 +172,7 @@ func NewController(
172172
logger.V(6).Info("deleted claim", "claimDump", obj)
173173
ec.enqueueResourceClaim(logger, obj, nil)
174174
},
175-
}); err != nil {
175+
}, cache.HandlerOptions{Logger: &logger}); err != nil {
176176
return nil, err
177177
}
178178
if err := ec.podIndexer.AddIndexers(cache.Indexers{podResourceClaimIndex: podResourceClaimIndexFunc}); err != nil {
@@ -190,7 +190,7 @@ func NewController(
190190
if err := claimInformerCache.AddIndexers(cache.Indexers{claimPodOwnerIndex: claimPodOwnerIndexFunc}); err != nil {
191191
return nil, fmt.Errorf("could not initialize ResourceClaim controller: %w", err)
192192
}
193-
ec.claimCache = cache.NewIntegerResourceVersionMutationCache(claimInformerCache, claimInformerCache,
193+
ec.claimCache = cache.NewIntegerResourceVersionMutationCache(logger, claimInformerCache, claimInformerCache,
194194
// Very long time to live, unlikely to be needed because
195195
// the informer cache should get updated soon.
196196
time.Hour,

pkg/controller/serviceaccount/tokens_controller.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ type TokensControllerOptions struct {
6969
}
7070

7171
// NewTokensController returns a new *TokensController.
72-
func NewTokensController(serviceAccounts informers.ServiceAccountInformer, secrets informers.SecretInformer, cl clientset.Interface, options TokensControllerOptions) (*TokensController, error) {
72+
func NewTokensController(logger klog.Logger, serviceAccounts informers.ServiceAccountInformer, secrets informers.SecretInformer, cl clientset.Interface, options TokensControllerOptions) (*TokensController, error) {
7373
maxRetries := options.MaxRetries
7474
if maxRetries == 0 {
7575
maxRetries = 10
@@ -104,9 +104,9 @@ func NewTokensController(serviceAccounts informers.ServiceAccountInformer, secre
104104
)
105105

106106
secretCache := secrets.Informer().GetIndexer()
107-
e.updatedSecrets = cache.NewIntegerResourceVersionMutationCache(secretCache, secretCache, 60*time.Second, true)
107+
e.updatedSecrets = cache.NewIntegerResourceVersionMutationCache(logger, secretCache, secretCache, 60*time.Second, true)
108108
e.secretSynced = secrets.Informer().HasSynced
109-
secrets.Informer().AddEventHandlerWithResyncPeriod(
109+
secrets.Informer().AddEventHandlerWithOptions(
110110
cache.FilteringResourceEventHandler{
111111
FilterFunc: func(obj interface{}) bool {
112112
switch t := obj.(type) {
@@ -123,7 +123,10 @@ func NewTokensController(serviceAccounts informers.ServiceAccountInformer, secre
123123
DeleteFunc: e.queueSecretSync,
124124
},
125125
},
126-
options.SecretResync,
126+
cache.HandlerOptions{
127+
Logger: &logger,
128+
ResyncPeriod: &options.SecretResync,
129+
},
127130
)
128131

129132
return e, nil

pkg/controller/serviceaccount/tokens_controller_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ func TestTokenCreation(t *testing.T) {
440440

441441
for k, tc := range testcases {
442442
t.Run(k, func(t *testing.T) {
443-
_, ctx := ktesting.NewTestContext(t)
443+
logger, ctx := ktesting.NewTestContext(t)
444444

445445
// Re-seed to reset name generation
446446
utilrand.Seed(1)
@@ -455,7 +455,7 @@ func TestTokenCreation(t *testing.T) {
455455
secretInformer := informers.Core().V1().Secrets().Informer()
456456
secrets := secretInformer.GetStore()
457457
serviceAccounts := informers.Core().V1().ServiceAccounts().Informer().GetStore()
458-
controller, err := NewTokensController(informers.Core().V1().ServiceAccounts(), informers.Core().V1().Secrets(), client, TokensControllerOptions{TokenGenerator: generator, RootCA: []byte("CA Data"), MaxRetries: tc.MaxRetries})
458+
controller, err := NewTokensController(logger, informers.Core().V1().ServiceAccounts(), informers.Core().V1().Secrets(), client, TokensControllerOptions{TokenGenerator: generator, RootCA: []byte("CA Data"), MaxRetries: tc.MaxRetries})
459459
if err != nil {
460460
t.Fatalf("error creating Tokens controller: %v", err)
461461
}

staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import (
4747
genericapiserver "k8s.io/apiserver/pkg/server"
4848
serverstorage "k8s.io/apiserver/pkg/server/storage"
4949
"k8s.io/apiserver/pkg/util/webhook"
50+
"k8s.io/klog/v2"
5051
)
5152

5253
var (
@@ -210,7 +211,7 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget)
210211
aggregatedDiscoveryManager = aggregatedDiscoveryManager.WithSource(aggregated.CRDSource)
211212
}
212213
discoveryController := NewDiscoveryController(s.Informers.Apiextensions().V1().CustomResourceDefinitions(), versionDiscoveryHandler, groupDiscoveryHandler, aggregatedDiscoveryManager)
213-
namingController := status.NewNamingConditionController(s.Informers.Apiextensions().V1().CustomResourceDefinitions(), crdClient.ApiextensionsV1())
214+
namingController := status.NewNamingConditionController(klog.TODO() /* for contextual logging */, s.Informers.Apiextensions().V1().CustomResourceDefinitions(), crdClient.ApiextensionsV1())
214215
nonStructuralSchemaController := nonstructuralschema.NewConditionController(s.Informers.Apiextensions().V1().CustomResourceDefinitions(), crdClient.ApiextensionsV1())
215216
apiApprovalController := apiapproval.NewKubernetesAPIApprovalPolicyConformantConditionController(s.Informers.Apiextensions().V1().CustomResourceDefinitions(), crdClient.ApiextensionsV1())
216217
finalizingController := finalizer.NewCRDFinalizer(

staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ type NamingConditionController struct {
6262
}
6363

6464
func NewNamingConditionController(
65+
logger klog.Logger,
6566
crdInformer informers.CustomResourceDefinitionInformer,
6667
crdClient client.CustomResourceDefinitionsGetter,
6768
) *NamingConditionController {
@@ -76,13 +77,17 @@ func NewNamingConditionController(
7677
}
7778

7879
informerIndexer := crdInformer.Informer().GetIndexer()
79-
c.crdMutationCache = cache.NewIntegerResourceVersionMutationCache(informerIndexer, informerIndexer, 60*time.Second, false)
80+
c.crdMutationCache = cache.NewIntegerResourceVersionMutationCache(logger, informerIndexer, informerIndexer, 60*time.Second, false)
8081

81-
crdInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
82+
crdInformer.Informer().AddEventHandlerWithOptions(cache.ResourceEventHandlerFuncs{
8283
AddFunc: c.addCustomResourceDefinition,
8384
UpdateFunc: c.updateCustomResourceDefinition,
8485
DeleteFunc: c.deleteCustomResourceDefinition,
85-
})
86+
},
87+
cache.HandlerOptions{
88+
Logger: &logger,
89+
},
90+
)
8691

8792
c.syncFn = c.sync
8893

0 commit comments

Comments
 (0)