X Tutup
Skip to content

Commit c3224cb

Browse files
committed
Merge pull request #208 from docker-java/event-stream-reader
Added PullEventStreamItem and EventStreamReader to stream the reading of...
2 parents fec6b92 + 86c9f0a commit c3224cb

File tree

9 files changed

+201
-26
lines changed

9 files changed

+201
-26
lines changed

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package com.github.dockerjava.api.command;
22

3+
import com.github.dockerjava.api.model.AuthConfigurations;
4+
import com.github.dockerjava.api.model.EventStreamItem;
5+
36
import java.io.File;
47
import java.io.IOException;
58
import java.io.InputStream;
69

7-
import com.github.dockerjava.api.model.AuthConfigurations;
8-
import com.github.dockerjava.api.model.EventStreamItem;
9-
1010
/**
1111
*
1212
* Build an image from Dockerfile.
@@ -61,6 +61,9 @@ public interface BuildImageCmd extends DockerCmd<BuildImageCmd.Response>{
6161
public static interface Exec extends DockerCmdExec<BuildImageCmd, BuildImageCmd.Response> {
6262
}
6363

64+
/**
65+
* @see {@link com.github.dockerjava.core.command.EventStreamReader}
66+
*/
6467
public static abstract class Response extends InputStream {
6568
public abstract Iterable<EventStreamItem> getItems() throws IOException;
6669
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.github.dockerjava.api.command;
22

33
import com.github.dockerjava.api.model.AuthConfig;
4+
import com.github.dockerjava.core.command.EventStreamReader;
45

56
import java.io.InputStream;
67

@@ -33,6 +34,8 @@ public static interface Exec extends DockerCmdExec<PullImageCmd, InputStream> {
3334
/**
3435
* Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent
3536
* connection leaks.
37+
*
38+
* @see {@link EventStreamReader}
3639
*/
3740
@Override
3841
public InputStream exec();

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package com.github.dockerjava.api.command;
22

3-
import java.io.IOException;
4-
import java.io.InputStream;
5-
63
import com.github.dockerjava.api.NotFoundException;
74
import com.github.dockerjava.api.model.AuthConfig;
85
import com.github.dockerjava.api.model.PushEventStreamItem;
6+
import com.github.dockerjava.core.command.EventStreamReader;
7+
8+
import java.io.IOException;
9+
import java.io.InputStream;
910

1011
/**
1112
* Push the latest image to the repository.
@@ -40,6 +41,9 @@ public interface PushImageCmd extends DockerCmd<PushImageCmd.Response>{
4041
public static interface Exec extends DockerCmdExec<PushImageCmd, Response> {
4142
}
4243

44+
/**
45+
* @see {@link EventStreamReader}
46+
*/
4347
public static abstract class Response extends InputStream {
4448
public abstract Iterable<PushEventStreamItem> getItems() throws IOException;
4549
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.github.dockerjava.api.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import com.google.common.base.Objects;
6+
7+
import java.io.Serializable;
8+
9+
/**
10+
* Represents an item returned from pull
11+
*/
12+
@JsonIgnoreProperties(ignoreUnknown=true)
13+
public class PullEventStreamItem implements Serializable {
14+
15+
private static final long serialVersionUID = -5187169652557467828L;
16+
17+
@JsonProperty("status")
18+
private String status;
19+
20+
@JsonProperty("progress")
21+
private String progress;
22+
23+
@JsonProperty("progressDetail")
24+
private ProgressDetail progressDetail;
25+
26+
27+
public String getStatus() {
28+
return status;
29+
}
30+
31+
public String getProgress() {
32+
return progress;
33+
}
34+
35+
public ProgressDetail getProgressDetail() {
36+
return progressDetail;
37+
}
38+
39+
@JsonIgnoreProperties(ignoreUnknown=true)
40+
public static class ProgressDetail implements Serializable {
41+
@JsonProperty("current")
42+
int current;
43+
44+
45+
@Override
46+
public String toString() {
47+
return "current " + current;
48+
}
49+
}
50+
51+
@Override
52+
public String toString() {
53+
return Objects.toStringHelper(this)
54+
.add("status", status)
55+
.add("progress", progress)
56+
.add("progressDetail", progressDetail)
57+
.toString();
58+
}
59+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.github.dockerjava.core.command;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
5+
import java.io.IOException;
6+
import java.io.InputStream;
7+
8+
public class EventStreamReader<I> implements AutoCloseable {
9+
10+
private final ObjectMapper objectMapper = new ObjectMapper();
11+
private final Class<I> type;
12+
private final InputStream inputStream;
13+
14+
public EventStreamReader(InputStream inputStream, Class<I> type) {
15+
this.inputStream = inputStream;
16+
this.type = type;
17+
}
18+
19+
public I readItem() throws IOException {
20+
try {
21+
return objectMapper.readValue(inputStream, type);
22+
} catch (IOException e) {
23+
// dirty, but works
24+
if (e.getMessage().equals("Stream closed")) {
25+
return null;
26+
}
27+
throw e;
28+
}
29+
}
30+
31+
@Override
32+
public void close() throws IOException {
33+
inputStream.close();
34+
}
35+
}

src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.slf4j.LoggerFactory;
99

1010
import java.io.File;
11+
import java.io.IOException;
1112

1213
/**
1314
* Start and stop a single container for testing.
@@ -25,7 +26,7 @@ public DockerfileFixture(DockerClient dockerClient, String directory) {
2526
this.directory = directory;
2627
}
2728

28-
public void open() throws Exception {
29+
public void open() throws IOException {
2930

3031
LOGGER.info("building {}", directory);
3132
dockerClient
@@ -79,7 +80,7 @@ public void close() throws Exception {
7980
.removeImageCmd(repository)
8081
.withForce()
8182
.exec();
82-
} catch (InternalServerErrorException e) {
83+
} catch (NotFoundException | InternalServerErrorException e) {
8384
LOGGER.info("ignoring {}", e.getMessage());
8485
}
8586
repository = null;
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.github.dockerjava.core.command;
2+
3+
import com.github.dockerjava.api.DockerClient;
4+
import com.github.dockerjava.api.model.EventStreamItem;
5+
import com.github.dockerjava.api.model.PullEventStreamItem;
6+
import com.github.dockerjava.core.DockerClientBuilder;
7+
import org.testng.annotations.AfterTest;
8+
import org.testng.annotations.BeforeTest;
9+
import org.testng.annotations.Test;
10+
11+
import java.io.File;
12+
13+
import static org.hamcrest.MatcherAssert.assertThat;
14+
import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;
15+
import static org.hamcrest.core.AllOf.allOf;
16+
import static org.hamcrest.core.IsEqual.equalTo;
17+
import static org.hamcrest.core.IsNull.nullValue;
18+
import static org.testng.AssertJUnit.assertNull;
19+
20+
21+
@Test(groups = "integration")
22+
public class EventStreamReaderITest {
23+
24+
private DockerClient dockerClient;
25+
26+
@BeforeTest
27+
public void setUp() throws Exception {
28+
dockerClient = DockerClientBuilder.getInstance().build();
29+
}
30+
31+
@AfterTest
32+
public void tearDown() throws Exception {
33+
dockerClient.close();
34+
}
35+
36+
@Test
37+
public void pullCanBeStreamed() throws Exception {
38+
39+
try (EventStreamReader<PullEventStreamItem> reader = new EventStreamReader<>(
40+
dockerClient.pullImageCmd("busybox:latest").exec(),
41+
PullEventStreamItem.class)
42+
) {;
43+
assertThat(reader.readItem(),
44+
allOf(
45+
hasProperty("status", equalTo("Pulling repository busybox")),
46+
hasProperty("progress", nullValue()),
47+
hasProperty("progressDetail", nullValue())
48+
)
49+
);
50+
assertNull(reader.readItem());
51+
}
52+
}
53+
54+
@Test
55+
public void buildCanBeStreamed() throws Exception {
56+
57+
try (EventStreamReader<EventStreamItem> reader = new EventStreamReader<>(
58+
dockerClient.buildImageCmd(new File("src/test/resources/eventStreamReaderDockerfile")).exec(),
59+
EventStreamItem.class)
60+
) {
61+
assertThat(reader.readItem(),
62+
allOf(
63+
hasProperty("stream", equalTo("Step 0 : FROM busybox:latest\n")),
64+
hasProperty("error", nullValue()),
65+
hasProperty("errorDetail", nullValue())
66+
)
67+
);
68+
assertNull(reader.readItem());
69+
70+
}
71+
}
72+
}

src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,37 @@
11
package com.github.dockerjava.core.command;
22

33

4+
import com.github.dockerjava.api.DockerClient;
45
import com.github.dockerjava.api.model.Frame;
56
import com.github.dockerjava.api.model.StreamType;
6-
import com.github.dockerjava.client.AbstractDockerClientTest;
7-
import org.testng.annotations.AfterMethod;
7+
import com.github.dockerjava.core.DockerClientBuilder;
88
import org.testng.annotations.AfterTest;
9-
import org.testng.annotations.BeforeMethod;
109
import org.testng.annotations.BeforeTest;
1110
import org.testng.annotations.Test;
1211

1312
import java.io.IOException;
1413
import java.io.InputStream;
1514

15+
import static org.testng.Assert.assertEquals;
16+
import static org.testng.AssertJUnit.assertNull;
17+
1618
@Test(groups = "integration")
17-
public class FrameReaderITest extends AbstractDockerClientTest {
19+
public class FrameReaderITest {
1820

21+
private DockerClient dockerClient;
1922
private DockerfileFixture dockerfileFixture;
2023

2124
@BeforeTest
22-
@Override
23-
public void beforeTest() {
24-
super.beforeTest();
25+
public void beforeTest() throws Exception {
26+
dockerClient = DockerClientBuilder.getInstance().build();
2527
dockerfileFixture = new DockerfileFixture(dockerClient, "frameReaderDockerfile");
26-
}
27-
28-
@BeforeMethod
29-
public void createAndStartDockerContainer() throws Exception {
3028
dockerfileFixture.open();
3129
}
3230

33-
@AfterMethod
31+
@AfterTest
3432
public void deleteDockerContainerImage() throws Exception {
3533
dockerfileFixture.close();
36-
}
37-
38-
@AfterTest
39-
@Override
40-
public void afterTest() {
41-
super.afterTest();
34+
dockerClient.close();
4235
}
4336

4437
@Test
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
FROM busybox:latest
2+
3+
RUN true
4+
5+
CMD ["true"]

0 commit comments

Comments
 (0)
X Tutup