From 490220e656179fb80427b161f4f31a55da219f1d Mon Sep 17 00:00:00 2001 From: deviantony Date: Tue, 19 Sep 2023 13:12:45 +0000 Subject: [PATCH] refactor: introduce converter function for default storage class --- .../adapter/converter/persistentvolume.go | 6 +- internal/adapter/converter/storageclass.go | 33 +++++++++++ internal/adapter/persistentvolume.go | 8 +-- internal/adapter/storageclass.go | 58 +++++-------------- 4 files changed, 55 insertions(+), 50 deletions(-) create mode 100644 internal/adapter/converter/storageclass.go diff --git a/internal/adapter/converter/persistentvolume.go b/internal/adapter/converter/persistentvolume.go index 0cd1b0a..32b0e39 100644 --- a/internal/adapter/converter/persistentvolume.go +++ b/internal/adapter/converter/persistentvolume.go @@ -11,10 +11,10 @@ import ( "k8s.io/kubernetes/pkg/apis/core" ) -func (converter *DockerAPIConverter) ConvertVolumeToPersistentVolume(volume volume.Volume, pvcConfigMap *corev1.ConfigMap) (*core.PersistentVolume, error) { +func (converter *DockerAPIConverter) ConvertVolumeToPersistentVolume(volume *volume.Volume, pvcConfigMap *corev1.ConfigMap) (core.PersistentVolume, error) { creationDate, err := time.Parse(time.RFC3339, volume.CreatedAt) if err != nil { - return nil, fmt.Errorf("unable to parse volume creation date: %w", err) + return core.PersistentVolume{}, fmt.Errorf("unable to parse volume creation date: %w", err) } var persistentVolumeClaimReference *core.ObjectReference @@ -29,7 +29,7 @@ func (converter *DockerAPIConverter) ConvertVolumeToPersistentVolume(volume volu } } - return &core.PersistentVolume{ + return core.PersistentVolume{ ObjectMeta: metav1.ObjectMeta{ Name: volume.Name, CreationTimestamp: metav1.Time{ diff --git a/internal/adapter/converter/storageclass.go b/internal/adapter/converter/storageclass.go new file mode 100644 index 0000000..b80db8c --- /dev/null +++ b/internal/adapter/converter/storageclass.go @@ -0,0 +1,33 @@ +package converter + +import ( + "time" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/kubernetes/pkg/apis/storage" +) + +func BuildDefaultStorageClass(startTime time.Time) storage.StorageClass { + reclaimPolicy := core.PersistentVolumeReclaimRetain + volumeBindingMode := storage.VolumeBindingWaitForFirstConsumer + + return storage.StorageClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "local", + Annotations: map[string]string{ + "storageclass.kubernetes.io/is-default-class": "true", + }, + CreationTimestamp: metav1.Time{ + Time: startTime, + }, + }, + TypeMeta: metav1.TypeMeta{ + Kind: "StorageClass", + APIVersion: "storage.k8s.io/v1", + }, + Provisioner: "k2d.io/local", + ReclaimPolicy: &reclaimPolicy, + VolumeBindingMode: &volumeBindingMode, + } +} diff --git a/internal/adapter/persistentvolume.go b/internal/adapter/persistentvolume.go index a54f570..49b33fc 100644 --- a/internal/adapter/persistentvolume.go +++ b/internal/adapter/persistentvolume.go @@ -52,7 +52,7 @@ func (adapter *KubeDockerAdapter) GetPersistentVolume(ctx context.Context, persi ) } - persistentVolume, err := adapter.converter.ConvertVolumeToPersistentVolume(volume, boundPVCConfigMap) + persistentVolume, err := adapter.converter.ConvertVolumeToPersistentVolume(&volume, boundPVCConfigMap) if err != nil { return nil, fmt.Errorf("unable to convert Docker volume to PersistentVolume: %w", err) } @@ -64,7 +64,7 @@ func (adapter *KubeDockerAdapter) GetPersistentVolume(ctx context.Context, persi }, } - err = adapter.ConvertK8SResource(persistentVolume, &versionedPersistentVolume) + err = adapter.ConvertK8SResource(&persistentVolume, &versionedPersistentVolume) if err != nil { return nil, fmt.Errorf("unable to convert internal object to versioned object: %w", err) } @@ -133,12 +133,12 @@ func (adapter *KubeDockerAdapter) listPersistentVolumes(ctx context.Context) (co ) } - persistentVolume, err := adapter.converter.ConvertVolumeToPersistentVolume(*volume, boundPVCConfigMap) + persistentVolume, err := adapter.converter.ConvertVolumeToPersistentVolume(volume, boundPVCConfigMap) if err != nil { return core.PersistentVolumeList{}, fmt.Errorf("unable to convert Docker volume to PersistentVolume: %w", err) } - persistentVolumes = append(persistentVolumes, *persistentVolume) + persistentVolumes = append(persistentVolumes, persistentVolume) } diff --git a/internal/adapter/storageclass.go b/internal/adapter/storageclass.go index 31ee78c..3bba698 100644 --- a/internal/adapter/storageclass.go +++ b/internal/adapter/storageclass.go @@ -4,12 +4,11 @@ import ( "context" "fmt" + "github.com/portainer/k2d/internal/adapter/converter" adaptererr "github.com/portainer/k2d/internal/adapter/errors" "github.com/portainer/k2d/internal/k8s" - corev1 "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/storage" ) @@ -18,28 +17,21 @@ func (adapter *KubeDockerAdapter) GetStorageClass(ctx context.Context, storageCl return nil, adaptererr.ErrResourceNotFound } - reclaimPolicy := corev1.PersistentVolumeReclaimPolicy("Retain") - volumeBindingMode := storagev1.VolumeBindingMode("WaitForFirstConsumer") - - // TODO: create in the converter package - return &storagev1.StorageClass{ - ObjectMeta: metav1.ObjectMeta{ - Name: "local", - Annotations: map[string]string{ - "storageclass.kubernetes.io/is-default-class": "true", - }, - CreationTimestamp: metav1.Time{ - Time: adapter.startTime, - }, - }, + defaultStorageClass := converter.BuildDefaultStorageClass(adapter.startTime) + + versionedStorageClass := storagev1.StorageClass{ TypeMeta: metav1.TypeMeta{ Kind: "StorageClass", APIVersion: "storage.k8s.io/v1", }, - Provisioner: "k2d.io/local", - ReclaimPolicy: &reclaimPolicy, - VolumeBindingMode: &volumeBindingMode, - }, nil + } + + err := adapter.ConvertK8SResource(&defaultStorageClass, &versionedStorageClass) + if err != nil { + return nil, fmt.Errorf("unable to convert internal object to versioned object: %w", err) + } + + return &versionedStorageClass, nil } func (adapter *KubeDockerAdapter) ListStorageClasses(ctx context.Context) (storagev1.StorageClassList, error) { @@ -73,30 +65,10 @@ func (adapter *KubeDockerAdapter) GetStorageClassTable(ctx context.Context) (*me } func (adapter *KubeDockerAdapter) listStorageClasses(ctx context.Context) (storage.StorageClassList, error) { - storageClasses := []storage.StorageClass{} + defaultStorageClass := converter.BuildDefaultStorageClass(adapter.startTime) - reclaimPolicy := core.PersistentVolumeReclaimPolicy("Retain") - volumeBindingMode := storage.VolumeBindingMode("WaitForFirstConsumer") - - // TODO: introduce a converter method to centralize the default storage class object creation - storageClasses = append(storageClasses, storage.StorageClass{ - ObjectMeta: metav1.ObjectMeta{ - Name: "local", - Annotations: map[string]string{ - "storageclass.kubernetes.io/is-default-class": "true", - }, - CreationTimestamp: metav1.Time{ - Time: adapter.startTime, - }, - }, - TypeMeta: metav1.TypeMeta{ - Kind: "StorageClass", - APIVersion: "storage.k8s.io/v1", - }, - Provisioner: "k2d.io/local", - ReclaimPolicy: &reclaimPolicy, - VolumeBindingMode: &volumeBindingMode, - }) + storageClasses := []storage.StorageClass{} + storageClasses = append(storageClasses, defaultStorageClass) return storage.StorageClassList{ TypeMeta: metav1.TypeMeta{