Skip to content

Commit dab2c52

Browse files
committed
capiinstaller: Read manifests direct from payload image
1 parent 945849d commit dab2c52

File tree

10 files changed

+1091
-45
lines changed

10 files changed

+1091
-45
lines changed

cmd/cluster-capi-operator/main.go

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,20 @@ import (
6363
"github.com/openshift/cluster-capi-operator/pkg/controllers/kubeconfig"
6464
"github.com/openshift/cluster-capi-operator/pkg/controllers/secretsync"
6565
"github.com/openshift/cluster-capi-operator/pkg/operatorstatus"
66+
"github.com/openshift/cluster-capi-operator/pkg/providerimages"
6667
"github.com/openshift/cluster-capi-operator/pkg/util"
6768
"github.com/openshift/cluster-capi-operator/pkg/webhook"
6869
)
6970

7071
const (
71-
defaultImagesLocation = "./dev-images.json"
72+
defaultImagesLocation = "./dev-images.json"
73+
7274
defaultMachineAPINamespace = "openshift-machine-api"
75+
76+
pullSecretPathEnvVar = "PULL_SECRET_PATH"
77+
defaultPullSecretPath = "/var/run/secrets/pull-secret/config.json"
78+
providerImageDirEnvVar = "PROVIDER_IMAGE_DIR"
79+
defaultProviderImageDirPath = "/var/lib/provider-images"
7380
)
7481

