2015-09-21 00:06:02 +00:00
|
|
|
package command
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2015-09-23 00:06:23 +00:00
|
|
|
"io/ioutil"
|
2015-09-21 00:06:02 +00:00
|
|
|
"os"
|
2015-09-23 00:06:23 +00:00
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
// DefaultInitName is the default name we use when
|
|
|
|
// initializing the example file
|
|
|
|
DefaultInitName = "example.nomad"
|
2015-09-21 00:06:02 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// InitCommand generates a new job template that you can customize to your
|
|
|
|
// liking, like vagrant init
|
|
|
|
type InitCommand struct {
|
|
|
|
Meta
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *InitCommand) Help() string {
|
2015-09-23 00:06:23 +00:00
|
|
|
helpText := `
|
|
|
|
Usage: nomad init
|
|
|
|
|
|
|
|
Creates an example job file that can be used as a starting
|
|
|
|
point to customize further.
|
|
|
|
`
|
|
|
|
return strings.TrimSpace(helpText)
|
2015-09-21 00:06:02 +00:00
|
|
|
}
|
|
|
|
|
2015-09-23 00:06:23 +00:00
|
|
|
func (c *InitCommand) Synopsis() string {
|
|
|
|
return "Create an example job file"
|
|
|
|
}
|
2015-09-21 00:06:02 +00:00
|
|
|
|
2015-09-23 00:06:23 +00:00
|
|
|
func (c *InitCommand) Run(args []string) int {
|
2015-09-30 21:21:50 +00:00
|
|
|
// Check for misuse
|
|
|
|
if len(args) != 0 {
|
|
|
|
c.Ui.Error(c.Help())
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
2015-09-23 00:06:23 +00:00
|
|
|
// Check if the file already exists
|
|
|
|
_, err := os.Stat(DefaultInitName)
|
2015-09-30 21:21:50 +00:00
|
|
|
if err != nil && !os.IsNotExist(err) {
|
2015-09-23 00:06:23 +00:00
|
|
|
c.Ui.Error(fmt.Sprintf("Failed to stat '%s': %v", DefaultInitName, err))
|
2015-09-21 00:06:02 +00:00
|
|
|
return 1
|
|
|
|
}
|
2015-09-30 21:21:50 +00:00
|
|
|
if !os.IsNotExist(err) {
|
|
|
|
c.Ui.Error(fmt.Sprintf("Job '%s' already exists", DefaultInitName))
|
|
|
|
return 1
|
|
|
|
}
|
2015-09-21 00:06:02 +00:00
|
|
|
|
2015-09-23 00:06:23 +00:00
|
|
|
// Write out the example
|
|
|
|
err = ioutil.WriteFile(DefaultInitName, []byte(defaultJob), 0660)
|
2015-09-21 00:06:02 +00:00
|
|
|
if err != nil {
|
2015-09-23 00:06:23 +00:00
|
|
|
c.Ui.Error(fmt.Sprintf("Failed to write '%s': %v", DefaultInitName, err))
|
2015-09-21 00:06:02 +00:00
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
2015-09-23 00:06:23 +00:00
|
|
|
// Success
|
|
|
|
c.Ui.Output(fmt.Sprintf("Example job file written to %s", DefaultInitName))
|
2015-09-21 00:06:02 +00:00
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
2015-09-30 21:21:50 +00:00
|
|
|
var defaultJob = strings.TrimSpace(`
|
2015-09-23 00:06:23 +00:00
|
|
|
# There can only be a single job definition per file.
|
|
|
|
# Create a job with ID and Name 'example'
|
|
|
|
job "example" {
|
|
|
|
# Run the job in the global region, which is the default.
|
|
|
|
# region = "global"
|
|
|
|
|
|
|
|
# Specify the datacenters within the region this job can run in.
|
|
|
|
datacenters = ["dc1"]
|
|
|
|
|
|
|
|
# Service type jobs optimize for long-lived services. This is
|
|
|
|
# the default but we can change to batch for short-lived tasks.
|
|
|
|
# type = "service"
|
|
|
|
|
|
|
|
# Priority controls our access to resources and scheduling priority.
|
|
|
|
# This can be 1 to 100, inclusively, and defaults to 50.
|
|
|
|
# priority = 50
|
|
|
|
|
|
|
|
# Restrict our job to only linux. We can specify multiple
|
|
|
|
# constraints as needed.
|
|
|
|
constraint {
|
2015-09-23 01:21:46 +00:00
|
|
|
attribute = "$attr.kernel.name"
|
2015-09-23 00:06:23 +00:00
|
|
|
value = "linux"
|
|
|
|
}
|
2015-09-21 00:06:02 +00:00
|
|
|
|
2015-09-23 00:06:23 +00:00
|
|
|
# Configure the job to do rolling updates
|
|
|
|
update {
|
|
|
|
# Stagger updates every 10 seconds
|
|
|
|
stagger = "10s"
|
2015-09-21 00:06:02 +00:00
|
|
|
|
2015-09-23 00:06:23 +00:00
|
|
|
# Update a single task at a time
|
|
|
|
max_parallel = 1
|
|
|
|
}
|
|
|
|
|
|
|
|
# Create a 'cache' group. Each task in the group will be
|
|
|
|
# scheduled onto the same machine.
|
|
|
|
group "cache" {
|
|
|
|
# Control the number of instances of this groups.
|
|
|
|
# Defaults to 1
|
|
|
|
# count = 1
|
|
|
|
|
2015-10-31 04:06:56 +00:00
|
|
|
# Restart Policy - This block defines the restart policy for TaskGroups,
|
|
|
|
# the attempts value defines the number of restarts Nomad will do if Tasks
|
2015-10-30 22:51:39 +00:00
|
|
|
# in this TaskGroup fails in a rolling window of interval duration
|
|
|
|
# The delay value makes Nomad wait for that duration to restart after a Task
|
|
|
|
# fails or crashes.
|
|
|
|
restart {
|
2015-11-03 01:30:41 +00:00
|
|
|
interval = "5m"
|
2015-10-30 22:51:39 +00:00
|
|
|
attempts = 10
|
2015-11-03 01:30:41 +00:00
|
|
|
delay = "25s"
|
2015-10-30 22:51:39 +00:00
|
|
|
}
|
|
|
|
|
2015-09-23 00:06:23 +00:00
|
|
|
# Define a task to run
|
|
|
|
task "redis" {
|
|
|
|
# Use Docker to run the task.
|
|
|
|
driver = "docker"
|
|
|
|
|
|
|
|
# Configure Docker driver with the image
|
|
|
|
config {
|
2015-09-23 01:10:33 +00:00
|
|
|
image = "redis:latest"
|
2015-09-23 00:06:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# We must specify the resources required for
|
|
|
|
# this task to ensure it runs on a machine with
|
|
|
|
# enough capacity.
|
|
|
|
resources {
|
|
|
|
cpu = 500 # 500 Mhz
|
2015-09-23 01:10:33 +00:00
|
|
|
memory = 256 # 256MB
|
2015-09-23 00:06:23 +00:00
|
|
|
network {
|
|
|
|
mbits = 10
|
2015-10-02 23:35:24 +00:00
|
|
|
dynamic_ports = ["6379"]
|
2015-09-23 00:06:23 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-09-21 00:06:02 +00:00
|
|
|
}
|
2015-09-30 21:21:50 +00:00
|
|
|
`)
|