This is an automated email from the ASF dual-hosted git repository.
ccondit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/yunikorn-core.git
The following commit(s) were added to refs/heads/master by this push:
new 5d3eb36b [YUNIKORN-2848] Refactor preemption_queue_test.go (#983)
5d3eb36b is described below
commit 5d3eb36bf10daef8e9820d76e4aff6bbb1f75acb
Author: Ryan <[email protected]>
AuthorDate: Thu Oct 24 12:15:25 2024 -0500
[YUNIKORN-2848] Refactor preemption_queue_test.go (#983)
Closes: #983
Signed-off-by: Craig Condit <[email protected]>
---
pkg/scheduler/objects/preemption_queue_test.go | 281 +++++++++++++++++--------
1 file changed, 197 insertions(+), 84 deletions(-)
diff --git a/pkg/scheduler/objects/preemption_queue_test.go
b/pkg/scheduler/objects/preemption_queue_test.go
index d2a287bd..08794382 100644
--- a/pkg/scheduler/objects/preemption_queue_test.go
+++ b/pkg/scheduler/objects/preemption_queue_test.go
@@ -53,101 +53,214 @@ type res struct {
assertMessages assertMessage
}
-func TestGetPreemptableResource(t *testing.T) {
- // no guaranteed and no usage. so nothing to preempt
+func setupQueueStructure(t *testing.T) (*Queue, *Queue, *Queue, *Queue) {
rootQ, err := createRootQueue(map[string]string{"first": "20"})
assert.NilError(t, err)
- var parentQ, childQ1, childQ2 *Queue
- parentQ, err = createManagedQueue(rootQ, "parent", true,
map[string]string{"first": "15"})
+ parentQ, err := createManagedQueue(rootQ, "parent", true,
map[string]string{"first": "15"})
assert.NilError(t, err)
- childQ1, err = createManagedQueue(parentQ, "child1", false,
map[string]string{"first": "10"})
+ childQ1, err := createManagedQueue(parentQ, "child1", false,
map[string]string{"first": "10"})
assert.NilError(t, err)
- childQ2, err = createManagedQueue(parentQ, "child2", false,
map[string]string{"first": "5"})
+ childQ2, err := createManagedQueue(parentQ, "child2", false,
map[string]string{"first": "5"})
assert.NilError(t, err)
+ return rootQ, parentQ, childQ1, childQ2
+}
- rootPreemptable, pPreemptable, cPreemptable1, cPreemptable2 :=
getPreemptableResource(rootQ, parentQ, childQ1, childQ2)
- assert.Assert(t, rootPreemptable.IsEmpty(), "nothing to preempt as no
guaranteed set and no usage")
- assert.Assert(t, pPreemptable.IsEmpty(), "nothing to preempt as no
guaranteed set and no usage")
- assert.Assert(t, cPreemptable1.IsEmpty(), "nothing to preempt as no
guaranteed set and no usage")
- assert.Assert(t, cPreemptable2.IsEmpty(), "nothing to preempt as no
guaranteed set and no usage")
-
- // guaranteed set but no usage. so nothing to preempt
- // clean start for the snapshot: whole hierarchy with guarantee
- smallestRes :=
resources.NewResourceFromMap(map[string]resources.Quantity{"first": 5})
+//nolint:funlen
+func TestGetPreemptableResource(t *testing.T) {
+ tests := []struct {
+ testName string
+ guaranteed resource
+ allocated resource
+ remaining resource
+ assertMsgs assertMessage
+ }{
+ {
+ // no guaranteed and no usage. so nothing to preempt
+ testName: "NoGuaranteedNoUsage",
+ guaranteed: resource{nil, nil, nil, nil},
+ allocated: resource{nil, nil, nil, nil},
+ remaining: resource{nil, nil, nil, nil},
+ assertMsgs: assertMessage{
+ rootR: "nothing to preempt as no guaranteed
set and no usage",
+ parentR: "nothing to preempt as no guaranteed
set and no usage",
+ childQ1R: "nothing to preempt as no guaranteed
set and no usage",
+ childQ2R: "nothing to preempt as no guaranteed
set and no usage",
+ },
+ },
+ {
+ // yes guaranteed and no usage. so nothing to preempt
+ testName: "YesGuaranteedNoUsage",
+ guaranteed: resource{
+ root: resources.Multiply(smallestRes, 2),
+ parent: smallestRes,
+ childQ1: childRes,
+ childQ2: smallestRes,
+ },
+ allocated: resource{nil, nil, nil, nil},
+ remaining: resource{nil, nil, nil, nil},
+ assertMsgs: assertMessage{
+ rootR: "nothing to preempt as no guaranteed
set and no usage",
+ parentR: "nothing to preempt as no guaranteed
set and no usage",
+ childQ1R: "nothing to preempt as no guaranteed
set and no usage",
+ childQ2R: "nothing to preempt as no guaranteed
set and no usage",
+ },
+ },
+ {
+ // add usage to parent + root: use all guaranteed at
parent level
+ // add usage to child2: while guaranteed no resource
+ // usage has exceeded guaranteed for some queues,
preemptable resources should be as expected
+ testName: "GuaranteedSetUsageExceeded1",
+ guaranteed: resource{nil, smallestRes, nil, nil},
+ allocated: resource{
+ root: resources.Multiply(smallestRes, 2),
+ parent: resources.Multiply(smallestRes, 2),
+ childQ1: nil,
+ childQ2: resources.Multiply(smallestRes, 2),
+ },
+ remaining: resource{
+ root: resources.Multiply(smallestRes, 2),
+ parent: smallestRes,
+ childQ1: nil,
+ childQ2: smallestRes,
+ },
+ assertMsgs: assertMessage{
+ rootR: "usage has exceeded guaranteed,
preemptable resource should be as expected",
+ parentR: "usage has exceeded guaranteed,
preemptable resource should be as expected",
+ childQ1R: "nothing to preempt as no guaranteed
set and no usage",
+ childQ2R: "usage has exceeded guaranteed,
preemptable resource should be as expected",
+ },
+ },
+ {
+ // add usage to parent + root: use all guaranteed at
parent level
+ // add usage to child2: use double than guaranteed
+ // usage has exceeded guaranteed for some queues,
preemptable resources should be as expected
+ testName: "GuaranteedSetUsageExceeded2",
+ guaranteed: resource{
+ root: resources.Multiply(smallestRes, 2),
+ parent: smallestRes,
+ childQ1: childRes,
+ childQ2: smallestRes,
+ },
+ allocated: resource{
+ root: resources.Multiply(smallestRes, 2),
+ parent: resources.Multiply(smallestRes, 2),
+ childQ1: nil,
+ childQ2: resources.Multiply(smallestRes, 2),
+ },
+ remaining: resource{
+ root: nil,
+ parent: smallestRes,
+ childQ1: nil,
+ childQ2: smallestRes,
+ },
+ assertMsgs: assertMessage{
+ rootR: "usage has exceeded guaranteed,
preemptable resource should be as expected",
+ parentR: "usage has exceeded guaranteed,
preemptable resource should be as expected",
+ childQ1R: "nothing to preempt as no guaranteed
set and no usage",
+ childQ2R: "usage has exceeded guaranteed,
preemptable resource should be as expected",
+ },
+ },
+ {
+ // add usage for all: use exactly guaranteed at parent
and child level
+ // parent guarantee used for one type child guarantee
used for second type
+ testName: "GuaranteedSetExactUsage",
+ guaranteed: resource{
+ root: resources.Multiply(smallestRes, 2),
+ parent: smallestRes,
+ childQ1: childRes,
+ childQ2: smallestRes,
+ },
+ allocated: resource{
+ root: smallestResDoublePlusChildRes,
+ parent: smallestResPlusChildRes,
+ childQ1: childRes,
+ childQ2: smallestRes,
+ },
+ remaining: resource{
+ root: childRes,
+ parent: childRes,
+ childQ1: nil,
+ childQ2: nil,
+ },
+ assertMsgs: assertMessage{
+ rootR: "usage has extra resource type not
defined as part of guaranteed, that extra should be preemptable",
+ parentR: "usage has extra resource type not
defined as part of guaranteed, that extra should be preemptable",
+ childQ1R: "nothing to preempt as no guaranteed
set and no usage",
+ childQ2R: "nothing to preempt as no guaranteed
set and no usage",
+ },
+ },
+ {
+ // add usage for root + parent: use exactly guaranteed
at parent and child level
+ // add usage to child1: use double than guaranteed
+ // parent guarantee used for one type child guarantee
used for second type
+ testName: "GuaranteedSetMixedUsage",
+ guaranteed: resource{
+ root: resources.Multiply(smallestRes, 2),
+ parent: smallestRes,
+ childQ1: childRes,
+ childQ2: smallestRes,
+ },
+ allocated: resource{
+ root: smallestResDoublePlusChildResDouble,
+ parent: smallestResPlusChildResDouble,
+ childQ1: childResDouble,
+ childQ2: nil,
+ },
+ remaining: resource{
+ root: resources.Multiply(childRes, 2),
+ parent: resources.Multiply(childRes, 2),
+ childQ1: childRes,
+ childQ2: nil,
+ },
+ assertMsgs: assertMessage{
+ rootR: "usage has extra resource type not
defined as part of guaranteed, that extra should be preemptable",
+ parentR: "usage has extra resource type not
defined as part of guaranteed, that extra should be preemptable",
+ childQ1R: "usage has exceeded guaranteed for
some queues, preemptable resources should be as expected",
+ childQ2R: "nothing to preempt as no guaranteed
set and no usage",
+ },
+ },
+ }
- // clean start for the snapshot: all set guaranteed - new tests
- // add usage to parent + root: use all guaranteed at parent level
- // add usage to child2: use double than guaranteed
- parentQ.guaranteedResource = smallestRes
- rootQ.allocatedResource = resources.Multiply(smallestRes, 2)
- parentQ.allocatedResource = resources.Multiply(smallestRes, 2)
- childQ2.allocatedResource = resources.Multiply(smallestRes, 2)
- rootPreemptable, pPreemptable, cPreemptable1, cPreemptable2 =
getPreemptableResource(rootQ, parentQ, childQ1, childQ2)
- assert.Assert(t, resources.Equals(rootPreemptable,
resources.Multiply(smallestRes, 2)), "usage is equal to guaranteed in root
queue. so nothing to preempt")
- assert.Assert(t, resources.Equals(pPreemptable, smallestRes), "usage
has exceeded twice than guaranteed in parent queue. preemtable resource should
be equal to guaranteed res")
- assert.Assert(t, resources.IsZero(cPreemptable1), "nothing to preempt
as no usage in child1 queue")
- assert.Assert(t, resources.Equals(cPreemptable2, smallestRes), "usage
has exceeded twice than guaranteed in child2 queue. preemtable resource should
be equal to guaranteed res")
+ for _, tt := range tests {
+ t.Run(tt.testName, func(t *testing.T) {
+ rootQ, parentQ, childQ1, childQ2 :=
setupQueueStructure(t)
- rootQ.guaranteedResource = resources.Multiply(smallestRes, 2)
- parentQ.guaranteedResource = smallestRes
- childQ2.guaranteedResource = smallestRes
- rootQ.allocatedResource = nil
- parentQ.allocatedResource = nil
- childQ2.allocatedResource = nil
- childRes :=
resources.NewResourceFromMap(map[string]resources.Quantity{"second": 5})
- childQ1.guaranteedResource = childRes
- rootPreemptable, pPreemptable, cPreemptable1, cPreemptable2 =
getPreemptableResource(rootQ, parentQ, childQ1, childQ2)
- assert.Assert(t, rootPreemptable.IsEmpty(), "nothing to preempt as no
usage")
- assert.Assert(t, pPreemptable.IsEmpty(), "nothing to preempt as no
usage")
- assert.Assert(t, cPreemptable1.IsEmpty(), "nothing to preempt as no
usage")
- assert.Assert(t, cPreemptable2.IsEmpty(), "nothing to preempt as no
usage")
+ // Set guaranteed resources
+ rootQ.guaranteedResource = tt.guaranteed.root
+ parentQ.guaranteedResource = tt.guaranteed.parent
+ childQ1.guaranteedResource = tt.guaranteed.childQ1
+ childQ2.guaranteedResource = tt.guaranteed.childQ2
- // clean start for the snapshot: all set guaranteed
- // add usage to parent + root: use all guaranteed at parent level
- // add usage to child2: use double than guaranteed
- rootQ.guaranteedResource = resources.Multiply(smallestRes, 2)
- parentQ.guaranteedResource = smallestRes
- childQ2.guaranteedResource = smallestRes
- rootQ.allocatedResource = resources.Multiply(smallestRes, 2)
- parentQ.allocatedResource = resources.Multiply(smallestRes, 2)
- childQ2.allocatedResource = resources.Multiply(smallestRes, 2)
- rootPreemptable, pPreemptable, cPreemptable1, cPreemptable2 =
getPreemptableResource(rootQ, parentQ, childQ1, childQ2)
- assert.Assert(t, resources.IsZero(rootPreemptable), "usage is equal to
guaranteed in root queue. so nothing to preempt")
- assert.Assert(t, resources.Equals(pPreemptable, smallestRes), "usage
has exceeded twice than guaranteed in parent queue. preemtable resource should
be equal to guaranteed res")
- assert.Assert(t, resources.IsZero(cPreemptable1), "nothing to preempt
as no usage in child1 queue")
- assert.Assert(t, resources.Equals(cPreemptable2, smallestRes), "usage
has exceeded twice than guaranteed in child2 queue. preemtable resource should
be equal to guaranteed res")
+ // Set allocated resources
+ rootQ.allocatedResource = tt.allocated.root
+ parentQ.allocatedResource = tt.allocated.parent
+ childQ1.allocatedResource = tt.allocated.childQ1
+ childQ2.allocatedResource = tt.allocated.childQ2
- // clean start for the snapshot: all set guaranteed
- // add usage for all: use exactly guaranteed at parent and child level
- // parent guarantee used for one type child guarantee used for second
type
- bothRes := resources.Multiply(smallestRes, 2)
- bothRes.AddTo(childRes)
- rootQ.allocatedResource = bothRes
- bothRes = resources.Add(smallestRes, childRes)
- parentQ.allocatedResource = bothRes
- childQ1.allocatedResource = childRes
- childQ2.allocatedResource = smallestRes
- rootPreemptable, pPreemptable, cPreemptable1, cPreemptable2 =
getPreemptableResource(rootQ, parentQ, childQ1, childQ2)
- assert.Assert(t, resources.Equals(rootPreemptable,
resources.Multiply(childRes, 1)), "usage in root queue has extra resource type
not defined as part of guaranteed res. So, that extra resource type should be
preempted")
- assert.Assert(t, resources.Equals(pPreemptable,
resources.Multiply(childRes, 1)), "usage in parent1 queue has extra resource
type not defined as part of guaranteed res. So, that extra resource type should
be preempted")
- assert.Assert(t, resources.IsZero(cPreemptable1), "usage in child1
queue is equal to guaranteed res. so nothing to preempt")
- assert.Assert(t, resources.IsZero(cPreemptable2), "nothing to preempt
as no usage in child2 queue")
+ rootPreemptable, parentPreemptable, child1Preemptable,
child2Preemptable := getPreemptableResource(rootQ, parentQ, childQ1, childQ2)
- // clean start for the snapshot: all set guaranteed
- // add usage for root + parent: use exactly guaranteed at parent and
child level
- // add usage to child1: use double than guaranteed
- // parent guarantee used for one type child guarantee used for second
type
- bothRes = resources.Multiply(smallestRes, 2)
- bothRes.AddTo(resources.Multiply(childRes, 2))
- rootQ.allocatedResource = bothRes
- bothRes = resources.Add(smallestRes, resources.Multiply(childRes, 2))
- parentQ.allocatedResource = bothRes
- childQ1.allocatedResource = resources.Multiply(childRes, 2)
- rootPreemptable, pPreemptable, cPreemptable1, cPreemptable2 =
getPreemptableResource(rootQ, parentQ, childQ1, childQ2)
- assert.Assert(t, resources.Equals(rootPreemptable,
resources.Multiply(childRes, 2)), "usage in root queue has extra resource type
not defined as part of guaranteed res. So, that extra resource type should be
preempted")
- assert.Assert(t, resources.Equals(pPreemptable,
resources.Multiply(childRes, 2)), "usage in parent1 queue has extra resource
type not defined as part of guaranteed res. So, that extra resource type should
be preempted")
- assert.Assert(t, resources.Equals(cPreemptable1, childRes), "usage has
exceeded twice than guaranteed in child1 queue. cPreemptable1 resource should
be equal to guaranteed res")
- assert.Assert(t, resources.IsZero(cPreemptable2), "nothing to preempt
as no usage in child2 queue")
+ if tt.remaining.root != nil {
+ assert.Assert(t,
resources.Equals(rootPreemptable, tt.remaining.root), tt.assertMsgs.rootR)
+ } else {
+ assert.Assert(t,
resources.IsZero(rootPreemptable), tt.assertMsgs.rootR)
+ }
+ if tt.remaining.parent != nil {
+ assert.Assert(t,
resources.Equals(parentPreemptable, tt.remaining.parent), tt.assertMsgs.parentR)
+ } else {
+ assert.Assert(t,
resources.IsZero(parentPreemptable), tt.assertMsgs.parentR)
+ }
+ if tt.remaining.childQ1 != nil {
+ assert.Assert(t,
resources.Equals(child1Preemptable, tt.remaining.childQ1),
tt.assertMsgs.childQ1R)
+ } else {
+ assert.Assert(t,
resources.IsZero(child1Preemptable), tt.assertMsgs.childQ1R)
+ }
+ if tt.remaining.childQ2 != nil {
+ assert.Assert(t,
resources.Equals(child2Preemptable, tt.remaining.childQ2),
tt.assertMsgs.childQ2R)
+ } else {
+ assert.Assert(t,
resources.IsZero(child2Preemptable), tt.assertMsgs.childQ2R)
+ }
+ })
+ }
}
func TestGetRemainingGuaranteedResource(t *testing.T) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]