Browse code

Add `capability` filter to `docker plugin ls`

This fix adds `--filter capability=[volumedriver|authz]` to `docker plugin ls`.

The related docs has been updated.

An integration test has been added.

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

Yong Tang authored on 2016/11/23 22:27:09
Showing 5 changed files
... ...
@@ -31,6 +31,10 @@ func TestPluginList(t *testing.T) {
31 31
 	enabledFilters := filters.NewArgs()
32 32
 	enabledFilters.Add("enabled", "true")
33 33
 
34
+	capabilityFilters := filters.NewArgs()
35
+	capabilityFilters.Add("capability", "volumedriver")
36
+	capabilityFilters.Add("capability", "authz")
37
+
34 38
 	listCases := []struct {
35 39
 		filters             filters.Args
36 40
 		expectedQueryParams map[string]string
... ...
@@ -51,6 +55,14 @@ func TestPluginList(t *testing.T) {
51 51
 				"filters": `{"enabled":{"true":true}}`,
52 52
 			},
53 53
 		},
54
+		{
55
+			filters: capabilityFilters,
56
+			expectedQueryParams: map[string]string{
57
+				"all":     "",
58
+				"filter":  "",
59
+				"filters": `{"capability":{"authz":true,"volumedriver":true}}`,
60
+			},
61
+		},
54 62
 	}
55 63
 
56 64
 	for _, listCase := range listCases {
... ...
@@ -51,9 +51,13 @@ Config provides the base accessible fields for working with V0 plugin format
51 51
 
52 52
       currently supported:
53 53
 
54
-      	- **docker.volumedriver/1.0**
54
+        - **docker.volumedriver/1.0**
55 55
 
56
-      	- **docker.authz/1.0**
56
+        - **docker.networkdriver/1.0**
57
+
58
+        - **docker.ipamdriver/1.0**
59
+
60
+        - **docker.authz/1.0**
57 61
 
58 62
     - **`socket`** *string*
59 63
 
... ...
@@ -53,11 +53,26 @@ than one filter, then pass multiple flags (e.g., `--filter "foo=bar" --filter "b
53 53
 The currently supported filters are:
54 54
 
55 55
 * enabled (boolean - true or false, 0 or 1)
56
+* capability (string - currently `volumedriver`, `networkdriver`, `ipamdriver`, or `authz`)
56 57
 
57 58
 ### enabled
58 59
 
59 60
 The `enabled` filter matches on plugins enabled or disabled.
60 61
 
62
+### capability
63
+
64
+The `capability` filter matches on plugin capabilities. One plugin
65
+might have multiple capabilities. Currently `volumedriver`, `networkdriver`,
66
+`ipamdriver`, and `authz` are supported capabilities.
67
+
68
+```bash
69
+$ docker plugin install --disable tiborvass/no-remove
70
+tiborvass/no-remove
71
+
72
+$ docker plugin ls --filter enabled=true
73
+NAME                  TAG                 DESCRIPTION                ENABLED
74
+```
75
+
61 76
 
62 77
 ## Formatting
63 78
 
... ...
@@ -313,3 +313,30 @@ func (s *DockerDaemonSuite) TestPluginListFilterEnabled(c *check.C) {
313 313
 	c.Assert(err, checker.IsNil)
314 314
 	c.Assert(out, checker.Contains, pName)
315 315
 }
316
+
317
+func (s *DockerDaemonSuite) TestPluginListFilterCapability(c *check.C) {
318
+	testRequires(c, Network)
319
+
320
+	s.d.Start(c)
321
+
322
+	out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pNameWithTag, "--disable")
323
+	c.Assert(err, check.IsNil, check.Commentf(out))
324
+
325
+	defer func() {
326
+		if out, err := s.d.Cmd("plugin", "remove", pNameWithTag); err != nil {
327
+			c.Fatalf("Could not remove plugin: %v %s", err, out)
328
+		}
329
+	}()
330
+
331
+	out, err = s.d.Cmd("plugin", "ls", "--filter", "capability=volumedriver")
332
+	c.Assert(err, checker.IsNil)
333
+	c.Assert(out, checker.Contains, pName)
334
+
335
+	out, err = s.d.Cmd("plugin", "ls", "--filter", "capability=authz")
336
+	c.Assert(err, checker.IsNil)
337
+	c.Assert(out, checker.Not(checker.Contains), pName)
338
+
339
+	out, err = s.d.Cmd("plugin", "ls")
340
+	c.Assert(err, checker.IsNil)
341
+	c.Assert(out, checker.Contains, pName)
342
+}
... ...
@@ -35,7 +35,8 @@ import (
35 35
 )
36 36
 
37 37
 var acceptedPluginFilterTags = map[string]bool{
38
-	"enabled": true,
38
+	"enabled":    true,
39
+	"capability": true,
39 40
 }
40 41
 
41 42
 // Disable deactivates a plugin. This means resources (volumes, networks) cant use them.
... ...
@@ -284,6 +285,7 @@ func (pm *Manager) List(pluginFilters filters.Args) ([]types.Plugin, error) {
284 284
 	plugins := pm.config.Store.GetAll()
285 285
 	out := make([]types.Plugin, 0, len(plugins))
286 286
 
287
+next:
287 288
 	for _, p := range plugins {
288 289
 		if enabledOnly && !p.PluginObj.Enabled {
289 290
 			continue
... ...
@@ -291,6 +293,13 @@ func (pm *Manager) List(pluginFilters filters.Args) ([]types.Plugin, error) {
291 291
 		if disabledOnly && p.PluginObj.Enabled {
292 292
 			continue
293 293
 		}
294
+		if pluginFilters.Include("capability") {
295
+			for _, f := range p.GetTypes() {
296
+				if !pluginFilters.Match("capability", f.Capability) {
297
+					continue next
298
+				}
299
+			}
300
+		}
294 301
 		out = append(out, p.PluginObj)
295 302
 	}
296 303
 	return out, nil