From e3a08471a86036552a311f9a1a521692f0c00601 Mon Sep 17 00:00:00 2001 From: Carlos Sanchez Date: Tue, 7 Jul 2015 12:09:49 +0200 Subject: [PATCH 1/2] Add filters option to events operation --- .../dockerjava/api/command/EventsCmd.java | 5 +++ .../dockerjava/api/model/EventFilters.java | 37 +++++++++++++++++++ .../core/command/EventsCmdImpl.java | 20 +++++++++- .../dockerjava/jaxrs/EventsCmdExec.java | 7 ++++ .../core/command/EventsCmdImplTest.java | 20 ++++++++++ 5 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/github/dockerjava/api/model/EventFilters.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 057bed644..e691bbc94 100644 --- a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java @@ -1,6 +1,7 @@ package com.github.dockerjava.api.command; import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.api.model.Filters; /** * Get events @@ -19,6 +20,10 @@ public interface EventsCmd extends AsyncDockerCmd { public String getUntil(); + public Filters getFilters(); + + public EventsCmd withFilters(Filters filters); + public static interface Exec extends DockerCmdExec { } } diff --git a/src/main/java/com/github/dockerjava/api/model/EventFilters.java b/src/main/java/com/github/dockerjava/api/model/EventFilters.java new file mode 100644 index 000000000..08cb7ad11 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/EventFilters.java @@ -0,0 +1,37 @@ +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/core/command/EventsCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java index d1de2e60f..50cf34ff3 100644 --- a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java @@ -1,8 +1,11 @@ package com.github.dockerjava.core.command; +import static com.google.common.base.Preconditions.*; + import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.api.model.Filters; /** * Stream docker events @@ -13,6 +16,8 @@ public class EventsCmdImpl extends AbstrDockerCmd implements Ev private String until; + private Filters filters; + private ResultCallback resultCallback; public EventsCmdImpl(EventsCmd.Exec exec, ResultCallback resultCallback) { @@ -38,6 +43,13 @@ public EventsCmd withResultCallback(ResultCallback resultCallback) { return this; } + @Override + public EventsCmd withFilters(Filters filters) { + checkNotNull(filters, "filters have not been specified"); + this.filters = filters; + return this; + } + @Override public String getSince() { return since; @@ -53,9 +65,15 @@ public ResultCallback getResultCallback() { return resultCallback; } + @Override + public Filters getFilters() { + return filters; + } + @Override public String toString() { return new StringBuilder("events").append(since != null ? " --since=" + since : "") - .append(until != null ? " --until=" + until : "").toString(); + .append(until != null ? " --until=" + until : "") + .append(filters != null ? " --filters=" + filters : "").toString(); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index e6f27ae69..0b3d998ac 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -1,5 +1,7 @@ package com.github.dockerjava.jaxrs; +import static com.google.common.net.UrlEscapers.*; + import javax.ws.rs.client.WebTarget; import org.slf4j.Logger; @@ -25,6 +27,11 @@ protected Void execute(EventsCmd command) { WebTarget webTarget = getBaseResource().path("/events").queryParam("since", command.getSince()) .queryParam("until", command.getUntil()); + if (command.getFilters() != null) { + webTarget = webTarget.queryParam("filters", + urlPathSegmentEscaper().escape(command.getFilters().toString())); + } + LOGGER.trace("GET: {}", webTarget); GETCallbackNotifier callbackNotifier = new GETCallbackNotifier(new JsonStreamProcessor( 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 eb490d7e9..7da6a100f 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -18,6 +18,7 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.api.model.EventFilters; import com.github.dockerjava.client.AbstractDockerClientTest; import com.github.dockerjava.core.async.ResultCallbackTemplate; @@ -94,6 +95,25 @@ public void testEventStreaming1() throws InterruptedException, IOException { assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); } + @Test + public void testEventStreamingWithFilter() throws InterruptedException, IOException { + // Don't include other tests events + TimeUnit.SECONDS.sleep(1); + + CountDownLatch countDownLatch = new CountDownLatch(1); + EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); + + EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withFilters(new EventFilters().withEvent("start")); + eventsCmd.exec(); + + generateEvents(); + + boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); + + eventCallback.close(); + assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); + } + @Test public void testEventStreaming2() throws InterruptedException, IOException { // Don't include other tests events From 87e9c19729a7267f45b2856e6c9c1c861418ba81 Mon Sep 17 00:00:00 2001 From: Carlos Sanchez Date: Tue, 7 Jul 2015 12:10:15 +0200 Subject: [PATCH 2/2] Ensure errors in callback are processed and logged --- .../dockerjava/core/async/ResultCallbackTemplate.java | 6 ++++++ .../dockerjava/jaxrs/async/AbstractCallbackNotifier.java | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java index 50cc1fd91..94d199a6f 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -8,6 +8,9 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.github.dockerjava.api.async.ResultCallback; /** @@ -18,6 +21,8 @@ */ public abstract class ResultCallbackTemplate implements ResultCallback { + private final static Logger LOGGER = LoggerFactory.getLogger(ResultCallbackTemplate.class); + private final CountDownLatch finished = new CountDownLatch(1); private Closeable stream; @@ -34,6 +39,7 @@ public void onNext(T object) { @Override public void onError(Throwable throwable) { try { + LOGGER.error("Error during callback", throwable); throw new RuntimeException(throwable); } finally { try { diff --git a/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java b/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java index 6cfc7a76e..a010a87ad 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java +++ b/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java @@ -48,6 +48,11 @@ public Void call() throws Exception { resultCallback.onError(e.getCause()); } return null; + } catch (Exception e) { + if (resultCallback != null) { + resultCallback.onError(e); + } + return null; } try {