Skip to content

Commit 80bd498

Browse files
Merge pull request #1189 from petr-muller/ota-1531-04-extract-informer-factories
OTA-1531: [4/x] cvo: extract config informer creation
2 parents facd6a4 + 61ca445 commit 80bd498

File tree

2 files changed

+67
-43
lines changed

2 files changed

+67
-43
lines changed

pkg/start/start.go

Lines changed: 58 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,14 @@ import (
1313
"time"
1414

1515
"github.com/google/uuid"
16-
configlistersv1 "github.com/openshift/client-go/config/listers/config/v1"
1716
v1 "k8s.io/api/core/v1"
1817
apierrors "k8s.io/apimachinery/pkg/api/errors"
1918
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2019
"k8s.io/apimachinery/pkg/fields"
2120
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
2221
"k8s.io/apimachinery/pkg/util/sets"
2322
"k8s.io/apimachinery/pkg/util/wait"
24-
"k8s.io/client-go/informers"
23+
coreinformers "k8s.io/client-go/informers"
2524
"k8s.io/client-go/kubernetes"
2625
"k8s.io/client-go/kubernetes/scheme"
2726
coreclientsetv1 "k8s.io/client-go/kubernetes/typed/core/v1"
@@ -35,9 +34,10 @@ import (
3534

3635
configv1 "github.com/openshift/api/config/v1"
3736
clientset "github.com/openshift/client-go/config/clientset/versioned"
38-
"github.com/openshift/client-go/config/informers/externalversions"
37+
configinformers "github.com/openshift/client-go/config/informers/externalversions"
38+
configlistersv1 "github.com/openshift/client-go/config/listers/config/v1"
3939
operatorclientset "github.com/openshift/client-go/operator/clientset/versioned"
40-
operatorexternalversions "github.com/openshift/client-go/operator/informers/externalversions"
40+
operatorinformers "github.com/openshift/client-go/operator/informers/externalversions"
4141
"github.com/openshift/library-go/pkg/config/clusterstatus"
4242
libgoleaderelection "github.com/openshift/library-go/pkg/config/leaderelection"
4343

@@ -208,14 +208,16 @@ func (o *Options) Run(ctx context.Context) error {
208208
case err != nil:
209209
klog.Warningf("Failed to read release metadata to determine OCP version for this CVO (will use placeholder version %q): %v", cvoOcpVersion, err)
210210
case releaseMetadata.Version == "":
211-
klog.Warningf("Version missing from release metadata, cannot determine OCP version for this CVO (will use placeholder version %q): %v", cvoOcpVersion, err)
211+
klog.Warningf("Version missing from release metadata, cannot determine OCP version for this CVO (will use placeholder version %q)", cvoOcpVersion)
212212
default:
213213
cvoOcpVersion = releaseMetadata.Version
214214
klog.Infof("Determined OCP version for this CVO: %q", cvoOcpVersion)
215215
}
216216

217+
clusterVersionConfigInformerFactory, configInformerFactory := o.prepareConfigInformerFactories(cb)
218+
217219
// initialize the controllers and attempt to load the payload information
218-
controllerCtx, err := o.NewControllerContext(cb)
220+
controllerCtx, err := o.NewControllerContext(cb, clusterVersionConfigInformerFactory, configInformerFactory)
219221
if err != nil {
220222
return err
221223
}
@@ -224,6 +226,17 @@ func (o *Options) Run(ctx context.Context) error {
224226
return nil
225227
}
226228

229+
func (o *Options) prepareConfigInformerFactories(cb *ClientBuilder) (configinformers.SharedInformerFactory, configinformers.SharedInformerFactory) {
230+
client := cb.ClientOrDie("shared-informer")
231+
filterByName := func(opts *metav1.ListOptions) {
232+
opts.FieldSelector = fields.OneTermEqualSelector("metadata.name", o.Name).String()
233+
}
234+
clusterVersionConfigInformerFactory := configinformers.NewSharedInformerFactoryWithOptions(client, resyncPeriod(o.ResyncInterval), configinformers.WithTweakListOptions(filterByName))
235+
configInformerFactory := configinformers.NewSharedInformerFactory(client, resyncPeriod(o.ResyncInterval))
236+
237+
return clusterVersionConfigInformerFactory, configInformerFactory
238+
}
239+
227240
// run launches a number of goroutines to handle manifest application,
228241
// metrics serving, etc. It continues operating until ctx.Done(),
229242
// and then attempts a clean shutdown limited by an internal context
@@ -255,13 +268,13 @@ func (o *Options) run(ctx context.Context, controllerCtx *Context, lock resource
255268

256269
informersDone := postMainContext.Done()
257270
// FIXME: would be nice if there was a way to collect these.
258-
controllerCtx.CVInformerFactory.Start(informersDone)
271+
controllerCtx.ClusterVersionInformerFactory.Start(informersDone)
259272
controllerCtx.OpenshiftConfigInformerFactory.Start(informersDone)
260273
controllerCtx.OpenshiftConfigManagedInformerFactory.Start(informersDone)
261-
controllerCtx.InformerFactory.Start(informersDone)
274+
controllerCtx.ConfigInformerFactory.Start(informersDone)
262275
controllerCtx.OperatorInformerFactory.Start(informersDone)
263276

264-
allSynced := controllerCtx.CVInformerFactory.WaitForCacheSync(informersDone)
277+
allSynced := controllerCtx.ClusterVersionInformerFactory.WaitForCacheSync(informersDone)
265278
for _, synced := range allSynced {
266279
if !synced {
267280
klog.Fatalf("Caches never synchronized: %v", postMainContext.Err())
@@ -489,34 +502,39 @@ type Context struct {
489502
AutoUpdate *autoupdate.Controller
490503
StopOnFeatureGateChange *featuregates.ChangeStopper
491504

492-
CVInformerFactory externalversions.SharedInformerFactory
493-
OpenshiftConfigInformerFactory informers.SharedInformerFactory
494-
OpenshiftConfigManagedInformerFactory informers.SharedInformerFactory
495-
InformerFactory externalversions.SharedInformerFactory
496-
OperatorInformerFactory operatorexternalversions.SharedInformerFactory
505+
// ClusterVersionInformerFactory should be used to get informers / listers for code that works with ClusterVersion resource
506+
// singleton in the cluster.
507+
ClusterVersionInformerFactory configinformers.SharedInformerFactory
508+
// ConfigInformerFactory should be used to get informers / listers for code that works with resources from the
509+
// config.openshift.io group, _except_ the ClusterVersion resource singleton.
510+
ConfigInformerFactory configinformers.SharedInformerFactory
511+
// OpenshiftConfigManagedInformerFactory should be used to get informers / listers for code that works with core k8s
512+
// resources in the openshift-config namespace.
513+
OpenshiftConfigInformerFactory coreinformers.SharedInformerFactory
514+
// OpenshiftConfigManagedInformerFactory should be used to get informers / listers for code that works with core k8s
515+
// resources in the openshift-config-managed namespace.
516+
OpenshiftConfigManagedInformerFactory coreinformers.SharedInformerFactory
517+
// OperatorInformerFactory should be used to get informers / listers for code that works with resources from the
518+
// operator.openshift.io group
519+
OperatorInformerFactory operatorinformers.SharedInformerFactory
497520

498521
fgLister configlistersv1.FeatureGateLister
499522
}
500523

501524
// NewControllerContext initializes the default Context for the current Options. It does
502525
// not start any background processes.
503-
func (o *Options) NewControllerContext(cb *ClientBuilder) (*Context, error) {
504-
client := cb.ClientOrDie("shared-informer")
526+
func (o *Options) NewControllerContext(cb *ClientBuilder, clusterVersionConfigInformerFactory, configInformerFactory configinformers.SharedInformerFactory) (*Context, error) {
505527
kubeClient := cb.KubeClientOrDie(internal.ConfigNamespace, useProtobuf)
506-
operatorClient := cb.OperatorClientOrDie("operator-client")
528+
openshiftConfigInformerFactory := coreinformers.NewSharedInformerFactoryWithOptions(kubeClient, resyncPeriod(o.ResyncInterval), coreinformers.WithNamespace(internal.ConfigNamespace))
529+
openshiftConfigManagedInformerFactory := coreinformers.NewSharedInformerFactoryWithOptions(kubeClient, resyncPeriod(o.ResyncInterval), coreinformers.WithNamespace(internal.ConfigManagedNamespace))
507530

508-
cvInformer := externalversions.NewFilteredSharedInformerFactory(client, resyncPeriod(o.ResyncInterval), "", func(opts *metav1.ListOptions) {
509-
opts.FieldSelector = fmt.Sprintf("metadata.name=%s", o.Name)
510-
})
511-
openshiftConfigInformer := informers.NewSharedInformerFactoryWithOptions(kubeClient, resyncPeriod(o.ResyncInterval), informers.WithNamespace(internal.ConfigNamespace))
512-
openshiftConfigManagedInformer := informers.NewSharedInformerFactoryWithOptions(kubeClient, resyncPeriod(o.ResyncInterval), informers.WithNamespace(internal.ConfigManagedNamespace))
513-
sharedInformers := externalversions.NewSharedInformerFactory(client, resyncPeriod(o.ResyncInterval))
514-
operatorInformerFactory := operatorexternalversions.NewSharedInformerFactoryWithOptions(operatorClient, o.ResyncInterval,
515-
operatorexternalversions.WithTweakListOptions(func(opts *metav1.ListOptions) {
516-
opts.FieldSelector = fields.OneTermEqualSelector("metadata.name", configuration.ClusterVersionOperatorConfigurationName).String()
517-
}))
531+
operatorClient := cb.OperatorClientOrDie("operator-client")
532+
filterByName := func(opts *metav1.ListOptions) {
533+
opts.FieldSelector = fields.OneTermEqualSelector("metadata.name", configuration.ClusterVersionOperatorConfigurationName).String()
534+
}
535+
operatorInformerFactory := operatorinformers.NewSharedInformerFactoryWithOptions(operatorClient, o.ResyncInterval, operatorinformers.WithTweakListOptions(filterByName))
518536

519-
coInformer := sharedInformers.Config().V1().ClusterOperators()
537+
coInformer := configInformerFactory.Config().V1().ClusterOperators()
520538

521539
cvoKubeClient := cb.KubeClientOrDie(o.Namespace, useProtobuf)
522540
o.PromQLTarget.KubeClient = cvoKubeClient
@@ -527,11 +545,11 @@ func (o *Options) NewControllerContext(cb *ClientBuilder) (*Context, error) {
527545
o.ReleaseImage,
528546
o.PayloadOverride,
529547
resyncPeriod(o.ResyncInterval),
530-
cvInformer.Config().V1().ClusterVersions(),
548+
clusterVersionConfigInformerFactory.Config().V1().ClusterVersions(),
531549
coInformer,
532-
openshiftConfigInformer.Core().V1().ConfigMaps(),
533-
openshiftConfigManagedInformer.Core().V1().ConfigMaps(),
534-
sharedInformers.Config().V1().Proxies(),
550+
openshiftConfigInformerFactory.Core().V1().ConfigMaps(),
551+
openshiftConfigManagedInformerFactory.Core().V1().ConfigMaps(),
552+
configInformerFactory.Config().V1().Proxies(),
535553
operatorInformerFactory,
536554
cb.ClientOrDie(o.Namespace),
537555
cvoKubeClient,
@@ -548,28 +566,28 @@ func (o *Options) NewControllerContext(cb *ClientBuilder) (*Context, error) {
548566
return nil, err
549567
}
550568

551-
featureChangeStopper, err := featuregates.NewChangeStopper(sharedInformers.Config().V1().FeatureGates())
569+
featureChangeStopper, err := featuregates.NewChangeStopper(configInformerFactory.Config().V1().FeatureGates())
552570
if err != nil {
553571
return nil, err
554572
}
555573

556574
ctx := &Context{
557-
CVInformerFactory: cvInformer,
558-
OpenshiftConfigInformerFactory: openshiftConfigInformer,
559-
OpenshiftConfigManagedInformerFactory: openshiftConfigManagedInformer,
560-
InformerFactory: sharedInformers,
575+
ClusterVersionInformerFactory: clusterVersionConfigInformerFactory,
576+
ConfigInformerFactory: configInformerFactory,
577+
OpenshiftConfigInformerFactory: openshiftConfigInformerFactory,
578+
OpenshiftConfigManagedInformerFactory: openshiftConfigManagedInformerFactory,
561579
OperatorInformerFactory: operatorInformerFactory,
562580
CVO: cvo,
563581
StopOnFeatureGateChange: featureChangeStopper,
564582

565-
fgLister: sharedInformers.Config().V1().FeatureGates().Lister(),
583+
fgLister: configInformerFactory.Config().V1().FeatureGates().Lister(),
566584
}
567585

568586
if o.EnableAutoUpdate {
569587
ctx.AutoUpdate, err = autoupdate.New(
570588
o.Namespace, o.Name,
571-
cvInformer.Config().V1().ClusterVersions(),
572-
sharedInformers.Config().V1().ClusterOperators(),
589+
clusterVersionConfigInformerFactory.Config().V1().ClusterVersions(),
590+
configInformerFactory.Config().V1().ClusterOperators(),
573591
cb.ClientOrDie(o.Namespace),
574592
cb.KubeClientOrDie(o.Namespace),
575593
)

pkg/start/start_integration_test.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,9 @@ func TestIntegrationCVO_initializeAndUpgrade(t *testing.T) {
188188
if err := options.ValidateAndComplete(); err != nil {
189189
t.Fatalf("incorrectly initialized options: %v", err)
190190
}
191-
controllers, err := options.NewControllerContext(cb)
191+
192+
cvif, cif := options.prepareConfigInformerFactories(cb)
193+
controllers, err := options.NewControllerContext(cb, cvif, cif)
192194
if err != nil {
193195
t.Fatal(err)
194196
}
@@ -323,7 +325,9 @@ func TestIntegrationCVO_gracefulStepDown(t *testing.T) {
323325
if err := options.ValidateAndComplete(); err != nil {
324326
t.Fatalf("incorrectly initialized options: %v", err)
325327
}
326-
controllers, err := options.NewControllerContext(cb)
328+
329+
cvif, cif := options.prepareConfigInformerFactories(cb)
330+
controllers, err := options.NewControllerContext(cb, cvif, cif)
327331
if err != nil {
328332
t.Fatal(err)
329333
}
@@ -520,7 +524,9 @@ metadata:
520524
if err := options.ValidateAndComplete(); err != nil {
521525
t.Fatalf("incorrectly initialized options: %v", err)
522526
}
523-
controllers, err := options.NewControllerContext(cb)
527+
528+
cvif, cif := options.prepareConfigInformerFactories(cb)
529+
controllers, err := options.NewControllerContext(cb, cvif, cif)
524530
if err != nil {
525531
t.Fatal(err)
526532
}

0 commit comments

Comments
 (0)