Skip to content

Commit

Permalink
scale: do not allow scaling of jobs with type system. (#16969)
Browse files Browse the repository at this point in the history
  • Loading branch information
jrasell authored Apr 25, 2023
1 parent a7c8f1f commit f12c957
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .changelog/16969.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
scale: Do not allow scale requests for jobs of type system
```
6 changes: 6 additions & 0 deletions nomad/job_endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -1054,9 +1054,15 @@ func (j *Job) Scale(args *structs.JobScaleRequest, reply *structs.JobRegisterRes
return err
}

// Perform validation on the job to ensure we have something that can
// actually be scaled. This logic can only exist here, as we need access
// to the job object.
if job == nil {
return structs.NewErrRPCCoded(404, fmt.Sprintf("job %q not found", args.JobID))
}
if job.Type == structs.JobTypeSystem {
return structs.NewErrRPCCoded(http.StatusBadRequest, `cannot scale jobs of type "system"`)
}

// Since job is going to be mutated we must copy it since state store methods
// return a shared pointer.
Expand Down
28 changes: 28 additions & 0 deletions nomad/job_endpoint_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7840,6 +7840,34 @@ func TestJobEndpoint_Scale_Priority(t *testing.T) {
requireAssertion.NotZero(eval.ModifyTime)
}

func TestJobEndpoint_Scale_SystemJob(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()

mockSystemJob := mock.SystemJob()
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 10, nil, mockSystemJob))

scaleReq := &structs.JobScaleRequest{
JobID: mockSystemJob.ID,
Target: map[string]string{
structs.ScalingTargetGroup: mockSystemJob.TaskGroups[0].Name,
},
Count: pointer.Of(int64(13)),
WriteRequest: structs.WriteRequest{
Region: DefaultRegion,
Namespace: mockSystemJob.Namespace,
},
}
var resp structs.JobRegisterResponse
must.ErrorContains(t, msgpackrpc.CallWithCodec(codec, "Job.Scale", scaleReq, &resp),
`400,cannot scale jobs of type "system"`)
}

func TestJobEndpoint_InvalidCount(t *testing.T) {
ci.Parallel(t)
require := require.New(t)
Expand Down

0 comments on commit f12c957

Please sign in to comment.