X Tutup
Skip to content

Commit 019ff9e

Browse files
author
Brendan Almonte
committed
Add streaming events API
1 parent 0abdfeb commit 019ff9e

File tree

12 files changed

+345
-3
lines changed

12 files changed

+345
-3
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
<slf4j-api.version>1.7.5</slf4j-api.version>
6464
<jsr305.version>1.3.9</jsr305.version>
6565
<jnr.unixsocket.version>0.3</jnr.unixsocket.version>
66-
<guava.version>11.0.1</guava.version>
66+
<guava.version>18.0</guava.version>
6767

6868
<!--test dependencies -->
6969
<version.logback>1.0.1</version.logback>

src/main/java/com/github/dockerjava/api/DockerClient.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
1111
import com.github.dockerjava.api.command.CreateContainerCmd;
1212
import com.github.dockerjava.api.command.CreateImageCmd;
13+
import com.github.dockerjava.api.command.EventsCmd;
1314
import com.github.dockerjava.api.command.InfoCmd;
1415
import com.github.dockerjava.api.command.InspectContainerCmd;
1516
import com.github.dockerjava.api.command.InspectImageCmd;
@@ -114,6 +115,8 @@ public CopyFileFromContainerCmd copyFileFromContainerCmd(
114115

115116
public UnpauseContainerCmd unpauseContainerCmd(String containerId);
116117

118+
public EventsCmd eventsCmd();
119+
117120
public void close() throws IOException;
118121

119122
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ public interface DockerCmdExecFactory extends Closeable {
6969

7070
public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec();
7171

72+
public EventsCmd.Exec createEventsCmdExec();
73+
7274
public void close() throws IOException;
7375

7476
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.github.dockerjava.api.command;
2+
3+
import com.github.dockerjava.api.model.EventStream;
4+
5+
/**
6+
* Get events
7+
*
8+
* @param since - Show all events created since timestamp
9+
* @param until - Stream events until this timestamp
10+
*/
11+
public interface EventsCmd extends DockerCmd<EventStream> {
12+
public EventsCmd withSince(String since);
13+
14+
public EventsCmd withUntil(String until);
15+
16+
public String getSince();
17+
18+
public String getUntil();
19+
20+
public static interface Exec extends DockerCmdExec<EventsCmd, EventStream> {
21+
}
22+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.github.dockerjava.api.model;
2+
3+
import org.apache.commons.lang.builder.ToStringBuilder;
4+
5+
/**
6+
* Representation of a Docker event.
7+
*/
8+
public class Event {
9+
private String status;
10+
11+
private String id;
12+
13+
private String from;
14+
15+
private long time;
16+
17+
public String getStatus() {
18+
return status;
19+
}
20+
21+
public String getId() {
22+
return id;
23+
}
24+
25+
public String getFrom() {
26+
return from;
27+
}
28+
29+
public long getTime() {
30+
return time;
31+
}
32+
33+
@Override
34+
public String toString() {
35+
return ToStringBuilder.reflectionToString(this);
36+
}
37+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package com.github.dockerjava.api.model;
2+
3+
import com.fasterxml.jackson.core.JsonFactory;
4+
import com.fasterxml.jackson.core.JsonParser;
5+
import com.fasterxml.jackson.core.JsonToken;
6+
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import com.google.common.collect.Queues;
8+
9+
import java.io.Closeable;
10+
import java.io.IOException;
11+
import java.io.InputStream;
12+
import java.util.Queue;
13+
import java.util.concurrent.BlockingQueue;
14+
import java.util.concurrent.ExecutorService;
15+
import java.util.concurrent.Executors;
16+
import java.util.concurrent.TimeUnit;
17+
18+
/**
19+
* EventStream API
20+
* <p/>
21+
* Spawns a thread to poll for events to fill a BlockingQueue
22+
*/
23+
public class EventStream implements Closeable {
24+
private final ExecutorService executor = Executors.newSingleThreadExecutor();
25+
private final BlockingQueue<Event> queue;
26+
private final EventRunner eventRunner;
27+
28+
private EventStream(InputStream inputStream) {
29+
queue = Queues.newLinkedBlockingQueue();
30+
eventRunner = new EventRunner(queue, inputStream);
31+
}
32+
33+
public static EventStream create(InputStream inputStream) {
34+
return new EventStream(inputStream).startRunner();
35+
}
36+
37+
public Event pollEvent() {
38+
return queue.poll();
39+
}
40+
41+
public Event pollEvent(long timeout, TimeUnit unit) throws InterruptedException {
42+
return queue.poll(timeout, unit);
43+
}
44+
45+
@Override
46+
public void close() throws IOException {
47+
eventRunner.initiateStop();
48+
executor.shutdown();
49+
}
50+
51+
private EventStream startRunner() {
52+
executor.execute(eventRunner);
53+
return this;
54+
}
55+
56+
private static class EventRunner implements Runnable {
57+
private static final JsonFactory JSON_FACTORY = new JsonFactory();
58+
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
59+
60+
private final Queue<Event> queue;
61+
private final InputStream inputStream;
62+
63+
public EventRunner(Queue<Event> queue, InputStream inputStream) {
64+
this.queue = queue;
65+
this.inputStream = inputStream;
66+
}
67+
68+
public void initiateStop() throws IOException {
69+
inputStream.close();
70+
}
71+
72+
@Override
73+
public void run() {
74+
try {
75+
JsonParser jp = JSON_FACTORY.createParser(inputStream);
76+
while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed()) {
77+
queue.add(OBJECT_MAPPER.readValue(jp, Event.class));
78+
}
79+
inputStream.close();
80+
} catch (IOException e) {
81+
throw new RuntimeException(e);
82+
}
83+
}
84+
}
85+
}

src/main/java/com/github/dockerjava/api/model/Info.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import com.fasterxml.jackson.annotation.JsonProperty;
1111
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
1212

13-
/**Ø
13+
/**
1414
*
1515
* @author Konstantin Pelykh (kpelykh@gmail.com)
1616
*

src/main/java/com/github/dockerjava/core/DockerClientImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,11 @@ public UnpauseContainerCmd unpauseContainerCmd(String containerId) {
253253
return new UnpauseContainerCmdImpl(getDockerCmdExecFactory().createUnpauseContainerCmdExec(), containerId);
254254
}
255255

256+
@Override
257+
public EventsCmd eventsCmd() {
258+
return new EventsCmdImpl(getDockerCmdExecFactory().createEventsCmdExec());
259+
}
260+
256261
@Override
257262
public void close() throws IOException {
258263
getDockerCmdExecFactory().close();
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.github.dockerjava.core.command;
2+
3+
import com.github.dockerjava.api.command.EventsCmd;
4+
import com.github.dockerjava.api.model.EventStream;
5+
6+
import java.io.InputStream;
7+
8+
/**
9+
* Stream docker events
10+
*/
11+
public class EventsCmdImpl extends AbstrDockerCmd<EventsCmd, EventStream> implements EventsCmd {
12+
13+
private String since;
14+
private String until;
15+
16+
public EventsCmdImpl(EventsCmd.Exec exec) {
17+
super(exec);
18+
}
19+
20+
@Override
21+
public EventsCmd withSince(String since) {
22+
this.since = since;
23+
return this;
24+
}
25+
26+
@Override
27+
public EventsCmd withUntil(String until) {
28+
this.until = until;
29+
return this;
30+
}
31+
32+
public String getSince() {
33+
return since;
34+
}
35+
36+
public String getUntil() {
37+
return until;
38+
}
39+
40+
@Override
41+
public EventStream exec() {
42+
return super.exec();
43+
}
44+
45+
@Override
46+
public String toString() {
47+
return new StringBuilder("events")
48+
.append(since != null ? " --since=" + since : "")
49+
.append(until != null ? " --until=" + until : "")
50+
.toString();
51+
}
52+
}

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import javax.ws.rs.client.ClientBuilder;
88
import javax.ws.rs.client.WebTarget;
99

10+
import com.github.dockerjava.api.command.EventsCmd;
1011
import org.glassfish.jersey.client.ClientConfig;
1112
import org.glassfish.jersey.client.ClientProperties;
1213

@@ -239,7 +240,12 @@ public PauseContainerCmd.Exec createPauseContainerCmdExec() {
239240
public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() {
240241
return new UnpauseContainerCmdExec(baseResource);
241242
}
242-
243+
244+
@Override
245+
public EventsCmd.Exec createEventsCmdExec() {
246+
return new EventsCmdExec(getBaseResource());
247+
}
248+
243249
@Override
244250
public void close() throws IOException {
245251
Preconditions.checkNotNull(client, "Factory not initialized. You probably forgot to call init()!");

0 commit comments

Comments
 (0)
X Tutup