diff --git a/.changelog/17092.txt b/.changelog/17092.txt new file mode 100644 index 000000000..0f4c4a770 --- /dev/null +++ b/.changelog/17092.txt @@ -0,0 +1,3 @@ +```release-note:bug +scale: Fixed a bug where evals could be created with the wrong type +``` diff --git a/nomad/job_endpoint.go b/nomad/job_endpoint.go index 664703941..031a9df74 100644 --- a/nomad/job_endpoint.go +++ b/nomad/job_endpoint.go @@ -1152,7 +1152,7 @@ func (j *Job) Scale(args *structs.JobScaleRequest, reply *structs.JobRegisterRes ID: uuid.Generate(), Namespace: namespace, Priority: job.Priority, // Safe as nil check performed above. - Type: structs.JobTypeService, + Type: job.Type, TriggeredBy: structs.EvalTriggerScaling, JobID: args.JobID, JobModifyIndex: reply.JobModifyIndex, diff --git a/nomad/job_endpoint_test.go b/nomad/job_endpoint_test.go index 7ac5896e8..e16b5f5e1 100644 --- a/nomad/job_endpoint_test.go +++ b/nomad/job_endpoint_test.go @@ -7868,6 +7868,44 @@ func TestJobEndpoint_Scale_SystemJob(t *testing.T) { `400,cannot scale jobs of type "system"`) } +func TestJobEndpoint_Scale_BatchJob(t *testing.T) { + ci.Parallel(t) + + testServer, testServerCleanup := TestServer(t, nil) + defer testServerCleanup() + codec := rpcClient(t, testServer) + testutil.WaitForLeader(t, testServer.RPC) + state := testServer.fsm.State() + + mockBatchJob := mock.BatchJob() + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 10, nil, mockBatchJob)) + + scaleReq := &structs.JobScaleRequest{ + JobID: mockBatchJob.ID, + Target: map[string]string{ + structs.ScalingTargetGroup: mockBatchJob.TaskGroups[0].Name, + }, + Count: pointer.Of(int64(13)), + WriteRequest: structs.WriteRequest{ + Region: DefaultRegion, + Namespace: mockBatchJob.Namespace, + }, + } + var resp structs.JobRegisterResponse + must.NoError(t, msgpackrpc.CallWithCodec(codec, "Job.Scale", scaleReq, &resp)) + + // Pull the generated evaluation from state and ensure the detailed type + // matches the jobspec. + testFMSSnapshot, err := testServer.fsm.State().Snapshot() + must.NoError(t, err) + + scaleEval, err := testFMSSnapshot.EvalByID(nil, resp.EvalID) + must.NoError(t, err) + must.Eq(t, resp.EvalID, scaleEval.ID) + must.Eq(t, mockBatchJob.ID, scaleEval.JobID) + must.Eq(t, mockBatchJob.Type, scaleEval.Type) +} + func TestJobEndpoint_InvalidCount(t *testing.T) { ci.Parallel(t) require := require.New(t)