/
k8s_pvc.go
102 lines (88 loc) · 3.09 KB
/
k8s_pvc.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package k8s
import (
"context"
"fmt"
"github.com/sirupsen/logrus"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// createPersistentVolumeClaim deploys a PersistentVolumeClaim if it does not exist.
func createPersistentVolumeClaim(
namespace,
name string,
labels map[string]string,
size resource.Quantity,
accessModes []v1.PersistentVolumeAccessMode,
) error {
pvc := &v1.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{
Namespace: namespace,
Name: name,
Labels: labels,
},
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: accessModes,
Resources: v1.VolumeResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceStorage: size,
},
},
},
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
if !IsInitialized() {
return fmt.Errorf("knuu is not initialized")
}
if _, err := Clientset().CoreV1().PersistentVolumeClaims(namespace).Create(ctx, pvc, metav1.CreateOptions{}); err != nil {
return err
}
logrus.Debugf("PersistentVolumeClaim %s created", name)
return nil
}
// deletePersistentVolumeClaim deletes a PersistentVolumeClaim if it exists.
func deletePersistentVolumeClaim(namespace, name string) error {
// Get the pvc object from the API server
_, err := getPersistentVolumeClaim(namespace, name)
if err != nil {
// If the pvc does not exist, skip and return without error
return nil
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
if !IsInitialized() {
return fmt.Errorf("knuu is not initialized")
}
if err := Clientset().CoreV1().PersistentVolumeClaims(namespace).Delete(ctx, name, metav1.DeleteOptions{}); err != nil {
return fmt.Errorf("error deleting PersistentVolumeClaim %s: %w", name, err)
}
logrus.Debugf("PersistentVolumeClaim %s deleted", name)
return nil
}
// getPersistentVolumeClaim retrieves a PersistentVolumeClaim.
func getPersistentVolumeClaim(namespace, name string) (*v1.PersistentVolumeClaim, error) {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
if !IsInitialized() {
return nil, fmt.Errorf("knuu is not initialized")
}
pv, err := Clientset().CoreV1().PersistentVolumeClaims(namespace).Get(ctx, name, metav1.GetOptions{})
if err != nil {
return nil, err
}
return pv, nil
}
// DeployPersistentVolumeClaim creates a new PersistentVolumeClaim in the specified namespace.
func DeployPersistentVolumeClaim(namespace, name string, labels map[string]string, size resource.Quantity) {
accessModes := []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}
if err := createPersistentVolumeClaim(namespace, name, labels, size, accessModes); err != nil {
logrus.Fatalf("Error creating PersistentVolumeClaim %s: %v", name, err)
}
}
// DeletePersistentVolumeClaim deletes the PersistentVolumeClaim with the specified name in the specified namespace.
func DeletePersistentVolumeClaim(namespace, name string) {
if err := deletePersistentVolumeClaim(namespace, name); err != nil {
logrus.Fatalf("Error deleting PersistentVolumeClaim %s: %v", name, err)
}
}