diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/EventsCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/EventsCmd.java index c52706226..34a0c5ad5 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/EventsCmd.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/EventsCmd.java @@ -2,10 +2,12 @@ import java.util.List; import java.util.Map; +import java.util.stream.Stream; import javax.annotation.CheckForNull; import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.api.model.EventType; /** * Get events @@ -33,6 +35,24 @@ public interface EventsCmd extends AsyncDockerCmd { */ EventsCmd withEventFilter(String... event); + /** + * @param eventTypes event types to filter + */ + EventsCmd withEventTypeFilter(String... eventTypes); + + /** + * This provides a type safe version of {@link #withEventTypeFilter(String...)}. + * + * @param eventTypes event types to filter + */ + default EventsCmd withEventTypeFilter(EventType... eventTypes) { + return withEventTypeFilter( + Stream.of(eventTypes) + .map(EventType::getValue) + .toArray(String[]::new) + ); + } + /** * @param image * - image to filter diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java index 230f6dd5a..d6cca6899 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java @@ -57,6 +57,13 @@ public EventsCmd withEventFilter(String... event) { return this; } + @Override + public EventsCmd withEventTypeFilter(String... eventTypes) { + checkNotNull(eventTypes, "event types have not been specified"); + this.filters.withEventTypes(eventTypes); + return this; + } + @Override public EventsCmd withLabelFilter(String... label) { checkNotNull(label, "label have not been specified"); diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java b/docker-java-core/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java index 73b369ca7..0d6c1d268 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java @@ -10,6 +10,8 @@ import java.util.Map; import java.util.Map.Entry; import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Representation of Docker filters. @@ -64,6 +66,16 @@ public List getContainer() { return getFilter("container"); } + /** + * Filter by event types + * + * @param eventTypes an array of event types + */ + public FiltersBuilder withEventTypes(String... eventTypes) { + withFilter("type", Stream.of(eventTypes).collect(Collectors.toList())); + return this; + } + /** * Filter by labels * diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/EventsCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/EventsCmdIT.java index 897c6fd25..2a16e5474 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/EventsCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/EventsCmdIT.java @@ -3,6 +3,7 @@ import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.api.model.EventType; import com.github.dockerjava.utils.TestUtils; import org.junit.Test; import org.slf4j.Logger; @@ -10,6 +11,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -113,6 +115,37 @@ public void testEventStreamingWithFilter() throws Exception { } } + @Test + public void testEventStreamingWithEventTypeFilter() throws Exception { + assumeNotSwarm("", dockerRule); + + String startTime = getEpochTime(); + generateEvents(); + String endTime = getEpochTime(); + + for (EventType eventType : EventType.values()) { + List events = new CopyOnWriteArrayList<>(); + try ( + ResultCallback.Adapter eventCallback = dockerRule.getClient().eventsCmd() + .withSince(startTime) + .withUntil(endTime) + .withEventTypeFilter(eventType) + .exec(new ResultCallback.Adapter() { + @Override + public void onNext(Event event) { + events.add(event); + } + }) + ) { + eventCallback.awaitCompletion(30, TimeUnit.SECONDS); + + for (Event event : events) { + assertThat("Received event: " + event, event.getType(), is(eventType)); + } + } + } + } + /** * This method generates some events and returns the number of events being generated */