Skip to content

Commit

Permalink
Fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
severinson committed Jun 22, 2023
1 parent 3945a46 commit dbcdb0b
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 111 deletions.
26 changes: 13 additions & 13 deletions internal/scheduler/gang_scheduler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,26 +117,26 @@ func TestGangScheduler(t *testing.T) {
},
"MaximumResourceFractionPerQueue": {
SchedulingConfig: testfixtures.WithPerPriorityLimitsConfig(
map[int32]map[string]float64{
0: {"cpu": 1.0},
1: {"cpu": 15.0 / 32.0},
2: {"cpu": 10.0 / 32.0},
3: {"cpu": 3.0 / 32.0},
map[string]map[string]float64{
testfixtures.PriorityClass0: {"cpu": 1.0 / 32.0},
testfixtures.PriorityClass1: {"cpu": 2.0 / 32.0},
testfixtures.PriorityClass2: {"cpu": 3.0 / 32.0},
testfixtures.PriorityClass3: {"cpu": 4.0 / 32.0},
},
testfixtures.TestSchedulingConfig(),
),
Nodes: testfixtures.N32CpuNodes(1, testfixtures.TestPriorities),
Gangs: [][]*jobdb.Job{
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 1),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 2),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass1, 2),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass1, 3),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass2, 3),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass2, 4),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass3, 4),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass3, 3),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass2, 8),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass2, 7),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass1, 6),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass1, 5),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 18),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 17),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass3, 5),
},
ExpectedScheduledIndices: []int{1, 3, 5, 7},
ExpectedScheduledIndices: []int{0, 2, 4, 6},
},
"resolution has no impact on jobs of size a multiple of the resolution": {
SchedulingConfig: testfixtures.WithIndexedResourcesConfig(
Expand Down
91 changes: 67 additions & 24 deletions internal/scheduler/preempting_queue_scheduler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -817,25 +817,30 @@ func TestPreemptingQueueScheduler(t *testing.T) {
"A": 1,
},
},
"per-priority class limits": {
"MaximumResourceFractionPerQueue": {
SchedulingConfig: testfixtures.WithPerPriorityLimitsConfig(
map[int32]map[string]float64{
0: {"cpu": 60.0 / 64.0},
1: {"cpu": 20.0 / 64.0},
map[string]map[string]float64{
testfixtures.PriorityClass0: {"cpu": 1.0 / 32.0},
testfixtures.PriorityClass1: {"cpu": 2.0 / 32.0},
testfixtures.PriorityClass2: {"cpu": 3.0 / 32.0},
testfixtures.PriorityClass3: {"cpu": 4.0 / 32.0},
},
testfixtures.TestSchedulingConfig(),
),
Nodes: testfixtures.N32CpuNodes(2, testfixtures.TestPriorities),
Nodes: testfixtures.N32CpuNodes(1, testfixtures.TestPriorities),
Rounds: []SchedulingRound{
{
JobsByQueue: map[string][]*jobdb.Job{
"A": append(
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass1, 64),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 64)...,
"A": armadaslices.Concatenate(
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 32),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass1, 32),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass2, 32),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass3, 32),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 32),
),
},
ExpectedScheduledIndices: map[string][]int{
"A": append(testfixtures.IntRange(0, 19), testfixtures.IntRange(64, 103)...),
"A": {0, 32, 33, 64, 65, 66, 96, 97, 98, 99},
},
},
{
Expand All @@ -848,43 +853,71 @@ func TestPreemptingQueueScheduler(t *testing.T) {
"A": 1,
},
},
"per-priority class limits multiple rounds": {
"MaximumResourceFractionPerQueue multiple rounds": {
SchedulingConfig: testfixtures.WithPerPriorityLimitsConfig(
map[int32]map[string]float64{
0: {"cpu": 30.0 / 32.0},
1: {"cpu": 10.0 / 32.0},
map[string]map[string]float64{
testfixtures.PriorityClass0: {"cpu": 1.0 / 32.0},
testfixtures.PriorityClass1: {"cpu": 2.0 / 32.0},
testfixtures.PriorityClass2: {"cpu": 3.0 / 32.0},
testfixtures.PriorityClass3: {"cpu": 4.0 / 32.0},
},
testfixtures.TestSchedulingConfig(),
),
Nodes: testfixtures.N32CpuNodes(1, testfixtures.TestPriorities),
Rounds: []SchedulingRound{
{
JobsByQueue: map[string][]*jobdb.Job{
"A": append(
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass1, 5),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 10)...,
"A": armadaslices.Concatenate(
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 32),
),
},
ExpectedScheduledIndices: map[string][]int{
"A": testfixtures.IntRange(0, 0),
},
},
{
JobsByQueue: map[string][]*jobdb.Job{
"A": armadaslices.Concatenate(
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass1, 32),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 32),
),
},
ExpectedScheduledIndices: map[string][]int{
"A": testfixtures.IntRange(0, 1),
},
},
{
JobsByQueue: map[string][]*jobdb.Job{
"A": armadaslices.Concatenate(
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass2, 32),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass1, 32),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 32),
),
},
ExpectedScheduledIndices: map[string][]int{
"A": testfixtures.IntRange(0, 14),
"A": testfixtures.IntRange(0, 2),
},
},
{
JobsByQueue: map[string][]*jobdb.Job{
"A": append(
"A": armadaslices.Concatenate(
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass3, 32),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass2, 32),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass1, 32),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 32)...,
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 32),
),
},
ExpectedScheduledIndices: map[string][]int{
"A": append(testfixtures.IntRange(0, 4), testfixtures.IntRange(32, 41)...),
"A": testfixtures.IntRange(0, 3),
},
},
{
JobsByQueue: map[string][]*jobdb.Job{
"A": append(
"A": armadaslices.Concatenate(
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass3, 32),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass2, 32),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass1, 32),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 32)...,
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 32),
),
},
},
Expand Down Expand Up @@ -1216,13 +1249,23 @@ func TestPreemptingQueueScheduler(t *testing.T) {

// Test resource accounting.
for _, job := range result.PreemptedJobs {
allocatedByQueueAndPriorityClass[job.GetQueue()].SubV1ResourceList(
m := allocatedByQueueAndPriorityClass[job.GetQueue()]
if m == nil {
m = make(schedulerobjects.QuantityByTAndResourceType[string])
allocatedByQueueAndPriorityClass[job.GetQueue()] = m
}
m.SubV1ResourceList(
job.GetPriorityClassName(),
job.GetResourceRequirements().Requests,
)
}
for _, job := range result.ScheduledJobs {
allocatedByQueueAndPriorityClass[job.GetQueue()].AddV1ResourceList(
m := allocatedByQueueAndPriorityClass[job.GetQueue()]
if m == nil {
m = make(schedulerobjects.QuantityByTAndResourceType[string])
allocatedByQueueAndPriorityClass[job.GetQueue()] = m
}
m.AddV1ResourceList(
job.GetPriorityClassName(),
job.GetResourceRequirements().Requests,
)
Expand Down
79 changes: 17 additions & 62 deletions internal/scheduler/queue_scheduler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,79 +138,34 @@ func TestQueueScheduler(t *testing.T) {
},
"PerPriorityLimits": {
SchedulingConfig: testfixtures.WithPerPriorityLimitsConfig(
map[int32]map[string]float64{
0: {"cpu": 1.0},
1: {"cpu": 15.0 / 32.0},
2: {"cpu": 10.0 / 32.0},
3: {"cpu": 3.0 / 32.0},
map[string]map[string]float64{
testfixtures.PriorityClass0: {"cpu": 1.0 / 32.0},
testfixtures.PriorityClass1: {"cpu": 2.0 / 32.0},
testfixtures.PriorityClass2: {"cpu": 3.0 / 32.0},
testfixtures.PriorityClass3: {"cpu": 4.0 / 32.0},
},
testfixtures.TestSchedulingConfig(),
),
PriorityFactorByQueue: map[string]float64{"A": 1.0},
Nodes: testfixtures.N32CpuNodes(1, testfixtures.TestPriorities),
Jobs: armadaslices.Concatenate(
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 1),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 2),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass1, 2),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass1, 3),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass2, 3),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass2, 3),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass3, 4),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass3, 4),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass2, 8),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass1, 6),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 18),
testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 1),
),
ExpectedScheduledIndices: armadaslices.Concatenate(
testfixtures.IntRange(0, 2),
testfixtures.IntRange(4, 10),
testfixtures.IntRange(12, 16),
testfixtures.IntRange(18, 34),
testfixtures.IntRange(0, 0),
testfixtures.IntRange(3, 4),
testfixtures.IntRange(8, 10),
testfixtures.IntRange(14, 17),
),
},
"PerPriorityLimits equal MaximumResourceFractionToSchedule": {
SchedulingConfig: testfixtures.WithPerPriorityLimitsConfig(
map[int32]map[string]float64{
0: {"cpu": 0.9}, // 28 cpu
1: {"cpu": 0.9},
}, testfixtures.TestSchedulingConfig()),
Nodes: testfixtures.N32CpuNodes(1, testfixtures.TestPriorities),
Jobs: armadaslices.Concatenate(testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 5), testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 5)),
PriorityFactorByQueue: map[string]float64{"A": 1},
InitialAllocatedByQueueAndPriorityClass: map[string]schedulerobjects.QuantityByTAndResourceType[string]{
"A": {
testfixtures.PriorityClass0: schedulerobjects.ResourceList{
Resources: map[string]resource.Quantity{
"cpu": resource.MustParse("13"),
},
},
testfixtures.PriorityClass1: schedulerobjects.ResourceList{
Resources: map[string]resource.Quantity{
"cpu": resource.MustParse("14"),
},
},
},
},
ExpectedScheduledIndices: []int{0},
},
"limit hit at higher priority doesn't block jobs at lower priority": {
SchedulingConfig: testfixtures.WithPerPriorityLimitsConfig(
map[int32]map[string]float64{
0: {"cpu": 0.9}, // 28 cpu
1: {"cpu": 0.5}, // 14 cpu
}, testfixtures.TestSchedulingConfig()),
Nodes: testfixtures.N32CpuNodes(1, testfixtures.TestPriorities),
Jobs: armadaslices.Concatenate(testfixtures.N1CpuJobs("A", testfixtures.PriorityClass1, 1), testfixtures.N1CpuJobs("A", testfixtures.PriorityClass0, 5)),
PriorityFactorByQueue: map[string]float64{"A": 1},
InitialAllocatedByQueueAndPriorityClass: map[string]schedulerobjects.QuantityByTAndResourceType[string]{
"A": {
testfixtures.PriorityClass0: schedulerobjects.ResourceList{
Resources: map[string]resource.Quantity{
"cpu": resource.MustParse("7"), // out of 28
},
},
testfixtures.PriorityClass1: schedulerobjects.ResourceList{
Resources: map[string]resource.Quantity{
"cpu": resource.MustParse("20"), // out of 14, i.e., over the limit
},
},
},
},
ExpectedScheduledIndices: []int{1},
},
"fairness two queues": {
SchedulingConfig: testfixtures.TestSchedulingConfig(),
Nodes: testfixtures.N32CpuNodes(1, testfixtures.TestPriorities),
Expand Down
12 changes: 6 additions & 6 deletions internal/scheduler/scheduling_algo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ func TestLegacySchedulingAlgo_TestSchedule(t *testing.T) {
},
"user is at usage cap before scheduling": {
schedulingConfig: testfixtures.WithPerPriorityLimitsConfig(
map[int32]map[string]float64{
testfixtures.TestPriorityClasses[testfixtures.PriorityClass3].Priority: {"cpu": 0.5},
map[string]map[string]float64{
testfixtures.PriorityClass3: {"cpu": 0.5},
},
testfixtures.TestSchedulingConfig(),
),
Expand All @@ -134,8 +134,8 @@ func TestLegacySchedulingAlgo_TestSchedule(t *testing.T) {
},
"user hits usage cap during scheduling": {
schedulingConfig: testfixtures.WithPerPriorityLimitsConfig(
map[int32]map[string]float64{
testfixtures.TestPriorityClasses[testfixtures.PriorityClass3].Priority: {"cpu": 0.5},
map[string]map[string]float64{
testfixtures.PriorityClass3: {"cpu": 0.5},
},
testfixtures.TestSchedulingConfig(),
),
Expand Down Expand Up @@ -179,8 +179,8 @@ func TestLegacySchedulingAlgo_TestSchedule(t *testing.T) {
},
"computation of allocated resources does not confuse priority class with per-queue priority": {
schedulingConfig: testfixtures.WithPerPriorityLimitsConfig(
map[int32]map[string]float64{
testfixtures.TestPriorityClasses[testfixtures.PriorityClass3].Priority: {"cpu": 0.5},
map[string]map[string]float64{
testfixtures.PriorityClass3: {"cpu": 0.5},
},
testfixtures.TestSchedulingConfig(),
),
Expand Down
18 changes: 12 additions & 6 deletions internal/scheduler/testfixtures/testfixtures.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,12 +126,18 @@ func WithRoundLimitsPoolConfig(limits map[string]map[string]float64, config conf
return config
}

func WithPerPriorityLimitsConfig(limits map[int32]map[string]float64, config configuration.SchedulingConfig) configuration.SchedulingConfig {
for k, v := range config.Preemption.PriorityClasses {
config.Preemption.PriorityClasses[k] = configuration.PriorityClass{
Priority: v.Priority,
Preemptible: v.Preemptible,
MaximumResourceFractionPerQueue: limits[v.Priority],
func WithPerPriorityLimitsConfig(limits map[string]map[string]float64, config configuration.SchedulingConfig) configuration.SchedulingConfig {
for priorityClassName, limit := range limits {
priorityClass, ok := config.Preemption.PriorityClasses[priorityClassName]
if !ok {
panic(fmt.Sprintf("no priority class with name %s", priorityClassName))
}
// We need to make a copy to avoid mutating the priorityClasses, which are used by other tests too.
config.Preemption.PriorityClasses[priorityClassName] = configuration.PriorityClass{
Priority: priorityClass.Priority,
Preemptible: priorityClass.Preemptible,
MaximumResourceFractionPerQueue: limit,
MaximumResourceFractionPerQueueByPool: priorityClass.MaximumResourceFractionPerQueueByPool,
}
}
return config
Expand Down

0 comments on commit dbcdb0b

Please sign in to comment.