@@ -17,8 +17,116 @@ limitations under the License.
1717package e2e
1818
1919import (
20+ "context"
21+ "encoding/json"
22+ "os"
23+
24+ "github.com/kubernetes-sigs/dra-driver-cpu/test/pkg/discovery"
25+ "github.com/kubernetes-sigs/dra-driver-cpu/test/pkg/fixture"
26+ "github.com/kubernetes-sigs/dra-driver-cpu/test/pkg/node"
27+ e2epod "github.com/kubernetes-sigs/dra-driver-cpu/test/pkg/pod"
2028 "github.com/onsi/ginkgo/v2"
29+ "github.com/onsi/gomega"
30+ v1 "k8s.io/api/core/v1"
31+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
32+ "k8s.io/client-go/kubernetes"
33+ "k8s.io/utils/cpuset"
2134)
2235
23- var _ = ginkgo .Describe ("CPU Assignment" , func () {
36+ var _ = ginkgo .Describe ("CPU Assignment" , ginkgo .Ordered , ginkgo .ContinueOnFailure , func () {
37+ var rootFxt * fixture.Fixture
38+ var targetNode * v1.Node
39+ var targetNodeCPUInfo discovery.DRACPUInfo
40+ var dracpuTesterImage string
41+
42+ ginkgo .BeforeAll (func (ctx context.Context ) {
43+ dracpuTesterImage = os .Getenv ("DRACPU_TEST_IMAGE" )
44+ gomega .Expect (dracpuTesterImage ).ToNot (gomega .BeEmpty (), "missing environment variable DRACPU_TEST_IMAGE" )
45+
46+ var err error
47+ rootFxt , err = fixture .Make ("root" , ctx )
48+ gomega .Expect (err ).ToNot (gomega .HaveOccurred (), "cannot create e2e root test fixture: %v" , err )
49+
50+ workerNodes , err := node .FindWorkers (ctx , rootFxt .K8SClientset )
51+ gomega .Expect (err ).ToNot (gomega .HaveOccurred (), "cannot find worker nodes: %v" , err )
52+ gomega .Expect (workerNodes ).ToNot (gomega .BeEmpty (), "no worker nodes detected" )
53+
54+ targetNode = workerNodes [0 ] // pick random one, this is the simplest random pick
55+ ginkgo .GinkgoLogr .Info ("Using worker node" , "nodeName" , targetNode .Name )
56+
57+ infoPod , err := e2epod .RunToCompletion (ctx , rootFxt .K8SClientset , makeDiscoveryPod (rootFxt .Namespace .Name , dracpuTesterImage ))
58+ gomega .Expect (err ).ToNot (gomega .HaveOccurred (), "cannot create discovery pod: %v" , err )
59+ data , err := e2epod .GetLogs (rootFxt .K8SClientset , ctx , infoPod .Namespace , infoPod .Name , infoPod .Spec .Containers [0 ].Name )
60+ gomega .Expect (err ).ToNot (gomega .HaveOccurred (), "cannot get logs from discovery pod: %v" , err )
61+ gomega .Expect (json .Unmarshal ([]byte (data ), & targetNodeCPUInfo )).To (gomega .Succeed ())
62+ ginkgo .GinkgoLogr .Info ("checking worker node" , "coreCount" , len (targetNodeCPUInfo .CPUs ))
63+
64+ gomega .Expect (rootFxt .Teardown (ctx )).To (gomega .Succeed ())
65+ })
66+
67+ ginkgo .When ("not setting resource claims" , func () {
68+ ginkgo .It ("should grant best-effort pods access to all system CPUs" , func (ctx context.Context ) {
69+ fxt , err := rootFxt .MakeFrom ("" , ctx )
70+ gomega .Expect (err ).ToNot (gomega .HaveOccurred (), "cannot create test fixture: %v" , err )
71+ ginkgo .DeferCleanup (fxt .Teardown , context .TODO ()) // TODO
72+
73+ pod , err := e2epod .CreateSync (ctx , fxt .K8SClientset , makeTesterPodBestEffort (rootFxt .Namespace .Name , dracpuTesterImage ))
74+ gomega .Expect (err ).ToNot (gomega .HaveOccurred (), "cannot create tester pod: %v" , err )
75+
76+ cpus , err := getTesterPodCPUAllocation (fxt .K8SClientset , ctx , pod )
77+ gomega .Expect (err ).ToNot (gomega .HaveOccurred (), "cannot get the CPUs allocated to tester pod %s/%s" , pod .Namespace , pod .Name )
78+ gomega .Expect (cpus .Size ()).To (gomega .Equal (len (targetNodeCPUInfo .CPUs )))
79+ })
80+ })
2481})
82+
83+ func getTesterPodCPUAllocation (cs kubernetes.Interface , ctx context.Context , pod * v1.Pod ) (cpuset.CPUSet , error ) {
84+ data , err := e2epod .GetLogs (cs , ctx , pod .Namespace , pod .Name , pod .Spec .Containers [0 ].Name )
85+ if err != nil {
86+ return cpuset.CPUSet {}, err
87+ }
88+ testerInfo := discovery.DRACPUTester {}
89+ err = json .Unmarshal ([]byte (data ), & testerInfo )
90+ if err != nil {
91+ return cpuset.CPUSet {}, err
92+ }
93+ return cpuset .Parse (testerInfo .Allocation .CPUs )
94+ }
95+
96+ func makeTesterPodBestEffort (ns , image string ) * v1.Pod {
97+ return & v1.Pod {
98+ ObjectMeta : metav1.ObjectMeta {
99+ GenerateName : "tester-pod-" ,
100+ Namespace : ns ,
101+ },
102+ Spec : v1.PodSpec {
103+ Containers : []v1.Container {
104+ {
105+ Name : "tester-container" ,
106+ Image : image ,
107+ Command : []string {"/dracputester" },
108+ },
109+ },
110+ RestartPolicy : v1 .RestartPolicyAlways ,
111+ },
112+ }
113+ }
114+ func makeDiscoveryPod (ns , image string ) * v1.Pod {
115+ return & v1.Pod {
116+ ObjectMeta : metav1.ObjectMeta {
117+ Name : "discovery-pod" ,
118+ Namespace : ns ,
119+ },
120+ Spec : v1.PodSpec {
121+ Containers : []v1.Container {
122+ {
123+ Name : "discovery-container" ,
124+ Image : image ,
125+ ImagePullPolicy : v1 .PullIfNotPresent ,
126+ Command : []string {"/dracpuinfo" },
127+ },
128+ },
129+ RestartPolicy : v1 .RestartPolicyNever ,
130+ },
131+ }
132+ }
0 commit comments