Skip to content

Commit 0b256d3

Browse files
author
Marcus Linke
committed
Merge branch 'list-containers-filters' of https://github.com/carlossg/docker-java into carlossg-list-containers-filters
2 parents 9366a9d + 4725809 commit 0b256d3

File tree

5 files changed

+139
-5
lines changed

5 files changed

+139
-5
lines changed

src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.List;
44

55
import com.github.dockerjava.api.model.Container;
6+
import com.github.dockerjava.api.model.Filters;
67

78
/**
89
* List containers
@@ -31,6 +32,8 @@ public interface ListContainersCmd extends DockerCmd<List<Container>> {
3132

3233
public String getBeforeId();
3334

35+
public Filters getFilters();
36+
3437
public ListContainersCmd withShowAll(boolean showAll);
3538

3639
public ListContainersCmd withShowSize(boolean showSize);
@@ -41,6 +44,8 @@ public interface ListContainersCmd extends DockerCmd<List<Container>> {
4144

4245
public ListContainersCmd withBefore(String before);
4346

47+
public ListContainersCmd withFilters(Filters filters);
48+
4449
public static interface Exec extends DockerCmdExec<ListContainersCmd, List<Container>> {
4550
}
4651

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.github.dockerjava.api.model;
2+
3+
import java.util.HashMap;
4+
import java.util.List;
5+
import java.util.Map;
6+
7+
import javax.ws.rs.core.MediaType;
8+
9+
import com.fasterxml.jackson.core.JsonProcessingException;
10+
import com.fasterxml.jackson.databind.ObjectMapper;
11+
import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
12+
13+
/**
14+
* Representation of Docker filters.
15+
*
16+
* @author Carlos Sanchez <carlos@apache.org>
17+
*
18+
*/
19+
public class Filters {
20+
21+
private static ObjectMapper OBJECT_MAPPER = new JacksonJaxbJsonProvider().locateMapper(Map.class,
22+
MediaType.APPLICATION_JSON_TYPE);
23+
24+
private Map<String, String[]> filters = new HashMap<String, String[]>();
25+
26+
public Filters() {
27+
}
28+
29+
/**
30+
* Constructor.
31+
*
32+
* @param image
33+
* image to filter
34+
* @param container
35+
* container to filter
36+
*/
37+
public Filters(String image, String container) {
38+
withImage(image);
39+
withContainer(container);
40+
}
41+
42+
public Filters withFilter(String key, String... value) {
43+
filters.put(key, value);
44+
return this;
45+
}
46+
47+
public String[] getFilter(String key) {
48+
return filters.get(key);
49+
}
50+
51+
public Filters withImage(String... image) {
52+
filters.put("image", image);
53+
return this;
54+
}
55+
56+
public String[] getImage() {
57+
return getFilter("image");
58+
}
59+
60+
public Filters withContainer(String... container) {
61+
filters.put("container", container);
62+
return this;
63+
}
64+
65+
public String[] getContainer() {
66+
return getFilter("container");
67+
}
68+
69+
public Filters withLabel(String label) {
70+
return withLabel(label, (String[]) null);
71+
}
72+
73+
public Filters withLabel(String label, String... value) {
74+
if (value != null) {
75+
filters.put(label, value);
76+
} else {
77+
filters.put("label", new String[] { label });
78+
}
79+
return this;
80+
}
81+
82+
@Override
83+
public String toString() {
84+
try {
85+
return OBJECT_MAPPER.writeValueAsString(filters);
86+
} catch (JsonProcessingException e) {
87+
throw new RuntimeException(e);
88+
}
89+
}
90+
}

src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package com.github.dockerjava.core.command;
22

3-
import static com.google.common.base.Preconditions.checkArgument;
4-
import static com.google.common.base.Preconditions.checkNotNull;
3+
import static com.google.common.base.Preconditions.*;
54

65
import java.util.List;
76

87
import com.github.dockerjava.api.command.ListContainersCmd;
98
import com.github.dockerjava.api.model.Container;
9+
import com.github.dockerjava.api.model.Filters;
1010

