@@ -26,6 +26,7 @@ import (
2626
2727 "github.com/spf13/pflag"
2828 corev1 "k8s.io/api/core/v1"
29+ apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
2930 "k8s.io/apimachinery/pkg/runtime"
3031 clientgoscheme "k8s.io/client-go/kubernetes/scheme"
3132 cliflag "k8s.io/component-base/cli/flag"
@@ -35,6 +36,7 @@ import (
3536 "k8s.io/klog/v2"
3637 clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2"
3738 ipamv1 "sigs.k8s.io/cluster-api/api/ipam/v1beta2"
39+ "sigs.k8s.io/cluster-api/controllers/crdmigrator"
3840 "sigs.k8s.io/cluster-api/util/flags"
3941 ctrl "sigs.k8s.io/controller-runtime"
4042 cache "sigs.k8s.io/controller-runtime/pkg/cache"
@@ -92,10 +94,12 @@ var (
9294 caCertsPath string
9395 showVersion bool
9496 scopeCacheMaxSize int
97+ skipCRDMigrationPhases []string
9598 logOptions = logs .NewOptions ()
9699)
97100
98101func init () {
102+ _ = apiextensionsv1 .AddToScheme (scheme )
99103 _ = clientgoscheme .AddToScheme (scheme )
100104 _ = clusterv1 .AddToScheme (scheme )
101105 _ = ipamv1 .AddToScheme (scheme )
@@ -166,12 +170,19 @@ func InitFlags(fs *pflag.FlagSet) {
166170
167171 fs .IntVar (& scopeCacheMaxSize , "scope-cache-max-size" , 10 , "The maximum credentials count the operator should keep in cache. Setting this value to 0 means no cache." )
168172
173+ fs .StringArrayVar (& skipCRDMigrationPhases , "skip-crd-migration-phases" , []string {},
174+ "List of CRD migration phases to skip. Valid values are: StorageVersionMigration, CleanupManagedFields." )
169175 fs .BoolVar (& showVersion , "version" , false , "Show current version and exit." )
170176}
171177
172178// Add RBAC for the authorized diagnostics endpoint.
173179// +kubebuilder:rbac:groups=authentication.k8s.io,resources=tokenreviews,verbs=create
174180// +kubebuilder:rbac:groups=authorization.k8s.io,resources=subjectaccessreviews,verbs=create
181+ // Setup CRD migrator
182+ // +kubebuilder:rbac:groups=apiextensions.k8s.io,resources=customresourcedefinitions,verbs=get;list;watch;update;patch
183+ // +kubebuilder:rbac:groups=apiextensions.k8s.io,resources=customresourcedefinitions/status,verbs=get;list;watch;update;patch
184+ // +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=openstackclusters;openstackmachines;openstackmachinetemplates;openstackclustertemplates;openstackfloatingippools;openstackservers;openstackclusteridentities,verbs=get;list;watch;patch;update
185+ // +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=openstackclusters/status;openstackmachines/status;openstackmachinetemplates/status;openstackclustertemplates/status;openstackfloatingippools/status;openstackservers/status;openstackclusteridentities/status,verbs=get;patch;update
175186
176187func main () {
177188 InitFlags (pflag .CommandLine )
@@ -296,6 +307,43 @@ func setupChecks(mgr ctrl.Manager) {
296307func setupReconcilers (ctx context.Context , mgr ctrl.Manager , caCerts []byte ) {
297308 scopeFactory := scope .NewFactory (scopeCacheMaxSize )
298309
310+ crdMigratorConfig := map [client.Object ]crdmigrator.ByObjectConfig {
311+ & infrav1.OpenStackCluster {}: {
312+ UseCache : true ,
313+ },
314+ & infrav1.OpenStackMachine {}: {
315+ UseCache : true ,
316+ },
317+ & infrav1.OpenStackMachineTemplate {}: {
318+ UseCache : true ,
319+ },
320+ & infrav1.OpenStackClusterTemplate {}: {
321+ UseCache : true ,
322+ },
323+ & infrav1alpha1.OpenStackFloatingIPPool {}: {
324+ UseCache : true ,
325+ },
326+ & infrav1alpha1.OpenStackServer {}: {
327+ UseCache : true ,
328+ },
329+ & infrav1alpha1.OpenStackClusterIdentity {}: {
330+ UseCache : true ,
331+ },
332+ }
333+ crdMigratorSkipPhases := []crdmigrator.Phase {}
334+ for _ , p := range skipCRDMigrationPhases {
335+ crdMigratorSkipPhases = append (crdMigratorSkipPhases , crdmigrator .Phase (p ))
336+ }
337+ if err := (& crdmigrator.CRDMigrator {
338+ Client : mgr .GetClient (),
339+ APIReader : mgr .GetAPIReader (),
340+ SkipCRDMigrationPhases : crdMigratorSkipPhases ,
341+ Config : crdMigratorConfig ,
342+ }).SetupWithManager (ctx , mgr , concurrency (1 )); err != nil {
343+ setupLog .Error (err , "unable to setup CRD migrator" )
344+ os .Exit (1 )
345+ }
346+
299347 if err := (& controllers.OpenStackClusterReconciler {
300348 Client : mgr .GetClient (),
301349 Recorder : mgr .GetEventRecorderFor ("openstackcluster-controller" ),
0 commit comments