From acfe65de6f4ef1392a9bc561a01d88268ef9869b Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 18 Jan 2016 21:53:13 +0100 Subject: [PATCH] Refactored filters API --- .../dockerjava/api/command/EventsCmd.java | 49 ++++++++++++--- .../api/command/ListContainersCmd.java | 62 ++++++++++++++----- .../dockerjava/api/command/ListImagesCmd.java | 32 +++++++--- .../api/command/ListNetworksCmd.java | 8 ++- .../api/command/ListVolumesCmd.java | 13 ++-- .../dockerjava/api/model/EventFilters.java | 37 ----------- .../dockerjava/api/model/NetworkFilters.java | 15 ----- .../api/model/PullResponseItem.java | 1 - .../core/command/EventsCmdImpl.java | 45 +++++++++++--- .../core/command/ListContainersCmdImpl.java | 49 +++++++++------ .../core/command/ListImagesCmdImpl.java | 56 +++++++++++++---- .../core/command/ListNetworksCmdImpl.java | 23 ++++--- .../core/command/ListVolumesCmdImpl.java | 16 +++-- .../util/FiltersBuilder.java} | 39 ++++-------- .../dockerjava/core/util/FiltersEncoder.java | 30 +++++++++ .../dockerjava/jaxrs/EventsCmdExec.java | 5 +- .../jaxrs/ListContainersCmdExec.java | 3 +- .../dockerjava/jaxrs/ListImagesCmdExec.java | 10 ++- .../dockerjava/jaxrs/ListNetworksCmdExec.java | 7 ++- .../dockerjava/jaxrs/ListVolumesCmdExec.java | 5 +- .../dockerjava/netty/exec/EventsCmdExec.java | 5 +- .../netty/exec/ListContainersCmdExec.java | 3 +- .../netty/exec/ListImagesCmdExec.java | 5 +- .../netty/exec/ListNetworksCmdExec.java | 6 +- .../netty/exec/ListVolumesCmdExec.java | 5 +- .../dockerjava/api/model/FiltersTest.java | 58 ----------------- .../core/command/EventsCmdImplTest.java | 3 +- .../command/ListContainersCmdImplTest.java | 5 +- .../core/command/ListImagesCmdImplTest.java | 7 +-- .../core/util/FiltersBuilderTest.java | 61 ++++++++++++++++++ .../netty/exec/EventsCmdExecTest.java | 3 +- .../netty/exec/ListContainersCmdExecTest.java | 6 +- .../netty/exec/ListImagesCmdExecTest.java | 8 +-- 33 files changed, 412 insertions(+), 268 deletions(-) delete mode 100644 src/main/java/com/github/dockerjava/api/model/EventFilters.java delete mode 100644 src/main/java/com/github/dockerjava/api/model/NetworkFilters.java rename src/main/java/com/github/dockerjava/{api/model/Filters.java => core/util/FiltersBuilder.java} (66%) create mode 100644 src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java delete mode 100644 src/test/java/com/github/dockerjava/api/model/FiltersTest.java create mode 100644 src/test/java/com/github/dockerjava/core/util/FiltersBuilderTest.java diff --git a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java index 4020a8e72..8c03270df 100644 --- a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java @@ -1,22 +1,19 @@ package com.github.dockerjava.api.command; +import java.util.List; +import java.util.Map; + import javax.annotation.CheckForNull; import com.github.dockerjava.api.model.Event; -import com.github.dockerjava.api.model.Filters; /** * Get events - * - * @param since - * - Show all events created since timestamp - * @param until - * - Stream events until this timestamp */ public interface EventsCmd extends AsyncDockerCmd { @CheckForNull - public Filters getFilters(); + public Map> getFilters(); @CheckForNull public String getSince(); @@ -24,10 +21,46 @@ public interface EventsCmd extends AsyncDockerCmd { @CheckForNull public String getUntil(); - public EventsCmd withFilters(Filters filters); + /** + * @param container + * - container to filter + */ + public EventsCmd withContainerFilter(String... container); + + /** + * @param event + * - event to filter (pull | create | attach | start | stop | kill) + */ + public EventsCmd withEventFilter(String... event); + + /** + * @param image + * - image to filter + */ + public EventsCmd withImageFilter(String... image); + + /** + * @param label + * - label to filter + */ + public EventsCmd withLabelFilter(String... label); + + /** + * @param labels + * - labels to filter (map of names and values) + */ + public EventsCmd withLabelFilter(Map labels); + /** + * @param since + * - Show all events created since timestamp + */ public EventsCmd withSince(String since); + /** + * @param until + * - Show all events created until timestamp + */ public EventsCmd withUntil(String until); public static interface Exec extends DockerCmdAsyncExec { diff --git a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java index 87faec0b3..842f242cc 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java @@ -1,26 +1,15 @@ package com.github.dockerjava.api.command; import java.util.List; +import java.util.Map; import javax.annotation.CheckForNull; import com.github.dockerjava.api.model.Container; -import com.github.dockerjava.api.model.Filters; /** * List containers * - * @param showAll - * - true or false, Show all containers. Only running containers are shown by default. - * @param showSize - * - true or false, Show the containers sizes. This is false by default. - * @param limit - * - Show `limit` last created containers, include non-running ones. There is no limit by default. - * @param sinceId - * - Show only containers created since Id, include non-running ones. - * @param beforeId - * - Show only containers created before Id, include non-running ones. - * */ public interface ListContainersCmd extends SyncDockerCmd> { @@ -28,7 +17,7 @@ public interface ListContainersCmd extends SyncDockerCmd> { public String getBeforeId(); @CheckForNull - public Filters getFilters(); + public Map> getFilters(); @CheckForNull public Integer getLimit(); @@ -42,16 +31,59 @@ public interface ListContainersCmd extends SyncDockerCmd> { @CheckForNull public Boolean hasShowSizeEnabled(); + /** + * @param beforeId + * - Show only containers created before Id, include non-running ones. + */ public ListContainersCmd withBefore(String before); - public ListContainersCmd withFilters(Filters filters); - + /** + * @param exitcode + * - Show only containers that exited with the passed exitcode. + */ + public ListContainersCmd withExitcodeFilter(Integer exitcode); + + /** + * @param exitcode + * - Show only containers with the passed status (created|restarting|running|paused|exited). + */ + public ListContainersCmd withStatusFilter(String status); + + /** + * @param labels + * - Show only containers with the passed labels. + */ + public ListContainersCmd withLabelFilter(String... labels); + + /** + * @param labels + * - Show only containers with the passed labels. Labels is a {@link Map} that contains label keys and + * values + */ + public ListContainersCmd withLabelFilter(Map labels); + + /** + * @param limit + * - Show `limit` last created containers, include non-running ones. There is no limit by default. + */ public ListContainersCmd withLimit(Integer limit); + /** + * @param showAll + * - Show all containers. Only running containers are shown by default. + */ public ListContainersCmd withShowAll(Boolean showAll); + /** + * @param showSize + * - Show the containers sizes. This is false by default. + */ public ListContainersCmd withShowSize(Boolean showSize); + /** + * @param sinceId + * - Show only containers created since Id, include non-running ones. + */ public ListContainersCmd withSince(String since); public static interface Exec extends DockerCmdSyncExec> { diff --git a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java index 3ef40f48f..7dee8c918 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java @@ -1,6 +1,7 @@ package com.github.dockerjava.api.command; import java.util.List; +import java.util.Map; import javax.annotation.CheckForNull; @@ -8,23 +9,40 @@ /** * List images - * - * @param showAll - * - Show all images (by default filter out the intermediate images used to build) - * @param filters - * - a json encoded value of the filters (a map[string][]string) to process on the images list. */ public interface ListImagesCmd extends SyncDockerCmd> { @CheckForNull - public String getFilters(); + public Map> getFilters(); + + public String getImageNameFilter(); @CheckForNull public Boolean hasShowAllEnabled(); + /** + * Show all images (by default filter out the intermediate images used to build) + */ public ListImagesCmd withShowAll(Boolean showAll); - public ListImagesCmd withFilters(String filters); + public ListImagesCmd withImageNameFilter(String imageName); + + /** + * Filter dangling images + */ + public ListImagesCmd withDanglingFilter(Boolean dangling); + + /** + * @param labels + * - string array in the form ["key"] or ["key=value"] or a mix of both + */ + public ListImagesCmd withLabelFilter(String... label); + + /** + * @param labels + * - {@link Map} of labels that contains label keys and values + */ + public ListImagesCmd withLabelFilter(Map labels); public static interface Exec extends DockerCmdSyncExec> { } diff --git a/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java b/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java index 2b5b29996..dd3c89c7b 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java @@ -1,12 +1,12 @@ package com.github.dockerjava.api.command; -import com.github.dockerjava.api.model.Filters; import com.github.dockerjava.api.model.Network; import com.github.dockerjava.core.RemoteApiVersion; import javax.annotation.CheckForNull; import java.util.List; +import java.util.Map; /** * List networks. @@ -16,9 +16,11 @@ public interface ListNetworksCmd extends SyncDockerCmd> { @CheckForNull - public Filters getFilters(); + public Map> getFilters(); - ListNetworksCmd withFilters(Filters filters); + ListNetworksCmd withNameFilter(String... networkName); + + ListNetworksCmd withIdFilter(String... networkId); public static interface Exec extends DockerCmdSyncExec> { } diff --git a/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java b/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java index f900f1967..a049aa20f 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java @@ -1,24 +1,25 @@ package com.github.dockerjava.api.command; +import java.util.List; +import java.util.Map; + import javax.annotation.CheckForNull; /** * List volumes. * - * * @author Marcus Linke */ public interface ListVolumesCmd extends SyncDockerCmd { @CheckForNull - public String getFilters(); + public Map> getFilters(); /** - * @param filters - * - JSON encoded value of the filters (a map[string][]string) to process on the volumes list. There is - * one available filter: dangling=true + * @param dangling + * - Show dangling volumes filter */ - public ListVolumesCmd withFilters(String filters); + public ListVolumesCmd withDanglingFilter(Boolean dangling); public static interface Exec extends DockerCmdSyncExec { } diff --git a/src/main/java/com/github/dockerjava/api/model/EventFilters.java b/src/main/java/com/github/dockerjava/api/model/EventFilters.java deleted file mode 100644 index 08cb7ad11..000000000 --- a/src/main/java/com/github/dockerjava/api/model/EventFilters.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.github.dockerjava.api.model; - -import java.util.List; - -/** - * Representation of a Docker event filter. - * - * @author Carlos Sanchez - * - */ -public class EventFilters extends Filters { - - /** - * Default constructor for the deserialization. - */ - public EventFilters() { - } - - /** - * Constructor. - * - * @param event - * event to filter - */ - public EventFilters(String... event) { - super(); - withEvent(event); - } - - public Filters withEvent(String... event) { - return withFilter("event", event); - } - - public List getEvent() { - return getFilter("event"); - } -} diff --git a/src/main/java/com/github/dockerjava/api/model/NetworkFilters.java b/src/main/java/com/github/dockerjava/api/model/NetworkFilters.java deleted file mode 100644 index f3c837643..000000000 --- a/src/main/java/com/github/dockerjava/api/model/NetworkFilters.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.github.dockerjava.api.model; - -/** - * Created by andrewk on 1/5/16. - */ -public class NetworkFilters extends Filters { - - public Filters withNames(String... names) { - return withFilter("name", names); - } - - public Filters withIds(String... ids) { - return withFilter("id", ids); - } -} diff --git a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java index c18d12bd0..3ab77bee0 100644 --- a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java @@ -33,5 +33,4 @@ public boolean isPullSuccessIndicated() { return (getStatus().contains(DOWNLOAD_COMPLETE) || getStatus().contains(IMAGE_UP_TO_DATE) || getStatus().contains(DOWNLOADED_NEWER_IMAGE) || getStatus().contains(LEGACY_REGISTRY)); } - } diff --git a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java index 9bd34e57d..230f6dd5a 100644 --- a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java @@ -2,9 +2,12 @@ import static com.google.common.base.Preconditions.checkNotNull; +import java.util.List; +import java.util.Map; + import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.model.Event; -import com.github.dockerjava.api.model.Filters; +import com.github.dockerjava.core.util.FiltersBuilder; /** * Stream docker events @@ -15,7 +18,7 @@ public class EventsCmdImpl extends AbstrAsyncDockerCmd impleme private String until; - private Filters filters; + private FiltersBuilder filters = new FiltersBuilder(); public EventsCmdImpl(EventsCmd.Exec exec) { super(exec); @@ -34,9 +37,37 @@ public EventsCmd withUntil(String until) { } @Override - public EventsCmd withFilters(Filters filters) { - checkNotNull(filters, "filters have not been specified"); - this.filters = filters; + public EventsCmd withContainerFilter(String... container) { + checkNotNull(container, "container have not been specified"); + this.filters.withContainers(container); + return this; + } + + @Override + public EventsCmd withImageFilter(String... image) { + checkNotNull(image, "image have not been specified"); + this.filters.withImages(image); + return this; + } + + @Override + public EventsCmd withEventFilter(String... event) { + checkNotNull(event, "event have not been specified"); + this.filters.withFilter("event", event); + return this; + } + + @Override + public EventsCmd withLabelFilter(String... label) { + checkNotNull(label, "label have not been specified"); + this.filters.withLabels(label); + return this; + } + + @Override + public EventsCmd withLabelFilter(Map labels) { + checkNotNull(labels, "labels have not been specified"); + this.filters.withLabels(labels); return this; } @@ -51,8 +82,8 @@ public String getUntil() { } @Override - public Filters getFilters() { - return filters; + public Map> getFilters() { + return filters.build(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java index b7a70603d..8e8e194da 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java @@ -4,25 +4,14 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.List; +import java.util.Map; import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.model.Container; -import com.github.dockerjava.api.model.Filters; +import com.github.dockerjava.core.util.FiltersBuilder; /** - * List containers - * - * @param showAll - * - true or false, Show all containers. Only running containers are shown by default. - * @param showSize - * - true or false, Show the containers sizes. This is false by default. - * @param limit - * - Show `limit` last created containers, include non-running ones. There is no limit by default. - * @param sinceId - * - Show only containers created since Id, include non-running ones. - * @param beforeId - * - Show only containers created before Id, include non-running ones. - * + * List containers. */ public class ListContainersCmdImpl extends AbstrDockerCmd> implements ListContainersCmd { @@ -33,7 +22,7 @@ public class ListContainersCmdImpl extends AbstrDockerCmd> getFilters() { + return filters.build(); } @Override @@ -104,10 +93,30 @@ public ListContainersCmd withBefore(String before) { } @Override - public ListContainersCmd withFilters(Filters filters) { - checkNotNull(filters, "filters was not specified"); - this.filters = filters; + public ListContainersCmd withLabelFilter(String... labels) { + checkNotNull(labels, "labels was not specified"); + this.filters.withLabels(labels); return this; } + @Override + public ListContainersCmd withLabelFilter(Map labels) { + checkNotNull(labels, "labels was not specified"); + this.filters.withLabels(labels); + return this; + } + + @Override + public ListContainersCmd withExitcodeFilter(Integer exitcode) { + checkNotNull(exitcode, "exitcode was not specified"); + this.filters.withFilter("exitcode", exitcode.toString()); + return this; + } + + @Override + public ListContainersCmd withStatusFilter(String status) { + checkNotNull(status, "status was not specified"); + this.filters.withFilter("status", status); + return this; + } } diff --git a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java index 69879b673..d726ca7ce 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java @@ -3,31 +3,33 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.builder.ReflectionToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; import com.github.dockerjava.api.command.ListImagesCmd; import com.github.dockerjava.api.model.Image; +import com.github.dockerjava.core.util.FiltersBuilder; /** * List images - * - * @param showAll - * - Show all images (by default filter out the intermediate images used to build) - * @param filters - * - a json encoded value of the filters (a map[string][]string) to process on the images list. */ public class ListImagesCmdImpl extends AbstrDockerCmd> implements ListImagesCmd { - private String filters; + private String imageNameFilter; + + private Boolean showAll = false; - private Boolean showAll = false; + private FiltersBuilder filters = new FiltersBuilder(); public ListImagesCmdImpl(ListImagesCmd.Exec exec) { super(exec); } @Override - public String getFilters() { - return filters; + public Map> getFilters() { + return filters.build(); } @Override @@ -42,10 +44,40 @@ public ListImagesCmd withShowAll(Boolean showAll) { } @Override - public ListImagesCmd withFilters(String filter) { - checkNotNull(filter, "filters have not been specified"); - this.filters = filter; + public ListImagesCmd withDanglingFilter(Boolean dangling) { + checkNotNull(dangling, "dangling have not been specified"); + filters.withFilter("dangling", dangling.toString()); + return this; + } + + @Override + public ListImagesCmd withLabelFilter(String... labels) { + checkNotNull(labels, "labels have not been specified"); + filters.withLabels(labels); + return this; + } + + @Override + public ListImagesCmd withLabelFilter(Map labels) { + checkNotNull(labels, "labels have not been specified"); + filters.withLabels(labels); return this; } + @Override + public ListImagesCmd withImageNameFilter(String imageNameFilter) { + checkNotNull(imageNameFilter, "image name filter not specified"); + this.imageNameFilter = imageNameFilter; + return this; + } + + @Override + public String getImageNameFilter() { + return this.imageNameFilter; + } + + @Override + public String toString() { + return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java index 2303e7c9c..44a9d2cfb 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java @@ -1,27 +1,34 @@ package com.github.dockerjava.core.command; import com.github.dockerjava.api.command.ListNetworksCmd; -import com.github.dockerjava.api.model.Filters; import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.core.util.FiltersBuilder; import java.util.List; +import java.util.Map; -public class ListNetworksCmdImpl extends AbstrDockerCmd> implements - ListNetworksCmd { +public class ListNetworksCmdImpl extends AbstrDockerCmd> implements ListNetworksCmd { - private Filters filters; + private FiltersBuilder filtersBuilder = new FiltersBuilder(); public ListNetworksCmdImpl(ListNetworksCmd.Exec exec) { super(exec); } - @Override public Filters getFilters() { - return filters; + @Override + public Map> getFilters() { + return filtersBuilder.build(); } - @Override public ListNetworksCmd withFilters(Filters filters) { + @Override + public ListNetworksCmd withIdFilter(String... networkId) { + this.filtersBuilder.withFilter("id", networkId); + return this; + } - this.filters = filters; + @Override + public ListNetworksCmd withNameFilter(String... networkName) { + this.filtersBuilder.withFilter("name", networkName); return this; } } diff --git a/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java index af1ca3fae..d9efe7b17 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java @@ -2,8 +2,12 @@ import static com.google.common.base.Preconditions.checkNotNull; +import java.util.List; +import java.util.Map; + import com.github.dockerjava.api.command.ListVolumesCmd; import com.github.dockerjava.api.command.ListVolumesResponse; +import com.github.dockerjava.core.util.FiltersBuilder; /** * @@ -12,21 +16,21 @@ */ public class ListVolumesCmdImpl extends AbstrDockerCmd implements ListVolumesCmd { - private String filters; + private FiltersBuilder filters = new FiltersBuilder(); public ListVolumesCmdImpl(ListVolumesCmd.Exec exec) { super(exec); } @Override - public String getFilters() { - return filters; + public Map> getFilters() { + return filters.build(); } @Override - public ListVolumesCmd withFilters(String filter) { - checkNotNull(filter, "filters have not been specified"); - this.filters = filter; + public ListVolumesCmd withDanglingFilter(Boolean dangling) { + checkNotNull(dangling, "dangling have not been specified"); + this.filters.withFilter("dangling", dangling.toString()); return this; } } diff --git a/src/main/java/com/github/dockerjava/api/model/Filters.java b/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java similarity index 66% rename from src/main/java/com/github/dockerjava/api/model/Filters.java rename to src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java index b24dd69db..d6cd0d9f7 100644 --- a/src/main/java/com/github/dockerjava/api/model/Filters.java +++ b/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api.model; +package com.github.dockerjava.core.util; import java.util.ArrayList; import java.util.Arrays; @@ -7,29 +7,20 @@ import java.util.Map; import java.util.Map.Entry; -import javax.ws.rs.core.MediaType; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; - /** * Representation of Docker filters. * * @author Carlos Sanchez * */ -public class Filters { - - private static ObjectMapper OBJECT_MAPPER = new JacksonJaxbJsonProvider().locateMapper(Map.class, - MediaType.APPLICATION_JSON_TYPE); +public class FiltersBuilder { private Map> filters = new HashMap>(); - public Filters() { + public FiltersBuilder() { } - public Filters withFilter(String key, String... value) { + public FiltersBuilder withFilter(String key, String... value) { filters.put(key, Arrays.asList(value)); return this; } @@ -38,7 +29,7 @@ public List getFilter(String key) { return filters.get(key); } - public Filters withImages(String... image) { + public FiltersBuilder withImages(String... image) { withFilter("image", image); return this; } @@ -47,7 +38,7 @@ public List getImage() { return getFilter("image"); } - public Filters withContainers(String... container) { + public FiltersBuilder withContainers(String... container) { withFilter("container", container); return this; } @@ -61,9 +52,8 @@ public List getContainer() { * * @param labels * string array in the form ["key"] or ["key=value"] or a mix of both - * @return */ - public Filters withLabels(String... labels) { + public FiltersBuilder withLabels(String... labels) { withFilter("label", labels); return this; } @@ -73,9 +63,8 @@ public Filters withLabels(String... labels) { * * @param labels * {@link Map} of labels that contains label keys and values - * @return */ - public Filters withLabels(Map labels) { + public FiltersBuilder withLabels(Map labels) { withFilter("label", labelsMapToList(labels).toArray(new String[labels.size()])); return this; } @@ -99,7 +88,7 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; - Filters filters1 = (Filters) o; + FiltersBuilder filters1 = (FiltersBuilder) o; return filters.equals(filters1.filters); @@ -110,13 +99,7 @@ public int hashCode() { return filters.hashCode(); } - @Override - public String toString() { - try { - return OBJECT_MAPPER.writeValueAsString(filters); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + public Map> build() { + return filters; } - } diff --git a/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java b/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java new file mode 100644 index 000000000..75f9d48c2 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.core.util; + +import java.util.List; +import java.util.Map; + +import javax.ws.rs.core.MediaType; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; + +/** + * JSON Encoder for docker filters. + * + * @author Carlos Sanchez + * + */ +public class FiltersEncoder { + + private static ObjectMapper OBJECT_MAPPER = new JacksonJaxbJsonProvider().locateMapper(Map.class, + MediaType.APPLICATION_JSON_TYPE); + + public static String jsonEncode(Map> filters) { + try { + return OBJECT_MAPPER.writeValueAsString(filters); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index 395fde4e0..3d4c8dc17 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -12,6 +12,7 @@ import com.github.dockerjava.api.model.Event; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.async.JsonStreamProcessor; +import com.github.dockerjava.core.util.FiltersEncoder; import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.GETCallbackNotifier; @@ -28,9 +29,9 @@ protected AbstractCallbackNotifier callbackNotifier(EventsCmd command, Re WebTarget webTarget = getBaseResource().path("/events").queryParam("since", command.getSince()) .queryParam("until", command.getUntil()); - if (command.getFilters() != null) { + if (command.getFilters() != null && !command.getFilters().isEmpty()) { webTarget = webTarget - .queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + .queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java index 4031bfa0d..fd882b673 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java @@ -14,6 +14,7 @@ import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.model.Container; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; public class ListContainersCmdExec extends AbstrSyncDockerCmdExec> implements ListContainersCmd.Exec { @@ -38,7 +39,7 @@ protected List execute(ListContainersCmd command) { if (command.getFilters() != null) { webTarget = webTarget - .queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + .queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java index 9734dfb42..1e7acfc33 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java @@ -14,6 +14,7 @@ import com.github.dockerjava.api.command.ListImagesCmd; import com.github.dockerjava.api.model.Image; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; public class ListImagesCmdExec extends AbstrSyncDockerCmdExec> implements ListImagesCmd.Exec { @@ -29,8 +30,13 @@ protected List execute(ListImagesCmd command) { webTarget = booleanQueryParam(webTarget, "all", command.hasShowAllEnabled()); - if (command.getFilters() != null) - webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); + if (command.getFilters() != null && !command.getFilters().isEmpty()) { + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); + } + + if (command.getImageNameFilter() != null) { + webTarget = webTarget.queryParam("filter", urlPathSegmentEscaper().escape(command.getImageNameFilter())); + } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListNetworksCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListNetworksCmdExec.java index 80438d433..9137e28d2 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListNetworksCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListNetworksCmdExec.java @@ -3,12 +3,15 @@ import com.github.dockerjava.api.command.ListNetworksCmd; import com.github.dockerjava.api.model.Network; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; + import java.util.List; import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; @@ -26,9 +29,9 @@ public ListNetworksCmdExec(WebTarget baseResource, DockerClientConfig dockerClie protected List execute(ListNetworksCmd command) { WebTarget webTarget = getBaseResource().path("/networks"); - if (command.getFilters() != null) { + if (command.getFilters() != null && !command.getFilters().isEmpty()) { webTarget = webTarget - .queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + .queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java index 2550db31b..dd877a89a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java @@ -11,6 +11,7 @@ import com.github.dockerjava.api.command.ListVolumesCmd; import com.github.dockerjava.api.command.ListVolumesResponse; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; public class ListVolumesCmdExec extends AbstrSyncDockerCmdExec implements ListVolumesCmd.Exec { @@ -24,8 +25,8 @@ public ListVolumesCmdExec(WebTarget baseResource, DockerClientConfig dockerClien protected ListVolumesResponse execute(ListVolumesCmd command) { WebTarget webTarget = getBaseResource().path("/volumes"); - if (command.getFilters() != null) - webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); + if (command.getFilters() != null && !command.getFilters().isEmpty()) + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/netty/exec/EventsCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/EventsCmdExec.java index be1ac0956..f07230c07 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/EventsCmdExec.java @@ -10,6 +10,7 @@ import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.model.Event; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; import com.github.dockerjava.netty.WebTarget; public class EventsCmdExec extends AbstrAsyncDockerCmdExec implements EventsCmd.Exec { @@ -26,9 +27,9 @@ protected Void execute0(EventsCmd command, ResultCallback resultCallback) WebTarget webTarget = getBaseResource().path("/events").queryParam("since", command.getSince()) .queryParam("until", command.getUntil()); - if (command.getFilters() != null) { + if (command.getFilters() != null && !command.getFilters().isEmpty()) { webTarget = webTarget - .queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + .queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java index b45e76cbd..219aebc4b 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java @@ -11,6 +11,7 @@ import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.model.Container; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; @@ -37,7 +38,7 @@ protected List execute(ListContainersCmd command) { if (command.getFilters() != null) { webTarget = webTarget - .queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + .queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListImagesCmdExec.java index 4ca65a061..0d1b81962 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ListImagesCmdExec.java @@ -11,6 +11,7 @@ import com.github.dockerjava.api.command.ListImagesCmd; import com.github.dockerjava.api.model.Image; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; @@ -28,8 +29,8 @@ protected List execute(ListImagesCmd command) { webTarget = booleanQueryParam(webTarget, "all", command.hasShowAllEnabled()); - if (command.getFilters() != null) { - webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); + if (command.getFilters() != null && !command.getFilters().isEmpty()) { + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java index 8f370642f..e0c945d6d 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java @@ -4,8 +4,10 @@ import com.github.dockerjava.api.command.ListNetworksCmd; import com.github.dockerjava.api.model.Network; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,8 +28,8 @@ public ListNetworksCmdExec(WebTarget baseResource, DockerClientConfig dockerClie protected List execute(ListNetworksCmd command) { WebTarget webTarget = getBaseResource().path("/networks"); - if (command.getFilters() != null) - webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + if (command.getFilters() != null && !command.getFilters().isEmpty()) + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java index 2086e4d2d..98d073ff5 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java @@ -9,6 +9,7 @@ import com.github.dockerjava.api.command.ListVolumesCmd; import com.github.dockerjava.api.command.ListVolumesResponse; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; @@ -25,8 +26,8 @@ public ListVolumesCmdExec(WebTarget baseResource, DockerClientConfig dockerClien protected ListVolumesResponse execute(ListVolumesCmd command) { WebTarget webTarget = getBaseResource().path("/volumes"); - if (command.getFilters() != null) - webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); + if (command.getFilters() != null && !command.getFilters().isEmpty()) + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); LOGGER.trace("GET: {}", webTarget); diff --git a/src/test/java/com/github/dockerjava/api/model/FiltersTest.java b/src/test/java/com/github/dockerjava/api/model/FiltersTest.java deleted file mode 100644 index 8016ec49f..000000000 --- a/src/test/java/com/github/dockerjava/api/model/FiltersTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.github.dockerjava.api.model; - -import com.google.common.collect.Maps; -import org.testng.annotations.Test; - -import java.util.Map; - -import static org.testng.Assert.*; - -/** - * @author Vincent Latombe - */ -public class FiltersTest { - - @Test - public void newFiltersShouldBeEquals() { - assertEquals(new Filters(), new Filters()); - } - - @Test - public void newFiltersShouldHaveEqualHashcode() { - assertEquals(new Filters().hashCode(), new Filters().hashCode()); - } - - @Test - public void filtersWithEqualContentShouldBeEquals() { - assertEquals(new Filters().withContainers("foo"), new Filters().withContainers("foo")); - assertEquals(new Filters().withLabels("alpha=val"), new Filters().withLabels("alpha=val")); - } - - @Test - public void filtersWithEqualContentShouldHaveEqualHashcode() { - assertEquals(new Filters().withContainers("foo").hashCode(), new Filters().withContainers("foo").hashCode()); - assertEquals(new Filters().withLabels("alpha=val").hashCode(), new Filters().withLabels("alpha=val").hashCode()); - } - - @Test - public void withLabelsMapShouldBeEqualsToVarargs() { - Map map = Maps.newHashMap(); - map.put("alpha", "val"); - assertEquals(new Filters().withLabels("alpha=val"), new Filters().withLabels(map)); - - map = Maps.newHashMap(); - map.put("alpha", "val"); - map.put("beta", "val1"); - assertEquals(new Filters().withLabels("alpha=val", "beta=val1"), new Filters().withLabels(map)); - } - - @Test - public void filtersWithDifferentContentShouldntBeEquals() { - assertNotEquals(new Filters().withContainers("foo"), new Filters().withContainers("bar")); - } - - @Test - public void filtersWithDifferentContentShouldntHaveEqualHashcode() { - assertNotEquals(new Filters().withContainers("foo").hashCode(), new Filters().withContainers("bar").hashCode()); - } -} diff --git a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java index ead529107..939f95087 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -15,7 +15,6 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.model.Event; -import com.github.dockerjava.api.model.EventFilters; import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") @@ -112,7 +111,7 @@ public void testEventStreamingWithFilter() throws Exception { TimeUnit.SECONDS.sleep(1); CountDownLatch countDownLatch = new CountDownLatch(1); - EventsTestCallback eventCallback = dockerClient.eventsCmd().withFilters(new EventFilters().withEvent("start")) + EventsTestCallback eventCallback = dockerClient.eventsCmd().withEventFilter("start") .exec(new EventsTestCallback(countDownLatch)); generateEvents(); diff --git a/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java index e41b7736f..529c2f89b 100644 --- a/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java @@ -26,7 +26,6 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.Container; -import com.github.dockerjava.api.model.Filters; import com.github.dockerjava.client.AbstractDockerClientTest; import com.google.common.collect.ImmutableMap; @@ -152,14 +151,14 @@ public void testListContainersWithLabelsFilter() throws Exception { // list with filter by label dockerClient.createContainerCmd(testImage).withCmd("echo").withLabels(labels).exec(); filteredContainers = dockerClient.listContainersCmd().withShowAll(true) - .withFilters(new Filters().withLabels(labels)).exec(); + .withLabelFilter(labels).exec(); assertThat(filteredContainers.size(), is(equalTo(1))); Container container3 = filteredContainers.get(0); assertThat(container3.getCommand(), not(isEmptyString())); assertThat(container3.getImage(), startsWith(testImage)); filteredContainers = dockerClient.listContainersCmd().withShowAll(true) - .withFilters(new Filters().withLabels("test")).exec(); + .withLabelFilter("test").exec(); assertThat(filteredContainers.size(), is(equalTo(1))); container3 = filteredContainers.get(0); assertThat(container3.getCommand(), not(isEmptyString())); diff --git a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java index 6f1ae7a68..1b811867a 100644 --- a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java @@ -65,9 +65,9 @@ public void listImages() throws DockerException { } @Test(groups = "ignoreInCircleCi") - public void listDanglingImages() throws DockerException { + public void listImagesWithDanglingFilter() throws DockerException { String imageId = createDanglingImage(); - List images = dockerClient.listImagesCmd().withFilters("{\"dangling\":[\"true\"]}").withShowAll(true) + List images = dockerClient.listImagesCmd().withDanglingFilter(true).withShowAll(true) .exec(); assertThat(images, notNullValue()); LOG.info("Images List: {}", images); @@ -86,7 +86,7 @@ private boolean isImageInFilteredList(List images, String expectedImageId } private String createDanglingImage() { - CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "5").exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); LOG.info("Created container: {}", container.toString()); assertThat(container.getId(), not(isEmptyString())); dockerClient.startContainerCmd(container.getId()).exec(); @@ -95,7 +95,6 @@ private String createDanglingImage() { String imageId = dockerClient.commitCmd(container.getId()).exec(); dockerClient.stopContainerCmd(container.getId()).exec(); - dockerClient.killContainerCmd(container.getId()).exec(); dockerClient.removeContainerCmd(container.getId()).exec(); return imageId; } diff --git a/src/test/java/com/github/dockerjava/core/util/FiltersBuilderTest.java b/src/test/java/com/github/dockerjava/core/util/FiltersBuilderTest.java new file mode 100644 index 000000000..125fd0785 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/util/FiltersBuilderTest.java @@ -0,0 +1,61 @@ +package com.github.dockerjava.core.util; + +import com.github.dockerjava.core.util. +FiltersBuilder; +import com.google.common.collect.Maps; + +import org.testng.annotations.Test; + +import java.util.Map; + +import static org.testng.Assert.*; + +/** + * @author Vincent Latombe + */ +public class FiltersBuilderTest { + + @Test + public void newFiltersShouldBeEquals() { + assertEquals(new FiltersBuilder(), new FiltersBuilder()); + } + + @Test + public void newFiltersShouldHaveEqualHashcode() { + assertEquals(new FiltersBuilder().hashCode(), new FiltersBuilder().hashCode()); + } + + @Test + public void filtersWithEqualContentShouldBeEquals() { + assertEquals(new FiltersBuilder().withContainers("foo"), new FiltersBuilder().withContainers("foo")); + assertEquals(new FiltersBuilder().withLabels("alpha=val"), new FiltersBuilder().withLabels("alpha=val")); + } + + @Test + public void filtersWithEqualContentShouldHaveEqualHashcode() { + assertEquals(new FiltersBuilder().withContainers("foo").hashCode(), new FiltersBuilder().withContainers("foo").hashCode()); + assertEquals(new FiltersBuilder().withLabels("alpha=val").hashCode(), new FiltersBuilder().withLabels("alpha=val").hashCode()); + } + + @Test + public void withLabelsMapShouldBeEqualsToVarargs() { + Map map = Maps.newHashMap(); + map.put("alpha", "val"); + assertEquals(new FiltersBuilder().withLabels("alpha=val"), new FiltersBuilder().withLabels(map)); + + map = Maps.newHashMap(); + map.put("alpha", "val"); + map.put("beta", "val1"); + assertEquals(new FiltersBuilder().withLabels("alpha=val", "beta=val1"), new FiltersBuilder().withLabels(map)); + } + + @Test + public void filtersWithDifferentContentShouldntBeEquals() { + assertNotEquals(new FiltersBuilder().withContainers("foo"), new FiltersBuilder().withContainers("bar")); + } + + @Test + public void filtersWithDifferentContentShouldntHaveEqualHashcode() { + assertNotEquals(new FiltersBuilder().withContainers("foo").hashCode(), new FiltersBuilder().withContainers("bar").hashCode()); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/EventsCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/EventsCmdExecTest.java index 06119b203..a634e2562 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/EventsCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/EventsCmdExecTest.java @@ -15,7 +15,6 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.model.Event; -import com.github.dockerjava.api.model.EventFilters; import com.github.dockerjava.core.command.EventsResultCallback; import com.github.dockerjava.core.command.PullImageResultCallback; import com.github.dockerjava.netty.AbstractNettyDockerClientTest; @@ -114,7 +113,7 @@ public void testEventStreamingWithFilter() throws Exception { TimeUnit.SECONDS.sleep(1); CountDownLatch countDownLatch = new CountDownLatch(1); - EventsTestCallback eventCallback = dockerClient.eventsCmd().withFilters(new EventFilters().withEvent("start")) + EventsTestCallback eventCallback = dockerClient.eventsCmd().withEventFilter("start") .exec(new EventsTestCallback(countDownLatch)); generateEvents(); diff --git a/src/test/java/com/github/dockerjava/netty/exec/ListContainersCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ListContainersCmdExecTest.java index c36bead2e..673784281 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/ListContainersCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/ListContainersCmdExecTest.java @@ -26,8 +26,8 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.Container; -import com.github.dockerjava.api.model.Filters; import com.github.dockerjava.core.command.PullImageResultCallback; +import com.github.dockerjava.core.util.FiltersBuilder; import com.github.dockerjava.netty.AbstractNettyDockerClientTest; import com.google.common.collect.ImmutableMap; @@ -153,14 +153,14 @@ public void testListContainersWithLabelsFilter() throws Exception { // list with filter by label dockerClient.createContainerCmd(testImage).withCmd("echo").withLabels(labels).exec(); filteredContainers = dockerClient.listContainersCmd().withShowAll(true) - .withFilters(new Filters().withLabels(labels)).exec(); + .withLabelFilter(labels).exec(); assertThat(filteredContainers.size(), is(equalTo(1))); Container container3 = filteredContainers.get(0); assertThat(container3.getCommand(), not(isEmptyString())); assertThat(container3.getImage(), startsWith(testImage)); filteredContainers = dockerClient.listContainersCmd().withShowAll(true) - .withFilters(new Filters().withLabels("test")).exec(); + .withLabelFilter("test").exec(); assertThat(filteredContainers.size(), is(equalTo(1))); container3 = filteredContainers.get(0); assertThat(container3.getCommand(), not(isEmptyString())); diff --git a/src/test/java/com/github/dockerjava/netty/exec/ListImagesCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ListImagesCmdExecTest.java index f6348c7d9..c83fa7ef9 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/ListImagesCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/ListImagesCmdExecTest.java @@ -65,10 +65,9 @@ public void listImages() throws DockerException { } @Test(groups = "ignoreInCircleCi") - public void listDanglingImages() throws DockerException { + public void listImagesWithDanglingFilter() throws DockerException { String imageId = createDanglingImage(); - List images = dockerClient.listImagesCmd().withFilters("{\"dangling\":[\"true\"]}").withShowAll(true) - .exec(); + List images = dockerClient.listImagesCmd().withDanglingFilter(true).withShowAll(true).exec(); assertThat(images, notNullValue()); LOG.info("Images List: {}", images); assertThat(images.size(), is(greaterThan(0))); @@ -86,7 +85,7 @@ private boolean isImageInFilteredList(List images, String expectedImageId } private String createDanglingImage() { - CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "5").exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); LOG.info("Created container: {}", container.toString()); assertThat(container.getId(), not(isEmptyString())); dockerClient.startContainerCmd(container.getId()).exec(); @@ -95,7 +94,6 @@ private String createDanglingImage() { String imageId = dockerClient.commitCmd(container.getId()).exec(); dockerClient.stopContainerCmd(container.getId()).exec(); - dockerClient.killContainerCmd(container.getId()).exec(); dockerClient.removeContainerCmd(container.getId()).exec(); return imageId; }