7582
func initScheme(scheme *runtime.Scheme) {
@@ -208,6 +215,28 @@ func main() {
208215
os.Exit(1)
209216
}
210217

218+
pullSecretPath := os.Getenv(pullSecretPathEnvVar)
219+
if pullSecretPath == "" {
220+
pullSecretPath = defaultPullSecretPath
221+
}
222+
223+
providerImageDir := os.Getenv(providerImageDirEnvVar)
224+
if providerImageDir == "" {
225+
providerImageDir = defaultProviderImageDirPath
226+
}
227+
228+
pullSecret, err := os.ReadFile(pullSecretPath)
229+
if err != nil {
230+
klog.Error(err, "unable to read pull secret", "path", pullSecretPath)
231+
os.Exit(1)
232+
}
233+
234+
providerImages, err := providerimages.ReadProviderImages(context.Background(), containerImages, providerImageDir, pullSecret)
235+
if err != nil {
236+
klog.Error(err, "unable to get provider image metadata")
237+
os.Exit(1)
238+
}
239+
211240
infra, err := util.GetInfra(context.Background(), mgr.GetAPIReader())
212241
if err != nil {
213242
klog.Error(err, "unable to get infrastructure object")
@@ -220,7 +249,7 @@ func main() {
220249
os.Exit(1)
221250
}
222251

223-
setupPlatformReconcilers(mgr, infra, platform, containerImages, applyClient, apiextensionsClient, *managedNamespace)
252+
setupPlatformReconcilers(mgr, infra, platform, containerImages, providerImages, applyClient, apiextensionsClient, *managedNamespace)
224253

225254
// +kubebuilder:scaffold:builder
226255

@@ -252,17 +281,17 @@ func getClusterOperatorStatusClient(mgr manager.Manager, controller string, plat
252281
}
253282
}
254283

255-
func setupPlatformReconcilers(mgr manager.Manager, infra *configv1.Infrastructure, platform configv1.PlatformType, containerImages map[string]string, applyClient *kubernetes.Clientset, apiextensionsClient *apiextensionsclient.Clientset, managedNamespace string) {
284+
func setupPlatformReconcilers(mgr manager.Manager, infra *configv1.Infrastructure, platform configv1.PlatformType, containerImages map[string]string, providerImages map[string]providerimages.ProviderImageManifests, applyClient *kubernetes.Clientset, apiextensionsClient *apiextensionsclient.Clientset, managedNamespace string) {
256285
// Only setup reconcile controllers and webhooks when the platform is supported.
257286
// This avoids unnecessary CAPI providers discovery, installs and reconciles when the platform is not supported.
258287
isUnsupportedPlatform := false
259288

260289
switch platform {
261290
case configv1.AWSPlatformType:
262-
setupReconcilers(mgr, infra, platform, &awsv1.AWSCluster{}, containerImages, applyClient, apiextensionsClient, managedNamespace)
291+
setupReconcilers(mgr, infra, platform, &awsv1.AWSCluster{}, containerImages, providerImages, applyClient, apiextensionsClient, managedNamespace)
263292
setupWebhooks(mgr)
264293
case configv1.GCPPlatformType:
265-
setupReconcilers(mgr, infra, platform, &gcpv1.GCPCluster{}, containerImages, applyClient, apiextensionsClient, managedNamespace)
294+
setupReconcilers(mgr, infra, platform, &gcpv1.GCPCluster{}, containerImages, providerImages, applyClient, apiextensionsClient, managedNamespace)
266295
setupWebhooks(mgr)
267296
case configv1.AzurePlatformType:
268297
azureCloudEnvironment := getAzureCloudEnvironment(infra.Status.PlatformStatus)
@@ -272,20 +301,20 @@ func setupPlatformReconcilers(mgr manager.Manager, infra *configv1.Infrastructur
272301
isUnsupportedPlatform = true
273302
} else {
274303
// The ClusterOperator Controller must run in all cases.
275-
setupReconcilers(mgr, infra, platform, &azurev1.AzureCluster{}, containerImages, applyClient, apiextensionsClient, managedNamespace)
304+
setupReconcilers(mgr, infra, platform, &azurev1.AzureCluster{}, containerImages, providerImages, applyClient, apiextensionsClient, managedNamespace)
276305
setupWebhooks(mgr)
277306
}
278307
case configv1.PowerVSPlatformType:
279-
setupReconcilers(mgr, infra, platform, &ibmpowervsv1.IBMPowerVSCluster{}, containerImages, applyClient, apiextensionsClient, managedNamespace)
308+
setupReconcilers(mgr, infra, platform, &ibmpowervsv1.IBMPowerVSCluster{}, containerImages, providerImages, applyClient, apiextensionsClient, managedNamespace)
280309
setupWebhooks(mgr)
281310
case configv1.VSpherePlatformType:
282-
setupReconcilers(mgr, infra, platform, &vspherev1.VSphereCluster{}, containerImages, applyClient, apiextensionsClient, managedNamespace)
311+
setupReconcilers(mgr, infra, platform, &vspherev1.VSphereCluster{}, containerImages, providerImages, applyClient, apiextensionsClient, managedNamespace)
283312
setupWebhooks(mgr)
284313
case configv1.OpenStackPlatformType:
285-
setupReconcilers(mgr, infra, platform, &openstackv1.OpenStackCluster{}, containerImages, applyClient, apiextensionsClient, managedNamespace)
314+
setupReconcilers(mgr, infra, platform, &openstackv1.OpenStackCluster{}, containerImages, providerImages, applyClient, apiextensionsClient, managedNamespace)
286315
setupWebhooks(mgr)
287316
case configv1.BareMetalPlatformType:
288-
setupReconcilers(mgr, infra, platform, &metal3v1.Metal3Cluster{}, containerImages, applyClient, apiextensionsClient, managedNamespace)
317+
setupReconcilers(mgr, infra, platform, &metal3v1.Metal3Cluster{}, containerImages, providerImages, applyClient, apiextensionsClient, managedNamespace)
289318
setupWebhooks(mgr)
290319
default:
291320
klog.Infof("Detected platform %q is not supported, skipping capi controllers setup", platform)
@@ -297,7 +326,7 @@ func setupPlatformReconcilers(mgr manager.Manager, infra *configv1.Infrastructur
297326
setupClusterOperatorController(mgr, platform, managedNamespace, isUnsupportedPlatform)
298327
}
299328

300-
func setupReconcilers(mgr manager.Manager, infra *configv1.Infrastructure, platform configv1.PlatformType, infraClusterObject client.Object, containerImages map[string]string, applyClient *kubernetes.Clientset, apiextensionsClient *apiextensionsclient.Clientset, managedNamespace string) {
329+
func setupReconcilers(mgr manager.Manager, infra *configv1.Infrastructure, platform configv1.PlatformType, infraClusterObject client.Object, containerImages map[string]string, providerImages map[string]providerimages.ProviderImageManifests, applyClient *kubernetes.Clientset, apiextensionsClient *apiextensionsclient.Clientset, managedNamespace string) {
301330
if err := (&corecluster.CoreClusterController{
302331
ClusterOperatorStatusClient: getClusterOperatorStatusClient(mgr, "cluster-capi-operator-cluster-resource-controller", platform, managedNamespace),
303332
Cluster: &clusterv1beta1.Cluster{},
@@ -333,6 +362,7 @@ func setupReconcilers(mgr manager.Manager, infra *configv1.Infrastructure, platf
333362
Platform: platform,
334363
ApplyClient: applyClient,
335364
APIExtensionsClient: apiextensionsClient,
365+
ProviderImages: providerImages,
336366
}).SetupWithManager(mgr); err != nil {
337367
klog.Error(err, "unable to create capi installer controller", "controller", "CAPIInstaller")
338368
os.Exit(1)

go.mod

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ require (
1717
github.com/google/go-cmp v0.7.0
1818
github.com/google/uuid v1.6.0
1919
github.com/gophercloud/gophercloud/v2 v2.9.0
20-
github.com/klauspost/compress v1.18.0
20+
github.com/klauspost/compress v1.18.1
2121
github.com/metal3-io/cluster-api-provider-metal3/api v1.11.2
2222
github.com/onsi/ginkgo/v2 v2.27.2
2323
github.com/onsi/gomega v1.38.2
@@ -27,7 +27,7 @@ require (
2727
github.com/openshift/library-go v0.0.0-20251112091634-ab97ebb73f0f
2828
github.com/pkg/errors v0.9.1
2929
github.com/spf13/pflag v1.0.10
30-
golang.org/x/tools v0.38.0
30+
golang.org/x/tools v0.39.0
3131
gopkg.in/yaml.v2 v2.4.0
3232
k8s.io/api v0.34.1
3333
k8s.io/apiextensions-apiserver v0.34.1
@@ -154,6 +154,7 @@ require (
154154
github.com/google/btree v1.1.3 // indirect
155155
github.com/google/cel-go v0.26.0 // indirect
156156
github.com/google/gnostic-models v0.7.0 // indirect
157+
github.com/google/go-containerregistry v0.20.7 // indirect
157158
github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 // indirect
158159
github.com/gophercloud/utils/v2 v2.0.0-20241220104409-2e0af06694a1 // indirect
159160
github.com/gordonklaus/ineffassign v0.1.0 // indirect
@@ -291,7 +292,7 @@ require (
291292
golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect
292293
golang.org/x/mod v0.30.0 // indirect
293294
golang.org/x/net v0.47.0 // indirect
294-
golang.org/x/oauth2 v0.32.0 // indirect
295+
golang.org/x/oauth2 v0.33.0 // indirect
295296
golang.org/x/sync v0.18.0 // indirect
296297
golang.org/x/sys v0.38.0 // indirect
297298
golang.org/x/term v0.37.0 // indirect

go.sum

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,8 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
277277
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
278278
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
279279
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
280+
github.com/google/go-containerregistry v0.20.7 h1:24VGNpS0IwrOZ2ms2P1QE3Xa5X9p4phx0aUgzYzHW6I=
281+
github.com/google/go-containerregistry v0.20.7/go.mod h1:Lx5LCZQjLH1QBaMPeGwsME9biPeo1lPx6lbGj/UmzgM=
280282
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
281283
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
282284
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -352,6 +354,8 @@ github.com/kkHAIKE/contextcheck v1.1.6 h1:7HIyRcnyzxL9Lz06NGhiKvenXq7Zw6Q0UQu/tt
352354
github.com/kkHAIKE/contextcheck v1.1.6/go.mod h1:3dDbMRNBFaq8HFXWC1JyvDSPm43CmE6IuHam8Wr0rkg=
353355
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
354356
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
357+
github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co=
358+
github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0=
355359
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
356360
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
357361
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -442,6 +446,7 @@ github.com/onsi/ginkgo/v2 v2.27.2/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zw
442446
github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A=
443447
github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k=
444448
github.com/openshift/api v0.0.0-20251214014457-bfa868a22401 h1:goMf6pBtRFSQaVElFk6K+GIAqnv7O84p7PJHH6pDz/E=
449+
github.com/openshift/api v0.0.0-20251214014457-bfa868a22401/go.mod h1:d5uzF0YN2nQQFA0jIEWzzOZ+edmo6wzlGLvx5Fhz4uY=
445450
github.com/openshift/client-go v0.0.0-20251205093018-96a6cbc1420c h1:TBE0Gl+oCo/SNEhLKZQNNH/SWHXrpGyhAw7P0lAqdHg=
446451
github.com/openshift/client-go v0.0.0-20251205093018-96a6cbc1420c/go.mod h1:IsynOWZAfdH+BgWimcFQRtI41Id9sgdhsCEjIk8ACLw=
447452
github.com/openshift/library-go v0.0.0-20251112091634-ab97ebb73f0f h1:r1pLosA7z3+t+lzW29FU54sg4/pAWu+lsKD0L5Gx3wg=
@@ -705,6 +710,7 @@ golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
705710
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
706711
golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY=
707712
golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
713+
golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
708714
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
709715
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
710716
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -786,6 +792,7 @@ golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58
786792
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
787793
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
788794
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
795+
golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ=
789796
golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM=
790797
golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY=
791798
golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM=

0 commit comments

Comments
 (0)