Browse code

Add -a option to service/node ps

Signed-off-by: Josh Horwitz <horwitzja@gmail.com>

Josh Horwitz authored on 2016/11/03 22:58:45
Showing 5 changed files
... ...
@@ -17,6 +17,7 @@ import (
17 17
 
18 18
 type psOptions struct {
19 19
 	nodeIDs   []string
20
+	all       bool
20 21
 	noResolve bool
21 22
 	noTrunc   bool
22 23
 	filter    opts.FilterOpt
... ...
@@ -43,6 +44,7 @@ func newPsCommand(dockerCli *command.DockerCli) *cobra.Command {
43 43
 	flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Do not truncate output")
44 44
 	flags.BoolVar(&opts.noResolve, "no-resolve", false, "Do not map IDs to Names")
45 45
 	flags.VarP(&opts.filter, "filter", "f", "Filter output based on conditions provided")
46
+	flags.BoolVarP(&opts.all, "all", "a", false, "Show all tasks (default shows tasks that are or will be running)")
46 47
 
47 48
 	return cmd
48 49
 }
... ...
@@ -72,6 +74,11 @@ func runPs(dockerCli *command.DockerCli, opts psOptions) error {
72 72
 		filter := opts.filter.Value()
73 73
 		filter.Add("node", node.ID)
74 74
 
75
+		if !opts.all && !filter.Include("desired-state") {
76
+			filter.Add("desired-state", string(swarm.TaskStateRunning))
77
+			filter.Add("desired-state", string(swarm.TaskStateAccepted))
78
+		}
79
+
75 80
 		nodeTasks, err := client.TaskList(ctx, types.TaskListOptions{Filters: filter})
76 81
 		if err != nil {
77 82
 			errs = append(errs, err.Error())
... ...
@@ -2,6 +2,7 @@ package service
2 2
 
3 3
 import (
4 4
 	"github.com/docker/docker/api/types"
5
+	"github.com/docker/docker/api/types/swarm"
5 6
 	"github.com/docker/docker/cli"
6 7
 	"github.com/docker/docker/cli/command"
7 8
 	"github.com/docker/docker/cli/command/idresolver"
... ...
@@ -14,6 +15,7 @@ import (
14 14
 
15 15
 type psOptions struct {
16 16
 	serviceID string
17
+	all       bool
17 18
 	quiet     bool
18 19
 	noResolve bool
19 20
 	noTrunc   bool
... ...
@@ -37,6 +39,7 @@ func newPsCommand(dockerCli *command.DockerCli) *cobra.Command {
37 37
 	flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Do not truncate output")
38 38
 	flags.BoolVar(&opts.noResolve, "no-resolve", false, "Do not map IDs to Names")
39 39
 	flags.VarP(&opts.filter, "filter", "f", "Filter output based on conditions provided")
40
+	flags.BoolVarP(&opts.all, "all", "a", false, "Show all tasks (default shows tasks that are or will be running)")
40 41
 
41 42
 	return cmd
42 43
 }
... ...
@@ -64,6 +67,11 @@ func runPS(dockerCli *command.DockerCli, opts psOptions) error {
64 64
 		}
65 65
 	}
66 66
 
67
+	if !opts.all && !filter.Include("desired-state") {
68
+		filter.Add("desired-state", string(swarm.TaskStateRunning))
69
+		filter.Add("desired-state", string(swarm.TaskStateAccepted))
70
+	}
71
+
67 72
 	tasks, err := client.TaskList(ctx, types.TaskListOptions{Filters: filter})
68 73
 	if err != nil {
69 74
 		return err
... ...
@@ -22,7 +22,7 @@ Usage:  docker node ps [OPTIONS] [NODE...]
22 22
 List tasks running on one or more nodes, defaults to current node.
23 23
 
24 24
 Options:
25
-  -a, --all            Display all instances
25
+  -a, --all            Show all tasks (default shows tasks that are or will be running)
26 26
   -f, --filter value   Filter output based on conditions provided
27 27
       --help           Print usage
28 28
       --no-resolve     Do not map IDs to Names
... ...
@@ -22,6 +22,7 @@ Usage:  docker service ps [OPTIONS] SERVICE
22 22
 List the tasks of a service
23 23
 
24 24
 Options:
25
+  -a, --all             Show all tasks (default shows tasks that are or will be running)
25 26
   -f, --filter filter   Filter output based on conditions provided
26 27
       --help            Print usage
27 28
       --no-resolve      Do not map IDs to Names
... ...
@@ -203,6 +203,88 @@ func (s *DockerSwarmSuite) TestSwarmNodeTaskListFilter(c *check.C) {
203 203
 	c.Assert(out, checker.Not(checker.Contains), name+".1")
204 204
 	c.Assert(out, checker.Not(checker.Contains), name+".2")
205 205
 	c.Assert(out, checker.Not(checker.Contains), name+".3")
206
+
207
+	out, err = d.Cmd("node", "ps", "--filter", "desired-state=running", "self")
208
+	c.Assert(err, checker.IsNil)
209
+	c.Assert(out, checker.Contains, name+".1")
210
+	c.Assert(out, checker.Contains, name+".2")
211
+	c.Assert(out, checker.Contains, name+".3")
212
+
213
+	out, err = d.Cmd("node", "ps", "--filter", "desired-state=shutdown", "self")
214
+	c.Assert(err, checker.IsNil)
215
+	c.Assert(out, checker.Not(checker.Contains), name+".1")
216
+	c.Assert(out, checker.Not(checker.Contains), name+".2")
217
+	c.Assert(out, checker.Not(checker.Contains), name+".3")
218
+}
219
+
220
+func (s *DockerSwarmSuite) TestSwarmServiceTaskListAll(c *check.C) {
221
+	d := s.AddDaemon(c, true, true)
222
+
223
+	name := "service-task-list-1"
224
+	out, err := d.Cmd("service", "create", "--name", name, "--replicas=3", "busybox", "top")
225
+	c.Assert(err, checker.IsNil)
226
+	c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
227
+
228
+	// make sure task has been deployed.
229
+	waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 3)
230
+
231
+	out, err = d.Cmd("service", "ps", name)
232
+	c.Assert(err, checker.IsNil)
233
+	c.Assert(out, checker.Contains, name+".1")
234
+	c.Assert(out, checker.Contains, name+".2")
235
+	c.Assert(out, checker.Contains, name+".3")
236
+
237
+	// Get the last container id so we can restart it to cause a task error in the history
238
+	containerID, err := d.Cmd("ps", "-q", "-l")
239
+	c.Assert(err, checker.IsNil)
240
+
241
+	_, err = d.Cmd("stop", strings.TrimSpace(containerID))
242
+	c.Assert(err, checker.IsNil)
243
+
244
+	waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 3)
245
+
246
+	out, err = d.Cmd("service", "ps", name)
247
+	c.Assert(err, checker.IsNil)
248
+	c.Assert(out, checker.Count, name, 3)
249
+
250
+	out, err = d.Cmd("service", "ps", name, "-a")
251
+	c.Assert(err, checker.IsNil)
252
+	c.Assert(out, checker.Count, name, 4)
253
+}
254
+
255
+func (s *DockerSwarmSuite) TestSwarmNodeTaskListAll(c *check.C) {
256
+	d := s.AddDaemon(c, true, true)
257
+
258
+	name := "node-task-list"
259
+	out, err := d.Cmd("service", "create", "--name", name, "--replicas=3", "busybox", "top")
260
+	c.Assert(err, checker.IsNil)
261
+	c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
262
+
263
+	// make sure task has been deployed.
264
+	waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 3)
265
+
266
+	out, err = d.Cmd("service", "ps", name)
267
+	c.Assert(err, checker.IsNil)
268
+	c.Assert(out, checker.Contains, name+".1")
269
+	c.Assert(out, checker.Contains, name+".2")
270
+	c.Assert(out, checker.Contains, name+".3")
271
+
272
+	// Get the last container id so we can restart it to cause a task error in the history
273
+	containerID, err := d.Cmd("ps", "-q", "-l")
274
+	c.Assert(err, checker.IsNil)
275
+
276
+	_, err = d.Cmd("stop", strings.TrimSpace(containerID))
277
+	c.Assert(err, checker.IsNil)
278
+
279
+	waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 3)
280
+
281
+	out, err = d.Cmd("node", "ps", "self")
282
+	c.Assert(err, checker.IsNil)
283
+	c.Assert(out, checker.Count, name, 3)
284
+
285
+	out, err = d.Cmd("node", "ps", "self", "-a")
286
+	c.Assert(err, checker.IsNil)
287
+	c.Assert(out, checker.Count, name, 4)
206 288
 }
207 289
 
208 290
 // Test case for #25375