node-status -self command and docs

This commit is contained in:
Alex Dadgar
2016-03-29 12:36:24 -07:00
parent 270da7a60c
commit 3fbe8a1642
5 changed files with 260 additions and 74 deletions

View File

@@ -164,7 +164,6 @@ func (c *AllocStatusCommand) shortTaskStatus(alloc *api.Allocation) {
tasks := make([]string, 0, len(alloc.TaskStates)+1)
tasks = append(tasks, "Name|State|Last Event|Time")
for task := range c.sortedTaskStateIterator(alloc.TaskStates) {
fmt.Println(task)
state := alloc.TaskStates[task]
lastState := state.State
var lastEvent, lastTime string

View File

@@ -22,7 +22,8 @@ Usage: nomad node-status [options] <node>
If a node ID is passed, information for that specific node will
be displayed. If no node ID's are passed, then a short-hand
list of all nodes will be displayed.
list of all nodes will be displayed. The -self flag is useful to
quickly access the status of the local node.
General Options:
@@ -37,6 +38,9 @@ Node Status Options:
-verbose
Display full information.
-self
Query the status of the local node.
-allocs
Display a count of running allocations for each node.
`
@@ -48,13 +52,14 @@ func (c *NodeStatusCommand) Synopsis() string {
}
func (c *NodeStatusCommand) Run(args []string) int {
var short, verbose, list_allocs bool
var short, verbose, list_allocs, self bool
flags := c.Meta.FlagSet("node-status", FlagSetClient)
flags.Usage = func() { c.Ui.Output(c.Help()) }
flags.BoolVar(&short, "short", false, "")
flags.BoolVar(&verbose, "verbose", false, "")
flags.BoolVar(&list_allocs, "allocs", false, "")
flags.BoolVar(&self, "self", false, "")
if err := flags.Parse(args); err != nil {
return 1
@@ -80,8 +85,32 @@ func (c *NodeStatusCommand) Run(args []string) int {
return 1
}
// If -self flag is set then determine the current node.
nodeID := ""
if self {
info, err := client.Agent().Self()
if err != nil {
c.Ui.Error(fmt.Sprintf("Error querying agent info: %s", err))
return 1
}
var stats map[string]interface{}
stats, _ = info["stats"]
clientStats, ok := stats["client"].(map[string]interface{})
if !ok {
c.Ui.Error("Nomad not running in client mode")
return 1
}
nodeID, ok = clientStats["node_id"].(string)
if !ok {
c.Ui.Error("Failed to determine node ID")
return 1
}
}
// Use list mode if no node name was provided
if len(args) == 0 {
if len(args) == 0 && !self {
// Query the node info
nodes, _, err := client.Nodes().List(nil)
if err != nil {
@@ -133,7 +162,9 @@ func (c *NodeStatusCommand) Run(args []string) int {
}
// Query the specific node
nodeID := args[0]
if !self {
nodeID = args[0]
}
if len(nodeID) == 1 {
c.Ui.Error(fmt.Sprintf("Identifier must contain at least two characters."))
return 1

View File

@@ -13,6 +13,57 @@ func TestNodeStatusCommand_Implements(t *testing.T) {
var _ cli.Command = &NodeStatusCommand{}
}
func TestNodeStatusCommand_Self(t *testing.T) {
// Start in dev mode so we get a node registration
srv, client, url := testServer(t, func(c *testutil.TestServerConfig) {
c.DevMode = true
c.NodeName = "mynode"
})
defer srv.Stop()
ui := new(cli.MockUi)
cmd := &NodeStatusCommand{Meta: Meta{Ui: ui}}
// Wait for a node to appear
var nodeID string
testutil.WaitForResult(func() (bool, error) {
nodes, _, err := client.Nodes().List(nil)
if err != nil {
return false, err
}
if len(nodes) == 0 {
return false, fmt.Errorf("missing node")
}
nodeID = nodes[0].ID
return true, nil
}, func(err error) {
t.Fatalf("err: %s", err)
})
// Query self node
if code := cmd.Run([]string{"-address=" + url, "-self"}); code != 0 {
t.Fatalf("expected exit 0, got: %d", code)
}
out := ui.OutputWriter.String()
if !strings.Contains(out, "mynode") {
t.Fatalf("expect to find mynode, got: %s", out)
}
if strings.Contains(out, "Allocations") {
t.Fatalf("should not dump allocations")
}
ui.OutputWriter.Reset()
// Request full id output
if code := cmd.Run([]string{"-address=" + url, "-self", "-verbose"}); code != 0 {
t.Fatalf("expected exit 0, got: %d", code)
}
out = ui.OutputWriter.String()
if !strings.Contains(out, nodeID) {
t.Fatalf("expected full node id %q, got: %s", nodeID, out)
}
ui.OutputWriter.Reset()
}
func TestNodeStatusCommand_Run(t *testing.T) {
// Start in dev mode so we get a node registration
srv, client, url := testServer(t, func(c *testutil.TestServerConfig) {

View File

@@ -37,70 +37,96 @@ allocations and information will be displayed.
Short status of an alloc:
```
$ nomad alloc-status --short a7365fe4
ID = a7365fe4
EvalID = 44c2d9ed
Name = example.cache[0]
NodeID = e55859b1
JobID = example
ClientStatus = running
NodesEvaluated = 1
NodesFiltered = 0
NodesExhausted = 0
AllocationTime = 911.026µs
CoalescedFailures = 0
redis
web
$ nomad alloc-status --short 13901f26
ID = 13901f26
Eval ID = c3c9a1db
Name = example.cache[0]
Node ID = 1f029d38
Job ID = example
Client Status = running
==> Tasks
Name State LastEvent Time
redis running Started 02:29:40 11/17/15
web running Started 02:30:41 11/17/15
==> Status
Allocation "a7365fe4" status "running" (0/1 nodes filtered)
* Score "e55859b1.binpack" = 10.334026
Name State Last Event Time
redis running Started 29/03/16 03:04:53 UTC
web running Started 29/03/16 03:04:53 UTC
```
Full status of an alloc, which shows one of the tasks dying and then being restarted:
```
$ nomad alloc-status a7365fe4
ID = a7365fe4
EvalID = 44c2d9ed
Name = example.cache[0]
NodeID = e55859b1
JobID = example
ClientStatus = running
NodesEvaluated = 1
NodesFiltered = 0
NodesExhausted = 0
AllocationTime = 911.026µs
CoalescedFailures = 0
==> Task "redis" is "running"
Recent Events:
Time Type Description
02:29:40 11/17/15 Started <none>
==> Task "web" is "running"
Recent Events:
Time Type Description
02:30:41 11/17/15 Started <none>
02:30:02 11/17/15 Terminated Exit Code: 137, Exit Message: "Docker container exited with non-zero exit code: 137"
02:29:40 11/17/15 Started <none>
==> Status
Allocation "a7365fe4" status "running" (0/1 nodes filtered)
* Score "e55859b1.binpack" = 10.334026
ID = a7365fe4
Eval ID = c3c9a1db
Name = example.cache[0]
Node ID = 1f029d38
Job ID = example
Client Status = running
==> Task Resources
Task: "redis"
CPU Memory MB Disk MB IOPS Addresses
500 256 300 0 db: 127.0.0.1:52004
500 256 300 0 db: 127.0.0.1:46321
Task: "web"
CPU Memory MB Disk MB IOPS Addresses
500 256 300 0 http: 127.0.0.1:52007
500 256 300 0 db: 127.0.0.1:38537
==> Task "redis" is "running"
Recent Events:
Time Type Description
29/03/16 03:04:53 UTC Started Task started by client
29/03/16 03:04:51 UTC Received Task received by client
==> Task "web" is "pending"
Recent Events:
Time Type Description
29/03/16 03:07:18 UTC Restarting Task restarting in 18.580059474s
29/03/16 03:07:18 UTC Terminated Exit Code: 137, Exit Message: "Docker container exited with non-zero exit code: 137"
29/03/16 03:04:53 UTC Started Task started by client
29/03/16 03:04:51 UTC Received Task received by client
```
Verbose status can also be accessed:
```
$ nomad alloc-status a7365fe4
ID = a7365fe4-cb28-a6e9-f3d4-f99e49c89776
Eval ID = c3c9a1db-dbeb-8afa-0a83-4f1b8b5a03f5
Name = example.cache[0]
Node ID = 1f029d38-8d4b-a552-261f-e457b60f9b4b
Job ID = example
Client Status = running
Evaluated Nodes = 1
Filtered Nodes = 0
Exhausted Nodes = 0
Allocation Time = 1.085001ms
Failures = 0
==> Task Resources
Task: "web"
CPU Memory MB Disk MB IOPS Addresses
500 256 300 0 db: 127.0.0.1:38537
Task: "redis"
CPU Memory MB Disk MB IOPS Addresses
500 256 300 0 db: 127.0.0.1:46321
==> Task "redis" is "running"
Recent Events:
Time Type Description
29/03/16 03:04:53 UTC Started Task started by client
29/03/16 03:04:51 UTC Received Task received by client
==> Task "web" is "running"
Recent Events:
Time Type Description
29/03/16 03:07:38 UTC Started Task started by client
29/03/16 03:07:18 UTC Restarting Task restarting in 18.580059474s
29/03/16 03:07:18 UTC Terminated Exit Code: 137, Exit Message: "Docker container exited with non-zero exit code: 137"
29/03/16 03:04:53 UTC Started Task started by client
29/03/16 03:04:51 UTC Received Task received by client
==> Status
Allocation "13901f26-cb28-a6e9-f3d4-f99e49c89776" status "running" (0/1 nodes filtered)
* Score "1f029d38-8d4b-a552-261f-e457b60f9b4b.binpack" = 10.334026
```

View File

@@ -24,7 +24,9 @@ but is a good way to get a bird's-eye view of things.
If there is an exact match based on the provided node ID or prefix, then that
particular node will be queried, and detailed information will be displayed.
Otherwise, a list of matching nodes and information will be displayed.
Otherwise, a list of matching nodes and information will be displayed. If
running the command on a Nomad Client, the -self flag is useful to quickly
access the status of the local node.
## General Options
@@ -32,10 +34,10 @@ Otherwise, a list of matching nodes and information will be displayed.
## Node Status Options
* `-short`: Display short output. Used only when querying a single node. Drops
verbose information about node allocations.
* `-short`: Display short output. Used only when querying a single node.
* `-verbose`: Show full information.
* `-allocs`: Show running allocations per node
* `-allocs`: Show running allocations per node.
* `-self`: Query the status of the local node.
## Examples
@@ -61,26 +63,103 @@ Single-node view in short mode:
```
$ nomad node-status -short 1f3f03ea
ID = 1f3f03ea
Name = node2
Class =
Datacenter = dc1
Drain = false
Status = ready
ID = c754da1f
Name = nomad
Class = <none>
DC = dc1
Drain = false
Status = ready
```
Full output for a single node:
```
$ nomad node-status 1f3f03ea
ID = 1f3f03ea
Name = node2
Class =
Datacenter = dc1
Drain = false
Status = ready
ID = c754da1f
Name = nomad
Class = <none>
DC = dc1
Drain = false
Status = ready
### Allocations
ID EvalID JobID TaskGroup DesiredStatus ClientStatus
678c51dc 193229c4 job8 grp8 failed failed
==> Resource Utilization
CPU Memory MB Disk MB IOPS
0/2600 0/1997 0/34374 0/0
==> Allocations
ID Eval ID Job ID Task Group Desired Status Client Status
3d743cff 2fb686da example cache run complete
```
Using `-self` when on a Nomad Client:
```
$ nomad node-status -self
ID = c754da1f
Name = nomad
Class = <none>
DC = dc1
Drain = false
Status = ready
==> Resource Utilization
CPU Memory MB Disk MB IOPS
0/2600 0/1997 0/34374 0/0
==> Allocations
ID Eval ID Job ID Task Group Desired Status Client Status
3d743cff 2fb686da example cache run complete
```
To view verbose information about the node:
```
$ nomad node-status -verbose c754da1f
ID = c754da1f-6337-b86d-47dc-2ef4c71aca14
Name = nomad
Class = <none>
DC = dc1
Drain = false
Status = ready
==> Resource Utilization
CPU Memory MB Disk MB IOPS
0/2600 0/1997 0/34374 0/0
==> Allocations
ID Eval ID Job ID Task Group Desired Status Client Status
3d743cff-8d57-18c3-2260-a41d3f6c5204 2fb686da-b2b0-f8c2-5d57-2be5600435bd example cache run complete
==> Attributes
arch = amd64
cpu.frequency = 1300.000000
cpu.modelname = Intel(R) Core(TM) M-5Y71 CPU @ 1.20GHz
cpu.numcores = 2
cpu.totalcompute = 2600.000000
driver.docker = 1
driver.docker.version = 1.10.3
driver.exec = 1
driver.java = 1
driver.java.runtime = OpenJDK Runtime Environment (IcedTea 2.6.4) (7u95-2.6.4-0ubuntu0.14.04.2)
driver.java.version = 1.7.0_95
driver.java.vm = OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)
driver.qemu = 1
driver.qemu.version = 2.0.0
driver.raw_exec = 1
driver.rkt = 1
driver.rkt.appc.version = 0.7.4
driver.rkt.version = 1.2.0
hostname = nomad
kernel.name = linux
kernel.version = 3.19.0-25-generic
memory.totalbytes = 2094473216
nomad.revision = '270da7a60ccbf39eeeadc4064a59ca06bf9ac6fc+CHANGES'
nomad.version = 0.3.2dev
os.name = ubuntu
os.version = 14.04
unique.cgroup.mountpoint = /sys/fs/cgroup
unique.network.ip-address = 127.0.0.1
unique.storage.bytesfree = 36044333056
unique.storage.bytestotal = 41092214784
unique.storage.volume = /dev/mapper/ubuntu--14--vg-root
```