github.com/anuvu/nomad@v0.8.7-atom1/command/job_plan_test.go (about) 1 package command 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "strings" 8 "testing" 9 10 "github.com/hashicorp/nomad/testutil" 11 "github.com/mitchellh/cli" 12 ) 13 14 func TestPlanCommand_Implements(t *testing.T) { 15 t.Parallel() 16 var _ cli.Command = &JobRunCommand{} 17 } 18 19 func TestPlanCommand_Fails(t *testing.T) { 20 t.Parallel() 21 ui := new(cli.MockUi) 22 cmd := &JobPlanCommand{Meta: Meta{Ui: ui}} 23 24 // Create a server 25 s := testutil.NewTestServer(t, nil) 26 defer s.Stop() 27 os.Setenv("NOMAD_ADDR", fmt.Sprintf("http://%s", s.HTTPAddr)) 28 29 // Fails on misuse 30 if code := cmd.Run([]string{"some", "bad", "args"}); code != 255 { 31 t.Fatalf("expected exit code 1, got: %d", code) 32 } 33 if out := ui.ErrorWriter.String(); !strings.Contains(out, commandErrorText(cmd)) { 34 t.Fatalf("expected help output, got: %s", out) 35 } 36 ui.ErrorWriter.Reset() 37 38 // Fails when specified file does not exist 39 if code := cmd.Run([]string{"/unicorns/leprechauns"}); code != 255 { 40 t.Fatalf("expect exit 255, got: %d", code) 41 } 42 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error getting job struct") { 43 t.Fatalf("expect getting job struct error, got: %s", out) 44 } 45 ui.ErrorWriter.Reset() 46 47 // Fails on invalid HCL 48 fh1, err := ioutil.TempFile("", "nomad") 49 if err != nil { 50 t.Fatalf("err: %s", err) 51 } 52 defer os.Remove(fh1.Name()) 53 if _, err := fh1.WriteString("nope"); err != nil { 54 t.Fatalf("err: %s", err) 55 } 56 if code := cmd.Run([]string{fh1.Name()}); code != 255 { 57 t.Fatalf("expect exit 255, got: %d", code) 58 } 59 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error getting job struct") { 60 t.Fatalf("expect parsing error, got: %s", out) 61 } 62 ui.ErrorWriter.Reset() 63 64 // Fails on invalid job spec 65 fh2, err := ioutil.TempFile("", "nomad") 66 if err != nil { 67 t.Fatalf("err: %s", err) 68 } 69 defer os.Remove(fh2.Name()) 70 if _, err := fh2.WriteString(`job "job1" {}`); err != nil { 71 t.Fatalf("err: %s", err) 72 } 73 if code := cmd.Run([]string{fh2.Name()}); code != 255 { 74 t.Fatalf("expect exit 255, got: %d", code) 75 } 76 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error during plan") { 77 t.Fatalf("expect validation error, got: %s", out) 78 } 79 ui.ErrorWriter.Reset() 80 81 // Fails on connection failure (requires a valid job) 82 fh3, err := ioutil.TempFile("", "nomad") 83 if err != nil { 84 t.Fatalf("err: %s", err) 85 } 86 defer os.Remove(fh3.Name()) 87 _, err = fh3.WriteString(` 88 job "job1" { 89 type = "service" 90 datacenters = [ "dc1" ] 91 group "group1" { 92 count = 1 93 task "task1" { 94 driver = "exec" 95 resources = { 96 cpu = 1000 97 memory = 512 98 } 99 } 100 } 101 }`) 102 if err != nil { 103 t.Fatalf("err: %s", err) 104 } 105 if code := cmd.Run([]string{"-address=nope", fh3.Name()}); code != 255 { 106 t.Fatalf("expected exit code 255, got: %d", code) 107 } 108 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error during plan") { 109 t.Fatalf("expected failed query error, got: %s", out) 110 } 111 } 112 113 func TestPlanCommand_From_STDIN(t *testing.T) { 114 t.Parallel() 115 stdinR, stdinW, err := os.Pipe() 116 if err != nil { 117 t.Fatalf("err: %s", err) 118 } 119 120 ui := new(cli.MockUi) 121 cmd := &JobPlanCommand{ 122 Meta: Meta{Ui: ui}, 123 JobGetter: JobGetter{testStdin: stdinR}, 124 } 125 126 go func() { 127 stdinW.WriteString(` 128 job "job1" { 129 type = "service" 130 datacenters = [ "dc1" ] 131 group "group1" { 132 count = 1 133 task "task1" { 134 driver = "exec" 135 resources = { 136 cpu = 1000 137 memory = 512 138 } 139 } 140 } 141 }`) 142 stdinW.Close() 143 }() 144 145 args := []string{"-"} 146 if code := cmd.Run(args); code != 255 { 147 t.Fatalf("expected exit code 255, got %d: %q", code, ui.ErrorWriter.String()) 148 } 149 150 if out := ui.ErrorWriter.String(); !strings.Contains(out, "connection refused") { 151 t.Fatalf("expected connection refused error, got: %s", out) 152 } 153 ui.ErrorWriter.Reset() 154 } 155 156 func TestPlanCommand_From_URL(t *testing.T) { 157 t.Parallel() 158 ui := new(cli.MockUi) 159 cmd := &JobPlanCommand{ 160 Meta: Meta{Ui: ui}, 161 } 162 163 args := []string{"https://example.com/foo/bar"} 164 if code := cmd.Run(args); code != 255 { 165 t.Fatalf("expected exit code 255, got %d: %q", code, ui.ErrorWriter.String()) 166 } 167 168 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error getting jobfile") { 169 t.Fatalf("expected error getting jobfile, got: %s", out) 170 } 171 }