From 6ed8e04596fa84f8596105ebeca4539c2759d901 Mon Sep 17 00:00:00 2001 From: w-mj Date: Mon, 20 Feb 2023 17:28:31 +0800 Subject: [PATCH] first step on persistent volume --- src/app_model.go | 16 +++++++++++ src/k8s_client.go | 71 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/src/app_model.go b/src/app_model.go index e5f29c1..396660c 100644 --- a/src/app_model.go +++ b/src/app_model.go @@ -140,3 +140,19 @@ func (a *AppModel) GetPorts() []int32 { func (a *AppModel) IngressName() string { return fmt.Sprintf("%s-ingress", a.NamePrefix()) } + +func (a *AppModel) PersistentVolumeName() string { + return a.UserName + "-pv" +} + +func (a *AppModel) NFSPath() string { + return "/data/" + a.UserName +} + +func (a *AppModel) PersistentVolumeClaimName() string { + return a.NamePrefix() + "-pvc" +} + +func (a *AppModel) StorageClassName() string { + return a.NamePrefix() + "-storage-class" +} diff --git a/src/k8s_client.go b/src/k8s_client.go index 9c3dbdd..6c772b7 100644 --- a/src/k8s_client.go +++ b/src/k8s_client.go @@ -8,6 +8,7 @@ import ( appv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" netv1 "k8s.io/api/networking/v1" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/selection" @@ -330,3 +331,73 @@ func (c *K8sClient) DeleteIngress(name string) { log.WithError(err).Error("Delete Ingress") } } + +func (c *K8sClient) PersistentVolumeExists(app *AppModel) bool { + _, err := c.CoreV1().PersistentVolumes().Get(context.Background(), app.PersistentVolumeName(), metav1.GetOptions{}) + if err == nil { + return true + } + if !strings.Contains(err.Error(), "not found") { + log.WithError(err).Error("PersistentVolumeExists") + } + return false +} + +func (c *K8sClient) CreatePersistentVolume(app *AppModel) { + cap1, _ := resource.ParseQuantity("1Gi") + pv := &v1.PersistentVolume{ + ObjectMeta: metav1.ObjectMeta{ + Name: app.PersistentVolumeName(), + }, + Spec: v1.PersistentVolumeSpec{ + AccessModes: []v1.PersistentVolumeAccessMode{ + v1.ReadWriteMany, + }, + PersistentVolumeReclaimPolicy: v1.PersistentVolumeReclaimRetain, + Capacity: v1.ResourceList{ + "storage": cap1, + }, + StorageClassName: app.StorageClassName(), + PersistentVolumeSource: v1.PersistentVolumeSource{ + NFS: &v1.NFSVolumeSource{ + Server: "192.168.1.1", + Path: app.NFSPath(), + ReadOnly: false, + }, + }, + }, + } + pv, err := c.CoreV1().PersistentVolumes().Create(context.Background(), pv, metav1.CreateOptions{}) + if err != nil { + log.WithError(err).Error("CreatePersistentVolume") + } +} + +func (c *K8sClient) PersistentVolumeClaimExists(app *AppModel) bool { + _, err := c.CoreV1().PersistentVolumeClaims(c.Namespace).Get(context.Background(), app.PersistentVolumeClaimName(), metav1.GetOptions{}) + if err == nil { + return true + } + if !strings.Contains(err.Error(), "not found") { + log.WithError(err).Error("PersistentVolumeExists") + } + return false +} + +func (c *K8sClient) CreatePersistentVolumeClaim(app *AppModel) { + pvc := &v1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: app.PersistentVolumeClaimName(), + }, + Spec: v1.PersistentVolumeClaimSpec{ + StorageClassName: UnnamedPointer(app.StorageClassName()), + AccessModes: []v1.PersistentVolumeAccessMode{ + v1.ReadWriteMany, + }, + }, + } + pvc, err := c.CoreV1().PersistentVolumeClaims(c.Namespace).Create(context.Background(), pvc, metav1.CreateOptions{}) + if err != nil { + log.WithError(err).Error("CreatePersistentVolumeClaim") + } +}