diff --git a/dockerclient.go b/dockerclient.go index fb1fdd9..e192a2c 100644 --- a/dockerclient.go +++ b/dockerclient.go @@ -683,12 +683,17 @@ func (client *DockerClient) RemoveContainer(id string, force, volumes bool) erro return err } -func (client *DockerClient) ListImages(all bool) ([]*Image, error) { +func (client *DockerClient) ListImages(all bool, filters string) ([]*Image, error) { argAll := 0 if all { argAll = 1 } uri := fmt.Sprintf("/%s/images/json?all=%d", APIVersion, argAll) + + if filters != "" { + uri += "&filters=" + filters + } + data, err := client.doRequest("GET", uri, nil, nil) if err != nil { return nil, err diff --git a/dockerclient_test.go b/dockerclient_test.go index 808aca8..e210a38 100644 --- a/dockerclient_test.go +++ b/dockerclient_test.go @@ -274,3 +274,24 @@ func TestDockerClientInterface(t *testing.T) { t.Fatalf("DockerClient does not implement the Client interface") } } + +func TestListImages(t *testing.T) { + client := testDockerClient(t) + images, err := client.ListImages(true, "") + if err != nil { + t.Fatal("cannot list images: %s", err) + } + assertEqual(t, len(images), 2, "") +} + +func TestListDanglingImages(t *testing.T) { + client := testDockerClient(t) + + images, err := client.ListImages(true, "{'dangling':['true']}") + + if err != nil { + t.Fatal("cannot list images: %s", err) + } + + assertEqual(t, len(images), 1, "") +} diff --git a/engine_mock_test.go b/engine_mock_test.go index a3c76df..a15292f 100644 --- a/engine_mock_test.go +++ b/engine_mock_test.go @@ -30,6 +30,7 @@ func init() { r.HandleFunc(baseURL+"/containers/{id}/kill", handleContainerKill).Methods("POST") r.HandleFunc(baseURL+"/containers/{id}/wait", handleWait).Methods("POST") r.HandleFunc(baseURL+"/images/create", handleImagePull).Methods("POST") + r.HandleFunc(baseURL+"/images/json", handleGetImages).Methods("GET") r.HandleFunc(baseURL+"/events", handleEvents).Methods("GET") testHTTPServer = httptest.NewServer(handlerAccessLog(r)) } @@ -239,6 +240,64 @@ func handlerGetContainers(w http.ResponseWriter, r *http.Request) { w.Write([]byte(body)) } +func handleGetImages(w http.ResponseWriter, r *http.Request) { + writeHeaders(w, 200, "images") + body := `[ + { + "Id":"d39c3fa09ced9473c6e4fffa9d26c63cb531d60552abdaf58dd6e703b6662ecd", + "ParentId":"8eb845d8d7f6c255db9550bc1f6031f57d7e0cc599945644dc6f676928b9fec8", + "RepoTags":[ + "mysql:latest" + ], + "RepoDigests":[ + + ], + "Created":1453142946, + "Size":0, + "VirtualSize":360299416, + "Labels":null + }, + { + "Id":"0750f4b0fe91d69123565609507f4dd38e19a0469b56d080bd033d89675007ac", + "ParentId":"d77a278aa5b811a93644a73ada70eb941cbe1c7b269fa860723f8bb61e38961c", + "RepoTags":[ + "\u003cnone\u003e:\u003cnone\u003e" + ], + "RepoDigests":[ + "\u003cnone\u003e@\u003cnone\u003e" + ], + "Created":1452457247, + "Size":0, + "VirtualSize":655675014, + "Labels":{ + + } + } +]` + + if v, ok := r.URL.Query()["filters"]; ok { + if v[0] == "{'dangling':['true']}" { + body = `[{ + "Id":"0750f4b0fe91d69123565609507f4dd38e19a0469b56d080bd033d89675007ac", + "ParentId":"d77a278aa5b811a93644a73ada70eb941cbe1c7b269fa860723f8bb61e38961c", + "RepoTags":[ + "\u003cnone\u003e:\u003cnone\u003e" + ], + "RepoDigests":[ + "\u003cnone\u003e@\u003cnone\u003e" + ], + "Created":1452457247, + "Size":0, + "VirtualSize":655675014, + "Labels":{ + + } + }]` + } + } + w.Write([]byte(body)) +} + func handleEvents(w http.ResponseWriter, r *http.Request) { w.Write([]byte(eventsResp)) } diff --git a/interface.go b/interface.go index 45e1a2d..2a71eaa 100644 --- a/interface.go +++ b/interface.go @@ -40,7 +40,7 @@ type Client interface { PushImage(name string, tag string, auth *AuthConfig) error LoadImage(reader io.Reader) error RemoveContainer(id string, force, volumes bool) error - ListImages(all bool) ([]*Image, error) + ListImages(all bool, filters string) ([]*Image, error) RemoveImage(name string, force bool) ([]*ImageDelete, error) PauseContainer(name string) error UnpauseContainer(name string) error