Skip to content

Commit c3994c5

Browse files
authored
refactor: create storage classes directly instead of using CRS (#539)
**What problem does this PR solve?**: **Which issue(s) this PR fixes**: Removes our dependency for Cluster Resource Sets entirely for Nutanix Clusters **How Has This Been Tested?**: <!-- Please describe the tests that you ran to verify your changes. Provide output from the tests and any manual steps needed to replicate the tests. --> Create a cluster and check if storage class is created. ```sh 02:55 PM faiqus @ archlinux ~/go/src/github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix faiq/storageclass-direct? $ kubectl --kubeconfig=faiqcsi.conf get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nutanix-volume (default) csi.nutanix.com Delete WaitForFirstConsumer false 3m 02:56 PM faiqus @ archlinux ~/go/src/github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix faiq/storageclass-direct? $ kubectl get clusterresourcesets No resources found in default namespace. 02:56 PM faiqus @ archlinux ~/go/src/github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix faiq/storageclass-direct? $ kubectl get clusterresourcesets -A No resources found 02:56 PM faiqus @ archlinux ~/go/src/github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix faiq/storageclass-direct? $ kubectl get helmreleaseproxy -A NAMESPACE NAME CLUSTER READY REASON STATUS REVISION default cilium-faiqcsi-ndb7v faiqcsi True deployed 1 default cluster-autoscaler-faiqcsi-v58lv faiqcsi True deployed 1 default node-feature-discovery-faiqcsi-q9n2w faiqcsi True deployed 1 default nutanix-cloud-provider-faiqcsi-2d4zq faiqcsi True deployed 1 default nutanix-csi-snapshot-faiqcsi-wjmjr faiqcsi True deployed 1 default nutanix-csi-storage-faiqcsi-6567j faiqcsi True deployed 1 ``` **Special notes for your reviewer**: <!-- Use this to provide any additional information to the reviewers. This may include: - Best way to review the PR. - Where the author wants the most review attention on. - etc. -->
1 parent b5784c1 commit c3994c5

File tree

3 files changed

+55
-79
lines changed

3 files changed

+55
-79
lines changed

pkg/handlers/generic/lifecycle/csi/aws-ebs/handler.go

+8-38
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"github.com/spf13/pflag"
1212
corev1 "k8s.io/api/core/v1"
1313
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14-
"k8s.io/apimachinery/pkg/runtime"
1514
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
1615
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
1716
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
@@ -22,7 +21,7 @@ import (
2221
"github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pkg/handlers/options"
2322
)
2423

25-
var defaultStorageClassParams = map[string]string{
24+
var defaultStorageClassParameters = map[string]string{
2625
"csi.storage.k8s.io/fstype": "ext4",
2726
"type": "gp3",
2827
}
@@ -74,49 +73,20 @@ func (a *AWSEBS) Apply(
7473
default:
7574
return fmt.Errorf("stategy %s not implemented", strategy)
7675
}
77-
return a.createStorageClasses(
76+
err := lifecycleutils.CreateStorageClassOnRemote(
7877
ctx,
78+
a.client,
7979
provider.StorageClassConfig,
8080
&req.Cluster,
8181
defaultStorageConfig,
82+
v1alpha1.CSIProviderAWSEBS,
83+
v1alpha1.AWSEBSProvisioner,
84+
defaultStorageClassParameters,
8285
)
83-
}
84-
85-
func (a *AWSEBS) createStorageClasses(ctx context.Context,
86-
configs []v1alpha1.StorageClassConfig,
87-
cluster *clusterv1.Cluster,
88-
defaultStorageConfig *v1alpha1.DefaultStorage,
89-
) error {
90-
allStorageClasses := make([]runtime.Object, 0, len(configs))
91-
for _, config := range configs {
92-
setAsDefault := config.Name == defaultStorageConfig.StorageClassConfigName &&
93-
v1alpha1.CSIProviderAWSEBS == defaultStorageConfig.ProviderName
94-
allStorageClasses = append(allStorageClasses, lifecycleutils.CreateStorageClass(
95-
config,
96-
v1alpha1.AWSEBSProvisioner,
97-
setAsDefault,
98-
defaultStorageClassParams,
99-
))
100-
}
101-
cm, err := lifecycleutils.CreateConfigMapForCRS(
102-
fmt.Sprintf("aws-storageclass-cm-%s", cluster.Name),
103-
a.config.DefaultsNamespace(),
104-
allStorageClasses...,
105-
)
106-
if err != nil {
107-
return err
108-
}
109-
err = client.ServerSideApply(ctx, a.client, cm)
11086
if err != nil {
111-
return err
87+
return fmt.Errorf("error creating StorageClasses for the AWS EBS CSI driver: %w", err)
11288
}
113-
return lifecycleutils.EnsureCRSForClusterFromObjects(
114-
ctx,
115-
"aws-storageclass-crs",
116-
a.client,
117-
cluster,
118-
cm,
119-
)
89+
return nil
12090
}
12191

12292
func (a *AWSEBS) handleCRSApply(ctx context.Context,

pkg/handlers/generic/lifecycle/csi/nutanix-csi/handler.go

+5-41
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"github.com/go-logr/logr"
1111
"github.com/spf13/pflag"
1212
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13-
"k8s.io/apimachinery/pkg/runtime"
1413
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
1514
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
1615
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
@@ -117,16 +116,19 @@ func (n *NutanixCSI) Apply(
117116
}
118117
}
119118

120-
err := n.createStorageClasses(
119+
err := lifecycleutils.CreateStorageClassOnRemote(
121120
ctx,
121+
n.client,
122122
provider.StorageClassConfig,
123123
&req.Cluster,
124124
defaultStorageConfig,
125+
v1alpha1.CSIProviderNutanix,
126+
v1alpha1.NutanixProvisioner,
127+
defaultStorageClassParameters,
125128
)
126129
if err != nil {
127130
return fmt.Errorf("error creating StorageClasses for the Nutanix CSI driver: %w", err)
128131
}
129-
130132
return nil
131133
}
132134

@@ -222,41 +224,3 @@ func (n *NutanixCSI) handleHelmAddonApply(
222224

223225
return nil
224226
}
225-
226-
func (n *NutanixCSI) createStorageClasses(
227-
ctx context.Context,
228-
configs []v1alpha1.StorageClassConfig,
229-
cluster *clusterv1.Cluster,
230-
defaultStorageConfig *v1alpha1.DefaultStorage,
231-
) error {
232-
allStorageClasses := make([]runtime.Object, 0, len(configs))
233-
for _, config := range configs {
234-
setAsDefault := config.Name == defaultStorageConfig.StorageClassConfigName &&
235-
v1alpha1.CSIProviderNutanix == defaultStorageConfig.ProviderName
236-
allStorageClasses = append(allStorageClasses, lifecycleutils.CreateStorageClass(
237-
config,
238-
v1alpha1.NutanixProvisioner,
239-
setAsDefault,
240-
defaultStorageClassParameters,
241-
))
242-
}
243-
cm, err := lifecycleutils.CreateConfigMapForCRS(
244-
fmt.Sprintf("nutanix-storageclass-cm-%s", cluster.Name),
245-
n.config.DefaultsNamespace(),
246-
allStorageClasses...,
247-
)
248-
if err != nil {
249-
return err
250-
}
251-
err = client.ServerSideApply(ctx, n.client, cm)
252-
if err != nil {
253-
return err
254-
}
255-
return lifecycleutils.EnsureCRSForClusterFromObjects(
256-
ctx,
257-
"nutanix-storageclass-crs",
258-
n.client,
259-
cluster,
260-
cm,
261-
)
262-
}

pkg/handlers/generic/lifecycle/utils/scs.go

+42
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,18 @@
44
package utils
55

66
import (
7+
"context"
8+
"fmt"
9+
710
storagev1 "k8s.io/api/storage/v1"
811
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
912
"k8s.io/utils/ptr"
13+
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
14+
"sigs.k8s.io/cluster-api/controllers/remote"
15+
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
1016

1117
"github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/api/v1alpha1"
18+
"github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/common/pkg/k8s/client"
1219
)
1320

1421
const (
@@ -50,3 +57,38 @@ func CreateStorageClass(
5057
}
5158
return &sc
5259
}
60+
61+
func CreateStorageClassOnRemote(
62+
ctx context.Context,
63+
cl ctrlclient.Client,
64+
configs []v1alpha1.StorageClassConfig,
65+
cluster *clusterv1.Cluster,
66+
defaultStorageConfig *v1alpha1.DefaultStorage,
67+
csiProvider string,
68+
provisioner v1alpha1.StorageProvisioner,
69+
defaultParameters map[string]string,
70+
) error {
71+
allStorageClasses := make([]*storagev1.StorageClass, 0, len(configs))
72+
for _, config := range configs {
73+
setAsDefault := config.Name == defaultStorageConfig.StorageClassConfigName &&
74+
csiProvider == defaultStorageConfig.ProviderName
75+
allStorageClasses = append(allStorageClasses, CreateStorageClass(
76+
config,
77+
provisioner,
78+
setAsDefault,
79+
defaultParameters,
80+
))
81+
}
82+
clusterKey := ctrlclient.ObjectKeyFromObject(cluster)
83+
remoteClient, err := remote.NewClusterClient(ctx, "", cl, clusterKey)
84+
if err != nil {
85+
return fmt.Errorf("error creating client for remote cluster: %w", err)
86+
}
87+
for _, sc := range allStorageClasses {
88+
err = client.ServerSideApply(ctx, remoteClient, sc)
89+
if err != nil {
90+
return fmt.Errorf("error creating storage class %v on remote cluster %w", sc, err)
91+
}
92+
}
93+
return nil
94+
}

0 commit comments

Comments
 (0)