Browse code

Allow partial name match for `service ls --filter`

This fix tries to address the issue raised in 24270 where it was
not possible to have a partial name match when list services
with name filter.

This fix updates swarmkit and allows prefix search when name is
provided as the filter for listing services.

An additional integration test is added to cover the changes.

This fix fixes 24270.

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

Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
(cherry picked from commit 1d600ebcb5750c4c93356fae08e562d836ecee45)
Signed-off-by: Tibor Vass <tibor@docker.com>

Yong Tang authored on 2016/07/14 11:09:07
Showing 2 changed files
... ...
@@ -55,9 +55,9 @@ func newListServicesFilters(filter filters.Args) (*swarmapi.ListServicesRequest_
55 55
 		return nil, err
56 56
 	}
57 57
 	return &swarmapi.ListServicesRequest_Filters{
58
-		Names:      filter.Get("name"),
59
-		IDPrefixes: filter.Get("id"),
60
-		Labels:     runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
58
+		NamePrefixes: filter.Get("name"),
59
+		IDPrefixes:   filter.Get("id"),
60
+		Labels:       runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
61 61
 	}, nil
62 62
 }
63 63
 
... ...
@@ -169,3 +169,45 @@ func (s *DockerSwarmSuite) TestSwarmNodeListHostname(c *check.C) {
169 169
 	c.Assert(err, checker.IsNil)
170 170
 	c.Assert(strings.Split(out, "\n")[0], checker.Contains, "HOSTNAME")
171 171
 }
172
+
173
+// Test case for #24270
174
+func (s *DockerSwarmSuite) TestSwarmServiceListFilter(c *check.C) {
175
+	d := s.AddDaemon(c, true, true)
176
+
177
+	name1 := "redis-cluster-md5"
178
+	name2 := "redis-cluster"
179
+	name3 := "other-cluster"
180
+	out, err := d.Cmd("service", "create", "--name", name1, "busybox", "top")
181
+	c.Assert(err, checker.IsNil)
182
+	c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
183
+
184
+	out, err = d.Cmd("service", "create", "--name", name2, "busybox", "top")
185
+	c.Assert(err, checker.IsNil)
186
+	c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
187
+
188
+	out, err = d.Cmd("service", "create", "--name", name3, "busybox", "top")
189
+	c.Assert(err, checker.IsNil)
190
+	c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
191
+
192
+	filter1 := "name=redis-cluster-md5"
193
+	filter2 := "name=redis-cluster"
194
+
195
+	// We search checker.Contains with `name+" "` to prevent prefix only.
196
+	out, err = d.Cmd("service", "ls", "--filter", filter1)
197
+	c.Assert(err, checker.IsNil)
198
+	c.Assert(out, checker.Contains, name1+" ")
199
+	c.Assert(out, checker.Not(checker.Contains), name2+" ")
200
+	c.Assert(out, checker.Not(checker.Contains), name3+" ")
201
+
202
+	out, err = d.Cmd("service", "ls", "--filter", filter2)
203
+	c.Assert(err, checker.IsNil)
204
+	c.Assert(out, checker.Contains, name1+" ")
205
+	c.Assert(out, checker.Contains, name2+" ")
206
+	c.Assert(out, checker.Not(checker.Contains), name3+" ")
207
+
208
+	out, err = d.Cmd("service", "ls")
209
+	c.Assert(err, checker.IsNil)
210
+	c.Assert(out, checker.Contains, name1+" ")
211
+	c.Assert(out, checker.Contains, name2+" ")
212
+	c.Assert(out, checker.Contains, name3+" ")
213
+}