@@ -23,44 +23,125 @@ import (
23
23
corev1 "k8s.io/api/core/v1"
24
24
apierrors "k8s.io/apimachinery/pkg/api/errors"
25
25
"k8s.io/apimachinery/pkg/types"
26
+ ctrl "sigs.k8s.io/controller-runtime/pkg/client"
27
+
28
+ "github.com/cloudnative-pg/cloudnative-pg/pkg/specs"
29
+ "github.com/cloudnative-pg/cloudnative-pg/pkg/utils"
26
30
27
31
. "github.com/onsi/ginkgo/v2"
28
32
. "github.com/onsi/gomega"
29
33
)
30
34
31
- var _ = Describe ("cluster_scale unit tests" , func () {
32
- It ("should make sure that scale down works correctly" , func () {
33
- ctx := context .Background ()
34
- namespace := newFakeNamespace ()
35
- cluster := newFakeCNPGCluster (namespace )
36
-
37
- resources := & managedResources {
38
- pvcs : corev1.PersistentVolumeClaimList {Items : generateFakePVCWithDefaultClient (cluster )},
39
- jobs : batchv1.JobList {Items : generateFakeInitDBJobsWithDefaultClient (cluster )},
40
- instances : corev1.PodList {Items : generateFakeClusterPodsWithDefaultClient (cluster , true )},
41
- }
42
-
43
- sacrificialInstanceBefore := getSacrificialInstance (resources .instances .Items )
44
- err := k8sClient .Get (
45
- ctx ,
46
- types.NamespacedName {Name : sacrificialInstanceBefore .Name , Namespace : cluster .Namespace },
47
- & corev1.Pod {},
48
- )
49
- Expect (err ).To (BeNil ())
50
-
51
- err = clusterReconciler .scaleDownCluster (
52
- ctx ,
53
- cluster ,
54
- resources ,
55
- )
56
- Expect (err ).To (BeNil ())
57
-
58
- sacrificialInstance := getSacrificialInstance (resources .instances .Items )
59
- err = k8sClient .Get (
60
- ctx ,
61
- types.NamespacedName {Name : sacrificialInstance .Name , Namespace : cluster .Namespace },
62
- & corev1.Pod {},
63
- )
64
- Expect (apierrors .IsNotFound (err )).To (BeTrue ())
35
+ var _ = Describe ("scale down" , func () {
36
+ When ("there's no separate WAL storage" , func () {
37
+ It ("delete the PGDATA PVC" , func () {
38
+ ctx := context .Background ()
39
+ namespace := newFakeNamespace ()
40
+ cluster := newFakeCNPGCluster (namespace )
41
+
42
+ resources := & managedResources {
43
+ pvcs : corev1.PersistentVolumeClaimList {Items : generateFakePVCWithDefaultClient (cluster )},
44
+ jobs : batchv1.JobList {Items : generateFakeInitDBJobsWithDefaultClient (cluster )},
45
+ instances : corev1.PodList {Items : generateFakeClusterPodsWithDefaultClient (cluster , true )},
46
+ }
47
+
48
+ sacrificialInstance := getSacrificialInstance (resources .instances .Items )
49
+ Expect (isResourceExisting (
50
+ ctx ,
51
+ & corev1.Pod {},
52
+ types.NamespacedName {Name : sacrificialInstance .Name , Namespace : cluster .Namespace },
53
+ )).To (BeTrue ())
54
+ Expect (isResourceExisting (
55
+ ctx ,
56
+ & corev1.PersistentVolumeClaim {},
57
+ types.NamespacedName {Name : sacrificialInstance .Name , Namespace : cluster .Namespace },
58
+ )).To (BeTrue ())
59
+
60
+ Expect (clusterReconciler .scaleDownCluster (
61
+ ctx ,
62
+ cluster ,
63
+ resources ,
64
+ )).To (Succeed ())
65
+
66
+ Expect (isResourceExisting (
67
+ ctx ,
68
+ & corev1.Pod {},
69
+ types.NamespacedName {Name : sacrificialInstance .Name , Namespace : cluster .Namespace },
70
+ )).To (BeFalse ())
71
+ Expect (isResourceExisting (
72
+ ctx ,
73
+ & corev1.PersistentVolumeClaim {},
74
+ types.NamespacedName {Name : sacrificialInstance .Name , Namespace : cluster .Namespace },
75
+ )).To (BeFalse ())
76
+ })
77
+ })
78
+
79
+ When ("WAL storage is separate" , func () {
80
+ It ("delete the PGDATA and WAL PVC" , func () {
81
+ ctx := context .Background ()
82
+ namespace := newFakeNamespace ()
83
+ cluster := newFakeCNPGClusterWithPGWal (namespace )
84
+
85
+ resources := & managedResources {
86
+ pvcs : corev1.PersistentVolumeClaimList {Items : generateFakePVCWithDefaultClient (cluster )},
87
+ jobs : batchv1.JobList {Items : generateFakeInitDBJobsWithDefaultClient (cluster )},
88
+ instances : corev1.PodList {Items : generateFakeClusterPodsWithDefaultClient (cluster , true )},
89
+ }
90
+
91
+ sacrificialInstance := getSacrificialInstance (resources .instances .Items )
92
+ pvcWalName := specs .GetPVCName (* cluster , sacrificialInstance .Name , utils .PVCRolePgWal )
93
+ Expect (isResourceExisting (
94
+ ctx ,
95
+ & corev1.Pod {},
96
+ types.NamespacedName {Name : sacrificialInstance .Name , Namespace : cluster .Namespace },
97
+ )).To (BeTrue ())
98
+ Expect (isResourceExisting (
99
+ ctx ,
100
+ & corev1.PersistentVolumeClaim {},
101
+ types.NamespacedName {Name : sacrificialInstance .Name , Namespace : cluster .Namespace },
102
+ )).To (BeTrue ())
103
+ Expect (isResourceExisting (
104
+ ctx ,
105
+ & corev1.PersistentVolumeClaim {},
106
+ types.NamespacedName {Name : pvcWalName , Namespace : cluster .Namespace },
107
+ )).To (BeTrue ())
108
+
109
+ Expect (clusterReconciler .scaleDownCluster (
110
+ ctx ,
111
+ cluster ,
112
+ resources ,
113
+ )).To (Succeed ())
114
+
115
+ Expect (isResourceExisting (
116
+ ctx ,
117
+ & corev1.Pod {},
118
+ types.NamespacedName {Name : sacrificialInstance .Name , Namespace : cluster .Namespace },
119
+ )).To (BeFalse ())
120
+ Expect (isResourceExisting (
121
+ ctx ,
122
+ & corev1.PersistentVolumeClaim {},
123
+ types.NamespacedName {Name : sacrificialInstance .Name , Namespace : cluster .Namespace },
124
+ )).To (BeFalse ())
125
+ Expect (isResourceExisting (
126
+ ctx ,
127
+ & corev1.PersistentVolumeClaim {},
128
+ types.NamespacedName {Name : pvcWalName , Namespace : cluster .Namespace },
129
+ )).To (BeFalse ())
130
+ })
65
131
})
66
132
})
133
+
134
+ // isResourceExisting check is a certain resource exists in the Kubernetes space and has not been deleted
135
+ func isResourceExisting (ctx context.Context , store ctrl.Object , key ctrl.ObjectKey ) (bool , error ) {
136
+ err := k8sClient .Get (ctx , key , store )
137
+ if err != nil && apierrors .IsNotFound (err ) {
138
+ return false , nil
139
+ }
140
+ if err != nil {
141
+ return false , err
142
+ }
143
+ if store .GetDeletionTimestamp () != nil {
144
+ return false , nil
145
+ }
146
+ return true , nil
147
+ }
0 commit comments