Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
<slf4j-api.version>1.7.5</slf4j-api.version>
<jsr305.version>1.3.9</jsr305.version>
<jnr.unixsocket.version>0.3</jnr.unixsocket.version>
<guava.version>11.0.1</guava.version>
<guava.version>18.0</guava.version>

<!--test dependencies -->
<version.logback>1.0.1</version.logback>
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/github/dockerjava/api/DockerClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
import com.github.dockerjava.api.command.CreateContainerCmd;
import com.github.dockerjava.api.command.CreateImageCmd;
import com.github.dockerjava.api.command.EventCallback;
import com.github.dockerjava.api.command.EventsCmd;
import com.github.dockerjava.api.command.InfoCmd;
import com.github.dockerjava.api.command.InspectContainerCmd;
import com.github.dockerjava.api.command.InspectImageCmd;
Expand Down Expand Up @@ -114,6 +116,8 @@ public CopyFileFromContainerCmd copyFileFromContainerCmd(

public UnpauseContainerCmd unpauseContainerCmd(String containerId);

public EventsCmd eventsCmd(EventCallback eventCallback);

public void close() throws IOException;

}
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ public interface DockerCmdExecFactory extends Closeable {

public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec();

public EventsCmd.Exec createEventsCmdExec();

public void close() throws IOException;

}
10 changes: 10 additions & 0 deletions src/main/java/com/github/dockerjava/api/command/EventCallback.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.github.dockerjava.api.command;

import com.github.dockerjava.api.model.Event;

/**
* Event callback
*/
public interface EventCallback {
public void onEvent(Event event);
}
27 changes: 27 additions & 0 deletions src/main/java/com/github/dockerjava/api/command/EventsCmd.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.github.dockerjava.api.command;

import java.util.concurrent.ExecutorService;


/**
* Get events
*
* @param since - Show all events created since timestamp
* @param until - Stream events until this timestamp
*/
public interface EventsCmd extends DockerCmd<ExecutorService> {
public EventsCmd withSince(String since);

public EventsCmd withUntil(String until);

public String getSince();

public String getUntil();

public EventCallback getEventCallback();

public EventsCmd withEventCallback(EventCallback eventCallback);

public static interface Exec extends DockerCmdExec<EventsCmd, ExecutorService> {
}
}
37 changes: 37 additions & 0 deletions src/main/java/com/github/dockerjava/api/model/Event.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.github.dockerjava.api.model;

import org.apache.commons.lang.builder.ToStringBuilder;

/**
* Representation of a Docker event.
*/
public class Event {
private String status;

private String id;

private String from;

private long time;

public String getStatus() {
return status;
}

public String getId() {
return id;
}

public String getFrom() {
return from;
}

public long getTime() {
return time;
}

@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
52 changes: 52 additions & 0 deletions src/main/java/com/github/dockerjava/api/model/EventNotifier.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.github.dockerjava.api.model;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.dockerjava.api.command.EventCallback;
import com.google.common.base.Preconditions;

import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
import java.io.InputStream;
import java.util.concurrent.Callable;

/**
* EventNotifier API
*/
public class EventNotifier implements Callable<Void> {
private static final JsonFactory JSON_FACTORY = new JsonFactory();
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

private final EventCallback eventCallback;
private final WebTarget webTarget;

private EventNotifier(EventCallback eventCallback, WebTarget webTarget) {
this.eventCallback = eventCallback;
this.webTarget = webTarget;
}

public static EventNotifier create(EventCallback eventCallback, WebTarget webTarget) {
Preconditions.checkNotNull(eventCallback, "An EventCallback must be provided");
Preconditions.checkNotNull(webTarget, "An WebTarget must be provided");
return new EventNotifier(eventCallback, webTarget);
}

@Override
public Void call() throws Exception {
Response response = webTarget.request().get(Response.class);
InputStream inputStream = response.readEntity(InputStream.class);
try {
JsonParser jp = JSON_FACTORY.createParser(inputStream);
while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed()) {
eventCallback.onEvent(OBJECT_MAPPER.readValue(jp, Event.class));
}
} finally {
if (response != null) {
response.close();
}
}
return null;
}
}
2 changes: 1 addition & 1 deletion src/main/java/com/github/dockerjava/api/model/Info.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

