Skip to content

Commit e2718ab

Browse files
committed
Add controller unit tests
Signed-off-by: Jose A. Rivera <[email protected]>
1 parent ddf57e4 commit e2718ab

File tree

1 file changed

+167
-0
lines changed

1 file changed

+167
-0
lines changed

pkg/controller/controller_test.go

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
package controller
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"testing"
7+
"time"
8+
9+
"github.com/kubernetes-csi/external-resizer/pkg/csi"
10+
"github.com/kubernetes-csi/external-resizer/pkg/resizer"
11+
12+
"k8s.io/api/core/v1"
13+
"k8s.io/apimachinery/pkg/api/resource"
14+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15+
"k8s.io/apimachinery/pkg/runtime"
16+
"k8s.io/client-go/informers"
17+
"k8s.io/client-go/kubernetes"
18+
"k8s.io/client-go/kubernetes/fake"
19+
)
20+
21+
func TestController(t *testing.T) {
22+
for _, test := range []struct {
23+
Name string
24+
PVC *v1.PersistentVolumeClaim
25+
PV *v1.PersistentVolume
26+
27+
CreateObjects bool
28+
NodeResize bool
29+
}{
30+
{
31+
Name: "Invalid key",
32+
PVC: invalidPVC(),
33+
},
34+
{
35+
Name: "PVC not found",
36+
PVC: pvc(1, 1),
37+
},
38+
{
39+
Name: "PVC doesn't need resize",
40+
PVC: pvc(1, 1),
41+
CreateObjects: true,
42+
},
43+
{
44+
Name: "PV not found",
45+
PVC: pvc(2, 1),
46+
CreateObjects: true,
47+
},
48+
{
49+
Name: "PV doesn't need resize",
50+
PVC: pvc(2, 1),
51+
PV: pv(2),
52+
CreateObjects: true,
53+
},
54+
{
55+
Name: "Resize PVC, no FS resize",
56+
PVC: pvc(2, 1),
57+
PV: pv(1),
58+
CreateObjects: true,
59+
},
60+
{
61+
Name: "Resize PVC with FS resize",
62+
PVC: pvc(2, 1),
63+
PV: pv(1),
64+
CreateObjects: true,
65+
NodeResize: true,
66+
},
67+
} {
68+
client := csi.NewMockClient(test.NodeResize, true, true)
69+
70+
initialObjects := []runtime.Object{}
71+
if test.CreateObjects {
72+
if test.PVC != nil {
73+
initialObjects = append(initialObjects, test.PVC)
74+
}
75+
if test.PV != nil {
76+
initialObjects = append(initialObjects, test.PV)
77+
}
78+
}
79+
80+
kubeClient, informerFactory := fakeK8s(initialObjects)
81+
pvInformer := informerFactory.Core().V1().PersistentVolumes()
82+
pvcInformer := informerFactory.Core().V1().PersistentVolumeClaims()
83+
84+
for _, obj := range initialObjects {
85+
switch obj.(type) {
86+
case *v1.PersistentVolume:
87+
pvInformer.Informer().GetStore().Add(obj)
88+
case *v1.PersistentVolumeClaim:
89+
pvcInformer.Informer().GetStore().Add(obj)
90+
default:
91+
t.Fatalf("Test %s: Unknown initalObject type: %+v", test.Name, obj)
92+
}
93+
}
94+
95+
csiResizer, err := resizer.NewResizerFromClient(client, 15*time.Second, kubeClient, informerFactory)
96+
if err != nil {
97+
t.Fatalf("Test %s: Unable to create resizer: %v", test.Name, err)
98+
}
99+
100+
driverName, _ := client.GetDriverName(context.TODO())
101+
controller := NewResizeController(driverName, csiResizer, kubeClient, time.Second, informerFactory)
102+
err = controller.(*resizeController).syncPVC(fmt.Sprintf("%s/%s", test.PVC.Namespace, test.PVC.Name))
103+
if err != nil {
104+
t.Fatalf("Test %s: Unexpected error: %v", test.Name, err)
105+
}
106+
}
107+
}
108+
109+
func invalidPVC() *v1.PersistentVolumeClaim {
110+
pvc := pvc(1, 1)
111+
pvc.ObjectMeta.Name = ""
112+
pvc.ObjectMeta.Namespace = ""
113+
114+
return pvc
115+
}
116+
117+
func quantityGB(i int) resource.Quantity {
118+
q := resource.NewQuantity(int64(i*1024*1024), resource.BinarySI)
119+
return *q
120+
}
121+
122+
func pvc(requestGB, capacityGB int) *v1.PersistentVolumeClaim {
123+
request := quantityGB(requestGB)
124+
capacity := quantityGB(capacityGB)
125+
126+
return &v1.PersistentVolumeClaim{
127+
ObjectMeta: metav1.ObjectMeta{
128+
Name: "testPVC",
129+
Namespace: "test",
130+
},
131+
Spec: v1.PersistentVolumeClaimSpec{
132+
Resources: v1.ResourceRequirements{
133+
Requests: map[v1.ResourceName]resource.Quantity{
134+
v1.ResourceStorage: request,
135+
},
136+
},
137+
VolumeName: "testPV",
138+
},
139+
Status: v1.PersistentVolumeClaimStatus{
140+
Phase: v1.ClaimBound,
141+
Capacity: map[v1.ResourceName]resource.Quantity{
142+
v1.ResourceStorage: capacity,
143+
},
144+
},
145+
}
146+
}
147+
148+
func pv(capacityGB int) *v1.PersistentVolume {
149+
capacity := quantityGB(capacityGB)
150+
151+
return &v1.PersistentVolume{
152+
ObjectMeta: metav1.ObjectMeta{
153+
Name: "testPV",
154+
},
155+
Spec: v1.PersistentVolumeSpec{
156+
Capacity: map[v1.ResourceName]resource.Quantity{
157+
v1.ResourceStorage: capacity,
158+
},
159+
},
160+
}
161+
}
162+
163+
func fakeK8s(objs []runtime.Object) (kubernetes.Interface, informers.SharedInformerFactory) {
164+
client := fake.NewSimpleClientset(objs...)
165+
informerFactory := informers.NewSharedInformerFactory(client, 0)
166+
return client, informerFactory
167+
}

0 commit comments

Comments
 (0)