From 24f5ec3e090451b3ed5950d05cb875dfcd63e8d5 Mon Sep 17 00:00:00 2001 From: Michael Schurter Date: Fri, 24 Feb 2017 10:31:05 -0800 Subject: [PATCH 1/3] Template.Canonicalize wasn't initializing all fields --- api/tasks.go | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/api/tasks.go b/api/tasks.go index 35712fa40..337dc4938 100644 --- a/api/tasks.go +++ b/api/tasks.go @@ -322,15 +322,18 @@ type Template struct { } func (tmpl *Template) Canonicalize() { + if tmpl.SourcePath == nil { + tmpl.SourcePath = helper.StringToPtr("") + } + if tmpl.DestPath == nil { + tmpl.DestPath = helper.StringToPtr("") + } + if tmpl.EmbeddedTmpl == nil { + tmpl.EmbeddedTmpl = helper.StringToPtr("") + } if tmpl.ChangeMode == nil { tmpl.ChangeMode = helper.StringToPtr("restart") } - if tmpl.Splay == nil { - tmpl.Splay = helper.TimeToPtr(5 * time.Second) - } - if tmpl.Perms == nil { - tmpl.Perms = helper.StringToPtr("0644") - } if *tmpl.ChangeMode == "signal" && tmpl.ChangeSignal == nil { tmpl.ChangeSignal = helper.StringToPtr("SIGHUP") } @@ -338,6 +341,12 @@ func (tmpl *Template) Canonicalize() { sig := *tmpl.ChangeSignal tmpl.ChangeSignal = helper.StringToPtr(strings.ToUpper(sig)) } + if tmpl.Splay == nil { + tmpl.Splay = helper.TimeToPtr(5 * time.Second) + } + if tmpl.Perms == nil { + tmpl.Perms = helper.StringToPtr("0644") + } if tmpl.LeftDelim == nil { tmpl.LeftDelim = helper.StringToPtr("{{") } From d1794c171453919a157a19c9adb1784b8318138a Mon Sep 17 00:00:00 2001 From: Michael Schurter Date: Fri, 24 Feb 2017 10:47:50 -0800 Subject: [PATCH 2/3] Missed initializing another field in Template! --- api/tasks.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/api/tasks.go b/api/tasks.go index 337dc4938..90e3b1e18 100644 --- a/api/tasks.go +++ b/api/tasks.go @@ -334,10 +334,13 @@ func (tmpl *Template) Canonicalize() { if tmpl.ChangeMode == nil { tmpl.ChangeMode = helper.StringToPtr("restart") } - if *tmpl.ChangeMode == "signal" && tmpl.ChangeSignal == nil { - tmpl.ChangeSignal = helper.StringToPtr("SIGHUP") - } - if tmpl.ChangeSignal != nil { + if tmpl.ChangeSignal == nil { + if *tmpl.ChangeMode == "signal" { + tmpl.ChangeSignal = helper.StringToPtr("SIGHUP") + } else { + tmpl.ChangeSignal = helper.StringToPtr("") + } + } else { sig := *tmpl.ChangeSignal tmpl.ChangeSignal = helper.StringToPtr(strings.ToUpper(sig)) } From fe4537e1f3a325db763bb6453aa1c302a82030b4 Mon Sep 17 00:00:00 2001 From: Michael Schurter Date: Fri, 24 Feb 2017 12:08:31 -0800 Subject: [PATCH 3/3] Add Canonicalize test mimicing example job + template --- api/jobs_test.go | 170 +++++++++++++++++++++++++++++++++++++++++++++++ api/tasks.go | 36 +++++----- 2 files changed, 188 insertions(+), 18 deletions(-) diff --git a/api/jobs_test.go b/api/jobs_test.go index f1e24b7eb..97a3d29cb 100644 --- a/api/jobs_test.go +++ b/api/jobs_test.go @@ -194,6 +194,176 @@ func TestJobs_Canonicalize(t *testing.T) { }, }, }, + { + name: "example_template", + input: &Job{ + ID: helper.StringToPtr("example_template"), + Name: helper.StringToPtr("example_template"), + Datacenters: []string{"dc1"}, + Type: helper.StringToPtr("service"), + Update: &UpdateStrategy{ + Stagger: 10 * time.Second, + MaxParallel: 1, + }, + TaskGroups: []*TaskGroup{ + { + Name: helper.StringToPtr("cache"), + Count: helper.IntToPtr(1), + RestartPolicy: &RestartPolicy{ + Interval: helper.TimeToPtr(5 * time.Minute), + Attempts: helper.IntToPtr(10), + Delay: helper.TimeToPtr(25 * time.Second), + Mode: helper.StringToPtr("delay"), + }, + EphemeralDisk: &EphemeralDisk{ + SizeMB: helper.IntToPtr(300), + }, + Tasks: []*Task{ + { + Name: "redis", + Driver: "docker", + Config: map[string]interface{}{ + "image": "redis:3.2", + "port_map": map[string]int{ + "db": 6379, + }, + }, + Resources: &Resources{ + CPU: helper.IntToPtr(500), + MemoryMB: helper.IntToPtr(256), + Networks: []*NetworkResource{ + { + MBits: helper.IntToPtr(10), + DynamicPorts: []Port{ + { + Label: "db", + }, + }, + }, + }, + }, + Services: []Service{ + { + Name: "global-redis-check", + Tags: []string{"global", "cache"}, + PortLabel: "db", + Checks: []ServiceCheck{ + { + Name: "alive", + Type: "tcp", + Interval: 10 * time.Second, + Timeout: 2 * time.Second, + }, + }, + }, + }, + Templates: []*Template{ + { + EmbeddedTmpl: helper.StringToPtr("---"), + DestPath: helper.StringToPtr("local/file.yml"), + }, + }, + }, + }, + }, + }, + }, + expected: &Job{ + ID: helper.StringToPtr("example_template"), + Name: helper.StringToPtr("example_template"), + ParentID: helper.StringToPtr(""), + Priority: helper.IntToPtr(50), + Region: helper.StringToPtr("global"), + Type: helper.StringToPtr("service"), + AllAtOnce: helper.BoolToPtr(false), + VaultToken: helper.StringToPtr(""), + Status: helper.StringToPtr(""), + StatusDescription: helper.StringToPtr(""), + CreateIndex: helper.Uint64ToPtr(0), + ModifyIndex: helper.Uint64ToPtr(0), + JobModifyIndex: helper.Uint64ToPtr(0), + Datacenters: []string{"dc1"}, + Update: &UpdateStrategy{ + Stagger: 10 * time.Second, + MaxParallel: 1, + }, + TaskGroups: []*TaskGroup{ + { + Name: helper.StringToPtr("cache"), + Count: helper.IntToPtr(1), + RestartPolicy: &RestartPolicy{ + Interval: helper.TimeToPtr(5 * time.Minute), + Attempts: helper.IntToPtr(10), + Delay: helper.TimeToPtr(25 * time.Second), + Mode: helper.StringToPtr("delay"), + }, + EphemeralDisk: &EphemeralDisk{ + Sticky: helper.BoolToPtr(false), + Migrate: helper.BoolToPtr(false), + SizeMB: helper.IntToPtr(300), + }, + Tasks: []*Task{ + { + Name: "redis", + Driver: "docker", + Config: map[string]interface{}{ + "image": "redis:3.2", + "port_map": map[string]int{ + "db": 6379, + }, + }, + Resources: &Resources{ + CPU: helper.IntToPtr(500), + MemoryMB: helper.IntToPtr(256), + IOPS: helper.IntToPtr(0), + Networks: []*NetworkResource{ + { + MBits: helper.IntToPtr(10), + DynamicPorts: []Port{ + { + Label: "db", + }, + }, + }, + }, + }, + Services: []Service{ + { + Name: "global-redis-check", + Tags: []string{"global", "cache"}, + PortLabel: "db", + Checks: []ServiceCheck{ + { + Name: "alive", + Type: "tcp", + Interval: 10 * time.Second, + Timeout: 2 * time.Second, + }, + }, + }, + }, + KillTimeout: helper.TimeToPtr(5 * time.Second), + LogConfig: DefaultLogConfig(), + Templates: []*Template{ + { + SourcePath: helper.StringToPtr(""), + DestPath: helper.StringToPtr("local/file.yml"), + EmbeddedTmpl: helper.StringToPtr("---"), + ChangeMode: helper.StringToPtr("restart"), + ChangeSignal: helper.StringToPtr(""), + Splay: helper.TimeToPtr(5 * time.Second), + Perms: helper.StringToPtr("0644"), + LeftDelim: helper.StringToPtr("{{"), + RightDelim: helper.StringToPtr("}}"), + }, + }, + }, + }, + }, + }, + }, + }, + { name: "periodic", input: &Job{ diff --git a/api/tasks.go b/api/tasks.go index 90e3b1e18..e1d3842b2 100644 --- a/api/tasks.go +++ b/api/tasks.go @@ -268,32 +268,32 @@ type Task struct { } func (t *Task) Canonicalize(tg *TaskGroup, job *Job) { - if t.LogConfig == nil { - t.LogConfig = DefaultLogConfig() - } else { - t.LogConfig.Canonicalize() - } - if t.Vault != nil { - t.Vault.Canonicalize() - } - for _, artifact := range t.Artifacts { - artifact.Canonicalize() - } - for _, tmpl := range t.Templates { - tmpl.Canonicalize() - } for _, s := range t.Services { s.Canonicalize(t, tg, job) } - if t.KillTimeout == nil { - t.KillTimeout = helper.TimeToPtr(5 * time.Second) - } - min := MinResources() min.Merge(t.Resources) min.Canonicalize() t.Resources = min + + if t.KillTimeout == nil { + t.KillTimeout = helper.TimeToPtr(5 * time.Second) + } + if t.LogConfig == nil { + t.LogConfig = DefaultLogConfig() + } else { + t.LogConfig.Canonicalize() + } + for _, artifact := range t.Artifacts { + artifact.Canonicalize() + } + if t.Vault != nil { + t.Vault.Canonicalize() + } + for _, tmpl := range t.Templates { + tmpl.Canonicalize() + } } // TaskArtifact is used to download artifacts before running a task.