/**
/**
*
* @author Konstantin Pelykh ([email protected])
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,11 @@ public UnpauseContainerCmd unpauseContainerCmd(String containerId) {
return new UnpauseContainerCmdImpl(getDockerCmdExecFactory().createUnpauseContainerCmdExec(), containerId);
}

@Override
public EventsCmd eventsCmd(EventCallback eventCallback) {
return new EventsCmdImpl(getDockerCmdExecFactory().createEventsCmdExec(), eventCallback);
}

@Override
public void close() throws IOException {
getDockerCmdExecFactory().close();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.github.dockerjava.core.command;

import java.util.concurrent.ExecutorService;

import com.github.dockerjava.api.command.EventCallback;
import com.github.dockerjava.api.command.EventsCmd;

/**
* Stream docker events
*/
public class EventsCmdImpl extends AbstrDockerCmd<EventsCmd, ExecutorService> implements EventsCmd {

private String since;
private String until;
private EventCallback eventCallback;

public EventsCmdImpl(EventsCmd.Exec exec, EventCallback eventCallback) {
super(exec);
withEventCallback(eventCallback);
}

@Override
public EventsCmd withSince(String since) {
this.since = since;
return this;
}

@Override
public EventsCmd withUntil(String until) {
this.until = until;
return this;
}

@Override
public EventsCmd withEventCallback(EventCallback eventCallback) {
this.eventCallback = eventCallback;
return this;
}

@Override
public String getSince() {
return since;
}

@Override
public String getUntil() {
return until;
}

@Override
public EventCallback getEventCallback() {
return eventCallback;
}

@Override
public ExecutorService exec() {
return super.exec();
}

@Override
public String toString() {
return new StringBuilder("events")
.append(since != null ? " --since=" + since : "")
.append(until != null ? " --until=" + until : "")
.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;

import com.github.dockerjava.api.command.EventsCmd;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties;

Expand Down Expand Up @@ -241,7 +242,12 @@ public PauseContainerCmd.Exec createPauseContainerCmdExec() {
public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() {
return new UnpauseContainerCmdExec(baseResource);
}


@Override
public EventsCmd.Exec createEventsCmdExec() {
return new EventsCmdExec(getBaseResource());
}

@Override
public void close() throws IOException {
Preconditions.checkNotNull(client, "Factory not initialized. You probably forgot to call init()!");
Expand Down
80 changes: 80 additions & 0 deletions src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package com.github.dockerjava.jaxrs;

import java.io.InputStream;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.dockerjava.api.command.EventCallback;
import com.github.dockerjava.api.command.EventsCmd;
import com.github.dockerjava.api.model.Event;
import com.github.dockerjava.api.model.EventNotifier;
import com.google.common.base.Preconditions;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;

public class EventsCmdExec extends AbstrDockerCmdExec<EventsCmd, ExecutorService> implements EventsCmd.Exec {
private static final Logger LOGGER = LoggerFactory.getLogger(EventsCmdExec.class);

public EventsCmdExec(WebTarget baseResource) {
super(baseResource);
}

@Override
protected ExecutorService execute(EventsCmd command) {
ExecutorService executorService = Executors.newSingleThreadExecutor();

WebTarget webResource = getBaseResource().path("/events")
.queryParam("since", command.getSince())
.queryParam("until", command.getUntil());

LOGGER.trace("GET: {}", webResource);
EventNotifier eventNotifier = EventNotifier.create(command.getEventCallback(), webResource);
executorService.submit(eventNotifier);
return executorService;
}

private static class EventNotifier implements Callable<Void> {
private static final JsonFactory JSON_FACTORY = new JsonFactory();
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

private final EventCallback eventCallback;
private final WebTarget webTarget;

private EventNotifier(EventCallback eventCallback, WebTarget webTarget) {
this.eventCallback = eventCallback;
this.webTarget = webTarget;
}

public static EventNotifier create(EventCallback eventCallback, WebTarget webTarget) {
Preconditions.checkNotNull(eventCallback, "An EventCallback must be provided");
Preconditions.checkNotNull(webTarget, "An WebTarget must be provided");
return new EventNotifier(eventCallback, webTarget);
}

@Override
public Void call() throws Exception {
Response response = webTarget.request().get(Response.class);
InputStream inputStream = response.readEntity(InputStream.class);
try {
JsonParser jp = JSON_FACTORY.createParser(inputStream);
while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed()) {
eventCallback.onEvent(OBJECT_MAPPER.readValue(jp, Event.class));
}
} finally {
if (response != null) {
response.close();
}
}
return null;
}
}
}
Loading