Skip to content

Commit 8c68172

Browse files
committed
feat: Implement CRD migration
1 parent 3450619 commit 8c68172

File tree

3 files changed

+78
-1
lines changed

3 files changed

+78
-1
lines changed

config/rbac/role.yaml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,17 @@ rules:
2424
- patch
2525
- update
2626
- watch
27+
- apiGroups:
28+
- apiextensions.k8s.io
29+
resources:
30+
- customresourcedefinitions
31+
- customresourcedefinitions/status
32+
verbs:
33+
- get
34+
- list
35+
- patch
36+
- update
37+
- watch
2738
- apiGroups:
2839
- authentication.k8s.io
2940
resources:
@@ -78,8 +89,10 @@ rules:
7889
- infrastructure.cluster.x-k8s.io
7990
resources:
8091
- cloudstackaffinitygroups/status
92+
- cloudstackclustertemplates/status
8193
- cloudstackisolatednetworks/status
8294
- cloudstackmachines/status
95+
- cloudstackmachinestatecheckers/status
8396
- cloudstackmachinetemplates/status
8497
verbs:
8598
- get
@@ -95,6 +108,17 @@ rules:
95108
- get
96109
- patch
97110
- update
111+
- apiGroups:
112+
- infrastructure.cluster.x-k8s.io
113+
resources:
114+
- cloudstackclustertemplates
115+
- cloudstackmachinestatecheckers
116+
verbs:
117+
- get
118+
- list
119+
- patch
120+
- update
121+
- watch
98122
- apiGroups:
99123
- infrastructure.cluster.x-k8s.io
100124
resources:

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ require (
1717
golang.org/x/text v0.28.0
1818
gopkg.in/yaml.v3 v3.0.1
1919
k8s.io/api v0.33.3
20+
k8s.io/apiextensions-apiserver v0.33.3
2021
k8s.io/apimachinery v0.33.3
2122
k8s.io/client-go v0.33.3
2223
k8s.io/component-base v0.33.3
@@ -95,7 +96,6 @@ require (
9596
google.golang.org/protobuf v1.36.6 // indirect
9697
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
9798
gopkg.in/inf.v0 v0.9.1 // indirect
98-
k8s.io/apiextensions-apiserver v0.33.3 // indirect
9999
k8s.io/apiserver v0.33.3 // indirect
100100
k8s.io/cluster-bootstrap v0.33.3 // indirect
101101
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect

main.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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"
@@ -61,6 +63,7 @@ var (
6163
)
6264

6365
func 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))
@@ -90,6 +93,7 @@ var (
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

194206
func main() {
195207
initFlags(pflag.CommandLine)
@@ -308,6 +320,47 @@ func setupChecks(mgr ctrl.Manager) {
308320

309321
func 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

Comments
 (0)