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