scale: fixed a bug where evals could be created with wrong type. (#17092)

The job scale RPC endpoint hard-coded the eval creation to use the
type of service. This meant scaling events triggered on jobs of
type batch would create evaluations with the wrong type, which
does not seem to cause any problems, just confusion when
correlating the two.
This commit is contained in:
James Rasell 2023-05-05 15:46:10 +02:00 committed by GitHub
parent 17bd930ca9
commit 6ec4a69f47
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 1 deletions

3
.changelog/17092.txt Normal file
View File

@ -0,0 +1,3 @@
```release-note:bug
scale: Fixed a bug where evals could be created with the wrong type
```

View File

@ -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,

View File

@ -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)