From 3c558266a64d117ae19825f376eb29b1d901a555 Mon Sep 17 00:00:00 2001 From: James Rasell Date: Tue, 2 Nov 2021 12:34:11 +0100 Subject: [PATCH] rpc: set the job scale eval priority to the job priority. Previously the eval priority was set to the default priority rather than the priority configured within the target job. This change fixes this bug, ensuring any eval created as a result of scaling uses the job priority. --- nomad/job_endpoint.go | 2 +- nomad/job_endpoint_test.go | 51 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/nomad/job_endpoint.go b/nomad/job_endpoint.go index 531bc362b879..7072f2047859 100644 --- a/nomad/job_endpoint.go +++ b/nomad/job_endpoint.go @@ -1129,7 +1129,7 @@ func (j *Job) Scale(args *structs.JobScaleRequest, reply *structs.JobRegisterRes eval := &structs.Evaluation{ ID: uuid.Generate(), Namespace: namespace, - Priority: structs.JobDefaultPriority, + Priority: job.Priority, // Safe as nil check performed above. Type: structs.JobTypeService, TriggeredBy: structs.EvalTriggerScaling, JobID: args.JobID, diff --git a/nomad/job_endpoint_test.go b/nomad/job_endpoint_test.go index 235882fe5372..b6ab647abe37 100644 --- a/nomad/job_endpoint_test.go +++ b/nomad/job_endpoint_test.go @@ -6985,6 +6985,57 @@ func TestJobEndpoint_Scale_NoEval(t *testing.T) { require.Equal(int64(originalCount), events[groupName][0].PreviousCount) } +func TestJobEndpoint_Scale_Priority(t *testing.T) { + t.Parallel() + requireAssertion := require.New(t) + + s1, cleanupS1 := TestServer(t, nil) + defer cleanupS1() + codec := rpcClient(t, s1) + testutil.WaitForLeader(t, s1.RPC) + fsmState := s1.fsm.State() + + // Create a job and alter the priority. + job := mock.Job() + job.Priority = 90 + originalCount := job.TaskGroups[0].Count + err := fsmState.UpsertJob(structs.MsgTypeTestSetup, 1000, job) + requireAssertion.Nil(err) + + groupName := job.TaskGroups[0].Name + scale := &structs.JobScaleRequest{ + JobID: job.ID, + Target: map[string]string{ + structs.ScalingTargetGroup: groupName, + }, + Count: helper.Int64ToPtr(int64(originalCount + 1)), + Message: "scotty, we need more power", + PolicyOverride: false, + WriteRequest: structs.WriteRequest{ + Region: "global", + Namespace: job.Namespace, + }, + } + var resp structs.JobRegisterResponse + err = msgpackrpc.CallWithCodec(codec, "Job.Scale", scale, &resp) + requireAssertion.NoError(err) + requireAssertion.NotEmpty(resp.EvalID) + requireAssertion.Greater(resp.EvalCreateIndex, resp.JobModifyIndex) + + // Check the evaluation priority matches the job priority. + eval, err := fsmState.EvalByID(nil, resp.EvalID) + requireAssertion.Nil(err) + requireAssertion.NotNil(eval) + requireAssertion.EqualValues(resp.EvalCreateIndex, eval.CreateIndex) + requireAssertion.Equal(job.Priority, eval.Priority) + requireAssertion.Equal(job.Type, eval.Type) + requireAssertion.Equal(structs.EvalTriggerScaling, eval.TriggeredBy) + requireAssertion.Equal(job.ID, eval.JobID) + requireAssertion.Equal(structs.EvalStatusPending, eval.Status) + requireAssertion.NotZero(eval.CreateTime) + requireAssertion.NotZero(eval.ModifyTime) +} + func TestJobEndpoint_InvalidCount(t *testing.T) { t.Parallel() require := require.New(t)