Fix unit-tests
This commit is contained in:
parent
3e0578bdeb
commit
a366e629ce
|
|
@ -316,7 +316,7 @@ func TestTemplateNodeInfo(t *testing.T) {
|
||||||
Return(fakeServerTypezx45f(), nil)
|
Return(fakeServerTypezx45f(), nil)
|
||||||
obj, err := makeFakeNodeGroup(t, testclient).TemplateNodeInfo()
|
obj, err := makeFakeNodeGroup(t, testclient).TemplateNodeInfo()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, fakeResource(), obj.ToScheduler().Allocatable)
|
assert.Equal(t, fakeResource(), obj.ToScheduler().GetAllocatable())
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNodeGroupErrors(t *testing.T) {
|
func TestNodeGroupErrors(t *testing.T) {
|
||||||
|
|
|
||||||
|
|
@ -1648,8 +1648,8 @@ func TestNodeGroupTemplateNodeInfo(t *testing.T) {
|
||||||
t.Errorf("Expected the number of DRA devices in ResourceSlice to have: %d, but got: %d", config.expectedResourceSlice.gpuCount, len(resourceslice.Spec.Devices))
|
t.Errorf("Expected the number of DRA devices in ResourceSlice to have: %d, but got: %d", config.expectedResourceSlice.gpuCount, len(resourceslice.Spec.Devices))
|
||||||
}
|
}
|
||||||
for _, device := range resourceslice.Spec.Devices {
|
for _, device := range resourceslice.Spec.Devices {
|
||||||
if *device.Basic.Attributes["type"].StringValue != config.expectedResourceSlice.deviceType {
|
if *device.Attributes["type"].StringValue != config.expectedResourceSlice.deviceType {
|
||||||
t.Errorf("Expected device type to have: %s, but got: %s", config.expectedResourceSlice.deviceType, *device.Basic.Attributes["type"].StringValue)
|
t.Errorf("Expected device type to have: %s, but got: %s", config.expectedResourceSlice.deviceType, *device.Attributes["type"].StringValue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -336,18 +336,16 @@ func TestAnnotations(t *testing.T) {
|
||||||
},
|
},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
Driver: draDriver,
|
Driver: draDriver,
|
||||||
NodeName: testNodeName,
|
NodeName: &testNodeName,
|
||||||
Pool: resourceapi.ResourcePool{
|
Pool: resourceapi.ResourcePool{
|
||||||
Name: testNodeName,
|
Name: testNodeName,
|
||||||
},
|
},
|
||||||
Devices: []resourceapi.Device{
|
Devices: []resourceapi.Device{
|
||||||
{
|
{
|
||||||
Name: "gpu-0",
|
Name: "gpu-0",
|
||||||
Basic: &resourceapi.BasicDevice{
|
Attributes: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{
|
||||||
Attributes: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{
|
"type": {
|
||||||
"type": {
|
StringValue: ptr.To(GpuDeviceType),
|
||||||
StringValue: ptr.To(GpuDeviceType),
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -396,19 +396,19 @@ func TestTemplateNodeInfo(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if nodeInfo.ToScheduler().Allocatable.MilliCPU != ng.resources.Cpu().MilliValue() {
|
if nodeInfo.ToScheduler().GetAllocatable().GetMilliCPU() != ng.resources.Cpu().MilliValue() {
|
||||||
t.Fatalf("expected nodeInfo to have %v MilliCPU, got %v",
|
t.Fatalf("expected nodeInfo to have %v MilliCPU, got %v",
|
||||||
ng.resources.Cpu().MilliValue(), nodeInfo.ToScheduler().Allocatable.MilliCPU)
|
ng.resources.Cpu().MilliValue(), nodeInfo.ToScheduler().GetAllocatable().GetMilliCPU())
|
||||||
}
|
}
|
||||||
|
|
||||||
if nodeInfo.ToScheduler().Allocatable.Memory != ng.resources.Memory().Value() {
|
if nodeInfo.ToScheduler().GetAllocatable().GetMemory() != ng.resources.Memory().Value() {
|
||||||
t.Fatalf("expected nodeInfo to have %v Memory, got %v",
|
t.Fatalf("expected nodeInfo to have %v Memory, got %v",
|
||||||
ng.resources.Memory().Value(), nodeInfo.ToScheduler().Allocatable.Memory)
|
ng.resources.Memory().Value(), nodeInfo.ToScheduler().GetAllocatable().GetMemory())
|
||||||
}
|
}
|
||||||
|
|
||||||
if nodeInfo.ToScheduler().Allocatable.EphemeralStorage != ng.resources.StorageEphemeral().Value() {
|
if nodeInfo.ToScheduler().GetAllocatable().GetEphemeralStorage() != ng.resources.StorageEphemeral().Value() {
|
||||||
t.Fatalf("expected nodeInfo to have %v ephemeral storage, got %v",
|
t.Fatalf("expected nodeInfo to have %v ephemeral storage, got %v",
|
||||||
ng.resources.StorageEphemeral().Value(), nodeInfo.ToScheduler().Allocatable.EphemeralStorage)
|
ng.resources.StorageEphemeral().Value(), nodeInfo.ToScheduler().GetAllocatable().GetEphemeralStorage())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -603,15 +603,17 @@ func testResourceClaim(claimName string, owningPod *apiv1.Pod, nodeName string,
|
||||||
selectors = append(selectors, resourceapi.DeviceSelector{CEL: &resourceapi.CELDeviceSelector{Expression: selector}})
|
selectors = append(selectors, resourceapi.DeviceSelector{CEL: &resourceapi.CELDeviceSelector{Expression: selector}})
|
||||||
}
|
}
|
||||||
deviceRequest := resourceapi.DeviceRequest{
|
deviceRequest := resourceapi.DeviceRequest{
|
||||||
Name: request.name,
|
Name: request.name,
|
||||||
DeviceClassName: "default-class",
|
Exactly: &resourceapi.ExactDeviceRequest{
|
||||||
Selectors: selectors,
|
DeviceClassName: "default-class",
|
||||||
|
Selectors: selectors,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
if request.all {
|
if request.all {
|
||||||
deviceRequest.AllocationMode = resourceapi.DeviceAllocationModeAll
|
deviceRequest.Exactly.AllocationMode = resourceapi.DeviceAllocationModeAll
|
||||||
} else {
|
} else {
|
||||||
deviceRequest.AllocationMode = resourceapi.DeviceAllocationModeExactCount
|
deviceRequest.Exactly.AllocationMode = resourceapi.DeviceAllocationModeExactCount
|
||||||
deviceRequest.Count = request.count
|
deviceRequest.Exactly.Count = request.count
|
||||||
}
|
}
|
||||||
deviceRequests = append(deviceRequests, deviceRequest)
|
deviceRequests = append(deviceRequests, deviceRequest)
|
||||||
}
|
}
|
||||||
|
|
@ -711,9 +713,10 @@ func testResourceSlices(driver, poolName string, poolSliceCount, poolGen int64,
|
||||||
}
|
}
|
||||||
|
|
||||||
if avail.node != "" {
|
if avail.node != "" {
|
||||||
slice.Spec.NodeName = avail.node
|
slice.Spec.NodeName = &avail.node
|
||||||
} else if avail.all {
|
} else if avail.all {
|
||||||
slice.Spec.AllNodes = true
|
v := true
|
||||||
|
slice.Spec.AllNodes = &v
|
||||||
} else if len(avail.nodes) > 0 {
|
} else if len(avail.nodes) > 0 {
|
||||||
slice.Spec.NodeSelector = &apiv1.NodeSelector{
|
slice.Spec.NodeSelector = &apiv1.NodeSelector{
|
||||||
NodeSelectorTerms: []apiv1.NodeSelectorTerm{
|
NodeSelectorTerms: []apiv1.NodeSelectorTerm{
|
||||||
|
|
@ -728,18 +731,16 @@ func testResourceSlices(driver, poolName string, poolSliceCount, poolGen int64,
|
||||||
var devices []resourceapi.Device
|
var devices []resourceapi.Device
|
||||||
for _, deviceDef := range deviceDefs {
|
for _, deviceDef := range deviceDefs {
|
||||||
device := resourceapi.Device{
|
device := resourceapi.Device{
|
||||||
Name: deviceDef.name,
|
Name: deviceDef.name,
|
||||||
Basic: &resourceapi.BasicDevice{
|
Attributes: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{},
|
||||||
Attributes: map[resourceapi.QualifiedName]resourceapi.DeviceAttribute{},
|
Capacity: map[resourceapi.QualifiedName]resourceapi.DeviceCapacity{},
|
||||||
Capacity: map[resourceapi.QualifiedName]resourceapi.DeviceCapacity{},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
for name, val := range deviceDef.attributes {
|
for name, val := range deviceDef.attributes {
|
||||||
val := val
|
val := val
|
||||||
device.Basic.Attributes[resourceapi.QualifiedName(driver+"/"+name)] = resourceapi.DeviceAttribute{StringValue: &val}
|
device.Attributes[resourceapi.QualifiedName(driver+"/"+name)] = resourceapi.DeviceAttribute{StringValue: &val}
|
||||||
}
|
}
|
||||||
for name, quantity := range deviceDef.capacity {
|
for name, quantity := range deviceDef.capacity {
|
||||||
device.Basic.Capacity[resourceapi.QualifiedName(name)] = resourceapi.DeviceCapacity{Value: resource.MustParse(quantity)}
|
device.Capacity[resourceapi.QualifiedName(name)] = resourceapi.DeviceCapacity{Value: resource.MustParse(quantity)}
|
||||||
}
|
}
|
||||||
devices = append(devices, device)
|
devices = append(devices, device)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,21 +35,20 @@ import (
|
||||||
. "k8s.io/autoscaler/cluster-autoscaler/utils/test"
|
. "k8s.io/autoscaler/cluster-autoscaler/utils/test"
|
||||||
)
|
)
|
||||||
|
|
||||||
func createTestResourceSlice(nodeName string, devicesPerSlice int, slicesPerNode int, driver string, device resourceapi.BasicDevice) *resourceapi.ResourceSlice {
|
func createTestResourceSlice(nodeName string, devicesPerSlice int, slicesPerNode int, driver string) *resourceapi.ResourceSlice {
|
||||||
sliceId := uuid.New().String()
|
sliceId := uuid.New().String()
|
||||||
name := fmt.Sprintf("rs-%s", sliceId)
|
name := fmt.Sprintf("rs-%s", sliceId)
|
||||||
uid := types.UID(fmt.Sprintf("rs-%s-uid", sliceId))
|
uid := types.UID(fmt.Sprintf("rs-%s-uid", sliceId))
|
||||||
devices := make([]resourceapi.Device, devicesPerSlice)
|
devices := make([]resourceapi.Device, devicesPerSlice)
|
||||||
for deviceIndex := 0; deviceIndex < devicesPerSlice; deviceIndex++ {
|
for deviceIndex := 0; deviceIndex < devicesPerSlice; deviceIndex++ {
|
||||||
deviceName := fmt.Sprintf("rs-dev-%s-%d", sliceId, deviceIndex)
|
deviceName := fmt.Sprintf("rs-dev-%s-%d", sliceId, deviceIndex)
|
||||||
deviceCopy := device
|
devices[deviceIndex] = resourceapi.Device{Name: deviceName}
|
||||||
devices[deviceIndex] = resourceapi.Device{Name: deviceName, Basic: &deviceCopy}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return &resourceapi.ResourceSlice{
|
return &resourceapi.ResourceSlice{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: name, UID: uid},
|
ObjectMeta: metav1.ObjectMeta{Name: name, UID: uid},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
NodeName: nodeName,
|
NodeName: &nodeName,
|
||||||
Driver: driver,
|
Driver: driver,
|
||||||
Pool: resourceapi.ResourcePool{
|
Pool: resourceapi.ResourcePool{
|
||||||
Name: nodeName,
|
Name: nodeName,
|
||||||
|
|
@ -69,11 +68,13 @@ func createTestResourceClaim(requestsPerClaim int, devicesPerRequest int, driver
|
||||||
requests := make([]resourceapi.DeviceRequest, requestsPerClaim)
|
requests := make([]resourceapi.DeviceRequest, requestsPerClaim)
|
||||||
for requestIndex := 0; requestIndex < requestsPerClaim; requestIndex++ {
|
for requestIndex := 0; requestIndex < requestsPerClaim; requestIndex++ {
|
||||||
requests[requestIndex] = resourceapi.DeviceRequest{
|
requests[requestIndex] = resourceapi.DeviceRequest{
|
||||||
Name: fmt.Sprintf("deviceRequest-%d", requestIndex),
|
Name: fmt.Sprintf("deviceRequest-%d", requestIndex),
|
||||||
DeviceClassName: deviceClass,
|
Exactly: &resourceapi.ExactDeviceRequest{
|
||||||
Selectors: []resourceapi.DeviceSelector{{CEL: &resourceapi.CELDeviceSelector{Expression: expression}}},
|
DeviceClassName: deviceClass,
|
||||||
AllocationMode: resourceapi.DeviceAllocationModeExactCount,
|
Selectors: []resourceapi.DeviceSelector{{CEL: &resourceapi.CELDeviceSelector{Expression: expression}}},
|
||||||
Count: int64(devicesPerRequest),
|
AllocationMode: resourceapi.DeviceAllocationModeExactCount,
|
||||||
|
Count: int64(devicesPerRequest),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -102,7 +103,7 @@ func allocateResourceSlicesForClaim(claim *resourceapi.ResourceClaim, nodeName s
|
||||||
|
|
||||||
allocationLoop:
|
allocationLoop:
|
||||||
for _, request := range claim.Spec.Devices.Requests {
|
for _, request := range claim.Spec.Devices.Requests {
|
||||||
for devicesRequired := request.Count; devicesRequired > 0; devicesRequired-- {
|
for devicesRequired := request.Exactly.Count; devicesRequired > 0; devicesRequired-- {
|
||||||
// Skipping resource slices until we find one with at least a single device available
|
// Skipping resource slices until we find one with at least a single device available
|
||||||
for sliceIndex < len(slices) && deviceIndex >= len(slices[sliceIndex].Spec.Devices) {
|
for sliceIndex < len(slices) && deviceIndex >= len(slices[sliceIndex].Spec.Devices) {
|
||||||
sliceIndex++
|
sliceIndex++
|
||||||
|
|
@ -272,7 +273,7 @@ func BenchmarkScheduleRevert(b *testing.B) {
|
||||||
for nodeIndex := 0; nodeIndex < maxNodesCount; nodeIndex++ {
|
for nodeIndex := 0; nodeIndex < maxNodesCount; nodeIndex++ {
|
||||||
nodeName := fmt.Sprintf("node-%d", nodeIndex)
|
nodeName := fmt.Sprintf("node-%d", nodeIndex)
|
||||||
node := BuildTestNode(nodeName, 10000, 10000)
|
node := BuildTestNode(nodeName, 10000, 10000)
|
||||||
nodeSlice := createTestResourceSlice(node.Name, devicesPerSlice, 1, driverName, resourceapi.BasicDevice{})
|
nodeSlice := createTestResourceSlice(node.Name, devicesPerSlice, 1, driverName)
|
||||||
nodeInfo := framework.NewNodeInfo(node, []*resourceapi.ResourceSlice{nodeSlice})
|
nodeInfo := framework.NewNodeInfo(node, []*resourceapi.ResourceSlice{nodeSlice})
|
||||||
|
|
||||||
sharedClaim := createTestResourceClaim(devicesPerSlice, 1, driverName, deviceClassName)
|
sharedClaim := createTestResourceClaim(devicesPerSlice, 1, driverName, deviceClassName)
|
||||||
|
|
|
||||||
|
|
@ -204,32 +204,32 @@ func validTestCases(t *testing.T, snapshotName string) []modificationTestCase {
|
||||||
{
|
{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "slice1", UID: "slice1Uid"},
|
ObjectMeta: metav1.ObjectMeta{Name: "slice1", UID: "slice1Uid"},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
NodeName: node.Name,
|
NodeName: &node.Name,
|
||||||
Driver: "driver.foo.com",
|
Driver: "driver.foo.com",
|
||||||
Pool: resourceapi.ResourcePool{
|
Pool: resourceapi.ResourcePool{
|
||||||
Name: "pool1",
|
Name: "pool1",
|
||||||
ResourceSliceCount: 1,
|
ResourceSliceCount: 1,
|
||||||
},
|
},
|
||||||
Devices: []resourceapi.Device{
|
Devices: []resourceapi.Device{
|
||||||
{Name: "dev1", Basic: &resourceapi.BasicDevice{}},
|
{Name: "dev1"},
|
||||||
{Name: "dev2", Basic: &resourceapi.BasicDevice{}},
|
{Name: "dev2"},
|
||||||
{Name: "dev3", Basic: &resourceapi.BasicDevice{}},
|
{Name: "dev3"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "slice2", UID: "slice2Uid"},
|
ObjectMeta: metav1.ObjectMeta{Name: "slice2", UID: "slice2Uid"},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
NodeName: node.Name,
|
NodeName: &node.Name,
|
||||||
Driver: "driver.bar.com",
|
Driver: "driver.bar.com",
|
||||||
Pool: resourceapi.ResourcePool{
|
Pool: resourceapi.ResourcePool{
|
||||||
Name: "pool2",
|
Name: "pool2",
|
||||||
ResourceSliceCount: 1,
|
ResourceSliceCount: 1,
|
||||||
},
|
},
|
||||||
Devices: []resourceapi.Device{
|
Devices: []resourceapi.Device{
|
||||||
{Name: "dev1", Basic: &resourceapi.BasicDevice{}},
|
{Name: "dev1"},
|
||||||
{Name: "dev2", Basic: &resourceapi.BasicDevice{}},
|
{Name: "dev2"},
|
||||||
{Name: "dev3", Basic: &resourceapi.BasicDevice{}},
|
{Name: "dev3"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -247,11 +247,13 @@ func validTestCases(t *testing.T, snapshotName string) []modificationTestCase {
|
||||||
Devices: resourceapi.DeviceClaim{
|
Devices: resourceapi.DeviceClaim{
|
||||||
Requests: []resourceapi.DeviceRequest{
|
Requests: []resourceapi.DeviceRequest{
|
||||||
{
|
{
|
||||||
Name: "req1",
|
Name: "req1",
|
||||||
DeviceClassName: "defaultClass",
|
Exactly: &resourceapi.ExactDeviceRequest{
|
||||||
Selectors: []resourceapi.DeviceSelector{{CEL: &resourceapi.CELDeviceSelector{Expression: `device.driver == "driver.foo.com"`}}},
|
DeviceClassName: "defaultClass",
|
||||||
AllocationMode: resourceapi.DeviceAllocationModeExactCount,
|
Selectors: []resourceapi.DeviceSelector{{CEL: &resourceapi.CELDeviceSelector{Expression: `device.driver == "driver.foo.com"`}}},
|
||||||
Count: 3,
|
AllocationMode: resourceapi.DeviceAllocationModeExactCount,
|
||||||
|
Count: 3,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -284,10 +286,12 @@ func validTestCases(t *testing.T, snapshotName string) []modificationTestCase {
|
||||||
Devices: resourceapi.DeviceClaim{
|
Devices: resourceapi.DeviceClaim{
|
||||||
Requests: []resourceapi.DeviceRequest{
|
Requests: []resourceapi.DeviceRequest{
|
||||||
{
|
{
|
||||||
Name: "req1",
|
Name: "req1",
|
||||||
DeviceClassName: "defaultClass",
|
Exactly: &resourceapi.ExactDeviceRequest{
|
||||||
Selectors: []resourceapi.DeviceSelector{{CEL: &resourceapi.CELDeviceSelector{Expression: `device.driver == "driver.bar.com"`}}},
|
DeviceClassName: "defaultClass",
|
||||||
AllocationMode: resourceapi.DeviceAllocationModeAll,
|
Selectors: []resourceapi.DeviceSelector{{CEL: &resourceapi.CELDeviceSelector{Expression: `device.driver == "driver.bar.com"`}}},
|
||||||
|
AllocationMode: resourceapi.DeviceAllocationModeAll,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -39,12 +39,16 @@ var (
|
||||||
claim2 = &resourceapi.ResourceClaim{ObjectMeta: metav1.ObjectMeta{Name: "claim-2", UID: "claim-2"}}
|
claim2 = &resourceapi.ResourceClaim{ObjectMeta: metav1.ObjectMeta{Name: "claim-2", UID: "claim-2"}}
|
||||||
claim3 = &resourceapi.ResourceClaim{ObjectMeta: metav1.ObjectMeta{Name: "claim-3", UID: "claim-3"}}
|
claim3 = &resourceapi.ResourceClaim{ObjectMeta: metav1.ObjectMeta{Name: "claim-3", UID: "claim-3"}}
|
||||||
|
|
||||||
localSlice1 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-1", UID: "local-slice-1"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "n1"}}
|
n1Name = "n1"
|
||||||
localSlice2 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-2", UID: "local-slice-2"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "n1"}}
|
n2Name = "n2"
|
||||||
localSlice3 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-3", UID: "local-slice-3"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "n2"}}
|
trueValue = true
|
||||||
localSlice4 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-4", UID: "local-slice-4"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "n2"}}
|
|
||||||
globalSlice1 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "global-slice-1", UID: "global-slice-1"}, Spec: resourceapi.ResourceSliceSpec{AllNodes: true}}
|
localSlice1 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-1", UID: "local-slice-1"}, Spec: resourceapi.ResourceSliceSpec{NodeName: &n1Name}}
|
||||||
globalSlice2 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "global-slice-2", UID: "global-slice-2"}, Spec: resourceapi.ResourceSliceSpec{AllNodes: true}}
|
localSlice2 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-2", UID: "local-slice-2"}, Spec: resourceapi.ResourceSliceSpec{NodeName: &n1Name}}
|
||||||
|
localSlice3 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-3", UID: "local-slice-3"}, Spec: resourceapi.ResourceSliceSpec{NodeName: &n2Name}}
|
||||||
|
localSlice4 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-4", UID: "local-slice-4"}, Spec: resourceapi.ResourceSliceSpec{NodeName: &n2Name}}
|
||||||
|
globalSlice1 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "global-slice-1", UID: "global-slice-1"}, Spec: resourceapi.ResourceSliceSpec{AllNodes: &trueValue}}
|
||||||
|
globalSlice2 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "global-slice-2", UID: "global-slice-2"}, Spec: resourceapi.ResourceSliceSpec{AllNodes: &trueValue}}
|
||||||
globalSlice3 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "global-slice-3", UID: "global-slice-3"}, Spec: resourceapi.ResourceSliceSpec{NodeSelector: &apiv1.NodeSelector{}}}
|
globalSlice3 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "global-slice-3", UID: "global-slice-3"}, Spec: resourceapi.ResourceSliceSpec{NodeSelector: &apiv1.NodeSelector{}}}
|
||||||
|
|
||||||
class1 = &resourceapi.DeviceClass{ObjectMeta: metav1.ObjectMeta{Name: "class-1", UID: "class-1"}}
|
class1 = &resourceapi.DeviceClass{ObjectMeta: metav1.ObjectMeta{Name: "class-1", UID: "class-1"}}
|
||||||
|
|
|
||||||
|
|
@ -31,12 +31,15 @@ import (
|
||||||
|
|
||||||
func TestSnapshotSliceListerList(t *testing.T) {
|
func TestSnapshotSliceListerList(t *testing.T) {
|
||||||
var (
|
var (
|
||||||
localSlice1 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-1", UID: "local-slice-1"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "n1"}}
|
n1Name = "n1"
|
||||||
localSlice2 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-2", UID: "local-slice-2"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "n1"}}
|
n2Name = "n2"
|
||||||
localSlice3 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-3", UID: "local-slice-3"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "n2"}}
|
trueValue = true
|
||||||
localSlice4 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-4", UID: "local-slice-4"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "n2"}}
|
localSlice1 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-1", UID: "local-slice-1"}, Spec: resourceapi.ResourceSliceSpec{NodeName: &n1Name}}
|
||||||
globalSlice1 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "global-slice-1", UID: "global-slice-1"}, Spec: resourceapi.ResourceSliceSpec{AllNodes: true}}
|
localSlice2 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-2", UID: "local-slice-2"}, Spec: resourceapi.ResourceSliceSpec{NodeName: &n1Name}}
|
||||||
globalSlice2 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "global-slice-2", UID: "global-slice-2"}, Spec: resourceapi.ResourceSliceSpec{AllNodes: true}}
|
localSlice3 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-3", UID: "local-slice-3"}, Spec: resourceapi.ResourceSliceSpec{NodeName: &n2Name}}
|
||||||
|
localSlice4 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-4", UID: "local-slice-4"}, Spec: resourceapi.ResourceSliceSpec{NodeName: &n2Name}}
|
||||||
|
globalSlice1 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "global-slice-1", UID: "global-slice-1"}, Spec: resourceapi.ResourceSliceSpec{AllNodes: &trueValue}}
|
||||||
|
globalSlice2 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "global-slice-2", UID: "global-slice-2"}, Spec: resourceapi.ResourceSliceSpec{AllNodes: &trueValue}}
|
||||||
globalSlice3 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "global-slice-3", UID: "global-slice-3"}, Spec: resourceapi.ResourceSliceSpec{NodeSelector: &apiv1.NodeSelector{}}}
|
globalSlice3 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "global-slice-3", UID: "global-slice-3"}, Spec: resourceapi.ResourceSliceSpec{NodeSelector: &apiv1.NodeSelector{}}}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,14 +34,19 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
node1Slice1 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-1", UID: "local-slice-1"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "node1"}}
|
node1Name = "node1"
|
||||||
node1Slice2 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-2", UID: "local-slice-2"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "node1"}}
|
node2Name = "node2"
|
||||||
node2Slice1 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-3", UID: "local-slice-3"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "node2"}}
|
node3Name = "node3"
|
||||||
node2Slice2 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-4", UID: "local-slice-4"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "node2"}}
|
trueValue = true
|
||||||
node3Slice1 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-5", UID: "local-slice-5"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "node3"}}
|
|
||||||
node3Slice2 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-6", UID: "local-slice-6"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "node3"}}
|
node1Slice1 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-1", UID: "local-slice-1"}, Spec: resourceapi.ResourceSliceSpec{NodeName: &node1Name}}
|
||||||
globalSlice1 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "global-slice-1", UID: "global-slice-1"}, Spec: resourceapi.ResourceSliceSpec{AllNodes: true}}
|
node1Slice2 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-2", UID: "local-slice-2"}, Spec: resourceapi.ResourceSliceSpec{NodeName: &node1Name}}
|
||||||
globalSlice2 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "global-slice-2", UID: "global-slice-2"}, Spec: resourceapi.ResourceSliceSpec{AllNodes: true}}
|
node2Slice1 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-3", UID: "local-slice-3"}, Spec: resourceapi.ResourceSliceSpec{NodeName: &node2Name}}
|
||||||
|
node2Slice2 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-4", UID: "local-slice-4"}, Spec: resourceapi.ResourceSliceSpec{NodeName: &node2Name}}
|
||||||
|
node3Slice1 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-5", UID: "local-slice-5"}, Spec: resourceapi.ResourceSliceSpec{NodeName: &node3Name}}
|
||||||
|
node3Slice2 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "local-slice-6", UID: "local-slice-6"}, Spec: resourceapi.ResourceSliceSpec{NodeName: &node3Name}}
|
||||||
|
globalSlice1 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "global-slice-1", UID: "global-slice-1"}, Spec: resourceapi.ResourceSliceSpec{AllNodes: &trueValue}}
|
||||||
|
globalSlice2 = &resourceapi.ResourceSlice{ObjectMeta: metav1.ObjectMeta{Name: "global-slice-2", UID: "global-slice-2"}, Spec: resourceapi.ResourceSliceSpec{AllNodes: &trueValue}}
|
||||||
|
|
||||||
node1 = test.BuildTestNode("node1", 1000, 1000)
|
node1 = test.BuildTestNode("node1", 1000, 1000)
|
||||||
pod1 = test.BuildTestPod("pod1", 1, 1,
|
pod1 = test.BuildTestPod("pod1", 1, 1,
|
||||||
|
|
@ -600,7 +605,7 @@ func TestSnapshotForkCommitRevert(t *testing.T) {
|
||||||
GetClaimId(pod1OwnClaim2): pod1OwnClaim2.DeepCopy(),
|
GetClaimId(pod1OwnClaim2): pod1OwnClaim2.DeepCopy(),
|
||||||
}
|
}
|
||||||
initialDeviceClasses := map[string]*resourceapi.DeviceClass{deviceClass1.Name: deviceClass1.DeepCopy(), deviceClass2.Name: deviceClass2.DeepCopy()}
|
initialDeviceClasses := map[string]*resourceapi.DeviceClass{deviceClass1.Name: deviceClass1.DeepCopy(), deviceClass2.Name: deviceClass2.DeepCopy()}
|
||||||
initialLocalSlices := map[string][]*resourceapi.ResourceSlice{node1Slice1.Spec.NodeName: {node1Slice1.DeepCopy()}}
|
initialLocalSlices := map[string][]*resourceapi.ResourceSlice{*node1Slice1.Spec.NodeName: {node1Slice1.DeepCopy()}}
|
||||||
initialGlobalSlices := []*resourceapi.ResourceSlice{globalSlice1.DeepCopy(), globalSlice2.DeepCopy()}
|
initialGlobalSlices := []*resourceapi.ResourceSlice{globalSlice1.DeepCopy(), globalSlice2.DeepCopy()}
|
||||||
initialState := NewSnapshot(initialClaims, initialLocalSlices, initialGlobalSlices, initialDeviceClasses)
|
initialState := NewSnapshot(initialClaims, initialLocalSlices, initialGlobalSlices, initialDeviceClasses)
|
||||||
|
|
||||||
|
|
@ -614,7 +619,7 @@ func TestSnapshotForkCommitRevert(t *testing.T) {
|
||||||
GetClaimId(pod1OwnClaim1): drautils.TestClaimWithPodReservations(pod1OwnClaim1, podToReserve),
|
GetClaimId(pod1OwnClaim1): drautils.TestClaimWithPodReservations(pod1OwnClaim1, podToReserve),
|
||||||
GetClaimId(pod1OwnClaim2): drautils.TestClaimWithPodReservations(pod1OwnClaim2, podToReserve),
|
GetClaimId(pod1OwnClaim2): drautils.TestClaimWithPodReservations(pod1OwnClaim2, podToReserve),
|
||||||
}
|
}
|
||||||
modifiedLocalSlices := map[string][]*resourceapi.ResourceSlice{addedNodeSlice.Spec.NodeName: {addedNodeSlice.DeepCopy()}}
|
modifiedLocalSlices := map[string][]*resourceapi.ResourceSlice{*addedNodeSlice.Spec.NodeName: {addedNodeSlice.DeepCopy()}}
|
||||||
// Expected state after modifications are applied
|
// Expected state after modifications are applied
|
||||||
modifiedState := NewSnapshot(
|
modifiedState := NewSnapshot(
|
||||||
modifiedClaims,
|
modifiedClaims,
|
||||||
|
|
@ -627,7 +632,7 @@ func TestSnapshotForkCommitRevert(t *testing.T) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
addedSlices := []*resourceapi.ResourceSlice{addedNodeSlice.DeepCopy()}
|
addedSlices := []*resourceapi.ResourceSlice{addedNodeSlice.DeepCopy()}
|
||||||
if err := s.AddNodeResourceSlices(addedNodeSlice.Spec.NodeName, addedSlices); err != nil {
|
if err := s.AddNodeResourceSlices(*addedNodeSlice.Spec.NodeName, addedSlices); err != nil {
|
||||||
t.Fatalf("failed to add %s resource slices: %v", addedNodeSlice.Spec.NodeName, err)
|
t.Fatalf("failed to add %s resource slices: %v", addedNodeSlice.Spec.NodeName, err)
|
||||||
}
|
}
|
||||||
if err := s.AddClaims([]*resourceapi.ResourceClaim{addedClaim}); err != nil {
|
if err := s.AddClaims([]*resourceapi.ResourceClaim{addedClaim}); err != nil {
|
||||||
|
|
@ -637,7 +642,7 @@ func TestSnapshotForkCommitRevert(t *testing.T) {
|
||||||
t.Fatalf("failed to reserve claim %s for pod %s: %v", sharedClaim1.Name, podToReserve.Name, err)
|
t.Fatalf("failed to reserve claim %s for pod %s: %v", sharedClaim1.Name, podToReserve.Name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
s.RemoveNodeResourceSlices(node1Slice1.Spec.NodeName)
|
s.RemoveNodeResourceSlices(*node1Slice1.Spec.NodeName)
|
||||||
}
|
}
|
||||||
|
|
||||||
compareSnapshots := func(t *testing.T, want, got *Snapshot, msg string) {
|
compareSnapshots := func(t *testing.T, want, got *Snapshot, msg string) {
|
||||||
|
|
|
||||||
|
|
@ -30,8 +30,10 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSanitizedNodeResourceSlices(t *testing.T) {
|
func TestSanitizedNodeResourceSlices(t *testing.T) {
|
||||||
|
oldNodeName := "oldNode"
|
||||||
newNodeName := "newNode"
|
newNodeName := "newNode"
|
||||||
nameSuffix := "abc"
|
nameSuffix := "abc"
|
||||||
|
trueValue := true
|
||||||
|
|
||||||
device1 := resourceapi.Device{Name: "device1"}
|
device1 := resourceapi.Device{Name: "device1"}
|
||||||
device2 := resourceapi.Device{Name: "device2"}
|
device2 := resourceapi.Device{Name: "device2"}
|
||||||
|
|
@ -40,7 +42,7 @@ func TestSanitizedNodeResourceSlices(t *testing.T) {
|
||||||
allNodesSlice := &resourceapi.ResourceSlice{
|
allNodesSlice := &resourceapi.ResourceSlice{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "allNodesSlice", UID: "allNodesSlice"},
|
ObjectMeta: metav1.ObjectMeta{Name: "allNodesSlice", UID: "allNodesSlice"},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
AllNodes: true,
|
AllNodes: &trueValue,
|
||||||
Driver: "driver.example.com",
|
Driver: "driver.example.com",
|
||||||
Pool: resourceapi.ResourcePool{Name: "all-nodes-pool1", Generation: 13, ResourceSliceCount: 37},
|
Pool: resourceapi.ResourcePool{Name: "all-nodes-pool1", Generation: 13, ResourceSliceCount: 37},
|
||||||
Devices: devices,
|
Devices: devices,
|
||||||
|
|
@ -58,7 +60,7 @@ func TestSanitizedNodeResourceSlices(t *testing.T) {
|
||||||
pool1Slice1 := &resourceapi.ResourceSlice{
|
pool1Slice1 := &resourceapi.ResourceSlice{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "pool1Slice1", UID: "pool1Slice1"},
|
ObjectMeta: metav1.ObjectMeta{Name: "pool1Slice1", UID: "pool1Slice1"},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
NodeName: "oldNode",
|
NodeName: &oldNodeName,
|
||||||
Driver: "driver.example.com",
|
Driver: "driver.example.com",
|
||||||
Pool: resourceapi.ResourcePool{Name: "oldNode-pool1", Generation: 13, ResourceSliceCount: 37},
|
Pool: resourceapi.ResourcePool{Name: "oldNode-pool1", Generation: 13, ResourceSliceCount: 37},
|
||||||
Devices: devices,
|
Devices: devices,
|
||||||
|
|
@ -67,7 +69,7 @@ func TestSanitizedNodeResourceSlices(t *testing.T) {
|
||||||
pool1Slice2 := &resourceapi.ResourceSlice{
|
pool1Slice2 := &resourceapi.ResourceSlice{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "pool1Slice2", UID: "pool1Slice2"},
|
ObjectMeta: metav1.ObjectMeta{Name: "pool1Slice2", UID: "pool1Slice2"},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
NodeName: "oldNode",
|
NodeName: &oldNodeName,
|
||||||
Driver: "driver.example.com",
|
Driver: "driver.example.com",
|
||||||
Pool: resourceapi.ResourcePool{Name: "oldNode-pool1", Generation: 13, ResourceSliceCount: 37},
|
Pool: resourceapi.ResourcePool{Name: "oldNode-pool1", Generation: 13, ResourceSliceCount: 37},
|
||||||
Devices: devices,
|
Devices: devices,
|
||||||
|
|
@ -76,7 +78,7 @@ func TestSanitizedNodeResourceSlices(t *testing.T) {
|
||||||
pool2Slice1 := &resourceapi.ResourceSlice{
|
pool2Slice1 := &resourceapi.ResourceSlice{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "pool2Slice1", UID: "pool2Slice1"},
|
ObjectMeta: metav1.ObjectMeta{Name: "pool2Slice1", UID: "pool2Slice1"},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
NodeName: "oldNode",
|
NodeName: &oldNodeName,
|
||||||
Driver: "driver.example.com",
|
Driver: "driver.example.com",
|
||||||
Pool: resourceapi.ResourcePool{Name: "oldNode-pool2", Generation: 13, ResourceSliceCount: 37},
|
Pool: resourceapi.ResourcePool{Name: "oldNode-pool2", Generation: 13, ResourceSliceCount: 37},
|
||||||
Devices: devices,
|
Devices: devices,
|
||||||
|
|
@ -85,7 +87,7 @@ func TestSanitizedNodeResourceSlices(t *testing.T) {
|
||||||
pool2Slice2 := &resourceapi.ResourceSlice{
|
pool2Slice2 := &resourceapi.ResourceSlice{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "pool2Slice2", UID: "pool2Slice2"},
|
ObjectMeta: metav1.ObjectMeta{Name: "pool2Slice2", UID: "pool2Slice2"},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
NodeName: "oldNode",
|
NodeName: &oldNodeName,
|
||||||
Driver: "driver.example.com",
|
Driver: "driver.example.com",
|
||||||
Pool: resourceapi.ResourcePool{Name: "oldNode-pool2", Generation: 13, ResourceSliceCount: 37},
|
Pool: resourceapi.ResourcePool{Name: "oldNode-pool2", Generation: 13, ResourceSliceCount: 37},
|
||||||
Devices: devices,
|
Devices: devices,
|
||||||
|
|
@ -94,7 +96,7 @@ func TestSanitizedNodeResourceSlices(t *testing.T) {
|
||||||
pool1Slice1Sanitized := &resourceapi.ResourceSlice{
|
pool1Slice1Sanitized := &resourceapi.ResourceSlice{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "pool1Slice1-abc"},
|
ObjectMeta: metav1.ObjectMeta{Name: "pool1Slice1-abc"},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
NodeName: "newNode",
|
NodeName: &newNodeName,
|
||||||
Driver: "driver.example.com",
|
Driver: "driver.example.com",
|
||||||
Pool: resourceapi.ResourcePool{Name: "oldNode-pool1-abc", Generation: 13, ResourceSliceCount: 37},
|
Pool: resourceapi.ResourcePool{Name: "oldNode-pool1-abc", Generation: 13, ResourceSliceCount: 37},
|
||||||
Devices: devices,
|
Devices: devices,
|
||||||
|
|
@ -103,7 +105,7 @@ func TestSanitizedNodeResourceSlices(t *testing.T) {
|
||||||
pool1Slice2Sanitized := &resourceapi.ResourceSlice{
|
pool1Slice2Sanitized := &resourceapi.ResourceSlice{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "pool1Slice2-abc"},
|
ObjectMeta: metav1.ObjectMeta{Name: "pool1Slice2-abc"},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
NodeName: "newNode",
|
NodeName: &newNodeName,
|
||||||
Driver: "driver.example.com",
|
Driver: "driver.example.com",
|
||||||
Pool: resourceapi.ResourcePool{Name: "oldNode-pool1-abc", Generation: 13, ResourceSliceCount: 37},
|
Pool: resourceapi.ResourcePool{Name: "oldNode-pool1-abc", Generation: 13, ResourceSliceCount: 37},
|
||||||
Devices: devices,
|
Devices: devices,
|
||||||
|
|
@ -112,7 +114,7 @@ func TestSanitizedNodeResourceSlices(t *testing.T) {
|
||||||
pool2Slice1Sanitized := &resourceapi.ResourceSlice{
|
pool2Slice1Sanitized := &resourceapi.ResourceSlice{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "pool2Slice1-abc"},
|
ObjectMeta: metav1.ObjectMeta{Name: "pool2Slice1-abc"},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
NodeName: "newNode",
|
NodeName: &newNodeName,
|
||||||
Driver: "driver.example.com",
|
Driver: "driver.example.com",
|
||||||
Pool: resourceapi.ResourcePool{Name: "oldNode-pool2-abc", Generation: 13, ResourceSliceCount: 37},
|
Pool: resourceapi.ResourcePool{Name: "oldNode-pool2-abc", Generation: 13, ResourceSliceCount: 37},
|
||||||
Devices: devices,
|
Devices: devices,
|
||||||
|
|
@ -121,7 +123,7 @@ func TestSanitizedNodeResourceSlices(t *testing.T) {
|
||||||
pool2Slice2Sanitized := &resourceapi.ResourceSlice{
|
pool2Slice2Sanitized := &resourceapi.ResourceSlice{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "pool2Slice2-abc"},
|
ObjectMeta: metav1.ObjectMeta{Name: "pool2Slice2-abc"},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
NodeName: "newNode",
|
NodeName: &newNodeName,
|
||||||
Driver: "driver.example.com",
|
Driver: "driver.example.com",
|
||||||
Pool: resourceapi.ResourcePool{Name: "oldNode-pool2-abc", Generation: 13, ResourceSliceCount: 37},
|
Pool: resourceapi.ResourcePool{Name: "oldNode-pool2-abc", Generation: 13, ResourceSliceCount: 37},
|
||||||
Devices: devices,
|
Devices: devices,
|
||||||
|
|
|
||||||
|
|
@ -181,7 +181,7 @@ func testResourceSlices(driverName, poolName, nodeName string, poolGen, deviceCo
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: sliceName, UID: types.UID(sliceName)},
|
ObjectMeta: metav1.ObjectMeta{Name: sliceName, UID: types.UID(sliceName)},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
Driver: driverName,
|
Driver: driverName,
|
||||||
NodeName: nodeName,
|
NodeName: &nodeName,
|
||||||
Pool: resourceapi.ResourcePool{Name: poolName, Generation: poolGen, ResourceSliceCount: sliceCount},
|
Pool: resourceapi.ResourcePool{Name: poolName, Generation: poolGen, ResourceSliceCount: sliceCount},
|
||||||
Devices: devices,
|
Devices: devices,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ import (
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp"
|
"github.com/google/go-cmp/cmp"
|
||||||
"github.com/google/go-cmp/cmp/cmpopts"
|
"github.com/google/go-cmp/cmp/cmpopts"
|
||||||
|
fwk "k8s.io/kube-scheduler/framework"
|
||||||
|
|
||||||
apiv1 "k8s.io/api/core/v1"
|
apiv1 "k8s.io/api/core/v1"
|
||||||
resourceapi "k8s.io/api/resource/v1"
|
resourceapi "k8s.io/api/resource/v1"
|
||||||
|
|
@ -32,7 +33,8 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestNodeInfo(t *testing.T) {
|
func TestNodeInfo(t *testing.T) {
|
||||||
node := test.BuildTestNode("test-node", 1000, 1024)
|
nodeName := "test-node"
|
||||||
|
node := test.BuildTestNode(nodeName, 1000, 1024)
|
||||||
pods := []*apiv1.Pod{
|
pods := []*apiv1.Pod{
|
||||||
// Use pods requesting host-ports to make sure that NodeInfo fields other than node and Pods also
|
// Use pods requesting host-ports to make sure that NodeInfo fields other than node and Pods also
|
||||||
// get set correctly (in this case - the UsedPorts field).
|
// get set correctly (in this case - the UsedPorts field).
|
||||||
|
|
@ -51,9 +53,9 @@ func TestNodeInfo(t *testing.T) {
|
||||||
Name: "test-node-slice-0",
|
Name: "test-node-slice-0",
|
||||||
},
|
},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
NodeName: "test-node",
|
NodeName: &nodeName,
|
||||||
Driver: "test.driver.com",
|
Driver: "test.driver.com",
|
||||||
Pool: resourceapi.ResourcePool{Name: "test-node", Generation: 13, ResourceSliceCount: 2},
|
Pool: resourceapi.ResourcePool{Name: nodeName, Generation: 13, ResourceSliceCount: 2},
|
||||||
Devices: []resourceapi.Device{{Name: "device-0"}, {Name: "device-1"}},
|
Devices: []resourceapi.Device{{Name: "device-0"}, {Name: "device-1"}},
|
||||||
}},
|
}},
|
||||||
{
|
{
|
||||||
|
|
@ -61,9 +63,9 @@ func TestNodeInfo(t *testing.T) {
|
||||||
Name: "test-node-slice-1",
|
Name: "test-node-slice-1",
|
||||||
},
|
},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
NodeName: "test-node",
|
NodeName: &nodeName,
|
||||||
Driver: "test.driver.com",
|
Driver: "test.driver.com",
|
||||||
Pool: resourceapi.ResourcePool{Name: "test-node", Generation: 13, ResourceSliceCount: 2},
|
Pool: resourceapi.ResourcePool{Name: nodeName, Generation: 13, ResourceSliceCount: 2},
|
||||||
Devices: []resourceapi.Device{{Name: "device-2"}, {Name: "device-3"}},
|
Devices: []resourceapi.Device{{Name: "device-2"}, {Name: "device-3"}},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -71,14 +73,14 @@ func TestNodeInfo(t *testing.T) {
|
||||||
|
|
||||||
for _, tc := range []struct {
|
for _, tc := range []struct {
|
||||||
testName string
|
testName string
|
||||||
modFn func(info *schedulerframework.NodeInfo) *NodeInfo
|
modFn func(info fwk.NodeInfo) *NodeInfo
|
||||||
wantSchedNodeInfo *schedulerframework.NodeInfo
|
wantSchedNodeInfo fwk.NodeInfo
|
||||||
wantLocalResourceSlices []*resourceapi.ResourceSlice
|
wantLocalResourceSlices []*resourceapi.ResourceSlice
|
||||||
wantPods []*PodInfo
|
wantPods []*PodInfo
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
testName: "wrapping via NewNodeInfo",
|
testName: "wrapping via NewNodeInfo",
|
||||||
modFn: func(info *schedulerframework.NodeInfo) *NodeInfo {
|
modFn: func(info fwk.NodeInfo) *NodeInfo {
|
||||||
return NewNodeInfo(info.Node(), nil, testPodInfos(pods, false)...)
|
return NewNodeInfo(info.Node(), nil, testPodInfos(pods, false)...)
|
||||||
},
|
},
|
||||||
wantSchedNodeInfo: schedulerNodeInfo,
|
wantSchedNodeInfo: schedulerNodeInfo,
|
||||||
|
|
@ -86,7 +88,7 @@ func TestNodeInfo(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "wrapping via NewNodeInfo with DRA objects",
|
testName: "wrapping via NewNodeInfo with DRA objects",
|
||||||
modFn: func(info *schedulerframework.NodeInfo) *NodeInfo {
|
modFn: func(info fwk.NodeInfo) *NodeInfo {
|
||||||
return NewNodeInfo(info.Node(), slices, testPodInfos(pods, true)...)
|
return NewNodeInfo(info.Node(), slices, testPodInfos(pods, true)...)
|
||||||
},
|
},
|
||||||
wantSchedNodeInfo: schedulerNodeInfo,
|
wantSchedNodeInfo: schedulerNodeInfo,
|
||||||
|
|
@ -95,10 +97,10 @@ func TestNodeInfo(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "wrapping via NewTestNodeInfo",
|
testName: "wrapping via NewTestNodeInfo",
|
||||||
modFn: func(info *schedulerframework.NodeInfo) *NodeInfo {
|
modFn: func(info fwk.NodeInfo) *NodeInfo {
|
||||||
var pods []*apiv1.Pod
|
var pods []*apiv1.Pod
|
||||||
for _, pod := range info.Pods {
|
for _, pod := range info.GetPods() {
|
||||||
pods = append(pods, pod.Pod)
|
pods = append(pods, pod.GetPod())
|
||||||
}
|
}
|
||||||
return NewTestNodeInfo(info.Node(), pods...)
|
return NewTestNodeInfo(info.Node(), pods...)
|
||||||
},
|
},
|
||||||
|
|
@ -107,7 +109,7 @@ func TestNodeInfo(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "wrapping via WrapSchedulerNodeInfo",
|
testName: "wrapping via WrapSchedulerNodeInfo",
|
||||||
modFn: func(info *schedulerframework.NodeInfo) *NodeInfo {
|
modFn: func(info fwk.NodeInfo) *NodeInfo {
|
||||||
return WrapSchedulerNodeInfo(info, nil, nil)
|
return WrapSchedulerNodeInfo(info, nil, nil)
|
||||||
},
|
},
|
||||||
wantSchedNodeInfo: schedulerNodeInfo,
|
wantSchedNodeInfo: schedulerNodeInfo,
|
||||||
|
|
@ -115,7 +117,7 @@ func TestNodeInfo(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "wrapping via WrapSchedulerNodeInfo with DRA objects",
|
testName: "wrapping via WrapSchedulerNodeInfo with DRA objects",
|
||||||
modFn: func(info *schedulerframework.NodeInfo) *NodeInfo {
|
modFn: func(info fwk.NodeInfo) *NodeInfo {
|
||||||
podInfos := testPodInfos(pods, true)
|
podInfos := testPodInfos(pods, true)
|
||||||
extraInfos := make(map[types.UID]PodExtraInfo)
|
extraInfos := make(map[types.UID]PodExtraInfo)
|
||||||
for _, podInfo := range podInfos {
|
for _, podInfo := range podInfos {
|
||||||
|
|
@ -129,11 +131,11 @@ func TestNodeInfo(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "wrapping via SetNode+AddPod",
|
testName: "wrapping via SetNode+AddPod",
|
||||||
modFn: func(info *schedulerframework.NodeInfo) *NodeInfo {
|
modFn: func(info fwk.NodeInfo) *NodeInfo {
|
||||||
result := NewNodeInfo(nil, nil)
|
result := NewNodeInfo(nil, nil)
|
||||||
result.SetNode(info.Node())
|
result.SetNode(info.Node())
|
||||||
for _, pod := range info.Pods {
|
for _, pod := range info.GetPods() {
|
||||||
result.AddPod(&PodInfo{Pod: pod.Pod})
|
result.AddPod(&PodInfo{Pod: pod.GetPod()})
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
},
|
},
|
||||||
|
|
@ -142,7 +144,7 @@ func TestNodeInfo(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "wrapping via SetNode+AddPod with DRA objects",
|
testName: "wrapping via SetNode+AddPod with DRA objects",
|
||||||
modFn: func(info *schedulerframework.NodeInfo) *NodeInfo {
|
modFn: func(info fwk.NodeInfo) *NodeInfo {
|
||||||
result := NewNodeInfo(nil, nil)
|
result := NewNodeInfo(nil, nil)
|
||||||
result.LocalResourceSlices = slices
|
result.LocalResourceSlices = slices
|
||||||
result.SetNode(info.Node())
|
result.SetNode(info.Node())
|
||||||
|
|
@ -157,7 +159,7 @@ func TestNodeInfo(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "removing pods",
|
testName: "removing pods",
|
||||||
modFn: func(info *schedulerframework.NodeInfo) *NodeInfo {
|
modFn: func(info fwk.NodeInfo) *NodeInfo {
|
||||||
result := NewNodeInfo(info.Node(), slices, testPodInfos(pods, true)...)
|
result := NewNodeInfo(info.Node(), slices, testPodInfos(pods, true)...)
|
||||||
for _, pod := range []*apiv1.Pod{pods[0], pods[2], pods[4]} {
|
for _, pod := range []*apiv1.Pod{pods[0], pods[2], pods[4]} {
|
||||||
if err := result.RemovePod(pod); err != nil {
|
if err := result.RemovePod(pod); err != nil {
|
||||||
|
|
@ -172,7 +174,7 @@ func TestNodeInfo(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "wrapping via WrapSchedulerNodeInfo and adding more pods",
|
testName: "wrapping via WrapSchedulerNodeInfo and adding more pods",
|
||||||
modFn: func(info *schedulerframework.NodeInfo) *NodeInfo {
|
modFn: func(info fwk.NodeInfo) *NodeInfo {
|
||||||
result := WrapSchedulerNodeInfo(info, nil, nil)
|
result := WrapSchedulerNodeInfo(info, nil, nil)
|
||||||
result.AddPod(testPodInfos([]*apiv1.Pod{extraPod}, false)[0])
|
result.AddPod(testPodInfos([]*apiv1.Pod{extraPod}, false)[0])
|
||||||
return result
|
return result
|
||||||
|
|
@ -182,7 +184,7 @@ func TestNodeInfo(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "wrapping via WrapSchedulerNodeInfo and adding more pods using DRA",
|
testName: "wrapping via WrapSchedulerNodeInfo and adding more pods using DRA",
|
||||||
modFn: func(info *schedulerframework.NodeInfo) *NodeInfo {
|
modFn: func(info fwk.NodeInfo) *NodeInfo {
|
||||||
result := WrapSchedulerNodeInfo(info, nil, nil)
|
result := WrapSchedulerNodeInfo(info, nil, nil)
|
||||||
result.AddPod(testPodInfos([]*apiv1.Pod{extraPod}, true)[0])
|
result.AddPod(testPodInfos([]*apiv1.Pod{extraPod}, true)[0])
|
||||||
return result
|
return result
|
||||||
|
|
@ -193,7 +195,6 @@ func TestNodeInfo(t *testing.T) {
|
||||||
} {
|
} {
|
||||||
t.Run(tc.testName, func(t *testing.T) {
|
t.Run(tc.testName, func(t *testing.T) {
|
||||||
wrappedNodeInfo := tc.modFn(schedulerNodeInfo.Snapshot())
|
wrappedNodeInfo := tc.modFn(schedulerNodeInfo.Snapshot())
|
||||||
|
|
||||||
// Assert that the scheduler NodeInfo object is as expected.
|
// Assert that the scheduler NodeInfo object is as expected.
|
||||||
nodeInfoCmpOpts := []cmp.Option{
|
nodeInfoCmpOpts := []cmp.Option{
|
||||||
// The Node is the only unexported field in this type, and we want to compare it.
|
// The Node is the only unexported field in this type, and we want to compare it.
|
||||||
|
|
@ -202,8 +203,8 @@ func TestNodeInfo(t *testing.T) {
|
||||||
cmpopts.IgnoreFields(schedulerframework.NodeInfo{}, "Generation"),
|
cmpopts.IgnoreFields(schedulerframework.NodeInfo{}, "Generation"),
|
||||||
// The pod order changes in a particular way whenever schedulerframework.RemovePod() is called. Instead of
|
// The pod order changes in a particular way whenever schedulerframework.RemovePod() is called. Instead of
|
||||||
// relying on that schedulerframework implementation detail in assertions, just ignore the order.
|
// relying on that schedulerframework implementation detail in assertions, just ignore the order.
|
||||||
cmpopts.SortSlices(func(p1, p2 *schedulerframework.PodInfo) bool {
|
cmpopts.SortSlices(func(p1, p2 fwk.PodInfo) bool {
|
||||||
return p1.Pod.Name < p2.Pod.Name
|
return p1.GetPod().Name < p2.GetPod().Name
|
||||||
}),
|
}),
|
||||||
cmpopts.IgnoreUnexported(schedulerframework.PodInfo{}),
|
cmpopts.IgnoreUnexported(schedulerframework.PodInfo{}),
|
||||||
}
|
}
|
||||||
|
|
@ -247,7 +248,8 @@ func TestNodeInfo(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDeepCopyNodeInfo(t *testing.T) {
|
func TestDeepCopyNodeInfo(t *testing.T) {
|
||||||
node := test.BuildTestNode("node", 1000, 1000)
|
nodeName := "node"
|
||||||
|
node := test.BuildTestNode(nodeName, 1000, 1000)
|
||||||
pods := []*PodInfo{
|
pods := []*PodInfo{
|
||||||
{Pod: test.BuildTestPod("p1", 80, 0, test.WithNodeName(node.Name))},
|
{Pod: test.BuildTestPod("p1", 80, 0, test.WithNodeName(node.Name))},
|
||||||
{
|
{
|
||||||
|
|
@ -261,8 +263,8 @@ func TestDeepCopyNodeInfo(t *testing.T) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
slices := []*resourceapi.ResourceSlice{
|
slices := []*resourceapi.ResourceSlice{
|
||||||
{ObjectMeta: v1.ObjectMeta{Name: "slice1"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "node"}},
|
{ObjectMeta: v1.ObjectMeta{Name: "slice1"}, Spec: resourceapi.ResourceSliceSpec{NodeName: &nodeName}},
|
||||||
{ObjectMeta: v1.ObjectMeta{Name: "slice2"}, Spec: resourceapi.ResourceSliceSpec{NodeName: "node"}},
|
{ObjectMeta: v1.ObjectMeta{Name: "slice2"}, Spec: resourceapi.ResourceSliceSpec{NodeName: &nodeName}},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range []struct {
|
for _, tc := range []struct {
|
||||||
|
|
|
||||||
|
|
@ -396,7 +396,7 @@ func TestCreateSanitizedNodeInfo(t *testing.T) {
|
||||||
{
|
{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "slice1", UID: "slice1Uid"},
|
ObjectMeta: metav1.ObjectMeta{Name: "slice1", UID: "slice1Uid"},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
NodeName: oldNodeName,
|
NodeName: &oldNodeName,
|
||||||
Pool: resourceapi.ResourcePool{
|
Pool: resourceapi.ResourcePool{
|
||||||
Name: "pool1",
|
Name: "pool1",
|
||||||
ResourceSliceCount: 1,
|
ResourceSliceCount: 1,
|
||||||
|
|
@ -406,7 +406,7 @@ func TestCreateSanitizedNodeInfo(t *testing.T) {
|
||||||
{
|
{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "slice2", UID: "slice2Uid"},
|
ObjectMeta: metav1.ObjectMeta{Name: "slice2", UID: "slice2Uid"},
|
||||||
Spec: resourceapi.ResourceSliceSpec{
|
Spec: resourceapi.ResourceSliceSpec{
|
||||||
NodeName: oldNodeName,
|
NodeName: &oldNodeName,
|
||||||
Pool: resourceapi.ResourcePool{
|
Pool: resourceapi.ResourcePool{
|
||||||
Name: "pool2",
|
Name: "pool2",
|
||||||
ResourceSliceCount: 1,
|
ResourceSliceCount: 1,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue