@@ -36,6 +36,8 @@ import (
3636 "fmt"
3737 "testing"
3838
39+ "github.com/Project-HAMi/HAMi/pkg/device/nvidia"
40+
3941 spec "github.com/NVIDIA/k8s-device-plugin/api/config/v1"
4042 "github.com/stretchr/testify/require"
4143 kubeletdevicepluginv1beta1 "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1"
@@ -124,6 +126,118 @@ func TestDeviceMapInsert(t *testing.T) {
124126 }
125127}
126128
129+ func TestUpdateDeviceMapWithReplicas (t * testing.T ) {
130+ device0 := Device {Device : kubeletdevicepluginv1beta1.Device {ID : "0" }, Index : "0" }
131+ device1 := Device {Device : kubeletdevicepluginv1beta1.Device {ID : "1" }}
132+ device2 := Device {Device : kubeletdevicepluginv1beta1.Device {ID : "2" }}
133+ device3 := Device {Device : kubeletdevicepluginv1beta1.Device {ID : "3" }}
134+
135+ testCases := []struct {
136+ description string
137+ config * nvidia.DeviceConfig
138+ devices DeviceMap
139+ expectedDeviceMap DeviceMap
140+ }{
141+ {
142+ description : "Update device map with replicas" ,
143+ config : & nvidia.DeviceConfig {
144+ Config : & spec.Config {
145+ Sharing : spec.Sharing {
146+ TimeSlicing : spec.ReplicatedResources {
147+ Resources : []spec.ReplicatedResource {
148+ {
149+ Name : "resource1" ,
150+ Replicas : 2 ,
151+ Rename : "replicated-resource1" ,
152+ Devices : spec.ReplicatedDevices {
153+ All : true ,
154+ },
155+ },
156+ {
157+ Name : "resource2" ,
158+ Replicas : 1 ,
159+ Devices : spec.ReplicatedDevices {
160+ All : true ,
161+ },
162+ },
163+ },
164+ },
165+ },
166+ },
167+ },
168+ devices : DeviceMap {
169+ "resource1" : Devices {
170+ "0" : & device0 ,
171+ "1" : & device1 ,
172+ },
173+ "resource2" : Devices {
174+ "2" : & device2 ,
175+ },
176+ "resource3" : Devices {
177+ "3" : & device3 ,
178+ },
179+ },
180+ expectedDeviceMap : DeviceMap {
181+ "replicated-resource1" : Devices {
182+ "0::0" : & Device {Device : kubeletdevicepluginv1beta1.Device {ID : "0::0" }, Index : "0" },
183+ "0::1" : & Device {Device : kubeletdevicepluginv1beta1.Device {ID : "0::1" }, Index : "0" },
184+ "1::0" : & Device {Device : kubeletdevicepluginv1beta1.Device {ID : "1::0" }},
185+ "1::1" : & Device {Device : kubeletdevicepluginv1beta1.Device {ID : "1::1" }},
186+ },
187+ "resource2" : Devices {
188+ "2::0" : & Device {Device : kubeletdevicepluginv1beta1.Device {ID : "2::0" }},
189+ },
190+ "resource3" : Devices {
191+ "3" : & device3 ,
192+ },
193+ },
194+ },
195+ {
196+ description : "Some devices are not replicated" ,
197+ config : & nvidia.DeviceConfig {
198+ Config : & spec.Config {
199+ Sharing : spec.Sharing {
200+ TimeSlicing : spec.ReplicatedResources {
201+ Resources : []spec.ReplicatedResource {
202+ {
203+ Name : "resource1" ,
204+ Replicas : 2 ,
205+ Rename : "replicated-resource1" ,
206+ Devices : spec.ReplicatedDevices {
207+ List : []spec.ReplicatedDeviceRef {"0" }, // only replicate index 0
208+ },
209+ },
210+ },
211+ },
212+ },
213+ },
214+ },
215+ devices : DeviceMap {
216+ "resource1" : Devices {
217+ "0" : & device0 ,
218+ "1" : & device1 ,
219+ },
220+ },
221+ expectedDeviceMap : DeviceMap {
222+ "replicated-resource1" : Devices {
223+ "0::0" : & Device {Device : kubeletdevicepluginv1beta1.Device {ID : "0::0" }, Index : "0" },
224+ "0::1" : & Device {Device : kubeletdevicepluginv1beta1.Device {ID : "0::1" }, Index : "0" },
225+ },
226+ "resource1" : Devices {
227+ "1" : & device1 ,
228+ },
229+ },
230+ },
231+ }
232+
233+ for _ , tc := range testCases {
234+ t .Run (tc .description , func (t * testing.T ) {
235+ devices , _ := updateDeviceMapWithReplicas (tc .config , tc .devices )
236+ require .EqualValues (t , tc .expectedDeviceMap , devices )
237+ })
238+ }
239+ }
240+
127241func TestDeviceMapMerge (t * testing.T ) {
128242 device0 := Device {Device : kubeletdevicepluginv1beta1.Device {ID : "0" }}
129243 device1 := Device {Device : kubeletdevicepluginv1beta1.Device {ID : "1" }}
0 commit comments