diff --git a/internal/scheduler/internaltypes/node.go b/internal/scheduler/internaltypes/node.go index eae49179111..f05e35de75e 100644 --- a/internal/scheduler/internaltypes/node.go +++ b/internal/scheduler/internaltypes/node.go @@ -19,7 +19,7 @@ const ( // This helps avoid scheduling new jobs onto nodes that make it impossible to re-schedule evicted jobs. EvictedPriority int32 = -1 // MinPriority is the smallest possible priority class priority within the NodeDb. - MinPriority int32 = EvictedPriority + MinPriority = EvictedPriority ) // Node is a scheduler-internal representation of one Kubernetes node. diff --git a/internal/scheduler/internaltypes/node_factory.go b/internal/scheduler/internaltypes/node_factory.go index 13b6f22cfbd..54b9dd8f96b 100644 --- a/internal/scheduler/internaltypes/node_factory.go +++ b/internal/scheduler/internaltypes/node_factory.go @@ -64,7 +64,6 @@ func (f *NodeFactory) CreateNodeAndType( labels map[string]string, totalResources ResourceList, allocatableResources ResourceList, - unallocatableResources map[int32]ResourceList, allocatableByPriority map[int32]ResourceList, ) *Node { return CreateNodeAndType( diff --git a/internal/scheduler/internaltypes/resource_list_map_util_test.go b/internal/scheduler/internaltypes/resource_list_map_util_test.go index 199d3a00322..94ee819b215 100644 --- a/internal/scheduler/internaltypes/resource_list_map_util_test.go +++ b/internal/scheduler/internaltypes/resource_list_map_util_test.go @@ -16,7 +16,7 @@ func TestRlMapSumValues(t *testing.T) { factory := testFactory() assert.Equal(t, testResourceList(factory, "3", "3Ki"), RlMapSumValues(testMapAllPositive(factory))) - assert.True(t, RlMapSumValues(testMapEmpty(factory)).IsEmpty()) + assert.True(t, RlMapSumValues(testMapEmpty()).IsEmpty()) } func TestRlMapAllZero(t *testing.T) { @@ -26,7 +26,7 @@ func TestRlMapAllZero(t *testing.T) { assert.True(t, RlMapAllZero(testMapAllZero(factory))) assert.False(t, RlMapAllZero(testMapOneZero(factory))) assert.False(t, RlMapAllZero(testMapOneNegative(factory))) - assert.True(t, RlMapAllZero(testMapEmpty(factory))) + assert.True(t, RlMapAllZero(testMapEmpty())) } func TestRlMapHasNegativeValues(t *testing.T) { @@ -36,7 +36,7 @@ func TestRlMapHasNegativeValues(t *testing.T) { assert.False(t, RlMapHasNegativeValues(testMapAllZero(factory))) assert.False(t, RlMapHasNegativeValues(testMapOneZero(factory))) assert.True(t, RlMapHasNegativeValues(testMapOneNegative(factory))) - assert.False(t, RlMapHasNegativeValues(testMapEmpty(factory))) + assert.False(t, RlMapHasNegativeValues(testMapEmpty())) } func TestRlMapRemoveZeros(t *testing.T) { @@ -131,6 +131,6 @@ func testMapOneZero(factory *ResourceListFactory) map[string]ResourceList { } } -func testMapEmpty(factory *ResourceListFactory) map[string]ResourceList { +func testMapEmpty() map[string]ResourceList { return map[string]ResourceList{} } diff --git a/internal/scheduler/internaltypes/unschedulable.go b/internal/scheduler/internaltypes/unschedulable.go index 3d12b2bf7c3..d19f1892312 100644 --- a/internal/scheduler/internaltypes/unschedulable.go +++ b/internal/scheduler/internaltypes/unschedulable.go @@ -3,9 +3,9 @@ package internaltypes import v1 "k8s.io/api/core/v1" const ( - unschedulableTaintKey string = "armadaproject.io/unschedulable" - unschedulableTaintValue string = "true" - unschedulableTaintEffect v1.TaintEffect = v1.TaintEffectNoSchedule + unschedulableTaintKey string = "armadaproject.io/unschedulable" + unschedulableTaintValue string = "true" + unschedulableTaintEffect = v1.TaintEffectNoSchedule ) // UnschedulableTaint returns the taint automatically added to unschedulable nodes on inserting into the nodeDb. diff --git a/internal/scheduler/jobdb/comparison.go b/internal/scheduler/jobdb/comparison.go index 1fb0c4b95a7..d6da5a875b1 100644 --- a/internal/scheduler/jobdb/comparison.go +++ b/internal/scheduler/jobdb/comparison.go @@ -72,7 +72,7 @@ func SchedulingOrderCompare(job, other *Job) int { // If both jobs are active, order by time since the job was scheduled. // This ensures jobs that have been running for longer are rescheduled first, // which reduces wasted compute time when preempting. - if jobIsActive && otherIsActive { + if jobIsActive { if job.activeRunTimestamp < other.activeRunTimestamp { return -1 } else if job.activeRunTimestamp > other.activeRunTimestamp { diff --git a/internal/scheduler/jobdb/test_utils.go b/internal/scheduler/jobdb/test_utils.go index c8083c6b5f7..a64591a3d12 100644 --- a/internal/scheduler/jobdb/test_utils.go +++ b/internal/scheduler/jobdb/test_utils.go @@ -32,20 +32,6 @@ func getTestFloatingResourceTypes() []schedulerconfiguration.FloatingResourceCon } } -//func WithJobDbJobPodRequirements(job *Job, reqs *schedulerobjects.PodRequirements) *Job { -// return JobWithJobSchedulingInfo(job, &schedulerobjects.JobSchedulingInfo{ -// PriorityClassName: job.JobSchedulingInfo().PriorityClassName, -// SubmitTime: job.JobSchedulingInfo().SubmitTime, -// ObjectRequirements: []*schedulerobjects.ObjectRequirements{ -// { -// Requirements: &schedulerobjects.ObjectRequirements_PodRequirements{ -// PodRequirements: reqs, -// }, -// }, -// }, -// }) -//} - func JobWithJobSchedulingInfo(job *Job, jobSchedulingInfo *internaltypes.JobSchedulingInfo) *Job { j, err := job.WithJobSchedulingInfo(jobSchedulingInfo) if err != nil { diff --git a/internal/scheduler/kubernetesobjects/taint/taint.go b/internal/scheduler/kubernetesobjects/taint/taint.go index f7ba4abcb65..bb321642e56 100644 --- a/internal/scheduler/kubernetesobjects/taint/taint.go +++ b/internal/scheduler/kubernetesobjects/taint/taint.go @@ -45,7 +45,7 @@ func FindMatchingUntoleratedTaint(taints []v1.Taint, tolerations ...[]v1.Tolerat for _, taint := range taints { taintTolerated := false for _, ts := range tolerations { - taintTolerated = taintTolerated || corev1.TolerationsTolerateTaint(ts, &taint) + taintTolerated = corev1.TolerationsTolerateTaint(ts, &taint) if taintTolerated { break } diff --git a/internal/scheduler/nodedb/nodedb.go b/internal/scheduler/nodedb/nodedb.go index 817579fa99d..eeb257fc5e5 100644 --- a/internal/scheduler/nodedb/nodedb.go +++ b/internal/scheduler/nodedb/nodedb.go @@ -160,7 +160,7 @@ func NewNodeDb( nodeDbPriorities = append(nodeDbPriorities, types.AllowedPriorities(priorityClasses)...) indexedResourceNames := slices.Map(indexedResources, func(v configuration.ResourceType) string { return v.Name }) - schema, indexNameByPriority, keyIndexByPriority := nodeDbSchema(nodeDbPriorities, indexedResourceNames) + schema, indexNameByPriority, keyIndexByPriority := nodeDbSchema(nodeDbPriorities) db, err := memdb.NewMemDB(schema) if err != nil { return nil, errors.WithStack(err) @@ -1076,7 +1076,7 @@ func (nodeDb *NodeDb) AddEvictedJobSchedulingContextWithTxn(txn *memdb.Txn, inde return nil } -func nodeDbSchema(priorities []int32, resources []string) (*memdb.DBSchema, map[int32]string, map[int32]int) { +func nodeDbSchema(priorities []int32) (*memdb.DBSchema, map[int32]string, map[int32]int) { nodesTable, indexNameByPriority, keyIndexByPriority := nodesTableSchema(priorities) evictionsTable := evictionsTableSchema() return &memdb.DBSchema{ diff --git a/internal/scheduler/nodedb/nodedb_test.go b/internal/scheduler/nodedb/nodedb_test.go index 71f5e084e01..bed71f9cbb6 100644 --- a/internal/scheduler/nodedb/nodedb_test.go +++ b/internal/scheduler/nodedb/nodedb_test.go @@ -23,7 +23,7 @@ import ( ) func TestNodeDbSchema(t *testing.T) { - schema, _, _ := nodeDbSchema(testfixtures.TestPriorities, testfixtures.TestResourceNames) + schema, _, _ := nodeDbSchema(testfixtures.TestPriorities) assert.NoError(t, schema.Validate()) } @@ -606,7 +606,7 @@ func TestAwayNodeScheduling(t *testing.T) { job := testfixtures.TestJob( testfixtures.TestQueue, jobId, "armada-preemptible-away", - testfixtures.Test1Cpu4GiPodReqs(testfixtures.TestQueue, jobId, 30000), + testfixtures.Test1Cpu4GiPodReqs(), ) if tc.shouldSubmitGang { job = testfixtures.WithGangAnnotationsJobs([]*jobdb.Job{job.DeepCopy(), job.DeepCopy()})[0] diff --git a/internal/scheduler/nodedb/nodeidindex.go b/internal/scheduler/nodedb/nodeidindex.go index 2e455711a7a..7798408a30a 100644 --- a/internal/scheduler/nodedb/nodeidindex.go +++ b/internal/scheduler/nodedb/nodeidindex.go @@ -18,7 +18,7 @@ func (nii *nodeIdIndex) FromObject(obj interface{}) (bool, []byte, error) { node, ok := obj.(*internaltypes.Node) if !ok { return false, nil, - fmt.Errorf("Expected type *Node but got %v", reflect.TypeOf(obj)) + fmt.Errorf("expected type *Node but got %v", reflect.TypeOf(obj)) } val := node.GetId() if val == "" { diff --git a/internal/scheduler/nodedb/nodematching_test.go b/internal/scheduler/nodedb/nodematching_test.go index 7cd2553eb5f..6551708ddf5 100644 --- a/internal/scheduler/nodedb/nodematching_test.go +++ b/internal/scheduler/nodedb/nodematching_test.go @@ -267,21 +267,17 @@ func TestNodeSchedulingRequirementsMet(t *testing.T) { expectSuccess: false, }, "sufficient cpu": { - node: makeTestNodeResources( - t, - map[int32]internaltypes.ResourceList{ - 0: rlFactory.FromJobResourceListIgnoreUnknown( - map[string]resource.Quantity{ - "cpu": resource.MustParse("1"), - }, - ), - }, - rlFactory.FromJobResourceListIgnoreUnknown( + node: makeTestNodeResources(map[int32]internaltypes.ResourceList{ + 0: rlFactory.FromJobResourceListIgnoreUnknown( map[string]resource.Quantity{ "cpu": resource.MustParse("1"), }, ), - ), + }, rlFactory.FromJobResourceListIgnoreUnknown( + map[string]resource.Quantity{ + "cpu": resource.MustParse("1"), + }, + )), req: &internaltypes.PodRequirements{ ResourceRequirements: v1.ResourceRequirements{ Requests: v1.ResourceList{ @@ -293,20 +289,16 @@ func TestNodeSchedulingRequirementsMet(t *testing.T) { expectSuccess: true, }, "insufficient cpu": { - node: makeTestNodeResources( - t, - map[int32]internaltypes.ResourceList{ - 0: rlFactory.FromJobResourceListIgnoreUnknown( - map[string]resource.Quantity{ - "cpu": resource.MustParse("0"), - }, - ), - }, - rlFactory.FromJobResourceListIgnoreUnknown(map[string]resource.Quantity{ - "cpu": resource.MustParse("0"), - }, + node: makeTestNodeResources(map[int32]internaltypes.ResourceList{ + 0: rlFactory.FromJobResourceListIgnoreUnknown( + map[string]resource.Quantity{ + "cpu": resource.MustParse("0"), + }, ), - ), + }, rlFactory.FromJobResourceListIgnoreUnknown(map[string]resource.Quantity{ + "cpu": resource.MustParse("0"), + }, + )), req: &internaltypes.PodRequirements{ ResourceRequirements: v1.ResourceRequirements{ Requests: v1.ResourceList{ @@ -318,26 +310,22 @@ func TestNodeSchedulingRequirementsMet(t *testing.T) { expectSuccess: false, }, "sufficient cpu at priority": { - node: makeTestNodeResources( - t, - map[int32]internaltypes.ResourceList{ - 0: rlFactory.FromJobResourceListIgnoreUnknown( - map[string]resource.Quantity{ - "cpu": resource.MustParse("0"), - }, - ), - 1: rlFactory.FromJobResourceListIgnoreUnknown( - map[string]resource.Quantity{ - "cpu": resource.MustParse("1"), - }, - ), - }, - rlFactory.FromJobResourceListIgnoreUnknown( + node: makeTestNodeResources(map[int32]internaltypes.ResourceList{ + 0: rlFactory.FromJobResourceListIgnoreUnknown( + map[string]resource.Quantity{ + "cpu": resource.MustParse("0"), + }, + ), + 1: rlFactory.FromJobResourceListIgnoreUnknown( map[string]resource.Quantity{ "cpu": resource.MustParse("1"), }, ), - ), + }, rlFactory.FromJobResourceListIgnoreUnknown( + map[string]resource.Quantity{ + "cpu": resource.MustParse("1"), + }, + )), req: &internaltypes.PodRequirements{ ResourceRequirements: v1.ResourceRequirements{ Requests: v1.ResourceList{ @@ -349,26 +337,22 @@ func TestNodeSchedulingRequirementsMet(t *testing.T) { expectSuccess: true, }, "insufficient cpu at priority": { - node: makeTestNodeResources( - t, - map[int32]internaltypes.ResourceList{ - 0: rlFactory.FromJobResourceListIgnoreUnknown( - map[string]resource.Quantity{ - "cpu": resource.MustParse("0"), - }, - ), - 1: rlFactory.FromJobResourceListIgnoreUnknown( - map[string]resource.Quantity{ - "cpu": resource.MustParse("1"), - }, - ), - }, - rlFactory.FromJobResourceListIgnoreUnknown( + node: makeTestNodeResources(map[int32]internaltypes.ResourceList{ + 0: rlFactory.FromJobResourceListIgnoreUnknown( + map[string]resource.Quantity{ + "cpu": resource.MustParse("0"), + }, + ), + 1: rlFactory.FromJobResourceListIgnoreUnknown( map[string]resource.Quantity{ "cpu": resource.MustParse("1"), }, ), - ), + }, rlFactory.FromJobResourceListIgnoreUnknown( + map[string]resource.Quantity{ + "cpu": resource.MustParse("1"), + }, + )), req: &internaltypes.PodRequirements{ ResourceRequirements: v1.ResourceRequirements{ Requests: v1.ResourceList{ @@ -679,7 +663,7 @@ func makeTestNodeTaintsLabels(taints []v1.Taint, labels map[string]string) *inte ) } -func makeTestNodeResources(t *testing.T, allocatableByPriority map[int32]internaltypes.ResourceList, totalResources internaltypes.ResourceList) *internaltypes.Node { +func makeTestNodeResources(allocatableByPriority map[int32]internaltypes.ResourceList, totalResources internaltypes.ResourceList) *internaltypes.Node { return internaltypes.CreateNode( "id", internaltypes.NewNodeType([]v1.Taint{}, diff --git a/internal/scheduler/scheduling/constraints/constraints.go b/internal/scheduler/scheduling/constraints/constraints.go index 915a781e446..a236896f75d 100644 --- a/internal/scheduler/scheduling/constraints/constraints.go +++ b/internal/scheduler/scheduling/constraints/constraints.go @@ -26,9 +26,6 @@ const ( // Indicates that the limit on resources scheduled per round has been exceeded. MaximumResourcesScheduledUnschedulableReason = "maximum resources scheduled" - // Indicates that a queue has been assigned more than its allowed amount of resources. - MaximumResourcesPerQueueExceededUnschedulableReason = "maximum total resources for this queue exceeded" - // Indicates that the scheduling rate limit has been exceeded. GlobalRateLimitExceededUnschedulableReason = "global scheduling rate limit exceeded" QueueRateLimitExceededUnschedulableReason = "queue scheduling rate limit exceeded" diff --git a/internal/scheduler/scheduling/fairness/fairness_test.go b/internal/scheduler/scheduling/fairness/fairness_test.go index 5f21dc5abfe..102eeff2b70 100644 --- a/internal/scheduler/scheduling/fairness/fairness_test.go +++ b/internal/scheduler/scheduling/fairness/fairness_test.go @@ -14,19 +14,6 @@ import ( const poolName = "pool" -type MinimalQueue struct { - allocation internaltypes.ResourceList - weight float64 -} - -func (q MinimalQueue) GetAllocation() internaltypes.ResourceList { - return q.allocation -} - -func (q MinimalQueue) GetWeight() float64 { - return q.weight -} - func TestNewDominantResourceFairness(t *testing.T) { rlFactory := makeTestResourceListFactory() _, err := NewDominantResourceFairness( diff --git a/internal/scheduler/scheduling/gang_scheduler_test.go b/internal/scheduler/scheduling/gang_scheduler_test.go index dc158448ee8..2c753c99abc 100644 --- a/internal/scheduler/scheduling/gang_scheduler_test.go +++ b/internal/scheduler/scheduling/gang_scheduler_test.go @@ -456,10 +456,10 @@ func TestGangScheduler(t *testing.T) { jobId = util.ULID() gangs = append(gangs, []*jobdb.Job{ testfixtures. - TestJob("A", jobId, "armada-preemptible-away", testfixtures.Test1Cpu4GiPodReqs("A", jobId, 30000)), + TestJob("A", jobId, "armada-preemptible-away", testfixtures.Test1Cpu4GiPodReqs()), }) jobId = util.ULID() - gangs = append(gangs, []*jobdb.Job{testfixtures.TestJob("A", jobId, "armada-preemptible-away-both", testfixtures.Test1Cpu4GiPodReqs("A", jobId, 30000))}) + gangs = append(gangs, []*jobdb.Job{testfixtures.TestJob("A", jobId, "armada-preemptible-away-both", testfixtures.Test1Cpu4GiPodReqs())}) return }(), ExpectedScheduledIndices: []int{1}, @@ -502,9 +502,9 @@ func TestGangScheduler(t *testing.T) { ), Gangs: func() (gangs [][]*jobdb.Job) { jobId := util.ULID() - gangs = append(gangs, []*jobdb.Job{testfixtures.TestJob("A", jobId, "armada-preemptible-away", testfixtures.Test32Cpu256GiWithLargeJobTolerationPodReqs("A", jobId, 30000))}) + gangs = append(gangs, []*jobdb.Job{testfixtures.TestJob("A", jobId, "armada-preemptible-away", testfixtures.Test32Cpu256GiWithLargeJobTolerationPodReqs())}) jobId = util.ULID() - gangs = append(gangs, []*jobdb.Job{testfixtures.TestJob("A", jobId, "armada-preemptible-away", testfixtures.Test32Cpu256GiWithLargeJobTolerationPodReqs("A", jobId, 30000))}) + gangs = append(gangs, []*jobdb.Job{testfixtures.TestJob("A", jobId, "armada-preemptible-away", testfixtures.Test32Cpu256GiWithLargeJobTolerationPodReqs())}) return }(), ExpectedScheduledIndices: []int{0}, diff --git a/internal/scheduler/scheduling/preempting_queue_scheduler_test.go b/internal/scheduler/scheduling/preempting_queue_scheduler_test.go index ccc0c0da070..a271ab0c6ec 100644 --- a/internal/scheduler/scheduling/preempting_queue_scheduler_test.go +++ b/internal/scheduler/scheduling/preempting_queue_scheduler_test.go @@ -52,7 +52,7 @@ func TestEvictOversubscribed(t *testing.T) { stringInterner := stringinterner.New(1024) - nodeDb, err := NewNodeDb(config, stringInterner) + nodeDb, err := NewNodeDb(config) require.NoError(t, err) nodeDbTxn := nodeDb.Txn(true) err = nodeDb.CreateAndInsertWithJobDbJobsWithTxn( @@ -1632,7 +1632,7 @@ func TestPreemptingQueueScheduler(t *testing.T) { "A": func() (jobs []*jobdb.Job) { for i := 0; i < 96; i++ { jobId := util.ULID() - jobs = append(jobs, testfixtures.TestJob("A", jobId, "armada-preemptible-away", testfixtures.Test1Cpu4GiPodReqs("A", jobId, 30000))) + jobs = append(jobs, testfixtures.TestJob("A", jobId, "armada-preemptible-away", testfixtures.Test1Cpu4GiPodReqs())) } return }(), @@ -1645,7 +1645,7 @@ func TestPreemptingQueueScheduler(t *testing.T) { "B": func() (jobs []*jobdb.Job) { for i := 0; i < 12; i++ { jobId := util.ULID() - req := testfixtures.Test1GpuPodReqs("B", jobId, 30000) + req := testfixtures.Test1GpuPodReqs() req.Tolerations = append(req.Tolerations, v1.Toleration{Key: "gpu", Value: "true", Effect: v1.TaintEffectNoSchedule}) jobs = append(jobs, testfixtures.TestJob("B", jobId, "armada-preemptible", req)) } @@ -1689,7 +1689,7 @@ func TestPreemptingQueueScheduler(t *testing.T) { "B": func() (jobs []*jobdb.Job) { for i := 0; i < 12; i++ { jobId := util.ULID() - req := testfixtures.Test1GpuPodReqs("B", jobId, 30000) + req := testfixtures.Test1GpuPodReqs() req.Tolerations = append(req.Tolerations, v1.Toleration{Key: "gpu", Value: "true", Effect: v1.TaintEffectNoSchedule}) jobs = append(jobs, testfixtures.TestJob("B", jobId, "armada-preemptible", req)) } @@ -1704,7 +1704,7 @@ func TestPreemptingQueueScheduler(t *testing.T) { "A": func() (jobs []*jobdb.Job) { for i := 0; i < 96; i++ { jobId := util.ULID() - jobs = append(jobs, testfixtures.TestJob("A", jobId, "armada-preemptible-away", testfixtures.Test1Cpu4GiPodReqs("A", jobId, 30000))) + jobs = append(jobs, testfixtures.TestJob("A", jobId, "armada-preemptible-away", testfixtures.Test1Cpu4GiPodReqs())) } return }(), @@ -1756,7 +1756,7 @@ func TestPreemptingQueueScheduler(t *testing.T) { "A": func() (jobs []*jobdb.Job) { for i := 0; i < 96; i++ { jobId := util.ULID() - jobs = append(jobs, testfixtures.TestJob("A", jobId, "armada-preemptible-away", testfixtures.Test1Cpu4GiPodReqs("A", jobId, 30000))) + jobs = append(jobs, testfixtures.TestJob("A", jobId, "armada-preemptible-away", testfixtures.Test1Cpu4GiPodReqs())) } return }(), @@ -1769,7 +1769,7 @@ func TestPreemptingQueueScheduler(t *testing.T) { "B": func() (jobs []*jobdb.Job) { for i := 0; i < 12; i++ { jobId := util.ULID() - req := testfixtures.Test1GpuPodReqs("B", jobId, 30000) + req := testfixtures.Test1GpuPodReqs() req.Tolerations = append(req.Tolerations, v1.Toleration{Key: "gpu", Value: "true", Effect: v1.TaintEffectNoSchedule}) jobs = append(jobs, testfixtures.TestJob("B", jobId, "armada-preemptible", req)) } @@ -1817,7 +1817,7 @@ func TestPreemptingQueueScheduler(t *testing.T) { "B": func() (jobs []*jobdb.Job) { for i := 0; i < 12; i++ { jobId := util.ULID() - req := testfixtures.Test1GpuPodReqs("B", jobId, 30000) + req := testfixtures.Test1GpuPodReqs() req.Tolerations = append(req.Tolerations, v1.Toleration{Key: "gpu", Value: "true", Effect: v1.TaintEffectNoSchedule}) jobs = append(jobs, testfixtures.TestJob("B", jobId, "armada-preemptible", req)) } @@ -1832,7 +1832,7 @@ func TestPreemptingQueueScheduler(t *testing.T) { "A": func() (jobs []*jobdb.Job) { for i := 0; i < 96; i++ { jobId := util.ULID() - jobs = append(jobs, testfixtures.TestJob("A", jobId, "armada-preemptible-away", testfixtures.Test1Cpu4GiPodReqs("A", jobId, 30000))) + jobs = append(jobs, testfixtures.TestJob("A", jobId, "armada-preemptible-away", testfixtures.Test1Cpu4GiPodReqs())) } return }(), @@ -1887,7 +1887,7 @@ func TestPreemptingQueueScheduler(t *testing.T) { "A": func() (jobs []*jobdb.Job) { for i := 0; i < 16; i++ { jobId := util.ULID() - req := testfixtures.Test1Cpu4GiPodReqs("A", jobId, 30000) + req := testfixtures.Test1Cpu4GiPodReqs() jobs = append(jobs, testfixtures.TestJob("A", jobId, "armada-preemptible-away-lower", req)) } return @@ -1895,7 +1895,7 @@ func TestPreemptingQueueScheduler(t *testing.T) { "B": func() (jobs []*jobdb.Job) { for i := 0; i < 16; i++ { jobId := util.ULID() - req := testfixtures.Test1Cpu4GiPodReqs("B", jobId, 30000) + req := testfixtures.Test1Cpu4GiPodReqs() jobs = append(jobs, testfixtures.TestJob("B", jobId, "armada-preemptible-away", req)) } return @@ -1911,7 +1911,7 @@ func TestPreemptingQueueScheduler(t *testing.T) { "C": func() (jobs []*jobdb.Job) { for i := 0; i < 17; i++ { jobId := util.ULID() - req := testfixtures.Test1Cpu4GiPodReqs("C", jobId, 30000) + req := testfixtures.Test1Cpu4GiPodReqs() req.Tolerations = append(req.Tolerations, v1.Toleration{Key: "gpu", Value: "true", Effect: v1.TaintEffectNoSchedule}) jobs = append(jobs, testfixtures.TestJob("C", jobId, "armada-preemptible", req)) } @@ -1997,7 +1997,7 @@ func TestPreemptingQueueScheduler(t *testing.T) { } } - nodeDb, err := NewNodeDb(tc.SchedulingConfig, stringinterner.New(1024)) + nodeDb, err := NewNodeDb(tc.SchedulingConfig) require.NoError(t, err) nodeDbTxn := nodeDb.Txn(true) for _, node := range tc.Nodes { @@ -2391,7 +2391,7 @@ func BenchmarkPreemptingQueueScheduler(b *testing.B) { priorityFactorByQueue[queue] = float64(rand.Intn(tc.MaxPriorityFactor-tc.MinPriorityFactor+1) + tc.MinPriorityFactor) } - nodeDb, err := NewNodeDb(tc.SchedulingConfig, stringinterner.New(1024)) + nodeDb, err := NewNodeDb(tc.SchedulingConfig) require.NoError(b, err) txn := nodeDb.Txn(true) for _, node := range tc.Nodes { @@ -2488,7 +2488,7 @@ func BenchmarkPreemptingQueueScheduler(b *testing.B) { nodeId := result.NodeIdByJobId[job.Id()] jobsByNodeId[nodeId] = append(jobsByNodeId[nodeId], job) } - nodeDb, err = NewNodeDb(tc.SchedulingConfig, stringinterner.New(1024)) + nodeDb, err = NewNodeDb(tc.SchedulingConfig) require.NoError(b, err) txn = nodeDb.Txn(true) for _, node := range tc.Nodes { diff --git a/internal/scheduler/scheduling/queue_scheduler_test.go b/internal/scheduler/scheduling/queue_scheduler_test.go index bfefe847e75..7690a0b4331 100644 --- a/internal/scheduler/scheduling/queue_scheduler_test.go +++ b/internal/scheduler/scheduling/queue_scheduler_test.go @@ -14,7 +14,6 @@ import ( "github.com/armadaproject/armada/internal/common/armadacontext" armadaslices "github.com/armadaproject/armada/internal/common/slices" - "github.com/armadaproject/armada/internal/common/stringinterner" "github.com/armadaproject/armada/internal/scheduler/configuration" "github.com/armadaproject/armada/internal/scheduler/internaltypes" "github.com/armadaproject/armada/internal/scheduler/jobdb" @@ -484,7 +483,7 @@ func TestQueueScheduler(t *testing.T) { } for name, tc := range tests { t.Run(name, func(t *testing.T) { - nodeDb, err := NewNodeDb(tc.SchedulingConfig, stringinterner.New(1024)) + nodeDb, err := NewNodeDb(tc.SchedulingConfig) require.NoError(t, err) txn := nodeDb.Txn(true) for _, node := range tc.Nodes { @@ -689,7 +688,7 @@ func TestQueueScheduler(t *testing.T) { } } -func NewNodeDb(config configuration.SchedulingConfig, stringInterner *stringinterner.StringInterner) (*nodedb.NodeDb, error) { +func NewNodeDb(config configuration.SchedulingConfig) (*nodedb.NodeDb, error) { nodeDb, err := nodedb.NewNodeDb( config.PriorityClasses, config.IndexedResources, diff --git a/internal/scheduler/simulator/test_utils.go b/internal/scheduler/simulator/test_utils.go index f6372a3d8ab..e0e70ef6eca 100644 --- a/internal/scheduler/simulator/test_utils.go +++ b/internal/scheduler/simulator/test_utils.go @@ -2,7 +2,6 @@ package simulator import ( "fmt" - "math" "strings" "time" @@ -12,83 +11,10 @@ import ( "github.com/armadaproject/armada/internal/common/pointer" protoutil "github.com/armadaproject/armada/internal/common/proto" armadaslices "github.com/armadaproject/armada/internal/common/slices" - "github.com/armadaproject/armada/internal/common/types" - "github.com/armadaproject/armada/internal/scheduler/configuration" "github.com/armadaproject/armada/internal/scheduler/schedulerobjects" "github.com/armadaproject/armada/pkg/armadaevents" ) -func GetOneQueue10JobWorkload() *WorkloadSpec { - ws := &WorkloadSpec{ - Name: "Basic Workload", - Queues: []*Queue{ - WithJobTemplatesQueue( - &Queue{Name: "A", Weight: 1}, - JobTemplate1Cpu(10, "job-set", "armada-default"), - ), - }, - } - initialiseWorkloadSpec(ws) - return ws -} - -func GetBasicSchedulingConfig() configuration.SchedulingConfig { - return configuration.SchedulingConfig{ - PriorityClasses: map[string]types.PriorityClass{ - "armada-default": { - Priority: 30000, - Preemptible: false, - }, - "armada-preemptible": { - Priority: 30000, - Preemptible: true, - }, - }, - DefaultPriorityClassName: "armada-default", - MaximumResourceFractionToSchedule: map[string]float64{ - "memory": 0.025, - "cpu": 0.025, - }, - DominantResourceFairnessResourcesToConsider: []string{"cpu", "memory", "nvidia.com/gpu", "ephemeral-storage"}, - IndexedResources: []configuration.ResourceType{ - { - Name: "cpu", - Resolution: resource.MustParse("1"), - }, - { - Name: "memory", - Resolution: resource.MustParse("1Mi"), - }, - { - Name: "nvidia.com/gpu", - Resolution: resource.MustParse("1"), - }, - }, - SupportedResourceTypes: []configuration.ResourceType{ - { - Name: "memory", - Resolution: resource.MustParse("1"), - }, - { - Name: "cpu", - Resolution: resource.MustParse("1m"), - }, - { - Name: "ephemeral-storage", - Resolution: resource.MustParse("1"), - }, - { - Name: "nvidia.com/gpu", - Resolution: resource.MustParse("1"), - }, - }, - MaximumSchedulingRate: math.Inf(1), - MaximumSchedulingBurst: math.MaxInt, - MaximumPerQueueSchedulingRate: math.Inf(1), - MaximumPerQueueSchedulingBurst: math.MaxInt, - } -} - func NodeTemplate32Cpu(n int64) *NodeTemplate { return &NodeTemplate{ Number: n, diff --git a/internal/scheduler/testfixtures/testfixtures.go b/internal/scheduler/testfixtures/testfixtures.go index fb4be1c979d..00d1778af33 100644 --- a/internal/scheduler/testfixtures/testfixtures.go +++ b/internal/scheduler/testfixtures/testfixtures.go @@ -39,7 +39,6 @@ const ( TestQueue2 = "testQueue2" TestPool = "testPool" TestPool2 = "testPool2" - TestCancelUser = "canceluser" AwayPool = "awayPool" TestHostnameLabel = "kubernetes.io/hostname" ClusterNameLabel = "cluster" @@ -574,14 +573,6 @@ func N1GpuJobs(queue string, priorityClassName string, n int) []*jobdb.Job { return rv } -func extractPriority(priorityClassName string) int32 { - priorityClass, ok := TestPriorityClasses[priorityClassName] - if !ok { - panic(fmt.Sprintf("no priority class with name %s", priorityClassName)) - } - return priorityClass.Priority -} - func TestJob(queue string, jobId ulid.ULID, priorityClassName string, req *internaltypes.PodRequirements) *jobdb.Job { created := jobTimestamp.Add(1) submitTime := time.Time{}.Add(time.Millisecond * time.Duration(created)) @@ -617,38 +608,38 @@ func TestJobWithResources(queue string, priorityClassName string, resources v1.R func Test1Cpu4GiJob(queue string, priorityClassName string) *jobdb.Job { jobId := util.ULID() - return TestJob(queue, jobId, priorityClassName, Test1Cpu4GiPodReqs(queue, jobId, extractPriority(priorityClassName))) + return TestJob(queue, jobId, priorityClassName, Test1Cpu4GiPodReqs()) } func Test1Cpu16GiJob(queue string, priorityClassName string) *jobdb.Job { jobId := util.ULID() - return TestJob(queue, jobId, priorityClassName, Test1Cpu16GiPodReqs(queue, jobId, extractPriority(priorityClassName))) + return TestJob(queue, jobId, priorityClassName, Test1Cpu16GiPodReqs()) } func Test16Cpu128GiJob(queue string, priorityClassName string) *jobdb.Job { jobId := util.ULID() - return TestJob(queue, jobId, priorityClassName, Test16Cpu128GiPodReqs(queue, jobId, extractPriority(priorityClassName))) + return TestJob(queue, jobId, priorityClassName, Test16Cpu128GiPodReqs()) } func Test32Cpu256GiJob(queue string, priorityClassName string) *jobdb.Job { jobId := util.ULID() - return TestJob(queue, jobId, priorityClassName, Test32Cpu256GiPodReqs(queue, jobId, extractPriority(priorityClassName))) + return TestJob(queue, jobId, priorityClassName, Test32Cpu256GiPodReqs()) } func Test32Cpu256GiJobWithLargeJobToleration(queue string, priorityClassName string) *jobdb.Job { jobId := util.ULID() - return TestJob(queue, jobId, priorityClassName, Test32Cpu256GiWithLargeJobTolerationPodReqs(queue, jobId, extractPriority(priorityClassName))) + return TestJob(queue, jobId, priorityClassName, Test32Cpu256GiWithLargeJobTolerationPodReqs()) } func Test1GpuJob(queue string, priorityClassName string) *jobdb.Job { jobId := util.ULID() - return TestJob(queue, jobId, priorityClassName, Test1GpuPodReqs(queue, jobId, extractPriority(priorityClassName))) + return TestJob(queue, jobId, priorityClassName, Test1GpuPodReqs()) } func N1CpuPodReqs(queue string, priority int32, n int) []*internaltypes.PodRequirements { rv := make([]*internaltypes.PodRequirements, n) for i := 0; i < n; i++ { - rv[i] = Test1Cpu4GiPodReqs(queue, util.ULID(), priority) + rv[i] = Test1Cpu4GiPodReqs() } return rv } @@ -661,21 +652,21 @@ func TestPodReqs(requests v1.ResourceList) *internaltypes.PodRequirements { } } -func Test1Cpu4GiPodReqs(queue string, jobId ulid.ULID, priority int32) *internaltypes.PodRequirements { +func Test1Cpu4GiPodReqs() *internaltypes.PodRequirements { return TestPodReqs(v1.ResourceList{ "cpu": resource.MustParse("1"), "memory": resource.MustParse("4Gi"), }) } -func Test1Cpu16GiPodReqs(queue string, jobId ulid.ULID, priority int32) *internaltypes.PodRequirements { +func Test1Cpu16GiPodReqs() *internaltypes.PodRequirements { return TestPodReqs(v1.ResourceList{ "cpu": resource.MustParse("1"), "memory": resource.MustParse("16Gi"), }) } -func Test16Cpu128GiPodReqs(queue string, jobId ulid.ULID, priority int32) *internaltypes.PodRequirements { +func Test16Cpu128GiPodReqs() *internaltypes.PodRequirements { req := TestPodReqs(v1.ResourceList{ "cpu": resource.MustParse("16"), "memory": resource.MustParse("128Gi"), @@ -689,7 +680,7 @@ func Test16Cpu128GiPodReqs(queue string, jobId ulid.ULID, priority int32) *inter return req } -func Test32Cpu256GiPodReqs(queue string, jobId ulid.ULID, priority int32) *internaltypes.PodRequirements { +func Test32Cpu256GiPodReqs() *internaltypes.PodRequirements { req := TestPodReqs(v1.ResourceList{ "cpu": resource.MustParse("32"), "memory": resource.MustParse("256Gi"), @@ -697,7 +688,7 @@ func Test32Cpu256GiPodReqs(queue string, jobId ulid.ULID, priority int32) *inter return req } -func Test32Cpu256GiWithLargeJobTolerationPodReqs(queue string, jobId ulid.ULID, priority int32) *internaltypes.PodRequirements { +func Test32Cpu256GiWithLargeJobTolerationPodReqs() *internaltypes.PodRequirements { req := TestPodReqs(v1.ResourceList{ "cpu": resource.MustParse("32"), "memory": resource.MustParse("256Gi"), @@ -711,7 +702,7 @@ func Test32Cpu256GiWithLargeJobTolerationPodReqs(queue string, jobId ulid.ULID, return req } -func Test1GpuPodReqs(queue string, jobId ulid.ULID, priority int32) *internaltypes.PodRequirements { +func Test1GpuPodReqs() *internaltypes.PodRequirements { req := TestPodReqs(v1.ResourceList{ "cpu": resource.MustParse("8"), "memory": resource.MustParse("128Gi"), @@ -811,21 +802,10 @@ func TestSimpleNode(id string) *internaltypes.Node { func TestNode(priorities []int32, resources map[string]*resource.Quantity) *internaltypes.Node { rl := TestNodeFactory.ResourceListFactory().FromNodeProto(resources) id := uuid.NewString() - return TestNodeFactory.CreateNodeAndType(id, - "executor1", - id, - TestPool, - "type", - false, - []v1.Taint{}, - map[string]string{ - TestHostnameLabel: id, - schedulerconfiguration.NodeIdLabel: id, - }, - rl, - rl, - map[int32]internaltypes.ResourceList{}, - internaltypes.NewAllocatableByPriorityAndResourceType(priorities, rl)) + return TestNodeFactory.CreateNodeAndType(id, "executor1", id, TestPool, "type", false, []v1.Taint{}, map[string]string{ + TestHostnameLabel: id, + schedulerconfiguration.NodeIdLabel: id, + }, rl, rl, internaltypes.NewAllocatableByPriorityAndResourceType(priorities, rl)) } func Test16CpuNode(priorities []int32) *internaltypes.Node {