@@ -26,11 +26,15 @@ import (
26
26
corev1 "k8s.io/api/core/v1"
27
27
apierrors "k8s.io/apimachinery/pkg/api/errors"
28
28
"k8s.io/apimachinery/pkg/api/resource"
29
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
30
+ "k8s.io/apimachinery/pkg/labels"
31
+ "k8s.io/apimachinery/pkg/selection"
29
32
"k8s.io/client-go/discovery"
30
33
"k8s.io/client-go/kubernetes"
31
34
"k8s.io/client-go/kubernetes/scheme"
32
35
clientv1 "k8s.io/client-go/kubernetes/typed/core/v1"
33
36
"k8s.io/client-go/metadata"
37
+ "k8s.io/client-go/metadata/metadatainformer"
34
38
"k8s.io/client-go/rest"
35
39
"k8s.io/client-go/tools/clientcmd"
36
40
"k8s.io/client-go/tools/record"
@@ -44,6 +48,7 @@ import (
44
48
"github.com/cert-manager/cert-manager/internal/controller/feature"
45
49
internalinformers "github.com/cert-manager/cert-manager/internal/informers"
46
50
"github.com/cert-manager/cert-manager/pkg/acme/accounts"
51
+ cmacme "github.com/cert-manager/cert-manager/pkg/apis/acme/v1"
47
52
clientset "github.com/cert-manager/cert-manager/pkg/client/clientset/versioned"
48
53
cmscheme "github.com/cert-manager/cert-manager/pkg/client/clientset/versioned/scheme"
49
54
informers "github.com/cert-manager/cert-manager/pkg/client/informers/externalversions"
@@ -84,6 +89,8 @@ type Context struct {
84
89
CMClient clientset.Interface
85
90
// GWClient is a GatewayAPI clientset.
86
91
GWClient gwclient.Interface
92
+ // MetadataClient is a PartialObjectMetadata client
93
+ MetadataClient metadata.Interface
87
94
// DiscoveryClient is a discovery interface. Usually set to Client.Discovery unless a fake client is in use.
88
95
DiscoveryClient discovery.DiscoveryInterface
89
96
@@ -98,6 +105,10 @@ type Context struct {
98
105
// instances for cert-manager.io types
99
106
SharedInformerFactory informers.SharedInformerFactory
100
107
108
+ // MetadataInformerFactory can be used to start partial metadata
109
+ // informers
110
+ MetadataInformerFactory metadatainformer.SharedInformerFactory
111
+
101
112
// GWShared can be used to obtain SharedIndexInformer instances for
102
113
// gateway.networking.k8s.io types
103
114
GWShared gwinformers.SharedInformerFactory
@@ -273,6 +284,20 @@ func NewContextFactory(ctx context.Context, opts ContextOptions) (*ContextFactor
273
284
} else {
274
285
kubeSharedInformerFactory = internalinformers .NewBaseKubeInformerFactory (clients .kubeClient , resyncPeriod , opts .Namespace )
275
286
}
287
+ r , err := labels .NewRequirement (cmacme .DomainLabelKey , selection .Exists , nil )
288
+ if err != nil {
289
+ panic (fmt .Errorf ("internal error: failed to build label selector to filter HTTP-01 challenge resources: %w" , err ))
290
+ }
291
+ isHTTP01ChallengeResourceLabelSelector := labels .NewSelector ().Add (* r )
292
+ metadataInformerFactory := metadatainformer .NewFilteredSharedInformerFactory (clients .metadataOnlyClient , resyncPeriod , opts .Namespace , func (listOptions * metav1.ListOptions ) {
293
+ // metadataInformersFactory is at the moment only used for pods
294
+ // and services for http-01 challenge which can be identified by
295
+ // the same label keys, so it is okay to set the label selector
296
+ // here. If we start using it for other resources then we'll
297
+ // have to set the selectors on individual informers instead.
298
+ listOptions .LabelSelector = isHTTP01ChallengeResourceLabelSelector .String ()
299
+
300
+ })
276
301
277
302
gwSharedInformerFactory := gwinformers .NewSharedInformerFactoryWithOptions (clients .gwClient , resyncPeriod , gwinformers .WithNamespace (opts .Namespace ))
278
303
@@ -286,6 +311,7 @@ func NewContextFactory(ctx context.Context, opts ContextOptions) (*ContextFactor
286
311
SharedInformerFactory : sharedInformerFactory ,
287
312
GWShared : gwSharedInformerFactory ,
288
313
GatewaySolverEnabled : clients .gatewayAvailable ,
314
+ MetadataInformerFactory : metadataInformerFactory ,
289
315
ContextOptions : opts ,
290
316
},
291
317
}, nil
0 commit comments