Browse code

Allow partial name match for `node ls`, and `node tasks`

This fix is an extension to last commit to expand the partial
filter to node and task searches.

Additional integration tests have been added to cover the changes.

This fix fixes 24270.
This fix fixes 24112.

Note: A separate pull request will be opened on swarmkit.

Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

Yong Tang authored on 2016/07/18 05:21:29
Showing 2 changed files
... ...
@@ -21,9 +21,9 @@ func newListNodesFilters(filter filters.Args) (*swarmapi.ListNodesRequest_Filter
21 21
 		return nil, err
22 22
 	}
23 23
 	f := &swarmapi.ListNodesRequest_Filters{
24
-		Names:      filter.Get("name"),
25
-		IDPrefixes: filter.Get("id"),
26
-		Labels:     runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
24
+		NamePrefixes: filter.Get("name"),
25
+		IDPrefixes:   filter.Get("id"),
26
+		Labels:       runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
27 27
 	}
28 28
 
29 29
 	for _, r := range filter.Get("role") {
... ...
@@ -79,11 +79,11 @@ func newListTasksFilters(filter filters.Args, transformFunc func(filters.Args) e
79 79
 		}
80 80
 	}
81 81
 	f := &swarmapi.ListTasksRequest_Filters{
82
-		Names:      filter.Get("name"),
83
-		IDPrefixes: filter.Get("id"),
84
-		Labels:     runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
85
-		ServiceIDs: filter.Get("service"),
86
-		NodeIDs:    filter.Get("node"),
82
+		NamePrefixes: filter.Get("name"),
83
+		IDPrefixes:   filter.Get("id"),
84
+		Labels:       runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
85
+		ServiceIDs:   filter.Get("service"),
86
+		NodeIDs:      filter.Get("node"),
87 87
 	}
88 88
 
89 89
 	for _, s := range filter.Get("desired-state") {
... ...
@@ -211,3 +211,45 @@ func (s *DockerSwarmSuite) TestSwarmServiceListFilter(c *check.C) {
211 211
 	c.Assert(out, checker.Contains, name2+" ")
212 212
 	c.Assert(out, checker.Contains, name3+" ")
213 213
 }
214
+
215
+func (s *DockerSwarmSuite) TestSwarmNodeListFilter(c *check.C) {
216
+	d := s.AddDaemon(c, true, true)
217
+
218
+	out, err := d.Cmd("node", "inspect", "--format", "{{ .Description.Hostname }}", "self")
219
+	c.Assert(err, checker.IsNil)
220
+	c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
221
+	name := strings.TrimSpace(out)
222
+
223
+	filter := "name=" + name[:4]
224
+
225
+	out, err = d.Cmd("node", "ls", "--filter", filter)
226
+	c.Assert(err, checker.IsNil)
227
+	c.Assert(out, checker.Contains, name)
228
+
229
+	out, err = d.Cmd("node", "ls", "--filter", "name=none")
230
+	c.Assert(err, checker.IsNil)
231
+	c.Assert(out, checker.Not(checker.Contains), name)
232
+}
233
+
234
+func (s *DockerSwarmSuite) TestSwarmNodeTaskListFilter(c *check.C) {
235
+	d := s.AddDaemon(c, true, true)
236
+
237
+	name := "redis-cluster-md5"
238
+	out, err := d.Cmd("service", "create", "--name", name, "--replicas=3", "busybox", "top")
239
+	c.Assert(err, checker.IsNil)
240
+	c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
241
+
242
+	filter := "name=redis-cluster"
243
+
244
+	out, err = d.Cmd("node", "tasks", "--filter", filter, "self")
245
+	c.Assert(err, checker.IsNil)
246
+	c.Assert(out, checker.Contains, name+".1")
247
+	c.Assert(out, checker.Contains, name+".2")
248
+	c.Assert(out, checker.Contains, name+".3")
249
+
250
+	out, err = d.Cmd("node", "tasks", "--filter", "name=none", "self")
251
+	c.Assert(err, checker.IsNil)
252
+	c.Assert(out, checker.Not(checker.Contains), name+".1")
253
+	c.Assert(out, checker.Not(checker.Contains), name+".2")
254
+	c.Assert(out, checker.Not(checker.Contains), name+".3")
255
+}