github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/command/job_run_test.go (about) 1 package command 2 3 import ( 4 "io/ioutil" 5 "os" 6 "strings" 7 "testing" 8 9 "github.com/hashicorp/nomad/testutil" 10 "github.com/mitchellh/cli" 11 ) 12 13 func TestRunCommand_Implements(t *testing.T) { 14 t.Parallel() 15 var _ cli.Command = &JobRunCommand{} 16 } 17 18 func TestRunCommand_Output_Json(t *testing.T) { 19 t.Parallel() 20 ui := cli.NewMockUi() 21 cmd := &JobRunCommand{Meta: Meta{Ui: ui}} 22 23 fh, err := ioutil.TempFile("", "nomad") 24 if err != nil { 25 t.Fatalf("err: %s", err) 26 } 27 defer os.Remove(fh.Name()) 28 _, err = fh.WriteString(` 29 job "job1" { 30 type = "service" 31 datacenters = [ "dc1" ] 32 group "group1" { 33 count = 1 34 task "task1" { 35 driver = "exec" 36 resources { 37 cpu = 1000 38 memory = 512 39 } 40 } 41 } 42 }`) 43 if err != nil { 44 t.Fatalf("err: %s", err) 45 } 46 if code := cmd.Run([]string{"-output", fh.Name()}); code != 0 { 47 t.Fatalf("expected exit code 0, got: %d", code) 48 } 49 if out := ui.OutputWriter.String(); !strings.Contains(out, `"Type": "service",`) { 50 t.Fatalf("Expected JSON output: %v", out) 51 } 52 } 53 54 func TestRunCommand_Fails(t *testing.T) { 55 t.Parallel() 56 57 // Create a server 58 s := testutil.NewTestServer(t, nil) 59 defer s.Stop() 60 61 ui := cli.NewMockUi() 62 cmd := &JobRunCommand{Meta: Meta{Ui: ui, flagAddress: "http://" + s.HTTPAddr}} 63 64 // Fails on misuse 65 if code := cmd.Run([]string{"some", "bad", "args"}); code != 1 { 66 t.Fatalf("expected exit code 1, got: %d", code) 67 } 68 if out := ui.ErrorWriter.String(); !strings.Contains(out, commandErrorText(cmd)) { 69 t.Fatalf("expected help output, got: %s", out) 70 } 71 ui.ErrorWriter.Reset() 72 73 // Fails when specified file does not exist 74 if code := cmd.Run([]string{"/unicorns/leprechauns"}); code != 1 { 75 t.Fatalf("expect exit 1, got: %d", code) 76 } 77 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error getting job struct") { 78 t.Fatalf("expect getting job struct error, got: %s", out) 79 } 80 ui.ErrorWriter.Reset() 81 82 // Fails on invalid HCL 83 fh1, err := ioutil.TempFile("", "nomad") 84 if err != nil { 85 t.Fatalf("err: %s", err) 86 } 87 defer os.Remove(fh1.Name()) 88 if _, err := fh1.WriteString("nope"); err != nil { 89 t.Fatalf("err: %s", err) 90 } 91 if code := cmd.Run([]string{fh1.Name()}); code != 1 { 92 t.Fatalf("expect exit 1, got: %d", code) 93 } 94 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error getting job struct") { 95 t.Fatalf("expect parsing error, got: %s", out) 96 } 97 ui.ErrorWriter.Reset() 98 99 // Fails on invalid job spec 100 fh2, err := ioutil.TempFile("", "nomad") 101 if err != nil { 102 t.Fatalf("err: %s", err) 103 } 104 defer os.Remove(fh2.Name()) 105 if _, err := fh2.WriteString(`job "job1" {}`); err != nil { 106 t.Fatalf("err: %s", err) 107 } 108 if code := cmd.Run([]string{fh2.Name()}); code != 1 { 109 t.Fatalf("expect exit 1, got: %d", code) 110 } 111 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error submitting job") { 112 t.Fatalf("expect validation error, got: %s", out) 113 } 114 ui.ErrorWriter.Reset() 115 116 // Fails on connection failure (requires a valid job) 117 fh3, err := ioutil.TempFile("", "nomad") 118 if err != nil { 119 t.Fatalf("err: %s", err) 120 } 121 defer os.Remove(fh3.Name()) 122 _, err = fh3.WriteString(` 123 job "job1" { 124 type = "service" 125 datacenters = [ "dc1" ] 126 group "group1" { 127 count = 1 128 task "task1" { 129 driver = "exec" 130 resources { 131 cpu = 1000 132 memory = 512 133 } 134 } 135 } 136 }`) 137 if err != nil { 138 t.Fatalf("err: %s", err) 139 } 140 if code := cmd.Run([]string{"-address=nope", fh3.Name()}); code != 1 { 141 t.Fatalf("expected exit code 1, got: %d", code) 142 } 143 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error submitting job") { 144 t.Fatalf("expected failed query error, got: %s", out) 145 } 146 147 // Fails on invalid check-index (requires a valid job) 148 if code := cmd.Run([]string{"-check-index=bad", fh3.Name()}); code != 1 { 149 t.Fatalf("expected exit code 1, got: %d", code) 150 } 151 if out := ui.ErrorWriter.String(); !strings.Contains(out, "parsing check-index") { 152 t.Fatalf("expected parse error, got: %s", out) 153 } 154 ui.ErrorWriter.Reset() 155 156 } 157 158 func TestRunCommand_From_STDIN(t *testing.T) { 159 t.Parallel() 160 stdinR, stdinW, err := os.Pipe() 161 if err != nil { 162 t.Fatalf("err: %s", err) 163 } 164 165 ui := cli.NewMockUi() 166 cmd := &JobRunCommand{ 167 Meta: Meta{Ui: ui}, 168 JobGetter: JobGetter{testStdin: stdinR}, 169 } 170 171 go func() { 172 stdinW.WriteString(` 173 job "job1" { 174 type = "service" 175 datacenters = [ "dc1" ] 176 group "group1" { 177 count = 1 178 task "task1" { 179 driver = "exec" 180 resources { 181 cpu = 1000 182 memory = 512 183 } 184 } 185 } 186 }`) 187 stdinW.Close() 188 }() 189 190 args := []string{"-address=nope", "-"} 191 if code := cmd.Run(args); code != 1 { 192 t.Fatalf("expected exit code 1, got %d: %q", code, ui.ErrorWriter.String()) 193 } 194 195 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error submitting job") { 196 t.Fatalf("expected submission error, got: %s", out) 197 } 198 ui.ErrorWriter.Reset() 199 } 200 201 func TestRunCommand_From_URL(t *testing.T) { 202 t.Parallel() 203 ui := cli.NewMockUi() 204 cmd := &JobRunCommand{ 205 Meta: Meta{Ui: ui}, 206 } 207 208 args := []string{"https://example.com/foo/bar"} 209 if code := cmd.Run(args); code != 1 { 210 t.Fatalf("expected exit code 1, got %d: %q", code, ui.ErrorWriter.String()) 211 } 212 213 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error getting jobfile") { 214 t.Fatalf("expected error getting jobfile, got: %s", out) 215 } 216 }