Merge pull request #28627 from yongtang/28624-docker-plugin-ls

Add `--filter enabled=true` for `docker plugin ls`
Upstream-commit: c086c9f89c
Component: cli
This commit is contained in:
Vincent Demeester
2017-02-01 16:52:00 +01:00
committed by GitHub
3 changed files with 90 additions and 31 deletions

View File

@ -108,7 +108,7 @@ type NodeAPIClient interface {
// PluginAPIClient defines API client methods for the plugins
type PluginAPIClient interface {
PluginList(ctx context.Context) (types.PluginsListResponse, error)
PluginList(ctx context.Context, filter filters.Args) (types.PluginsListResponse, error)
PluginRemove(ctx context.Context, name string, options types.PluginRemoveOptions) error
PluginEnable(ctx context.Context, name string, options types.PluginEnableOptions) error
PluginDisable(ctx context.Context, name string, options types.PluginDisableOptions) error

View File

@ -2,15 +2,26 @@ package client
import (
"encoding/json"
"net/url"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/filters"
"golang.org/x/net/context"
)
// PluginList returns the installed plugins
func (cli *Client) PluginList(ctx context.Context) (types.PluginsListResponse, error) {
func (cli *Client) PluginList(ctx context.Context, filter filters.Args) (types.PluginsListResponse, error) {
var plugins types.PluginsListResponse
resp, err := cli.get(ctx, "/plugins", nil, nil)
query := url.Values{}
if filter.Len() > 0 {
filterJSON, err := filters.ToParamWithVersion(cli.version, filter)
if err != nil {
return plugins, err
}
query.Set("filters", filterJSON)
}
resp, err := cli.get(ctx, "/plugins", query, nil)
if err != nil {
return plugins, err
}

View File

@ -10,6 +10,7 @@ import (
"testing"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/filters"
"golang.org/x/net/context"
)
@ -18,7 +19,7 @@ func TestPluginListError(t *testing.T) {
client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
}
_, err := client.PluginList(context.Background())
_, err := client.PluginList(context.Background(), filters.NewArgs())
if err == nil || err.Error() != "Error response from daemon: Server error" {
t.Fatalf("expected a Server Error, got %v", err)
}
@ -26,34 +27,81 @@ func TestPluginListError(t *testing.T) {
func TestPluginList(t *testing.T) {
expectedURL := "/plugins"
client := &Client{
client: newMockClient(func(req *http.Request) (*http.Response, error) {
if !strings.HasPrefix(req.URL.Path, expectedURL) {
return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
}
content, err := json.Marshal([]*types.Plugin{
{
ID: "plugin_id1",
},
{
ID: "plugin_id2",
},
})
if err != nil {
return nil, err
}
return &http.Response{
StatusCode: http.StatusOK,
Body: ioutil.NopCloser(bytes.NewReader(content)),
}, nil
}),
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
}{
{
filters: filters.NewArgs(),
expectedQueryParams: map[string]string{
"all": "",
"filter": "",
"filters": "",
},
},
{
filters: enabledFilters,
expectedQueryParams: map[string]string{
"all": "",
"filter": "",
"filters": `{"enabled":{"true":true}}`,
},
},
{
filters: capabilityFilters,
expectedQueryParams: map[string]string{
"all": "",
"filter": "",
"filters": `{"capability":{"authz":true,"volumedriver":true}}`,
},
},
}
plugins, err := client.PluginList(context.Background())
if err != nil {
t.Fatal(err)
}
if len(plugins) != 2 {
t.Fatalf("expected 2 plugins, got %v", plugins)
for _, listCase := range listCases {
client := &Client{
client: newMockClient(func(req *http.Request) (*http.Response, error) {
if !strings.HasPrefix(req.URL.Path, expectedURL) {
return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
}
query := req.URL.Query()
for key, expected := range listCase.expectedQueryParams {
actual := query.Get(key)
if actual != expected {
return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual)
}
}
content, err := json.Marshal([]*types.Plugin{
{
ID: "plugin_id1",
},
{
ID: "plugin_id2",
},
})
if err != nil {
return nil, err
}
return &http.Response{
StatusCode: http.StatusOK,
Body: ioutil.NopCloser(bytes.NewReader(content)),
}, nil
}),
}
plugins, err := client.PluginList(context.Background(), listCase.filters)
if err != nil {
t.Fatal(err)
}
if len(plugins) != 2 {
t.Fatalf("expected 2 plugins, got %v", plugins)
}
}
}