1111
/**
1212
* List containers
@@ -32,6 +32,8 @@ public class ListContainersCmdImpl extends AbstrDockerCmd<ListContainersCmd, Lis
3232

3333
private String sinceId, beforeId;
3434

35+
private Filters filters;
36+
3537
public ListContainersCmdImpl(ListContainersCmd.Exec exec) {
3638
super(exec);
3739
}
@@ -61,6 +63,11 @@ public String getBeforeId() {
6163
return beforeId;
6264
}
6365

66+
@Override
67+
public Filters getFilters() {
68+
return filters;
69+
}
70+
6471
@Override
6572
public ListContainersCmd withShowAll(boolean showAll) {
6673
this.showAll = showAll;
@@ -94,11 +101,18 @@ public ListContainersCmd withBefore(String before) {
94101
return this;
95102
}
96103

104+
@Override
105+
public ListContainersCmd withFilters(Filters filters) {
106+
checkNotNull(filters, "filters was not specified");
107+
this.filters = filters;
108+
return this;
109+
}
110+
97111
@Override
98112
public String toString() {
99113
return new StringBuilder("ps ").append(showAll ? "--all=true" : "").append(showSize ? "--size=true" : "")
100114
.append(sinceId != null ? "--since " + sinceId : "")
101115
.append(beforeId != null ? "--before " + beforeId : "").append(limit != -1 ? "-n " + limit : "")
102-
.toString();
116+
.append(filters != null ? "--filters " + filters : "").toString();
103117
}
104118
}

src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.github.dockerjava.jaxrs;
22

3+
import static com.google.common.net.UrlEscapers.*;
4+
35
import java.util.List;
46

57
import javax.ws.rs.client.WebTarget;
@@ -32,6 +34,11 @@ protected List<Container> execute(ListContainersCmd command) {
3234
webResource = webResource.queryParam("limit", String.valueOf(command.getLimit()));
3335
}
3436

37+
if (command.getFilters() != null) {
38+
webResource = webResource.queryParam("filters",
39+
urlPathSegmentEscaper().escape(command.getFilters().toString()));
40+
}
41+
3542
LOGGER.trace("GET: {}", webResource);
3643
List<Container> containers = webResource.request().accept(MediaType.APPLICATION_JSON)
3744
.get(new GenericType<List<Container>>() {

src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626
import com.github.dockerjava.api.command.CreateContainerResponse;
2727
import com.github.dockerjava.api.command.InspectContainerResponse;
2828
import com.github.dockerjava.api.model.Container;
29+
import com.github.dockerjava.api.model.Filters;
2930
import com.github.dockerjava.client.AbstractDockerClientTest;
31+
import com.google.common.collect.ImmutableMap;
3032

3133
@Test(groups = "integration")
3234
public class ListContainersCmdImplTest extends AbstractDockerClientTest {
@@ -65,7 +67,8 @@ public void testListContainers() throws DockerException {
6567

6668
int size = containers.size();
6769

68-
CreateContainerResponse container1 = dockerClient.createContainerCmd(testImage).withCmd("echo").exec();
70+
CreateContainerResponse container1 = dockerClient.createContainerCmd(testImage).withCmd("echo")
71+
.withLabels(ImmutableMap.of("test", "docker-java")).exec();
6972

7073
assertThat(container1.getId(), not(isEmptyString()));
7174

@@ -96,7 +99,22 @@ public void testListContainers() throws DockerException {
9699

97100
Container container2 = filteredContainers.get(0);
98101
assertThat(container2.getCommand(), not(isEmptyString()));
99-
assertThat(container2.getImage(), startsWith(testImage + ":"));
102+
assertThat(container2.getImage(), startsWith(testImage));
103+
104+
// list with filter by label
105+
filteredContainers = dockerClient.listContainersCmd().withShowAll(true)
106+
.withFilters(new Filters().withLabel("test", "docker-java")).exec();
107+
assertThat(filteredContainers.size(), is(equalTo(1)));
108+
Container container3 = filteredContainers.get(0);
109+
assertThat(container3.getCommand(), not(isEmptyString()));
110+
assertThat(container3.getImage(), startsWith(testImage));
111+
112+
filteredContainers = dockerClient.listContainersCmd().withShowAll(true)
113+
.withFilters(new Filters().withLabel("test")).exec();
114+
assertThat(filteredContainers.size(), is(equalTo(1)));
115+
container3 = filteredContainers.get(0);
116+
assertThat(container3.getCommand(), not(isEmptyString()));
117+
assertThat(container3.getImage(), startsWith(testImage));
100118
}
101119

102120
}

0 commit comments

Comments
 (0)