This commit is contained in:
Alex Dadgar
2016-05-17 13:32:47 -07:00
parent 74339714b4
commit 75e8f28f8f
2 changed files with 109 additions and 9 deletions

View File

@@ -13,9 +13,9 @@ import (
const (
jobModifyIndexHelp = `To submit the job with version verification run:
nomad run -verify %d %s
nomad run -check-index %d %s
When running the job with the verify flag, the job will only be run if the
When running the job with the check-index flag, the job will only be run if the
server side version matches the the job modify index returned. If the index has
changed, another user has modified the job and the plan's results are
potentially invalid.`
@@ -36,14 +36,12 @@ Usage: nomad plan [options] <file>
successfully and how it would affect existing allocations.
A job modify index is returned with the plan. This value can be used when
submitting the job using "nomad run -verify", which will check that the job
submitting the job using "nomad run -check-index", which will check that the job
was not modified between the plan and run command before invoking the
scheduler. This ensures that the plan reflects the same modifications to the
job as the run.
scheduler. This ensures the job has not been modified since the plan.
An annotated diff between the submitted job and the remote state is also
displayed. This diff gives insight onto what the scheduler will attempt to do
and why.
A structured diff between the local and remote job is displayed to
give insight into what the scheduler will attempt to do and why.
General Options:
@@ -59,7 +57,6 @@ Run Options:
-verbose
Increase diff verbosity.
`
return strings.TrimSpace(helpText)
}

103
command/plan_test.go Normal file
View File

@@ -0,0 +1,103 @@
package command
import (
"io/ioutil"
"os"
"strings"
"testing"
"github.com/mitchellh/cli"
)
func TestPlanCommand_Implements(t *testing.T) {
var _ cli.Command = &RunCommand{}
}
func TestPlanCommand_Fails(t *testing.T) {
ui := new(cli.MockUi)
cmd := &PlanCommand{Meta: Meta{Ui: ui}}
// Fails on misuse
if code := cmd.Run([]string{"some", "bad", "args"}); code != 1 {
t.Fatalf("expected exit code 1, got: %d", code)
}
if out := ui.ErrorWriter.String(); !strings.Contains(out, cmd.Help()) {
t.Fatalf("expected help output, got: %s", out)
}
ui.ErrorWriter.Reset()
// Fails when specified file does not exist
if code := cmd.Run([]string{"/unicorns/leprechauns"}); code != 1 {
t.Fatalf("expect exit 1, got: %d", code)
}
if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error parsing") {
t.Fatalf("expect parsing error, got: %s", out)
}
ui.ErrorWriter.Reset()
// Fails on invalid HCL
fh1, err := ioutil.TempFile("", "nomad")
if err != nil {
t.Fatalf("err: %s", err)
}
defer os.Remove(fh1.Name())
if _, err := fh1.WriteString("nope"); err != nil {
t.Fatalf("err: %s", err)
}
if code := cmd.Run([]string{fh1.Name()}); code != 1 {
t.Fatalf("expect exit 1, got: %d", code)
}
if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error parsing") {
t.Fatalf("expect parsing error, got: %s", err)
}
ui.ErrorWriter.Reset()
// Fails on invalid job spec
fh2, err := ioutil.TempFile("", "nomad")
if err != nil {
t.Fatalf("err: %s", err)
}
defer os.Remove(fh2.Name())
if _, err := fh2.WriteString(`job "job1" {}`); err != nil {
t.Fatalf("err: %s", err)
}
if code := cmd.Run([]string{fh2.Name()}); code != 1 {
t.Fatalf("expect exit 1, got: %d", code)
}
if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error validating") {
t.Fatalf("expect validation error, got: %s", out)
}
ui.ErrorWriter.Reset()
// Fails on connection failure (requires a valid job)
fh3, err := ioutil.TempFile("", "nomad")
if err != nil {
t.Fatalf("err: %s", err)
}
defer os.Remove(fh3.Name())
_, err = fh3.WriteString(`
job "job1" {
type = "service"
datacenters = [ "dc1" ]
group "group1" {
count = 1
task "task1" {
driver = "exec"
resources = {
cpu = 1000
disk = 150
memory = 512
}
}
}
}`)
if err != nil {
t.Fatalf("err: %s", err)
}
if code := cmd.Run([]string{"-address=nope", fh3.Name()}); code != 1 {
t.Fatalf("expected exit code 1, got: %d", code)
}
if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error during plan") {
t.Fatalf("expected failed query error, got: %s", out)
}
}