Make suggested interval round to seconds, and more end to end test cases

This commit is contained in:
Preetha Appan 2018-03-19 10:40:36 -05:00
parent 6df57c177c
commit 33a5a72323
No known key found for this signature in database
GPG Key ID: 9F7C19990A50EAFC
5 changed files with 83 additions and 7 deletions

View File

@ -0,0 +1,21 @@
job "test" {
datacenters = ["dc1"]
type = "service"
group "t" {
count = 3
task "t" {
driver = "raw_exec"
config {
command = "bash"
args = ["-c", "lol 5000"]
}
}
restart {
attempts = 0
delay = "0s"
mode = "fail"
}
}
}

View File

@ -0,0 +1,20 @@
job "test" {
datacenters = ["dc1"]
type = "system"
group "t" {
count = 1
task "t" {
driver = "raw_exec"
config {
command = "bash"
args = ["-c", "lol 5000"]
}
}
restart {
attempts = 0
delay = "0s"
mode = "fail"
}
}
}

View File

@ -9,6 +9,7 @@ import (
) )
var integration = flag.Bool("integration", false, "run integration tests") var integration = flag.Bool("integration", false, "run integration tests")
var slow = flag.Bool("slow", false, "runs slower integration tests")
func TestServerSideRestarts(t *testing.T) { func TestServerSideRestarts(t *testing.T) {
if !*integration { if !*integration {

View File

@ -2,12 +2,16 @@ package rescheduling
import ( import (
"time" "time"
"sort"
"github.com/hashicorp/nomad/api" "github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/jobspec" "github.com/hashicorp/nomad/jobspec"
_ "github.com/hashicorp/nomad/jobspec" _ "github.com/hashicorp/nomad/jobspec"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/helper"
) )
var _ = Describe("Server Side Restart Tests", func() { var _ = Describe("Server Side Restart Tests", func() {
@ -28,6 +32,7 @@ var _ = Describe("Server Side Restart Tests", func() {
for _, a := range allocs { for _, a := range allocs {
ret = append(ret, a.ClientStatus) ret = append(ret, a.ClientStatus)
} }
sort.Strings(ret)
return ret return ret
} }
@ -59,7 +64,7 @@ var _ = Describe("Server Side Restart Tests", func() {
JustBeforeEach(func() { JustBeforeEach(func() {
job, err = jobspec.ParseFile(specFile) job, err = jobspec.ParseFile(specFile)
Expect(err).ShouldNot(HaveOccurred()) Expect(err).ShouldNot(HaveOccurred())
job.ID = helper.StringToPtr(uuid.Generate())
resp, _, err := jobs.Register(job, nil) resp, _, err := jobs.Register(job, nil)
Expect(err).ShouldNot(HaveOccurred()) Expect(err).ShouldNot(HaveOccurred())
Expect(resp.EvalID).ShouldNot(BeEmpty()) Expect(resp.EvalID).ShouldNot(BeEmpty())
@ -84,20 +89,49 @@ var _ = Describe("Server Side Restart Tests", func() {
}) })
}) })
Context("System jobs should never be rescheduled", func() {
BeforeEach(func() {
specFile = "input/rescheduling_system.hcl"
})
It("Should have exactly one failed alloc", func() {
Eventually(allocStatuses, 10*time.Second, time.Second).Should(ConsistOf([]string{"failed"}))
})
})
Context("Default Rescheduling", func() {
BeforeEach(func() {
specFile = "input/rescheduling_default.hcl"
})
It("Should have exactly three allocs and all failed after 5 secs", func() {
Eventually(allocStatuses, 5*time.Second, time.Second).Should(ConsistOf([]string{"failed", "failed", "failed"}))
})
// wait until first exponential delay kicks in and rescheduling is attempted
It("Should have exactly six allocs and all failed after 35 secs", func() {
if !*slow {
Skip("Skipping slow test")
}
Eventually(allocStatuses, 35*time.Second, time.Second).Should(ConsistOf([]string{"failed", "failed", "failed", "failed", "failed", "failed"}))
})
})
Context("Reschedule attempts maxed out", func() { Context("Reschedule attempts maxed out", func() {
BeforeEach(func() { BeforeEach(func() {
specFile = "input/rescheduling_fail.hcl" specFile = "input/rescheduling_fail.hcl"
}) })
// Expect 3 original plus 6 rescheduled allocs from 2 attempts
var expected []string
for i := 0; i < 9; i++ {
expected = append(expected, "failed")
}
It("Should have all failed", func() { It("Should have all failed", func() {
Eventually(allocStatuses, 6*time.Second, time.Second).ShouldNot( Eventually(allocStatuses, 6*time.Second, time.Second).ShouldNot(
SatisfyAll(ContainElement("pending"), SatisfyAll(ContainElement("pending"),
ContainElement("running"))) ContainElement("running")))
}) })
Context("Updating job to change its version", func() {
It("Should have running allocs now", func() {
job.TaskGroups[0].Tasks[0].Config["args"] = []string{"-c", "sleep 15000"}
_, _, err := jobs.Register(job, nil)
Expect(err).ShouldNot(HaveOccurred())
Eventually(allocStatuses, 5*time.Second, time.Second).Should(ContainElement("running"))
})
})
}) })
Context("Reschedule attempts succeeded", func() { Context("Reschedule attempts succeeded", func() {

View File

@ -2892,7 +2892,7 @@ func (r *ReschedulePolicy) validateDelayParams() error {
multierror.Append(&mErr, fmt.Errorf("Nomad can only make %v attempts in %v with initial delay %v, "+ multierror.Append(&mErr, fmt.Errorf("Nomad can only make %v attempts in %v with initial delay %v, "+
"delay function %q, and delay ceiling %v", possibleAttempts, r.Interval, r.Delay, r.DelayFunction, r.MaxDelay)) "delay function %q, and delay ceiling %v", possibleAttempts, r.Interval, r.Delay, r.DelayFunction, r.MaxDelay))
} }
multierror.Append(&mErr, fmt.Errorf("Set the interval to at least %v to accommodate %v attempts", recommendedInterval.Round(time.Minute), r.Attempts)) multierror.Append(&mErr, fmt.Errorf("Set the interval to at least %v to accommodate %v attempts", recommendedInterval.Round(time.Second), r.Attempts))
return mErr.ErrorOrNil() return mErr.ErrorOrNil()
} }