@@ -22,6 +22,7 @@ import (
22
22
"net"
23
23
"os"
24
24
"path/filepath"
25
+ "sync/atomic"
25
26
"testing"
26
27
"time"
27
28
@@ -46,11 +47,15 @@ const (
46
47
47
48
type fakeDRADriverGRPCServer struct {
48
49
drapbv1.UnimplementedNodeServer
49
- driverName string
50
- timeout * time.Duration
50
+ driverName string
51
+ timeout * time.Duration
52
+ prepareResourceCalls atomic.Uint32
53
+ unprepareResourceCalls atomic.Uint32
51
54
}
52
55
53
56
func (s * fakeDRADriverGRPCServer ) NodePrepareResources (ctx context.Context , req * drapbv1.NodePrepareResourcesRequest ) (* drapbv1.NodePrepareResourcesResponse , error ) {
57
+ s .prepareResourceCalls .Add (1 )
58
+
54
59
if s .timeout != nil {
55
60
time .Sleep (* s .timeout )
56
61
}
@@ -60,6 +65,8 @@ func (s *fakeDRADriverGRPCServer) NodePrepareResources(ctx context.Context, req
60
65
}
61
66
62
67
func (s * fakeDRADriverGRPCServer ) NodeUnprepareResources (ctx context.Context , req * drapbv1.NodeUnprepareResourcesRequest ) (* drapbv1.NodeUnprepareResourcesResponse , error ) {
68
+ s .unprepareResourceCalls .Add (1 )
69
+
63
70
if s .timeout != nil {
64
71
time .Sleep (* s .timeout )
65
72
}
@@ -68,10 +75,23 @@ func (s *fakeDRADriverGRPCServer) NodeUnprepareResources(ctx context.Context, re
68
75
69
76
type tearDown func ()
70
77
71
- func setupFakeDRADriverGRPCServer (shouldTimeout bool ) (string , tearDown , error ) {
78
+ type fakeDRAServerInfo struct {
79
+ // fake DRA server
80
+ server * fakeDRADriverGRPCServer
81
+ // fake DRA plugin socket name
82
+ socketName string
83
+ // teardownFn stops fake gRPC server
84
+ teardownFn tearDown
85
+ }
86
+
87
+ func setupFakeDRADriverGRPCServer (shouldTimeout bool ) (fakeDRAServerInfo , error ) {
72
88
socketDir , err := os .MkdirTemp ("" , "dra" )
73
89
if err != nil {
74
- return "" , nil , err
90
+ return fakeDRAServerInfo {
91
+ server : nil ,
92
+ socketName : "" ,
93
+ teardownFn : nil ,
94
+ }, err
75
95
}
76
96
77
97
socketName := filepath .Join (socketDir , "server.sock" )
@@ -85,7 +105,11 @@ func setupFakeDRADriverGRPCServer(shouldTimeout bool) (string, tearDown, error)
85
105
l , err := net .Listen ("unix" , socketName )
86
106
if err != nil {
87
107
teardown ()
88
- return "" , nil , err
108
+ return fakeDRAServerInfo {
109
+ server : nil ,
110
+ socketName : "" ,
111
+ teardownFn : nil ,
112
+ }, err
89
113
}
90
114
91
115
s := grpc .NewServer ()
@@ -105,7 +129,11 @@ func setupFakeDRADriverGRPCServer(shouldTimeout bool) (string, tearDown, error)
105
129
s .GracefulStop ()
106
130
}()
107
131
108
- return socketName , teardown , nil
132
+ return fakeDRAServerInfo {
133
+ server : fakeDRADriverGRPCServer ,
134
+ socketName : socketName ,
135
+ teardownFn : teardown ,
136
+ }, nil
109
137
}
110
138
111
139
func TestNewManagerImpl (t * testing.T ) {
@@ -177,10 +205,12 @@ func TestGetResources(t *testing.T) {
177
205
},
178
206
},
179
207
claimInfo : & ClaimInfo {
180
- annotations : []kubecontainer.Annotation {
181
- {
182
- Name : "test-annotation" ,
183
- Value : "123" ,
208
+ annotations : map [string ][]kubecontainer.Annotation {
209
+ "test-plugin" : {
210
+ {
211
+ Name : "test-annotation" ,
212
+ Value : "123" ,
213
+ },
184
214
},
185
215
},
186
216
ClaimInfoState : state.ClaimInfoState {
@@ -280,14 +310,15 @@ func TestPrepareResources(t *testing.T) {
280
310
fakeKubeClient := fake .NewSimpleClientset ()
281
311
282
312
for _ , test := range []struct {
283
- description string
284
- driverName string
285
- pod * v1.Pod
286
- claimInfo * ClaimInfo
287
- resourceClaim * resourcev1alpha2.ResourceClaim
288
- wantErr bool
289
- wantTimeout bool
290
- wantResourceSkipped bool
313
+ description string
314
+ driverName string
315
+ pod * v1.Pod
316
+ claimInfo * ClaimInfo
317
+ resourceClaim * resourcev1alpha2.ResourceClaim
318
+ wantErr bool
319
+ wantTimeout bool
320
+ wantResourceSkipped bool
321
+ ExpectedPrepareCalls uint32
291
322
}{
292
323
{
293
324
description : "failed to fetch ResourceClaim" ,
@@ -497,6 +528,7 @@ func TestPrepareResources(t *testing.T) {
497
528
Namespace : "test-namespace" ,
498
529
PodUIDs : sets.Set [string ]{"test-another-pod-reserved" : sets.Empty {}},
499
530
},
531
+ prepared : true ,
500
532
},
501
533
resourceClaim : & resourcev1alpha2.ResourceClaim {
502
534
ObjectMeta : metav1.ObjectMeta {
@@ -574,11 +606,12 @@ func TestPrepareResources(t *testing.T) {
574
606
},
575
607
},
576
608
},
577
- wantErr : true ,
578
- wantTimeout : true ,
609
+ wantErr : true ,
610
+ wantTimeout : true ,
611
+ ExpectedPrepareCalls : 1 ,
579
612
},
580
613
{
581
- description : "should prepare resource" ,
614
+ description : "should prepare resource, claim not in cache " ,
582
615
driverName : driverName ,
583
616
pod : & v1.Pod {
584
617
ObjectMeta : metav1.ObjectMeta {
@@ -630,6 +663,78 @@ func TestPrepareResources(t *testing.T) {
630
663
},
631
664
},
632
665
},
666
+ ExpectedPrepareCalls : 1 ,
667
+ },
668
+ {
669
+ description : "should prepare resource. claim in cache, manager did not prepare resource" ,
670
+ driverName : driverName ,
671
+ pod : & v1.Pod {
672
+ ObjectMeta : metav1.ObjectMeta {
673
+ Name : "test-pod" ,
674
+ Namespace : "test-namespace" ,
675
+ UID : "test-reserved" ,
676
+ },
677
+ Spec : v1.PodSpec {
678
+ ResourceClaims : []v1.PodResourceClaim {
679
+ {
680
+ Name : "test-pod-claim" ,
681
+ Source : v1.ClaimSource {ResourceClaimName : func () * string {
682
+ s := "test-pod-claim"
683
+ return & s
684
+ }()},
685
+ },
686
+ },
687
+ Containers : []v1.Container {
688
+ {
689
+ Resources : v1.ResourceRequirements {
690
+ Claims : []v1.ResourceClaim {
691
+ {
692
+ Name : "test-pod-claim" ,
693
+ },
694
+ },
695
+ },
696
+ },
697
+ },
698
+ },
699
+ },
700
+ claimInfo : & ClaimInfo {
701
+ ClaimInfoState : state.ClaimInfoState {
702
+ DriverName : driverName ,
703
+ ClassName : "test-class" ,
704
+ ClaimName : "test-pod-claim" ,
705
+ ClaimUID : "test-reserved" ,
706
+ Namespace : "test-namespace" ,
707
+ PodUIDs : sets.Set [string ]{"test-reserved" : sets.Empty {}},
708
+ CDIDevices : map [string ][]string {
709
+ driverName : {fmt .Sprintf ("%s/%s=some-device" , driverName , driverClassName )},
710
+ },
711
+ ResourceHandles : []resourcev1alpha2.ResourceHandle {{Data : "test-data" }},
712
+ },
713
+ annotations : make (map [string ][]kubecontainer.Annotation ),
714
+ prepared : false ,
715
+ },
716
+ resourceClaim : & resourcev1alpha2.ResourceClaim {
717
+ ObjectMeta : metav1.ObjectMeta {
718
+ Name : "test-pod-claim" ,
719
+ Namespace : "test-namespace" ,
720
+ UID : "test-reserved" ,
721
+ },
722
+ Spec : resourcev1alpha2.ResourceClaimSpec {
723
+ ResourceClassName : "test-class" ,
724
+ },
725
+ Status : resourcev1alpha2.ResourceClaimStatus {
726
+ DriverName : driverName ,
727
+ Allocation : & resourcev1alpha2.AllocationResult {
728
+ ResourceHandles : []resourcev1alpha2.ResourceHandle {
729
+ {Data : "test-data" },
730
+ },
731
+ },
732
+ ReservedFor : []resourcev1alpha2.ResourceClaimConsumerReference {
733
+ {UID : "test-reserved" },
734
+ },
735
+ },
736
+ },
737
+ ExpectedPrepareCalls : 1 ,
633
738
},
634
739
} {
635
740
t .Run (test .description , func (t * testing.T ) {
@@ -649,14 +754,14 @@ func TestPrepareResources(t *testing.T) {
649
754
}
650
755
}
651
756
652
- socketName , teardown , err := setupFakeDRADriverGRPCServer (test .wantTimeout )
757
+ draServerInfo , err := setupFakeDRADriverGRPCServer (test .wantTimeout )
653
758
if err != nil {
654
759
t .Fatal (err )
655
760
}
656
- defer teardown ()
761
+ defer draServerInfo . teardownFn ()
657
762
658
763
plg := plugin .NewRegistrationHandler ()
659
- if err := plg .RegisterPlugin (test .driverName , socketName , []string {"1.27" }); err != nil {
764
+ if err := plg .RegisterPlugin (test .driverName , draServerInfo . socketName , []string {"1.27" }); err != nil {
660
765
t .Fatalf ("failed to register plugin %s, err: %v" , test .driverName , err )
661
766
}
662
767
defer plg .DeRegisterPlugin (test .driverName ) // for sake of next tests
@@ -666,6 +771,9 @@ func TestPrepareResources(t *testing.T) {
666
771
}
667
772
668
773
err = manager .PrepareResources (test .pod )
774
+
775
+ assert .Equal (t , test .ExpectedPrepareCalls , draServerInfo .server .prepareResourceCalls .Load ())
776
+
669
777
if test .wantErr {
670
778
assert .Error (t , err )
671
779
return // PrepareResources returned an error so stopping the subtest here
@@ -705,13 +813,14 @@ func TestUnprepareResources(t *testing.T) {
705
813
fakeKubeClient := fake .NewSimpleClientset ()
706
814
707
815
for _ , test := range []struct {
708
- description string
709
- driverName string
710
- pod * v1.Pod
711
- claimInfo * ClaimInfo
712
- wantErr bool
713
- wantTimeout bool
714
- wantResourceSkipped bool
816
+ description string
817
+ driverName string
818
+ pod * v1.Pod
819
+ claimInfo * ClaimInfo
820
+ wantErr bool
821
+ wantTimeout bool
822
+ wantResourceSkipped bool
823
+ expectedUnprepareCalls uint32
715
824
}{
716
825
{
717
826
description : "plugin does not exist" ,
@@ -838,11 +947,12 @@ func TestUnprepareResources(t *testing.T) {
838
947
},
839
948
},
840
949
},
841
- wantErr : true ,
842
- wantTimeout : true ,
950
+ wantErr : true ,
951
+ wantTimeout : true ,
952
+ expectedUnprepareCalls : 1 ,
843
953
},
844
954
{
845
- description : "should unprepare resource" ,
955
+ description : "should unprepare resource, claim previously prepared by currently running manager " ,
846
956
driverName : driverName ,
847
957
pod : & v1.Pod {
848
958
ObjectMeta : metav1.ObjectMeta {
@@ -885,7 +995,57 @@ func TestUnprepareResources(t *testing.T) {
885
995
},
886
996
},
887
997
},
998
+ prepared : true ,
999
+ },
1000
+ expectedUnprepareCalls : 1 ,
1001
+ },
1002
+ {
1003
+ description : "should unprepare resource, claim previously was not prepared by currently running manager" ,
1004
+ driverName : driverName ,
1005
+ pod : & v1.Pod {
1006
+ ObjectMeta : metav1.ObjectMeta {
1007
+ Name : "test-pod" ,
1008
+ Namespace : "test-namespace" ,
1009
+ UID : "test-reserved" ,
1010
+ },
1011
+ Spec : v1.PodSpec {
1012
+ ResourceClaims : []v1.PodResourceClaim {
1013
+ {
1014
+ Name : "test-pod-claim" ,
1015
+ Source : v1.ClaimSource {ResourceClaimName : func () * string {
1016
+ s := "test-pod-claim"
1017
+ return & s
1018
+ }()},
1019
+ },
1020
+ },
1021
+ Containers : []v1.Container {
1022
+ {
1023
+ Resources : v1.ResourceRequirements {
1024
+ Claims : []v1.ResourceClaim {
1025
+ {
1026
+ Name : "test-pod-claim" ,
1027
+ },
1028
+ },
1029
+ },
1030
+ },
1031
+ },
1032
+ },
1033
+ },
1034
+ claimInfo : & ClaimInfo {
1035
+ ClaimInfoState : state.ClaimInfoState {
1036
+ DriverName : driverName ,
1037
+ ClaimName : "test-pod-claim" ,
1038
+ Namespace : "test-namespace" ,
1039
+ ResourceHandles : []resourcev1alpha2.ResourceHandle {
1040
+ {
1041
+ DriverName : driverName ,
1042
+ Data : "test data" ,
1043
+ },
1044
+ },
1045
+ },
1046
+ prepared : false ,
888
1047
},
1048
+ expectedUnprepareCalls : 1 ,
889
1049
},
890
1050
} {
891
1051
t .Run (test .description , func (t * testing.T ) {
@@ -894,14 +1054,14 @@ func TestUnprepareResources(t *testing.T) {
894
1054
t .Fatalf ("failed to create a new instance of the claimInfoCache, err: %v" , err )
895
1055
}
896
1056
897
- socketName , teardown , err := setupFakeDRADriverGRPCServer (test .wantTimeout )
1057
+ draServerInfo , err := setupFakeDRADriverGRPCServer (test .wantTimeout )
898
1058
if err != nil {
899
1059
t .Fatal (err )
900
1060
}
901
- defer teardown ()
1061
+ defer draServerInfo . teardownFn ()
902
1062
903
1063
plg := plugin .NewRegistrationHandler ()
904
- if err := plg .RegisterPlugin (test .driverName , socketName , []string {"1.27" }); err != nil {
1064
+ if err := plg .RegisterPlugin (test .driverName , draServerInfo . socketName , []string {"1.27" }); err != nil {
905
1065
t .Fatalf ("failed to register plugin %s, err: %v" , test .driverName , err )
906
1066
}
907
1067
defer plg .DeRegisterPlugin (test .driverName ) // for sake of next tests
@@ -916,6 +1076,9 @@ func TestUnprepareResources(t *testing.T) {
916
1076
}
917
1077
918
1078
err = manager .UnprepareResources (test .pod )
1079
+
1080
+ assert .Equal (t , test .expectedUnprepareCalls , draServerInfo .server .unprepareResourceCalls .Load ())
1081
+
919
1082
if test .wantErr {
920
1083
assert .Error (t , err )
921
1084
return // UnprepareResources returned an error so stopping the subtest here
0 commit comments