Skip to content

Commit fb5fb69

Browse files
AGENT-1570: Remove all NoRegistryClusterInstall feature gate check
The InternalReleaseImage(IRI) functionality will now be always active instead of being gated behind a feature flag
1 parent dcb37f6 commit fb5fb69

12 files changed

Lines changed: 69 additions & 241 deletions

File tree

cmd/machine-config-controller/start.go

Lines changed: 18 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import (
88
"path"
99
"time"
1010

11-
features "github.com/openshift/api/features"
12-
mcfginformersv1 "github.com/openshift/client-go/machineconfiguration/informers/externalversions/machineconfiguration/v1"
1311
"github.com/openshift/machine-config-operator/cmd/common"
1412
"github.com/openshift/machine-config-operator/internal/clients"
1513
bootimagecontroller "github.com/openshift/machine-config-operator/pkg/controller/bootimage"
@@ -29,7 +27,6 @@ import (
2927
"github.com/openshift/machine-config-operator/pkg/version"
3028
"github.com/spf13/cobra"
3129
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
32-
coreinformersv1 "k8s.io/client-go/informers/core/v1"
3330
"k8s.io/client-go/tools/leaderelection"
3431
"k8s.io/klog/v2"
3532
)
@@ -214,25 +211,23 @@ func runStartCmd(_ *cobra.Command, _ []string) {
214211

215212
close(ctrlctx.InformersStarted)
216213

217-
if ctrlctx.FeatureGatesHandler.Enabled(features.FeatureGateNoRegistryClusterInstall) {
218-
iriController := internalreleaseimage.New(
219-
ctrlctx.InformerFactory.Machineconfiguration().V1().InternalReleaseImages(),
220-
ctrlctx.InformerFactory.Machineconfiguration().V1().ControllerConfigs(),
221-
ctrlctx.InformerFactory.Machineconfiguration().V1().MachineConfigs(),
222-
ctrlctx.ConfigInformerFactory.Config().V1().ClusterVersions(),
223-
ctrlctx.KubeInformerFactory.Core().V1().Secrets(),
224-
ctrlctx.InformerFactory.Machineconfiguration().V1().MachineConfigNodes(),
225-
ctrlctx.KubeInformerFactory.Core().V1().Nodes(),
226-
ctrlctx.ConfigInformerFactory.Config().V1().Infrastructures(),
227-
ctrlctx.ClientBuilder.KubeClientOrDie("internalreleaseimage-controller"),
228-
ctrlctx.ClientBuilder.MachineConfigClientOrDie("internalreleaseimage-controller"))
214+
iriController := internalreleaseimage.New(
215+
ctrlctx.InformerFactory.Machineconfiguration().V1().InternalReleaseImages(),
216+
ctrlctx.InformerFactory.Machineconfiguration().V1().ControllerConfigs(),
217+
ctrlctx.InformerFactory.Machineconfiguration().V1().MachineConfigs(),
218+
ctrlctx.ConfigInformerFactory.Config().V1().ClusterVersions(),
219+
ctrlctx.KubeInformerFactory.Core().V1().Secrets(),
220+
ctrlctx.InformerFactory.Machineconfiguration().V1().MachineConfigNodes(),
221+
ctrlctx.KubeInformerFactory.Core().V1().Nodes(),
222+
ctrlctx.ConfigInformerFactory.Config().V1().Infrastructures(),
223+
ctrlctx.ClientBuilder.KubeClientOrDie("internalreleaseimage-controller"),
224+
ctrlctx.ClientBuilder.MachineConfigClientOrDie("internalreleaseimage-controller"))
229225

230-
go iriController.Run(ctx, 2)
231-
// start the informers again to enable feature gated types.
232-
// see comments in SharedInformerFactory interface.
233-
ctrlctx.InformerFactory.Start(ctx.Done())
234-
ctrlctx.KubeInformerFactory.Start(ctx.Done())
235-
}
226+
go iriController.Run(ctx, 2)
227+
// start the informers again to pick up newly registered types.
228+
// see comments in SharedInformerFactory interface.
229+
ctrlctx.InformerFactory.Start(ctx.Done())
230+
ctrlctx.KubeInformerFactory.Start(ctx.Done())
236231

237232
if ctrlcommon.IsBootImageControllerRequired(ctrlctx) {
238233
bootImageController := bootimagecontroller.New(
@@ -290,17 +285,6 @@ func runStartCmd(_ *cobra.Command, _ []string) {
290285
}
291286

292287
func createControllers(ctx *ctrlcommon.ControllerContext, inspectionCache *imageutils.FileInspectionCache, inspectorFactory osimagestream.ImagesInspectorFactory) []ctrlcommon.Controller {
293-
// Only watch IRI informers when the feature gate is enabled. The
294-
// InternalReleaseImages CRD is not installed on clusters where the gate is
295-
// off, so the informer list call would fail and WaitForCacheSync in the
296-
// template controller would block forever.
297-
var iriSecretsInformer coreinformersv1.SecretInformer
298-
var iriInformer mcfginformersv1.InternalReleaseImageInformer
299-
if ctx.FeatureGatesHandler.Enabled(features.FeatureGateNoRegistryClusterInstall) {
300-
iriSecretsInformer = ctx.KubeInformerFactory.Core().V1().Secrets()
301-
iriInformer = ctx.InformerFactory.Machineconfiguration().V1().InternalReleaseImages()
302-
}
303-
304288
renderCtrl := render.New(
305289
ctx.InformerFactory.Machineconfiguration().V1().MachineConfigPools(),
306290
ctx.InformerFactory.Machineconfiguration().V1().MachineConfigs(),
@@ -331,8 +315,8 @@ func createControllers(ctx *ctrlcommon.ControllerContext, inspectionCache *image
331315
rootOpts.templates,
332316
ctx.InformerFactory.Machineconfiguration().V1().ControllerConfigs(),
333317
ctx.OpenShiftConfigKubeNamespacedInformerFactory.Core().V1().Secrets(),
334-
iriSecretsInformer,
335-
iriInformer,
318+
ctx.KubeInformerFactory.Core().V1().Secrets(),
319+
ctx.InformerFactory.Machineconfiguration().V1().InternalReleaseImages(),
336320
ctx.ConfigInformerFactory.Config().V1().APIServers(),
337321
ctx.ClientBuilder.KubeClientOrDie("template-controller"),
338322
ctx.ClientBuilder.MachineConfigClientOrDie("template-controller"),

cmd/machine-config-daemon/start.go

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"k8s.io/apimachinery/pkg/api/resource"
1313
"k8s.io/client-go/tools/clientcmd"
1414

15-
"github.com/openshift/api/features"
1615
"github.com/openshift/machine-config-operator/internal/clients"
1716
ctrlcommon "github.com/openshift/machine-config-operator/pkg/controller/common"
1817
"github.com/openshift/machine-config-operator/pkg/daemon"
@@ -236,27 +235,21 @@ func runStartCmd(_ *cobra.Command, _ []string) {
236235
)
237236
go pinnedImageSetManager.Run(2, stopCh)
238237

239-
var mcnScopedInformerStartFunc func(<-chan struct{})
240-
if ctrlctx.FeatureGatesHandler.Enabled(features.FeatureGateNoRegistryClusterInstall) {
241-
mcnScopedInformer, startFunc := ctrlcommon.NewScopedMachineConfigNodeInformerFromClientBuilder(cb, startOpts.nodeName)
242-
mcnScopedInformerStartFunc = startFunc
243-
internalReleaseImageManager := internalreleaseimage.New(
244-
startOpts.nodeName,
245-
ctrlctx.ClientBuilder.MachineConfigClientOrDie(componentName),
246-
ctrlctx.InformerFactory.Machineconfiguration().V1().InternalReleaseImages(),
247-
mcnScopedInformer,
248-
)
249-
go internalReleaseImageManager.Run(1, stopCh)
250-
}
238+
mcnScopedInformer, mcnScopedInformerStartFunc := ctrlcommon.NewScopedMachineConfigNodeInformerFromClientBuilder(cb, startOpts.nodeName)
239+
internalReleaseImageManager := internalreleaseimage.New(
240+
startOpts.nodeName,
241+
ctrlctx.ClientBuilder.MachineConfigClientOrDie(componentName),
242+
ctrlctx.InformerFactory.Machineconfiguration().V1().InternalReleaseImages(),
243+
mcnScopedInformer,
244+
)
245+
go internalReleaseImageManager.Run(1, stopCh)
251246

252247
ctrlctx.KubeInformerFactory.Start(stopCh)
253248
ctrlctx.KubeNamespacedInformerFactory.Start(stopCh)
254249
ctrlctx.InformerFactory.Start(stopCh)
255250
ctrlctx.OperatorInformerFactory.Start(stopCh)
256251
nodeScopedInformerStartFunc(ctrlctx.Stop)
257-
if mcnScopedInformerStartFunc != nil {
258-
mcnScopedInformerStartFunc(ctrlctx.Stop)
259-
}
252+
mcnScopedInformerStartFunc(ctrlctx.Stop)
260253
close(ctrlctx.InformersStarted)
261254

262255
if err := dn.Run(stopCh, exitCh, errCh); err != nil {

cmd/machine-config-operator/start.go

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"fmt"
77
"os"
88

9-
features "github.com/openshift/api/features"
109
"github.com/openshift/machine-config-operator/cmd/common"
1110
"github.com/openshift/machine-config-operator/internal/clients"
1211
ctrlcommon "github.com/openshift/machine-config-operator/pkg/controller/common"
@@ -67,13 +66,6 @@ func runStartCmd(_ *cobra.Command, _ []string) {
6766
klog.Fatal(fmt.Errorf("failed to connect to feature gates %w", fgErr))
6867
}
6968

70-
// Only pass IRI informer when the feature gate is enabled to avoid
71-
// watching for a CRD that may not exist
72-
var iriInformer = ctrlctx.InformerFactory.Machineconfiguration().V1().InternalReleaseImages()
73-
if !ctrlctx.FeatureGatesHandler.Enabled(features.FeatureGateNoRegistryClusterInstall) {
74-
iriInformer = nil
75-
}
76-
7769
controller := operator.New(
7870
ctrlcommon.MCONamespace, componentName,
7971
startOpts.imagesFile,
@@ -117,7 +109,7 @@ func runStartCmd(_ *cobra.Command, _ []string) {
117109
ctrlctx.ConfigInformerFactory.Config().V1().ClusterVersions(),
118110
ctrlctx.InformerFactory.Machineconfiguration().V1().OSImageStreams(),
119111
ctrlctx.KubeNamespacedInformerFactory.Networking().V1().NetworkPolicies(),
120-
iriInformer,
112+
ctrlctx.InformerFactory.Machineconfiguration().V1().InternalReleaseImages(),
121113
ctrlctx,
122114
)
123115

pkg/controller/bootstrap/bootstrap.go

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import (
2727
"github.com/opencontainers/go-digest"
2828
apicfgv1 "github.com/openshift/api/config/v1"
2929
apicfgv1alpha1 "github.com/openshift/api/config/v1alpha1"
30-
"github.com/openshift/api/features"
30+
3131
imagev1 "github.com/openshift/api/image/v1"
3232
mcfgv1 "github.com/openshift/api/machineconfiguration/v1"
3333
mcfgv1alpha1 "github.com/openshift/api/machineconfiguration/v1alpha1"
@@ -280,7 +280,7 @@ func (b *Bootstrap) Run(destDir string) error {
280280
// The template controller has not yet run at this point, so machine-config-daemon-pull.service
281281
// would otherwise fail to authenticate against the IRI registry.
282282
// Merge is a no-op if the feature gate is off or the IRI resource is absent.
283-
merger := ctrlcommon.NewIRISecretMergerFromObjects(iriCredentialsSecret, cconfig, fgHandler, iri)
283+
merger := ctrlcommon.NewIRISecretMergerFromObjects(iriCredentialsSecret, cconfig, iri)
284284
pullSecretBytes, err = merger.Merge(pullSecretBytes)
285285
if err != nil {
286286
return fmt.Errorf("could not merge IRI credentials into pull secret for bootstrap: %w", err)
@@ -346,15 +346,13 @@ func (b *Bootstrap) Run(destDir string) error {
346346
}
347347
klog.Infof("Successfully generated MachineConfigs from kubelet configs.")
348348

349-
if fgHandler != nil && fgHandler.Enabled(features.FeatureGateNoRegistryClusterInstall) {
350-
if iri {
351-
iriConfigs, err := internalreleaseimage.RunInternalReleaseImageBootstrap(iriTLSCert, iriCredentialsSecret, cconfig)
352-
if err != nil {
353-
return err
354-
}
355-
configs = append(configs, iriConfigs...)
356-
klog.Infof("Successfully generated MachineConfig from InternalReleaseImage.")
349+
if iri {
350+
iriConfigs, err := internalreleaseimage.RunInternalReleaseImageBootstrap(iriTLSCert, iriCredentialsSecret, cconfig)
351+
if err != nil {
352+
return err
357353
}
354+
configs = append(configs, iriConfigs...)
355+
klog.Infof("Successfully generated MachineConfig from InternalReleaseImage.")
358356
}
359357

360358
// Create component MachineConfigs for pre-built images for hybrid OCL

pkg/controller/certrotation/certrotation_controller.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -503,11 +503,6 @@ func (c *CertRotationController) reconcileSecret(secret corev1.Secret) error {
503503
}
504504

505505
func (c *CertRotationController) reconcileIRICertificate() {
506-
if !c.featureGatesHandler.Enabled(features.FeatureGateNoRegistryClusterInstall) {
507-
klog.V(4).Infof("Skipping IRI certificate reconciliation: %s feature gate is not enabled", features.FeatureGateNoRegistryClusterInstall)
508-
return
509-
}
510-
511506
// Check that the IRI cluster resource exists to confirm the feature is actually enabled
512507
if _, err := c.mcfgClient.MachineconfigurationV1().InternalReleaseImages().Get(context.TODO(), ctrlcommon.InternalReleaseImageInstanceName, metav1.GetOptions{}); err != nil {
513508
if k8serrors.IsNotFound(err) {

pkg/controller/certrotation/certrotation_controller_test.go

Lines changed: 2 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
"github.com/openshift/library-go/pkg/crypto"
1919
"github.com/openshift/library-go/pkg/operator/certrotation"
2020
corev1 "k8s.io/api/core/v1"
21-
k8serrors "k8s.io/apimachinery/pkg/api/errors"
2221
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2322
"k8s.io/apimachinery/pkg/util/sets"
2423

@@ -120,10 +119,7 @@ func (f *fixture) newController() *CertRotationController {
120119
f.infraLister = append(f.infraLister, infra.(*configv1.Infrastructure))
121120
}
122121

123-
fgHandler := ctrlcommon.NewFeatureGatesHardcodedHandler(
124-
[]configv1.FeatureGateName{features.FeatureGateNoRegistryClusterInstall},
125-
nil,
126-
)
122+
fgHandler := ctrlcommon.NewFeatureGatesHardcodedHandler(nil, nil)
127123
c, err := New(f.kubeClient, f.configClient, f.machineClient, f.aroClient, f.k8sI.Core().V1().Secrets(), f.k8sI.Core().V1().Secrets(), f.k8sI.Core().V1().ConfigMaps(), f.infraInformer.Config().V1().Infrastructures(), nil, fgHandler, f.mcfgClient)
128124
require.NoError(f.t, err)
129125

@@ -443,39 +439,6 @@ func TestIRICertificateRotation(t *testing.T) {
443439
})
444440
}
445441

446-
func TestIRICertificateReconcileSkippedWhenFeatureGateDisabled(t *testing.T) {
447-
f := newFixture(t)
448-
f.mcfgObjects = append(f.mcfgObjects, getIRIClusterResource())
449-
f.machineObjects = append(f.machineObjects, getMachineSet("test-machine"))
450-
451-
// Build a controller with the feature gate disabled.
452-
f.kubeClient = fake.NewSimpleClientset(f.objects...)
453-
f.configClient = fakeconfigv1client.NewSimpleClientset(f.configObjects...)
454-
f.machineClient = fakemachineclientset.NewSimpleClientset(f.machineObjects...)
455-
f.mcfgClient = fakemcfgclientset.NewSimpleClientset(f.mcfgObjects...)
456-
f.aroClient = fakearoclientset.NewSimpleClientset(f.aroObjects...)
457-
f.k8sI = kubeinformers.NewSharedInformerFactory(f.kubeClient, noResyncPeriodFunc())
458-
f.infraInformer = configinformers.NewSharedInformerFactory(f.configClient, noResyncPeriodFunc())
459-
460-
fgHandler := ctrlcommon.NewFeatureGatesHardcodedHandler(
461-
nil,
462-
[]configv1.FeatureGateName{features.FeatureGateNoRegistryClusterInstall},
463-
)
464-
c, err := New(f.kubeClient, f.configClient, f.machineClient, f.aroClient,
465-
f.k8sI.Core().V1().Secrets(), f.k8sI.Core().V1().Secrets(),
466-
f.k8sI.Core().V1().ConfigMaps(), f.infraInformer.Config().V1().Infrastructures(),
467-
nil, fgHandler, f.mcfgClient)
468-
require.NoError(t, err)
469-
470-
// reconcileIRICertificate must be a no-op when the feature gate is disabled.
471-
c.reconcileIRICertificate()
472-
473-
// Verify no IRI TLS secret was created.
474-
_, err = f.kubeClient.CoreV1().Secrets(ctrlcommon.MCONamespace).Get(context.TODO(), ctrlcommon.InternalReleaseImageTLSSecretName, metav1.GetOptions{})
475-
require.Error(t, err, "IRI TLS secret should not exist when feature gate is disabled")
476-
require.True(t, k8serrors.IsNotFound(err))
477-
}
478-
479442
func TestNewWithConfigurablePKI(t *testing.T) {
480443
testCases := []struct {
481444
name string
@@ -527,7 +490,7 @@ func TestNewWithConfigurablePKI(t *testing.T) {
527490
}
528491
infraInformer.Config().V1().Infrastructures().Informer().GetIndexer().Add(infraObj)
529492

530-
enabledGates := []configv1.FeatureGateName{features.FeatureGateNoRegistryClusterInstall}
493+
var enabledGates []configv1.FeatureGateName
531494
if tc.enablePKI {
532495
enabledGates = append(enabledGates, features.FeatureGateConfigurablePKI)
533496
}

pkg/controller/common/iri_secret_merger.go

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"fmt"
88
"strings"
99

10-
features "github.com/openshift/api/features"
1110
mcfgv1 "github.com/openshift/api/machineconfiguration/v1"
1211
mcfglistersv1 "github.com/openshift/client-go/machineconfiguration/listers/machineconfiguration/v1"
1312
corev1 "k8s.io/api/core/v1"
@@ -16,10 +15,9 @@ import (
1615
"k8s.io/klog/v2"
1716
)
1817

19-
// errIRIDisabled is returned by resolve when the NoRegistryClusterInstall
20-
// feature gate is off or the InternalReleaseImage resource is absent.
21-
// Merge treats it as a skip signal rather than an error.
22-
var errIRIDisabled = errors.New("IRI not enabled or not present")
18+
// errIRIDisabled is returned by resolve when the InternalReleaseImage
19+
// resource is absent. Merge treats it as a skip signal rather than an error.
20+
var errIRIDisabled = errors.New("IRI not present")
2321

2422
// IRISecretMerger merges IRI registry credentials into a pull secret.
2523
// Construct via NewIRISecretMerger (controller use) or NewIRISecretMergerFromObjects
@@ -30,21 +28,16 @@ type IRISecretMerger struct {
3028
resolve func() (password, baseDomain string, err error)
3129
}
3230

33-
// NewIRISecretMerger creates an IRISecretMerger that resolves the feature gate,
31+
// NewIRISecretMerger creates an IRISecretMerger that resolves the
3432
// IRI resource, credentials secret, and ControllerConfig from the informer cache
3533
// at merge time. Use this in controllers where informers are available.
36-
// fgHandler must not be nil.
3734
func NewIRISecretMerger(
3835
secretLister corelistersv1.SecretLister,
3936
ccLister mcfglistersv1.ControllerConfigLister,
4037
iriLister mcfglistersv1.InternalReleaseImageLister,
41-
fgHandler FeatureGatesHandler,
4238
) *IRISecretMerger {
4339
return &IRISecretMerger{
4440
resolve: func() (string, string, error) {
45-
if !fgHandler.Enabled(features.FeatureGateNoRegistryClusterInstall) {
46-
return "", "", errIRIDisabled
47-
}
4841
_, err := iriLister.Get(InternalReleaseImageInstanceName)
4942
if apierrors.IsNotFound(err) {
5043
return "", "", errIRIDisabled
@@ -67,19 +60,15 @@ func NewIRISecretMerger(
6760

6861
// NewIRISecretMergerFromObjects creates an IRISecretMerger from pre-fetched objects.
6962
// Use this during bootstrap where informer caches are not yet available.
70-
// The feature gate and iri checks are deferred to Merge time so the constructor
71-
// never returns an error; if either check fails, Merge skips and logs.
63+
// The iri check is deferred to Merge time so the constructor
64+
// never returns an error; if the check fails, Merge skips and logs.
7265
func NewIRISecretMergerFromObjects(
7366
secret *corev1.Secret,
7467
cconfig *mcfgv1.ControllerConfig,
75-
fgHandler FeatureGatesHandler,
7668
iri bool,
7769
) *IRISecretMerger {
7870
return &IRISecretMerger{
7971
resolve: func() (string, string, error) {
80-
if fgHandler == nil || !fgHandler.Enabled(features.FeatureGateNoRegistryClusterInstall) {
81-
return "", "", errIRIDisabled
82-
}
8372
if !iri {
8473
return "", "", errIRIDisabled
8574
}
@@ -91,12 +80,12 @@ func NewIRISecretMergerFromObjects(
9180
// Merge merges IRI registry credentials into pullSecretRaw, adding auth entries
9281
// for api-int.<baseDomain>:<IRIRegistryPort> (all nodes) and
9382
// localhost:<IRIRegistryPort> (masters, where the registry runs locally).
94-
// If the feature gate is disabled or the InternalReleaseImage resource is absent,
95-
// Merge logs and returns pullSecretRaw unchanged.
83+
// If the InternalReleaseImage resource is absent, Merge logs and returns
84+
// pullSecretRaw unchanged.
9685
func (m *IRISecretMerger) Merge(pullSecretRaw []byte) ([]byte, error) {
9786
password, baseDomain, err := m.resolve()
9887
if errors.Is(err, errIRIDisabled) {
99-
klog.V(4).Info("Skipping IRI registry credential merge: IRI not enabled or not present")
88+
klog.V(4).Info("Skipping IRI registry credential merge: IRI not present")
10089
return pullSecretRaw, nil
10190
}
10291
if err != nil {

0 commit comments

Comments
 (0)