diff --git a/command/run.go b/command/run.go index b6216588e..9b724e9cf 100644 --- a/command/run.go +++ b/command/run.go @@ -79,6 +79,12 @@ func (c *RunCommand) Run(args []string) int { return 1 } + // Check that the job is valid + if err := job.Validate(); err != nil { + c.Ui.Error(fmt.Sprintf("Error validating job: %s", err)) + return 1 + } + // Convert it to something we can use apiJob, err := convertJob(job) if err != nil { diff --git a/command/run_test.go b/command/run_test.go index f6a4b212b..c797ef406 100644 --- a/command/run_test.go +++ b/command/run_test.go @@ -35,7 +35,7 @@ func TestRunCommand_Fails(t *testing.T) { } ui.ErrorWriter.Reset() - // Fails on invalid job + // Fails on invalid HCL fh1, err := ioutil.TempFile("", "nomad") if err != nil { t.Fatalf("err: %s", err) @@ -52,16 +52,47 @@ func TestRunCommand_Fails(t *testing.T) { } ui.ErrorWriter.Reset() - // Fails on connection failure + // 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 "hello" {}`); err != nil { + if _, err := fh2.WriteString(`job "job1" {}`); err != nil { t.Fatalf("err: %s", err) } - if code := cmd.Run([]string{"-address=nope", fh2.Name()}); code != 1 { + 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" { + datacenters = [ "dc1" ] + group "group1" { + count = 1 + task "task1" { + driver = "exec" + resources = { + cpu = 1000 + mem = 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 submitting job") {