diff --git a/api/jobs.go b/api/jobs.go index 75a9cfa60..59dc0ea9a 100644 --- a/api/jobs.go +++ b/api/jobs.go @@ -1227,7 +1227,7 @@ func (j *Job) Canonicalize() { } if j.Update != nil { j.Update.Canonicalize() - } else if *j.Type == JobTypeService { + } else if *j.Type == JobTypeService || *j.Type == JobTypeSystem { j.Update = DefaultUpdateStrategy() } if j.Multiregion != nil { diff --git a/api/jobs_test.go b/api/jobs_test.go index 07baf6ecc..ef2e4620c 100644 --- a/api/jobs_test.go +++ b/api/jobs_test.go @@ -999,6 +999,70 @@ func TestJobs_Canonicalize(t *testing.T) { }, }, }, + { + name: "missing update for system job", + input: &Job{ + Name: pointerOf("foo"), + ID: pointerOf("bar"), + ParentID: pointerOf("lol"), + Type: pointerOf(JobTypeSystem), + TaskGroups: []*TaskGroup{ + { + Name: pointerOf("bar"), + Tasks: []*Task{ + { + Name: "task1", + }, + }, + }, + }, + }, + expected: &Job{ + Namespace: pointerOf(DefaultNamespace), + ID: pointerOf("bar"), + ParentID: pointerOf("lol"), + Name: pointerOf("foo"), + Region: pointerOf("global"), + Type: pointerOf(JobTypeSystem), + Priority: pointerOf(JobDefaultPriority), + NodePool: pointerOf(""), + AllAtOnce: pointerOf(false), + ConsulNamespace: pointerOf(""), + VaultNamespace: pointerOf(""), + NomadTokenID: pointerOf(""), + Stop: pointerOf(false), + Stable: pointerOf(false), + Version: pointerOf(uint64(0)), + Status: pointerOf(""), + StatusDescription: pointerOf(""), + CreateIndex: pointerOf(uint64(0)), + ModifyIndex: pointerOf(uint64(0)), + JobModifyIndex: pointerOf(uint64(0)), + Update: DefaultUpdateStrategy(), + TaskGroups: []*TaskGroup{ + { + Name: pointerOf("bar"), + Count: pointerOf(1), + RestartPolicy: defaultServiceJobRestartPolicy(), + EphemeralDisk: &EphemeralDisk{ + Sticky: pointerOf(false), + Migrate: pointerOf(false), + SizeMB: pointerOf(300), + }, + Update: DefaultUpdateStrategy(), + Tasks: []*Task{ + { + Name: "task1", + LogConfig: DefaultLogConfig(), + Resources: DefaultResources(), + KillTimeout: pointerOf(5 * time.Second), + RestartPolicy: defaultServiceJobRestartPolicy(), + }, + }, + }, + }, + }, + }, { name: "restart_merge", input: &Job{ diff --git a/command/agent/job_endpoint_test.go b/command/agent/job_endpoint_test.go index 0daf128af..8baa1a88d 100644 --- a/command/agent/job_endpoint_test.go +++ b/command/agent/job_endpoint_test.go @@ -3582,7 +3582,7 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) { structsJob := ApiJobToStructJob(apiJob) - require.Equal(t, expected, structsJob) + must.Eq(t, expected, structsJob) systemAPIJob := &api.Job{ Stop: pointer.Of(true), @@ -3725,6 +3725,10 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) { Operand: "c", }, }, + Update: structs.UpdateStrategy{ + Stagger: 30 * time.Second, + MaxParallel: 1, + }, TaskGroups: []*structs.TaskGroup{ { Name: "group1", @@ -3743,6 +3747,17 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) { Mode: "delay", RenderTemplates: false, }, + Update: &structs.UpdateStrategy{ + Stagger: 30 * time.Second, + MaxParallel: 1, + HealthCheck: structs.UpdateStrategyHealthCheck_Checks, + MinHealthyTime: 10 * time.Second, + HealthyDeadline: 5 * time.Minute, + ProgressDeadline: 10 * time.Minute, + AutoRevert: false, + AutoPromote: false, + Canary: 0, + }, EphemeralDisk: &structs.EphemeralDisk{ SizeMB: 100, Sticky: true, @@ -3832,7 +3847,7 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) { } systemStructsJob := ApiJobToStructJob(systemAPIJob) - require.Equal(t, expectedSystemJob, systemStructsJob) + must.Eq(t, expectedSystemJob, systemStructsJob) } func TestJobs_ApiJobToStructsJobUpdate(t *testing.T) {