Skip to content

Commit 37dcccc

Browse files
committed
MULTIARCH-4971: Set import mode in image config based on ClusterVersion desired Architecture
openshift/api#2024 introduces the architecture property in the desired status field which indicates the architecture of the cluster (or the architecture being reconciled to). Set import mode based on this status - if "Multi", set importmode to PreserveOriginal, else to Legacy. Backport of #1164
1 parent 6ca651c commit 37dcccc

File tree

13 files changed

+55
-23
lines changed

13 files changed

+55
-23
lines changed

cmd/cluster-image-registry-operator/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
1313
"k8s.io/klog/v2"
14+
"k8s.io/utils/clock"
1415

1516
configv1 "github.com/openshift/api/config/v1"
1617
"github.com/openshift/library-go/pkg/controller/controllercmd"
@@ -67,6 +68,7 @@ func main() {
6768
go metrics.RunServer(metricsPort)
6869
return operator.RunOperator(ctx, cctx.KubeConfig)
6970
},
71+
clock.RealClock{},
7072
).WithKubeConfigFile(
7173
kubeconfig, nil,
7274
).WithLeaderElection(

pkg/client/operatorclient.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import (
1313
imageregistryv1client "github.com/openshift/client-go/imageregistry/clientset/versioned/typed/imageregistry/v1"
1414
imageregistryv1informers "github.com/openshift/client-go/imageregistry/informers/externalversions/imageregistry/v1"
1515
imageregistryv1listers "github.com/openshift/client-go/imageregistry/listers/imageregistry/v1"
16+
applyoperatorv1 "github.com/openshift/client-go/operator/applyconfigurations/operator/v1"
17+
"github.com/openshift/library-go/pkg/apiserver/jsonpatch"
1618
"github.com/openshift/library-go/pkg/operator/v1helpers"
1719
)
1820

@@ -95,3 +97,15 @@ func (c *ConfigOperatorClient) UpdateOperatorStatus(ctx context.Context, oldReso
9597

9698
return &updatedConfig.Status.OperatorStatus, nil
9799
}
100+
101+
func (c *ConfigOperatorClient) ApplyOperatorSpec(ctx context.Context, fieldManager string, applyConfiguration *applyoperatorv1.OperatorSpecApplyConfiguration) (err error) {
102+
return fmt.Errorf("not implemented")
103+
}
104+
105+
func (c *ConfigOperatorClient) ApplyOperatorStatus(ctx context.Context, fieldManager string, applyConfiguration *applyoperatorv1.OperatorStatusApplyConfiguration) (err error) {
106+
return fmt.Errorf("not implemented")
107+
}
108+
109+
func (c *ConfigOperatorClient) PatchOperatorStatus(ctx context.Context, jsonPatch *jsonpatch.PatchSet) (err error) {
110+
return fmt.Errorf("not implemented")
111+
}

pkg/operator/awstagcontroller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ type AWSTagController struct {
4040

4141
event events.Recorder
4242
cachesToSync []cache.InformerSynced
43-
queue workqueue.RateLimitingInterface
43+
queue workqueue.TypedRateLimitingInterface[any]
4444
}
4545

4646
// tagKeyRegex is used to check that the keys and values of a tag contain only valid characters.
@@ -75,7 +75,7 @@ func NewAWSTagController(
7575
featureGateAccessor: featureGateAccessor,
7676
event: eventRecorder,
7777
queue: workqueue.NewNamedRateLimitingQueue(
78-
workqueue.DefaultControllerRateLimiter(),
78+
workqueue.DefaultTypedControllerRateLimiter[any](),
7979
"AWSTagController"),
8080
}
8181

pkg/operator/azurepathfixcontroller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ type AzurePathFixController struct {
4747
kubeconfig *restclient.Config
4848

4949
cachesToSync []cache.InformerSynced
50-
queue workqueue.RateLimitingInterface
50+
queue workqueue.TypedRateLimitingInterface[any]
5151

5252
featureGateAccessor featuregates.FeatureGateAccess
5353
}
@@ -76,7 +76,7 @@ func NewAzurePathFixController(
7676
proxyLister: proxyInformer.Lister(),
7777
openshiftConfigLister: openshiftConfigInformer.Lister().ConfigMaps(defaults.OpenShiftConfigNamespace),
7878
kubeconfig: kubeconfig,
79-
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "AzurePathFixController"),
79+
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultTypedControllerRateLimiter[any](), "AzurePathFixController"),
8080
featureGateAccessor: featureGateAccessor,
8181
}
8282

