github.com/zoomfoo/nomad@v0.8.5-0.20180907175415-f28fd3a1a056/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  }