Add hidden placeholder of `.Self` for `docker node ls --format`

This commit adds a hidden placeholder of `.Self` for
`docker node ls --format` so that if the node is the same
as the current docker daemon, then a `*` is outputed.

Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
This commit is contained in:
Yong Tang 2017-03-08 10:29:15 -08:00
parent 32e21ecbfe
commit 7328ae12cc
5 changed files with 19 additions and 15 deletions

View File

@ -7,9 +7,10 @@ import (
) )
const ( const (
defaultNodeTableFormat = "table {{.ID}}\t{{.Hostname}}\t{{.Status}}\t{{.Availability}}\t{{.ManagerStatus}}" defaultNodeTableFormat = "table {{.ID}} {{if .Self}}*{{else}} {{ end }}\t{{.Hostname}}\t{{.Status}}\t{{.Availability}}\t{{.ManagerStatus}}"
nodeIDHeader = "ID" nodeIDHeader = "ID"
selfHeader = ""
hostnameHeader = "HOSTNAME" hostnameHeader = "HOSTNAME"
availabilityHeader = "AVAILABILITY" availabilityHeader = "AVAILABILITY"
managerStatusHeader = "MANAGER STATUS" managerStatusHeader = "MANAGER STATUS"
@ -46,6 +47,7 @@ func NodeWrite(ctx Context, nodes []swarm.Node, info types.Info) error {
nodeCtx := nodeContext{} nodeCtx := nodeContext{}
nodeCtx.header = nodeHeaderContext{ nodeCtx.header = nodeHeaderContext{
"ID": nodeIDHeader, "ID": nodeIDHeader,
"Self": selfHeader,
"Hostname": hostnameHeader, "Hostname": hostnameHeader,
"Status": statusHeader, "Status": statusHeader,
"Availability": availabilityHeader, "Availability": availabilityHeader,
@ -67,11 +69,11 @@ func (c *nodeContext) MarshalJSON() ([]byte, error) {
} }
func (c *nodeContext) ID() string { func (c *nodeContext) ID() string {
nodeID := c.n.ID return c.n.ID
if nodeID == c.info.Swarm.NodeID { }
nodeID = nodeID + " *"
} func (c *nodeContext) Self() bool {
return nodeID return c.n.ID == c.info.Swarm.NodeID
} }
func (c *nodeContext) Hostname() string { func (c *nodeContext) Hostname() string {

View File

@ -148,8 +148,8 @@ func TestNodeContextWriteJSON(t *testing.T) {
{ID: "nodeID2", Description: swarm.NodeDescription{Hostname: "foobar_bar"}}, {ID: "nodeID2", Description: swarm.NodeDescription{Hostname: "foobar_bar"}},
} }
expectedJSONs := []map[string]interface{}{ expectedJSONs := []map[string]interface{}{
{"Availability": "", "Hostname": "foobar_baz", "ID": "nodeID1", "ManagerStatus": "", "Status": ""}, {"Availability": "", "Hostname": "foobar_baz", "ID": "nodeID1", "ManagerStatus": "", "Status": "", "Self": false},
{"Availability": "", "Hostname": "foobar_bar", "ID": "nodeID2", "ManagerStatus": "", "Status": ""}, {"Availability": "", "Hostname": "foobar_bar", "ID": "nodeID2", "ManagerStatus": "", "Status": "", "Self": false},
} }
out := bytes.NewBufferString("") out := bytes.NewBufferString("")

View File

@ -129,7 +129,7 @@ func TestNodeListDefaultFormat(t *testing.T) {
}) })
cmd := newListCommand(cli) cmd := newListCommand(cli)
assert.NilError(t, cmd.Execute()) assert.NilError(t, cmd.Execute())
assert.Contains(t, buf.String(), `nodeID1 *: nodeHostname1 Ready/Leader`) assert.Contains(t, buf.String(), `nodeID1: nodeHostname1 Ready/Leader`)
assert.Contains(t, buf.String(), `nodeID2: nodeHostname2 Ready/Reachable`) assert.Contains(t, buf.String(), `nodeID2: nodeHostname2 Ready/Reachable`)
assert.Contains(t, buf.String(), `nodeID3: nodeHostname3 Ready`) assert.Contains(t, buf.String(), `nodeID3: nodeHostname3 Ready`)
} }

View File

@ -169,8 +169,8 @@ format. For a list of supported formatting directives, see
The property `nodesFormat` specifies the default format for `docker node ls` output. The property `nodesFormat` specifies the default format for `docker node ls` output.
When the `--format` flag is not provided with the `docker node ls` command, When the `--format` flag is not provided with the `docker node ls` command,
Docker's client uses this property. If this property is not set, the client Docker's client uses the value of `nodesFormat`. If the value of `nodesFormat` is not set,
falls back to the default table format. For a list of supported formatting the client uses the default table format. For a list of supported formatting
directives, see the [**Formatting** section in the `docker node ls` documentation](node_ls.md) directives, see the [**Formatting** section in the `docker node ls` documentation](node_ls.md)
The property `credsStore` specifies an external binary to serve as the default The property `credsStore` specifies an external binary to serve as the default

View File

@ -46,9 +46,10 @@ ID HOSTNAME STATUS AVAILABILITY MANAGER STATU
38ciaotwjuritcdtn9npbnkuz swarm-worker1 Ready Active 38ciaotwjuritcdtn9npbnkuz swarm-worker1 Ready Active
e216jshn25ckzbvmwlnh5jr3g * swarm-manager1 Ready Active Leader e216jshn25ckzbvmwlnh5jr3g * swarm-manager1 Ready Active Leader
``` ```
> **Note:** > **Note**:
> If the `ID` field of the node is followed by a `*` (e.g., `e216jshn25ckzbvmwlnh5jr3g *`) > In the above example output, there is a hidden column of `.Self` that indicates if the
> in the above example output, then this node is also the node of the current docker daemon. > node is the same node as the current docker daemon. A `*` (e.g., `e216jshn25ckzbvmwlnh5jr3g *`)
> means this node is the current docker daemon.
### Filtering ### Filtering
@ -139,6 +140,7 @@ Valid placeholders for the Go template are listed below:
Placeholder | Description Placeholder | Description
-----------------|------------------------------------------------------------------------------------------ -----------------|------------------------------------------------------------------------------------------
`.ID` | Node ID `.ID` | Node ID
`.Self` | Node of the daemon (`true/false`, `true`indicates that the node is the same as current docker daemon)
`.Hostname` | Node hostname `.Hostname` | Node hostname
`.Status` | Node status `.Status` | Node status
`.Availability` | Node availability ("active", "pause", or "drain") `.Availability` | Node availability ("active", "pause", or "drain")
@ -153,7 +155,7 @@ The following example uses a template without headers and outputs the
```bash ```bash
$ docker node ls --format "{{.ID}}: {{.Hostname}}" $ docker node ls --format "{{.ID}}: {{.Hostname}}"
e216jshn25ckzbvmwlnh5jr3g *: swarm-manager1 e216jshn25ckzbvmwlnh5jr3g: swarm-manager1
`` ``