From 99d91ada97334116b26b34a0fdcfa83cce73cda3 Mon Sep 17 00:00:00 2001 From: Yong Tang Date: Wed, 23 Nov 2016 05:27:09 -0800 Subject: [PATCH] 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 --- client/plugin_list_test.go | 12 +++++++++ docs/extend/config.md | 8 ++++-- docs/reference/commandline/plugin_ls.md | 15 +++++++++++ .../docker_cli_daemon_plugins_test.go | 27 +++++++++++++++++++ plugin/backend_linux.go | 11 +++++++- 5 files changed, 70 insertions(+), 3 deletions(-) diff --git a/client/plugin_list_test.go b/client/plugin_list_test.go index 6a0e9844fc..6887079b42 100644 --- a/client/plugin_list_test.go +++ b/client/plugin_list_test.go @@ -31,6 +31,10 @@ func TestPluginList(t *testing.T) { enabledFilters := filters.NewArgs() enabledFilters.Add("enabled", "true") + capabilityFilters := filters.NewArgs() + capabilityFilters.Add("capability", "volumedriver") + capabilityFilters.Add("capability", "authz") + listCases := []struct { filters filters.Args expectedQueryParams map[string]string @@ -51,6 +55,14 @@ func TestPluginList(t *testing.T) { "filters": `{"enabled":{"true":true}}`, }, }, + { + filters: capabilityFilters, + expectedQueryParams: map[string]string{ + "all": "", + "filter": "", + "filters": `{"capability":{"authz":true,"volumedriver":true}}`, + }, + }, } for _, listCase := range listCases { diff --git a/docs/extend/config.md b/docs/extend/config.md index b98be592a0..eaa52fd9bc 100644 --- a/docs/extend/config.md +++ b/docs/extend/config.md @@ -51,9 +51,13 @@ Config provides the base accessible fields for working with V0 plugin format currently supported: - - **docker.volumedriver/1.0** + - **docker.volumedriver/1.0** - - **docker.authz/1.0** + - **docker.networkdriver/1.0** + + - **docker.ipamdriver/1.0** + + - **docker.authz/1.0** - **`socket`** *string* diff --git a/docs/reference/commandline/plugin_ls.md b/docs/reference/commandline/plugin_ls.md index b6cac6ffb7..c018dec813 100644 --- a/docs/reference/commandline/plugin_ls.md +++ b/docs/reference/commandline/plugin_ls.md @@ -53,11 +53,26 @@ than one filter, then pass multiple flags (e.g., `--filter "foo=bar" --filter "b The currently supported filters are: * enabled (boolean - true or false, 0 or 1) +* capability (string - currently `volumedriver`, `networkdriver`, `ipamdriver`, or `authz`) ### enabled The `enabled` filter matches on plugins enabled or disabled. +### capability + +The `capability` filter matches on plugin capabilities. One plugin +might have multiple capabilities. Currently `volumedriver`, `networkdriver`, +`ipamdriver`, and `authz` are supported capabilities. + +```bash +$ docker plugin install --disable tiborvass/no-remove +tiborvass/no-remove + +$ docker plugin ls --filter enabled=true +NAME TAG DESCRIPTION ENABLED +``` + ## Formatting diff --git a/integration-cli/docker_cli_daemon_plugins_test.go b/integration-cli/docker_cli_daemon_plugins_test.go index 764a207f35..f03672685f 100644 --- a/integration-cli/docker_cli_daemon_plugins_test.go +++ b/integration-cli/docker_cli_daemon_plugins_test.go @@ -313,3 +313,30 @@ func (s *DockerDaemonSuite) TestPluginListFilterEnabled(c *check.C) { c.Assert(err, checker.IsNil) c.Assert(out, checker.Contains, pName) } + +func (s *DockerDaemonSuite) TestPluginListFilterCapability(c *check.C) { + testRequires(c, Network) + + s.d.Start(c) + + out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pNameWithTag, "--disable") + c.Assert(err, check.IsNil, check.Commentf(out)) + + defer func() { + if out, err := s.d.Cmd("plugin", "remove", pNameWithTag); err != nil { + c.Fatalf("Could not remove plugin: %v %s", err, out) + } + }() + + out, err = s.d.Cmd("plugin", "ls", "--filter", "capability=volumedriver") + c.Assert(err, checker.IsNil) + c.Assert(out, checker.Contains, pName) + + out, err = s.d.Cmd("plugin", "ls", "--filter", "capability=authz") + c.Assert(err, checker.IsNil) + c.Assert(out, checker.Not(checker.Contains), pName) + + out, err = s.d.Cmd("plugin", "ls") + c.Assert(err, checker.IsNil) + c.Assert(out, checker.Contains, pName) +} diff --git a/plugin/backend_linux.go b/plugin/backend_linux.go index 0b376198e2..cc42058bc2 100644 --- a/plugin/backend_linux.go +++ b/plugin/backend_linux.go @@ -35,7 +35,8 @@ import ( ) var acceptedPluginFilterTags = map[string]bool{ - "enabled": true, + "enabled": true, + "capability": true, } // 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) { plugins := pm.config.Store.GetAll() out := make([]types.Plugin, 0, len(plugins)) +next: for _, p := range plugins { if enabledOnly && !p.PluginObj.Enabled { continue @@ -291,6 +293,13 @@ func (pm *Manager) List(pluginFilters filters.Args) ([]types.Plugin, error) { if disabledOnly && p.PluginObj.Enabled { continue } + if pluginFilters.Include("capability") { + for _, f := range p.GetTypes() { + if !pluginFilters.Match("capability", f.Capability) { + continue next + } + } + } out = append(out, p.PluginObj) } return out, nil