pkg/operator/azurestackcloud.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ type AzureStackCloudController struct {
2828
openshiftConfigLister corev1listers.ConfigMapNamespaceLister
2929

3030
cachesToSync []cache.InformerSynced
31-
queue workqueue.RateLimitingInterface
31+
queue workqueue.TypedRateLimitingInterface[any]
3232
}
3333

3434
func NewAzureStackCloudController(
@@ -38,7 +38,7 @@ func NewAzureStackCloudController(
3838
c := &AzureStackCloudController{
3939
operatorClient: operatorClient,
4040
openshiftConfigLister: openshiftConfigInformer.Lister().ConfigMaps(defaults.OpenShiftConfigNamespace),
41-
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "AzureStackCloudController"),
41+
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultTypedControllerRateLimiter[any](), "AzureStackCloudController"),
4242
}
4343

4444
c.cachesToSync = append(c.cachesToSync, operatorClient.Informer().HasSynced)

pkg/operator/clusteroperator.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ type ClusterOperatorStatusController struct {
3333
deploymentLister appsv1listers.DeploymentNamespaceLister
3434

3535
cachesToSync []cache.InformerSynced
36-
queue workqueue.RateLimitingInterface
36+
queue workqueue.TypedRateLimitingInterface[any]
3737
}
3838

3939
func NewClusterOperatorStatusController(
@@ -51,7 +51,7 @@ func NewClusterOperatorStatusController(
5151
imageRegistryConfigLister: imageRegistryConfigInformer.Lister(),
5252
imagePrunerLister: imagePrunerInformer.Lister(),
5353
deploymentLister: deploymentInformer.Lister().Deployments(defaults.ImageRegistryOperatorNamespace),
54-
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "ClusterOperatorStatusController"),
54+
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultTypedControllerRateLimiter[any](), "ClusterOperatorStatusController"),
5555
}
5656

