Skip to content

Commit e36a186

Browse files
committed
test: fix e2e test failure
fix golin
1 parent 6d3cc45 commit e36a186

File tree

2 files changed

+330
-4
lines changed

2 files changed

+330
-4
lines changed

Diff for: pkg/util/volume_util_test.go

+326
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,326 @@
1+
/*
2+
Copyright 2025 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package util
18+
19+
import (
20+
"testing"
21+
22+
"github.com/google/go-cmp/cmp"
23+
"k8s.io/api/core/v1"
24+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25+
)
26+
27+
func TestGetPersistentVolumeNodeNames(t *testing.T) {
28+
tests := []struct {
29+
name string
30+
pv *v1.PersistentVolume
31+
expectedNodeNames []string
32+
}{
33+
{
34+
name: "nil PV",
35+
pv: nil,
36+
},
37+
{
38+
name: "PV missing node affinity",
39+
pv: &v1.PersistentVolume{
40+
ObjectMeta: metav1.ObjectMeta{
41+
Name: "foo",
42+
},
43+
},
44+
},
45+
{
46+
name: "PV node affinity missing required",
47+
pv: &v1.PersistentVolume{
48+
ObjectMeta: metav1.ObjectMeta{
49+
Name: "foo",
50+
},
51+
Spec: v1.PersistentVolumeSpec{
52+
NodeAffinity: &v1.VolumeNodeAffinity{},
53+
},
54+
},
55+
},
56+
{
57+
name: "PV node affinity required zero selector terms",
58+
pv: &v1.PersistentVolume{
59+
ObjectMeta: metav1.ObjectMeta{
60+
Name: "foo",
61+
},
62+
Spec: v1.PersistentVolumeSpec{
63+
NodeAffinity: &v1.VolumeNodeAffinity{
64+
Required: &v1.NodeSelector{
65+
NodeSelectorTerms: []v1.NodeSelectorTerm{},
66+
},
67+
},
68+
},
69+
},
70+
expectedNodeNames: []string{},
71+
},
72+
{
73+
name: "PV node affinity required zero selector terms",
74+
pv: &v1.PersistentVolume{
75+
ObjectMeta: metav1.ObjectMeta{
76+
Name: "foo",
77+
},
78+
Spec: v1.PersistentVolumeSpec{
79+
NodeAffinity: &v1.VolumeNodeAffinity{
80+
Required: &v1.NodeSelector{
81+
NodeSelectorTerms: []v1.NodeSelectorTerm{},
82+
},
83+
},
84+
},
85+
},
86+
expectedNodeNames: []string{},
87+
},
88+
{
89+
name: "PV node affinity required zero match expressions",
90+
pv: &v1.PersistentVolume{
91+
ObjectMeta: metav1.ObjectMeta{
92+
Name: "foo",
93+
},
94+
Spec: v1.PersistentVolumeSpec{
95+
NodeAffinity: &v1.VolumeNodeAffinity{
96+
Required: &v1.NodeSelector{
97+
NodeSelectorTerms: []v1.NodeSelectorTerm{
98+
{
99+
MatchExpressions: []v1.NodeSelectorRequirement{},
100+
},
101+
},
102+
},
103+
},
104+
},
105+
},
106+
expectedNodeNames: []string{},
107+
},
108+
{
109+
name: "PV node affinity required multiple match expressions",
110+
pv: &v1.PersistentVolume{
111+
ObjectMeta: metav1.ObjectMeta{
112+
Name: "foo",
113+
},
114+
Spec: v1.PersistentVolumeSpec{
115+
NodeAffinity: &v1.VolumeNodeAffinity{
116+
Required: &v1.NodeSelector{
117+
NodeSelectorTerms: []v1.NodeSelectorTerm{
118+
{
119+
MatchExpressions: []v1.NodeSelectorRequirement{
120+
{
121+
Key: "foo",
122+
Operator: v1.NodeSelectorOpIn,
123+
},
124+
{
125+
Key: "bar",
126+
Operator: v1.NodeSelectorOpIn,
127+
},
128+
},
129+
},
130+
},
131+
},
132+
},
133+
},
134+
},
135+
expectedNodeNames: []string{},
136+
},
137+
{
138+
name: "PV node affinity required single match expression with no values",
139+
pv: &v1.PersistentVolume{
140+
ObjectMeta: metav1.ObjectMeta{
141+
Name: "foo",
142+
},
143+
Spec: v1.PersistentVolumeSpec{
144+
NodeAffinity: &v1.VolumeNodeAffinity{
145+
Required: &v1.NodeSelector{
146+
NodeSelectorTerms: []v1.NodeSelectorTerm{
147+
{
148+
MatchExpressions: []v1.NodeSelectorRequirement{
149+
{
150+
Key: v1.LabelHostname,
151+
Operator: v1.NodeSelectorOpIn,
152+
Values: []string{},
153+
},
154+
},
155+
},
156+
},
157+
},
158+
},
159+
},
160+
},
161+
expectedNodeNames: []string{},
162+
},
163+
{
164+
name: "PV node affinity required single match expression with single node",
165+
pv: &v1.PersistentVolume{
166+
ObjectMeta: metav1.ObjectMeta{
167+
Name: "foo",
168+
},
169+
Spec: v1.PersistentVolumeSpec{
170+
NodeAffinity: &v1.VolumeNodeAffinity{
171+
Required: &v1.NodeSelector{
172+
NodeSelectorTerms: []v1.NodeSelectorTerm{
173+
{
174+
MatchExpressions: []v1.NodeSelectorRequirement{
175+
{
176+
Key: v1.LabelHostname,
177+
Operator: v1.NodeSelectorOpIn,
178+
Values: []string{
179+
"node1",
180+
},
181+
},
182+
},
183+
},
184+
},
185+
},
186+
},
187+
},
188+
},
189+
expectedNodeNames: []string{
190+
"node1",
191+
},
192+
},
193+
{
194+
name: "PV node affinity required single match expression with multiple nodes",
195+
pv: &v1.PersistentVolume{
196+
ObjectMeta: metav1.ObjectMeta{
197+
Name: "foo",
198+
},
199+
Spec: v1.PersistentVolumeSpec{
200+
NodeAffinity: &v1.VolumeNodeAffinity{
201+
Required: &v1.NodeSelector{
202+
NodeSelectorTerms: []v1.NodeSelectorTerm{
203+
{
204+
MatchExpressions: []v1.NodeSelectorRequirement{
205+
{
206+
Key: v1.LabelHostname,
207+
Operator: v1.NodeSelectorOpIn,
208+
Values: []string{
209+
"node1",
210+
"node2",
211+
},
212+
},
213+
},
214+
},
215+
},
216+
},
217+
},
218+
},
219+
},
220+
expectedNodeNames: []string{
221+
"node1",
222+
"node2",
223+
},
224+
},
225+
{
226+
name: "PV node affinity required multiple match expressions with multiple nodes",
227+
pv: &v1.PersistentVolume{
228+
ObjectMeta: metav1.ObjectMeta{
229+
Name: "foo",
230+
},
231+
Spec: v1.PersistentVolumeSpec{
232+
NodeAffinity: &v1.VolumeNodeAffinity{
233+
Required: &v1.NodeSelector{
234+
NodeSelectorTerms: []v1.NodeSelectorTerm{
235+
{
236+
MatchExpressions: []v1.NodeSelectorRequirement{
237+
{
238+
Key: "bar",
239+
Operator: v1.NodeSelectorOpIn,
240+
Values: []string{
241+
"node1",
242+
"node2",
243+
},
244+
},
245+
{
246+
Key: v1.LabelHostname,
247+
Operator: v1.NodeSelectorOpIn,
248+
Values: []string{
249+
"node3",
250+
"node4",
251+
},
252+
},
253+
},
254+
},
255+
},
256+
},
257+
},
258+
},
259+
},
260+
expectedNodeNames: []string{
261+
"node3",
262+
"node4",
263+
},
264+
},
265+
{
266+
name: "PV node affinity required multiple node selectors multiple match expressions with multiple nodes",
267+
pv: &v1.PersistentVolume{
268+
ObjectMeta: metav1.ObjectMeta{
269+
Name: "foo",
270+
},
271+
Spec: v1.PersistentVolumeSpec{
272+
NodeAffinity: &v1.VolumeNodeAffinity{
273+
Required: &v1.NodeSelector{
274+
NodeSelectorTerms: []v1.NodeSelectorTerm{
275+
{
276+
MatchExpressions: []v1.NodeSelectorRequirement{
277+
{
278+
Key: v1.LabelHostname,
279+
Operator: v1.NodeSelectorOpIn,
280+
Values: []string{
281+
"node1",
282+
"node2",
283+
},
284+
},
285+
{
286+
Key: v1.LabelHostname,
287+
Operator: v1.NodeSelectorOpIn,
288+
Values: []string{
289+
"node2",
290+
"node3",
291+
},
292+
},
293+
},
294+
},
295+
{
296+
MatchExpressions: []v1.NodeSelectorRequirement{
297+
{
298+
Key: v1.LabelHostname,
299+
Operator: v1.NodeSelectorOpIn,
300+
Values: []string{
301+
"node1",
302+
},
303+
},
304+
},
305+
},
306+
},
307+
},
308+
},
309+
},
310+
},
311+
expectedNodeNames: []string{
312+
"node1",
313+
"node2",
314+
},
315+
},
316+
}
317+
318+
for _, test := range tests {
319+
t.Run(test.name, func(t *testing.T) {
320+
nodeNames := GetLocalPersistentVolumeNodeNames(test.pv)
321+
if diff := cmp.Diff(test.expectedNodeNames, nodeNames); diff != "" {
322+
t.Errorf("Unexpected nodeNames (-want, +got):\n%s", diff)
323+
}
324+
})
325+
}
326+
}

Diff for: test/e2e/e2e_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ func init() {
154154
fmt.Printf("PROVISIONER_IMAGE_PULL_POLICY: %s\n", imagePullPolicyFromEnv)
155155
}
156156

157-
var _ = utils.SIGDescribe("PersistentVolumes-local ", func() {
157+
var _ = utils.SIGDescribe("PersistentVolumes-local", func() {
158158
f := framework.NewDefaultFramework("persistent-local-volumes-test")
159159
f.NamespacePodSecurityEnforceLevel = admissionapi.LevelPrivileged
160160
var (
@@ -190,7 +190,7 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() {
190190

191191
// Provisioner positive tests
192192
for _, testConfig := range testConfigs {
193-
ctxString := fmt.Sprintf("Local volume provisioner [Serial][UseJobForCleaning: %v][VolumeType: %v]", testConfig.UseJobForCleaning, testConfig.VolumeType)
193+
ctxString := fmt.Sprintf("Local volume provisioner [WithSerial][UseJobForCleaning: %v][VolumeType: %v]", testConfig.UseJobForCleaning, testConfig.VolumeType)
194194
Context(ctxString, func() {
195195
BeforeEach(func(ctx SpecContext) {
196196
setupStorageClass(config, &immediateMode)
@@ -247,7 +247,7 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() {
247247
}
248248

249249
// Provisioner negative tests
250-
Context("Local volume provisioner [Serial]", func() {
250+
Context("Local volume provisioner [WithSerial]", func() {
251251
BeforeEach(func(ctx SpecContext) {
252252
setupStorageClass(config, &immediateMode)
253253
setupLocalVolumeProvisioner(ctx, config, nil)
@@ -282,7 +282,7 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() {
282282
})
283283

284284
// Provisioner stress tests
285-
Context("Stress with local volume provisioner [Serial]", func() {
285+
Context("Stress with local volume provisioner [WithSerial]", func() {
286286
var testVols [][]*localVolume
287287

288288
const (

0 commit comments

Comments
 (0)