@@ -27,6 +27,7 @@ import (
2727
2828 "github.com/spf13/pflag"
2929 corev1 "k8s.io/api/core/v1"
30+ apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
3031 "k8s.io/apimachinery/pkg/runtime"
3132 utilruntime "k8s.io/apimachinery/pkg/util/runtime"
3233 clientgoscheme "k8s.io/client-go/kubernetes/scheme"
@@ -37,6 +38,7 @@ import (
3738 logsv1 "k8s.io/component-base/logs/api/v1"
3839 "k8s.io/klog/v2"
3940 clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2"
41+ "sigs.k8s.io/cluster-api/controllers/crdmigrator"
4042 "sigs.k8s.io/cluster-api/controllers/remote"
4143 "sigs.k8s.io/cluster-api/feature"
4244 "sigs.k8s.io/cluster-api/util/flags"
6163)
6264
6365func init () {
66+ utilruntime .Must (apiextensionsv1 .AddToScheme (scheme ))
6467 utilruntime .Must (clientgoscheme .AddToScheme (scheme ))
6568 utilruntime .Must (clusterv1 .AddToScheme (scheme ))
6669 utilruntime .Must (infrav1beta1 .AddToScheme (scheme ))
9093 managerOptions = flags.ManagerOptions {}
9194 logOptions = logs .NewOptions ()
9295 showVersion bool
96+ skipCRDMigrationPhases []string
9397
9498 cloudStackClusterConcurrency int
9599 cloudStackMachineConcurrency int
@@ -180,6 +184,9 @@ func initFlags(fs *pflag.FlagSet) {
180184 fs .StringVar (& healthAddr , "health-addr" , ":9440" ,
181185 "The address the health endpoint binds to." )
182186
187+ fs .StringArrayVar (& skipCRDMigrationPhases , "skip-crd-migration-phases" , []string {},
188+ "List of CRD migration phases to skip. Valid values are: StorageVersionMigration, CleanupManagedFields." )
189+
183190 fs .BoolVar (& showVersion , "version" , false , "Show current version and exit." )
184191
185192 flags .AddManagerOptions (fs , & managerOptions )
@@ -190,6 +197,11 @@ func initFlags(fs *pflag.FlagSet) {
190197// Add RBAC for the authorized diagnostics endpoint.
191198// +kubebuilder:rbac:groups=authentication.k8s.io,resources=tokenreviews,verbs=create
192199// +kubebuilder:rbac:groups=authorization.k8s.io,resources=subjectaccessreviews,verbs=create
200+ // Setup CRD migrator
201+ // +kubebuilder:rbac:groups=apiextensions.k8s.io,resources=customresourcedefinitions,verbs=get;list;watch;update;patch
202+ // +kubebuilder:rbac:groups=apiextensions.k8s.io,resources=customresourcedefinitions/status,verbs=get;list;watch;update;patch
203+ // +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=cloudstackclusters;cloudstackmachines;cloudstackmachinetemplates;cloudstackclustertemplates;cloudstackfailuredomains;cloudstackisolatednetworks;cloudstackaffinitygroups;cloudstackmachinestatecheckers,verbs=get;list;watch;patch;update
204+ // +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=cloudstackclusters/status;cloudstackmachines/status;cloudstackmachinetemplates/status;cloudstackclustertemplates/status;cloudstackfailuredomains/status;cloudstackisolatednetworks/status;cloudstackaffinitygroups/status;cloudstackmachinestatecheckers/status,verbs=get;patch;update
193205
194206func main () {
195207 initFlags (pflag .CommandLine )
@@ -308,6 +320,47 @@ func setupChecks(mgr ctrl.Manager) {
308320
309321func setupReconcilers (ctx context.Context , mgr manager.Manager ) {
310322 scopeFactory := scope .NewClientScopeFactory (10 )
323+
324+ crdMigratorConfig := map [client.Object ]crdmigrator.ByObjectConfig {
325+ & infrav1.CloudStackCluster {}: {
326+ UseCache : true ,
327+ },
328+ & infrav1.CloudStackMachine {}: {
329+ UseCache : true ,
330+ },
331+ & infrav1.CloudStackMachineTemplate {}: {
332+ UseCache : true ,
333+ },
334+ & infrav1.CloudStackClusterTemplate {}: {
335+ UseCache : true ,
336+ },
337+ & infrav1.CloudStackFailureDomain {}: {
338+ UseCache : true ,
339+ },
340+ & infrav1.CloudStackIsolatedNetwork {}: {
341+ UseCache : true ,
342+ },
343+ & infrav1.CloudStackAffinityGroup {}: {
344+ UseCache : true ,
345+ },
346+ & infrav1.CloudStackMachineStateChecker {}: {
347+ UseCache : true ,
348+ },
349+ }
350+ crdMigratorSkipPhases := []crdmigrator.Phase {}
351+ for _ , p := range skipCRDMigrationPhases {
352+ crdMigratorSkipPhases = append (crdMigratorSkipPhases , crdmigrator .Phase (p ))
353+ }
354+ if err := (& crdmigrator.CRDMigrator {
355+ Client : mgr .GetClient (),
356+ APIReader : mgr .GetAPIReader (),
357+ SkipCRDMigrationPhases : crdMigratorSkipPhases ,
358+ Config : crdMigratorConfig ,
359+ }).SetupWithManager (ctx , mgr , controller.Options {MaxConcurrentReconciles : 1 }); err != nil {
360+ setupLog .Error (err , "unable to setup CRD migrator" )
361+ os .Exit (1 )
362+ }
363+
311364 if err := (& controllers.CloudStackClusterReconciler {
312365 Client : mgr .GetClient (),
313366 Scheme : mgr .GetScheme (),
0 commit comments