Skip to content

Commit 59db5d1

Browse files
committed
MULTIARCH-4552: Sync ImageStreamImportMode setting in the image config
As per openshift/enhancements#1605, there was a new field introduced in the image config spec and status which reflects the global value to be set for imagestream import mode which is behind a featuregate. This PR sets the status field in the image config based on the spec setting so it can be synced by the apiserver's observedconfig to set the import mode for imagestreams.
1 parent 27c842b commit 59db5d1

File tree

2 files changed

+45
-11
lines changed

2 files changed

+45
-11
lines changed

pkg/operator/imageconfig.go

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
configapi "github.com/openshift/api/config/v1"
2424
operatorv1 "github.com/openshift/api/operator/v1"
2525
configset "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1"
26+
configv1informers "github.com/openshift/client-go/config/informers/externalversions/config/v1"
2627
routev1informers "github.com/openshift/client-go/route/informers/externalversions/route/v1"
2728
routev1lister "github.com/openshift/client-go/route/listers/route/v1"
2829
"github.com/openshift/library-go/pkg/operator/v1helpers"
@@ -36,26 +37,30 @@ import (
3637
// Watches for changes on image registry routes and services, updating
3738
// the resource status appropriately.
3839
type ImageConfigController struct {
39-
configClient configset.ConfigV1Interface
40-
operatorClient v1helpers.OperatorClient
41-
routeLister routev1lister.RouteNamespaceLister
42-
serviceLister corev1listers.ServiceNamespaceLister
43-
cachesToSync []cache.InformerSynced
44-
queue workqueue.RateLimitingInterface
40+
configClient configset.ConfigV1Interface
41+
operatorClient v1helpers.OperatorClient
42+
routeLister routev1lister.RouteNamespaceLister
43+
serviceLister corev1listers.ServiceNamespaceLister
44+
cachesToSync []cache.InformerSynced
45+
queue workqueue.RateLimitingInterface
46+
imageStreamImportModeEnabled bool
4547
}
4648

4749
func NewImageConfigController(
4850
configClient configset.ConfigV1Interface,
4951
operatorClient v1helpers.OperatorClient,
5052
routeInformer routev1informers.RouteInformer,
5153
serviceInformer corev1informers.ServiceInformer,
54+
imageConfigInformer configv1informers.ImageInformer,
55+
imageStreamImportModeEnabled bool,
5256
) (*ImageConfigController, error) {
5357
icc := &ImageConfigController{
54-
configClient: configClient,
55-
operatorClient: operatorClient,
56-
routeLister: routeInformer.Lister().Routes(defaults.ImageRegistryOperatorNamespace),
57-
serviceLister: serviceInformer.Lister().Services(defaults.ImageRegistryOperatorNamespace),
58-
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "ImageConfigController"),
58+
configClient: configClient,
59+
operatorClient: operatorClient,
60+
routeLister: routeInformer.Lister().Routes(defaults.ImageRegistryOperatorNamespace),
61+
serviceLister: serviceInformer.Lister().Services(defaults.ImageRegistryOperatorNamespace),
62+
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "ImageConfigController"),
63+
imageStreamImportModeEnabled: imageStreamImportModeEnabled,
5964
}
6065

6166
if _, err := serviceInformer.Informer().AddEventHandler(icc.eventHandler()); err != nil {
@@ -68,6 +73,12 @@ func NewImageConfigController(
6873
}
6974
icc.cachesToSync = append(icc.cachesToSync, routeInformer.Informer().HasSynced)
7075

76+
if imageStreamImportModeEnabled {
77+
if _, err := imageConfigInformer.Informer().AddEventHandler(icc.eventHandler()); err != nil {
78+
return nil, err
79+
}
80+
icc.cachesToSync = append(icc.cachesToSync, imageConfigInformer.Informer().HasSynced)
81+
}
7182
return icc, nil
7283
}
7384

@@ -159,6 +170,20 @@ func (icc *ImageConfigController) syncImageStatus() error {
159170
cfg.Status.InternalRegistryHostname = internalHostname
160171
modified = true
161172
}
173+
if icc.imageStreamImportModeEnabled {
174+
var importmode configapi.ImportModeType
175+
if cfg.Spec.ImageStreamImportMode != "" {
176+
importmode = cfg.Spec.ImageStreamImportMode
177+
} else {
178+
// TODO: once clusterversion reports the type of payload in its status, use that to determine what the default will be
179+
// i.e, multi payload => PreserveOriginal, single arch payload => Legacy
180+
importmode = configapi.ImportModeLegacy
181+
}
182+
if cfg.Status.ImageStreamImportMode != importmode {
183+
cfg.Status.ImageStreamImportMode = importmode
184+
modified = true
185+
}
186+
}
162187

163188
if modified {
164189
if _, err := icc.configClient.Images().UpdateStatus(context.TODO(), cfg, metav1.UpdateOptions{}); err != nil {

pkg/operator/starter.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"k8s.io/klog/v2"
1212

1313
configv1 "github.com/openshift/api/config/v1"
14+
"github.com/openshift/api/features"
1415
configclient "github.com/openshift/client-go/config/clientset/versioned"
1516
configinformers "github.com/openshift/client-go/config/informers/externalversions"
1617
imageclient "github.com/openshift/client-go/image/clientset/versioned"
@@ -110,11 +111,19 @@ func RunOperator(ctx context.Context, kubeconfig *restclient.Config) error {
110111
return err
111112
}
112113

114+
featureGates, err := featureGateAccessor.CurrentFeatureGates()
115+
if err != nil {
116+
return err
117+
}
118+
imageStreamImportModeEnabled := featureGates.Enabled(features.FeatureGateImageStreamImportMode)
119+
113120
imageConfigStatusController, err := NewImageConfigController(
114121
configClient.ConfigV1(),
115122
configOperatorClient,
116123
routeInformers.Route().V1().Routes(),
117124
kubeInformers.Core().V1().Services(),
125+
configInformers.Config().V1().Images(),
126+
imageStreamImportModeEnabled,
118127
)
119128
if err != nil {
120129
return err

0 commit comments

Comments
 (0)