5757
if _, err := clusterOperatorInformer.Informer().AddEventHandler(c.eventHandler()); err != nil {

pkg/operator/controller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func NewController(
8686
c := &Controller{
8787
kubeconfig: kubeconfig,
8888
generator: resource.NewGenerator(eventRecorder, kubeconfig, clients, listers, featureGateAccessor),
89-
workqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "Changes"),
89+
workqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultTypedControllerRateLimiter[any](), "Changes"),
9090
listers: listers,
9191
clients: clients,
9292
}
@@ -189,7 +189,7 @@ func NewController(
189189
type Controller struct {
190190
kubeconfig *restclient.Config
191191
generator *resource.Generator
192-
workqueue workqueue.RateLimitingInterface
192+
workqueue workqueue.TypedRateLimitingInterface[any]
193193
listers *regopclient.Listers
194194
clients *regopclient.Clients
195195
cachesToSync []cache.InformerSynced

pkg/operator/controllerimagepruner.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func NewImagePrunerController(
5757
clients := &regopclient.Clients{}
5858
c := &ImagePrunerController{
5959
generator: resource.NewImagePrunerGenerator(clients, listers),
60-
workqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), imagePrunerWorkQueueKey),
60+
workqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultTypedControllerRateLimiter[any](), imagePrunerWorkQueueKey),
6161
listers: listers,
6262
clients: clients,
6363
}
@@ -131,7 +131,7 @@ func NewImagePrunerController(
131131
// ImagePrunerController keeps track of openshift image pruner components.
132132
type ImagePrunerController struct {
133133
generator *resource.ImagePrunerGenerator
134-
workqueue workqueue.RateLimitingInterface
134+
workqueue workqueue.TypedRateLimitingInterface[any]
135135
listers *regopclient.ImagePrunerControllerListers
136136
clients *regopclient.Clients
137137
cachesToSync []cache.InformerSynced

pkg/operator/imageconfig.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ import (
2222
"k8s.io/klog/v2"
2323

2424
configapi "github.com/openshift/api/config/v1"
25+
configv1 "github.com/openshift/api/config/v1"
2526
operatorv1 "github.com/openshift/api/operator/v1"
2627
configset "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1"
2728
configv1informers "github.com/openshift/client-go/config/informers/externalversions/config/v1"
29+
configlister "github.com/openshift/client-go/config/listers/config/v1"
2830
routev1informers "github.com/openshift/client-go/route/informers/externalversions/route/v1"
2931
routev1lister "github.com/openshift/client-go/route/listers/route/v1"
3032
"github.com/openshift/library-go/pkg/operator/v1helpers"
@@ -42,8 +44,9 @@ type ImageConfigController struct {
4244
operatorClient v1helpers.OperatorClient
4345
routeLister routev1lister.RouteNamespaceLister
4446
serviceLister corev1listers.ServiceNamespaceLister
47+
clusterVersionLister configlister.ClusterVersionLister
4548
cachesToSync []cache.InformerSynced
46-
queue workqueue.RateLimitingInterface
49+
queue workqueue.TypedRateLimitingInterface[any]
4750
imageStreamImportModeEnabled bool
4851
}
4952

@@ -53,14 +56,16 @@ func NewImageConfigController(
5356
routeInformer routev1informers.RouteInformer,
5457
serviceInformer corev1informers.ServiceInformer,
5558
imageConfigInformer configv1informers.ImageInformer,
59+
clusterVersionInformer configv1informers.ClusterVersionInformer,
5660
imageStreamImportModeEnabled bool,
5761
) (*ImageConfigController, error) {
5862
icc := &ImageConfigController{
5963
configClient: configClient,
6064
operatorClient: operatorClient,
6165
routeLister: routeInformer.Lister().Routes(defaults.ImageRegistryOperatorNamespace),
6266
serviceLister: serviceInformer.Lister().Services(defaults.ImageRegistryOperatorNamespace),
63-
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "ImageConfigController"),
67+
clusterVersionLister: clusterVersionInformer.Lister(),
68+
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultTypedControllerRateLimiter[any](), "ImageConfigController"),
6469
imageStreamImportModeEnabled: imageStreamImportModeEnabled,
6570
}
6671

@@ -178,9 +183,17 @@ func (icc *ImageConfigController) syncImageStatus() error {
178183
if cfg.Spec.ImageStreamImportMode != "" {
179184
importmode = cfg.Spec.ImageStreamImportMode
180185
} else {
181-
// TODO: once clusterversion reports the type of payload in its status, use that to determine what the default will be
182-
// i.e, multi payload => PreserveOriginal, single arch payload => Legacy
183-
importmode = configapi.ImportModeLegacy
186+
cv, err := icc.clusterVersionLister.Get("version")
187+
if err != nil {
188+
return err
189+
}
190+
// If the clusterversion reports that the desired architecture (existing or desired) of the
191+
// cluster is "Multi", set import mode to PreserveOriginal. Else set it to Legacy
192+
if cv.Status.Desired.Architecture == configv1.ClusterVersionArchitectureMulti {
193+
importmode = configapi.ImportModePreserveOriginal
194+
} else {
195+
importmode = configapi.ImportModeLegacy
196+
}
184197
}
185198
if cfg.Status.ImageStreamImportMode != importmode {
186199
cfg.Status.ImageStreamImportMode = importmode

pkg/operator/imageregistrycertificates.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ type ImageRegistryCertificatesController struct {
4141
storageListers *client.StorageListers
4242

4343
cachesToSync []cache.InformerSynced
44-
queue workqueue.RateLimitingInterface
44+
queue workqueue.TypedRateLimitingInterface[any]
4545

4646
featureGateAccessor featuregates.FeatureGateAccess
4747
}
@@ -69,7 +69,7 @@ func NewImageRegistryCertificatesController(
6969
imageConfigLister: imageConfigInformer.Lister(),
7070
openshiftConfigLister: openshiftConfigInformer.Lister().ConfigMaps(defaults.OpenShiftConfigNamespace),
7171
imageRegistryConfigLister: imageRegistryConfigInformer.Lister(),
72-
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "ImageRegistryCertificatesController"),
72+
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultTypedControllerRateLimiter[any](), "ImageRegistryCertificatesController"),
7373
}
7474

7575
if _, err := configMapInformer.Informer().AddEventHandler(c.eventHandler()); err != nil {

0 commit comments

Comments
 (0)