diff --git a/command/job_init.go b/command/job_init.go index b77c3e58149..1e0a2df06fa 100644 --- a/command/job_init.go +++ b/command/job_init.go @@ -26,6 +26,11 @@ Alias: nomad init Creates an example job file that can be used as a starting point to customize further. + +Init Options: + + -short + If the short flag is set, a minimal jobspec without comments is emitted. ` return strings.TrimSpace(helpText) } @@ -37,8 +42,18 @@ func (c *JobInitCommand) Synopsis() string { func (c *JobInitCommand) Name() string { return "job init" } func (c *JobInitCommand) Run(args []string) int { + var short bool + + flags := c.Meta.FlagSet(c.Name(), FlagSetClient) + flags.Usage = func() { c.Ui.Output(c.Help()) } + flags.BoolVar(&short, "short", false, "") + + if err := flags.Parse(args); err != nil { + return 1 + } + // Check for misuse - if len(args) != 0 { + if len(flags.Args()) != 0 { c.Ui.Error("This command takes no arguments") c.Ui.Error(commandErrorText(c)) return 1 @@ -55,8 +70,16 @@ func (c *JobInitCommand) Run(args []string) int { return 1 } + var jobSpec []byte + + if short { + jobSpec = []byte(shortJob) + } else { + jobSpec = []byte(defaultJob) + } + // Write out the example - err = ioutil.WriteFile(DefaultInitName, []byte(defaultJob), 0660) + err = ioutil.WriteFile(DefaultInitName, jobSpec, 0660) if err != nil { c.Ui.Error(fmt.Sprintf("Failed to write '%s': %v", DefaultInitName, err)) return 1 @@ -67,6 +90,50 @@ func (c *JobInitCommand) Run(args []string) int { return 0 } +var shortJob = strings.TrimSpace(` +job "example" { + datacenters = ["dc1"] + + group "cache" { + ephemeral_disk { + size = 300 + } + + task "redis" { + driver = "docker" + + config { + image = "redis:3.2" + port_map { + db = 6379 + } + } + + resources { + cpu = 500 # 500 MHz + memory = 256 # 256MB + network { + mbits = 10 + port "db" {} + } + } + + service { + name = "redis-cache" + tags = ["global", "cache"] + port = "db" + check { + name = "alive" + type = "tcp" + interval = "10s" + timeout = "2s" + } + } + } + } +} +`) + var defaultJob = strings.TrimSpace(` # There can only be a single job definition per file. This job is named # "example" so it will create a job with the ID and Name "example". diff --git a/command/job_init_test.go b/command/job_init_test.go index d2f7617fced..0f898cc5565 100644 --- a/command/job_init_test.go +++ b/command/job_init_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/mitchellh/cli" + "github.com/stretchr/testify/require" ) func TestInitCommand_Implements(t *testing.T) { @@ -57,6 +58,15 @@ func TestInitCommand_Run(t *testing.T) { t.Fatalf("unexpected file content\n\n%s", string(content)) } + // Works with -short flag + os.Remove(DefaultInitName) + if code := cmd.Run([]string{"-short"}); code != 0 { + require.Zero(t, code, "unexpected exit code: %d", code) + } + content, err = ioutil.ReadFile(DefaultInitName) + require.NoError(t, err) + require.Equal(t, string(content), shortJob) + // Fails if the file exists if code := cmd.Run([]string{}); code != 1 { t.Fatalf("expect exit code 1, got: %d", code)