Skip to content

Commit cdd0a71

Browse files
authored
Merge pull request docker-java#1000 from fengxx/feature/service_logs
add support for swarm service/task logs
2 parents 70d9cab + 1d52bcf commit cdd0a71

File tree

12 files changed

+447
-2
lines changed

12 files changed

+447
-2
lines changed

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import com.github.dockerjava.api.command.ListVolumesCmd;
4040
import com.github.dockerjava.api.command.LoadImageCmd;
4141
import com.github.dockerjava.api.command.LogContainerCmd;
42+
import com.github.dockerjava.api.command.LogSwarmObjectCmd;
4243
import com.github.dockerjava.api.command.PauseContainerCmd;
4344
import com.github.dockerjava.api.command.PingCmd;
4445
import com.github.dockerjava.api.command.PullImageCmd;
@@ -374,6 +375,22 @@ public interface DockerClient extends Closeable {
374375
*/
375376
ListTasksCmd listTasksCmd();
376377

378+
/**
379+
* Command to get service log
380+
*
381+
* @return the command
382+
* @since 1.29
383+
*/
384+
LogSwarmObjectCmd logServiceCmd(String serviceId);
385+
386+
/**
387+
* Command to get task log
388+
*
389+
* @return the command
390+
* @since 1.29
391+
*/
392+
LogSwarmObjectCmd logTaskCmd(String taskId);
393+
377394
@Override
378395
void close() throws IOException;
379396

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,13 @@ public interface DockerCmdExecFactory extends Closeable {
163163
*/
164164
RemoveServiceCmd.Exec createRemoveServiceCmdExec();
165165

166+
/**
167+
* @param endpoint endpoint name to tail logs
168+
* @return
169+
* @since {@link RemoteApiVersion#VERSION_1_29}
170+
*/
171+
LogSwarmObjectCmd.Exec logSwarmObjectExec(String endpoint);
172+
166173
// nodes
167174

168175
/**
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.github.dockerjava.api.command;
2+
3+
import com.github.dockerjava.api.async.ResultCallback;
4+
import com.github.dockerjava.api.model.Frame;
5+
6+
import javax.annotation.CheckForNull;
7+
import javax.annotation.Nonnull;
8+
9+
/**
10+
* Get docker service/task stdout/stderr logs
11+
*/
12+
public interface LogSwarmObjectCmd extends AsyncDockerCmd<LogSwarmObjectCmd, Frame> {
13+
/**
14+
* @param id ID or name of the service
15+
* @return self
16+
*/
17+
LogSwarmObjectCmd withId(@Nonnull String id);
18+
19+
/**
20+
* @param follow Return the logs as a raw stream.
21+
* @return self
22+
*/
23+
LogSwarmObjectCmd withFollow(Boolean follow);
24+
25+
/**
26+
* @param timestamps Add timestamps to every log line
27+
* @return self
28+
*/
29+
LogSwarmObjectCmd withTimestamps(Boolean timestamps);
30+
31+
/**
32+
* @param stdout Return logs from stdout
33+
* @return self
34+
*/
35+
LogSwarmObjectCmd withStdout(Boolean stdout);
36+
37+
/**
38+
* @param stderr Return logs from stderr
39+
* @return self
40+
*/
41+
LogSwarmObjectCmd withStderr(Boolean stderr);
42+
43+
/**
44+
* @param tail only return this number of log lines from the end of the logs.
45+
* @return self
46+
*/
47+
LogSwarmObjectCmd withTail(Integer tail);
48+
49+
/**
50+
* @param since Only return logs since this time, as a UNIX timestamp
51+
* @return self
52+
*/
53+
LogSwarmObjectCmd withSince(Integer since);
54+
55+
/**
56+
* @param details Show service context and extra details provided to logs.
57+
* @return
58+
*/
59+
LogSwarmObjectCmd withDetails(Boolean details);
60+
61+
@CheckForNull
62+
String getId();
63+
64+
@CheckForNull
65+
Integer getTail();
66+
67+
@CheckForNull
68+
Boolean getFollow();
69+
70+
@CheckForNull
71+
Boolean getTimestamps();
72+
73+
@CheckForNull
74+
Boolean getStdout();
75+
76+
@CheckForNull
77+
Boolean getStderr();
78+
79+
@CheckForNull
80+
Integer getSince();
81+
82+
@CheckForNull
83+
Boolean getDetails();
84+
85+
/**
86+
* @throws com.github.dockerjava.api.exception.NotFoundException no such service
87+
*/
88+
@Override
89+
<T extends ResultCallback<Frame>> T exec(T resultCallback);
90+
91+
interface Exec extends DockerCmdAsyncExec<LogSwarmObjectCmd, Frame> {
92+
}
93+
94+
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import com.github.dockerjava.api.command.ListVolumesCmd;
4242
import com.github.dockerjava.api.command.LoadImageCmd;
4343
import com.github.dockerjava.api.command.LogContainerCmd;
44+
import com.github.dockerjava.api.command.LogSwarmObjectCmd;
4445
import com.github.dockerjava.api.command.PauseContainerCmd;
4546
import com.github.dockerjava.api.command.PingCmd;
4647
import com.github.dockerjava.api.command.PullImageCmd;
@@ -133,6 +134,7 @@
133134
import com.github.dockerjava.core.exec.UpdateSwarmNodeCmdExec;
134135
import com.github.dockerjava.core.exec.VersionCmdExec;
135136
import com.github.dockerjava.core.exec.WaitContainerCmdExec;
137+
import com.github.dockerjava.core.exec.LogSwarmObjectExec;
136138

137139
import static com.google.common.base.Preconditions.checkNotNull;
138140

@@ -485,5 +487,10 @@ public ListTasksCmd.Exec listTasksCmdExec() {
485487
return new ListTasksCmdExec(getBaseResource(), getDockerClientConfig());
486488
}
487489

490+
@Override
491+
public LogSwarmObjectCmd.Exec logSwarmObjectExec(String endpoint) {
492+
return new LogSwarmObjectExec(getBaseResource(), getDockerClientConfig(), endpoint);
493+
}
494+
488495
protected abstract WebTarget getBaseResource();
489496
}

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import com.github.dockerjava.api.command.ListVolumesCmd;
4242
import com.github.dockerjava.api.command.LoadImageCmd;
4343
import com.github.dockerjava.api.command.LogContainerCmd;
44+
import com.github.dockerjava.api.command.LogSwarmObjectCmd;
4445
import com.github.dockerjava.api.command.PauseContainerCmd;
4546
import com.github.dockerjava.api.command.PingCmd;
4647
import com.github.dockerjava.api.command.PullImageCmd;
@@ -109,6 +110,7 @@
109110
import com.github.dockerjava.core.command.ListVolumesCmdImpl;
110111
import com.github.dockerjava.core.command.LoadImageCmdImpl;
111112
import com.github.dockerjava.core.command.LogContainerCmdImpl;
113+
import com.github.dockerjava.core.command.LogSwarmObjectImpl;
112114
import com.github.dockerjava.core.command.PauseContainerCmdImpl;
113115
import com.github.dockerjava.core.command.PingCmdImpl;
114116
import com.github.dockerjava.core.command.PullImageCmdImpl;
@@ -542,7 +544,8 @@ public ListSwarmNodesCmd listSwarmNodesCmd() {
542544
return new ListSwarmNodesCmdImpl(getDockerCmdExecFactory().listSwarmNodeCmdExec());
543545
}
544546

545-
@Override public ListServicesCmd listServicesCmd() {
547+
@Override
548+
public ListServicesCmd listServicesCmd() {
546549
return new ListServicesCmdImpl(getDockerCmdExecFactory().createListServicesCmdExec());
547550
}
548551

@@ -566,6 +569,16 @@ public RemoveServiceCmd removeServiceCmd(String serviceId) {
566569
return new RemoveServiceCmdImpl(getDockerCmdExecFactory().createRemoveServiceCmdExec(), serviceId);
567570
}
568571

572+
@Override
573+
public LogSwarmObjectCmd logServiceCmd(String serviceId) {
574+
return new LogSwarmObjectImpl(getDockerCmdExecFactory().logSwarmObjectExec("services"), serviceId);
575+
}
576+
577+
@Override
578+
public LogSwarmObjectCmd logTaskCmd(String taskId) {
579+
return new LogSwarmObjectImpl(getDockerCmdExecFactory().logSwarmObjectExec("tasks"), taskId);
580+
}
581+
569582
@Override
570583
public ListTasksCmd listTasksCmd() {
571584
return new ListTasksCmdImpl(getDockerCmdExecFactory().listTasksCmdExec());
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package com.github.dockerjava.core.command;
2+
3+
import com.github.dockerjava.api.command.DockerCmdAsyncExec;
4+
import com.github.dockerjava.api.command.LogSwarmObjectCmd;
5+
import com.github.dockerjava.api.model.Frame;
6+
7+
import javax.annotation.Nonnull;
8+
9+
public class LogSwarmObjectImpl extends AbstrAsyncDockerCmd<LogSwarmObjectCmd, Frame> implements LogSwarmObjectCmd {
10+
private String id;
11+
private Boolean followStream;
12+
private Boolean timestamps;
13+
private Boolean stdout;
14+
private Boolean stderr;
15+
private Boolean tailAll;
16+
private Boolean follow;
17+
private Integer tail;
18+
private Integer since;
19+
private Boolean details;
20+
21+
public LogSwarmObjectImpl(DockerCmdAsyncExec<LogSwarmObjectCmd, Frame> execution, String id) {
22+
super(execution);
23+
this.id = id;
24+
}
25+
26+
@Override
27+
public LogSwarmObjectImpl withId(@Nonnull String id) {
28+
this.id = id;
29+
return this;
30+
}
31+
32+
public String getId() {
33+
return id;
34+
}
35+
36+
public Boolean getFollowStream() {
37+
return followStream;
38+
}
39+
40+
public LogSwarmObjectImpl withFollowStream(Boolean followStream) {
41+
this.followStream = followStream;
42+
return this;
43+
}
44+
45+
public Boolean getTimestamps() {
46+
return timestamps;
47+
}
48+
49+
@Override
50+
public LogSwarmObjectImpl withTimestamps(Boolean timestamps) {
51+
this.timestamps = timestamps;
52+
return this;
53+
}
54+
55+
public Boolean getStdout() {
56+
return stdout;
57+
}
58+
59+
public LogSwarmObjectImpl withStdout(Boolean stdout) {
60+
this.stdout = stdout;
61+
return this;
62+
}
63+
64+
public Boolean getStderr() {
65+
return stderr;
66+
}
67+
68+
public LogSwarmObjectImpl withStderr(Boolean stderr) {
69+
this.stderr = stderr;
70+
return this;
71+
}
72+
73+
public Boolean getTailAll() {
74+
return tailAll;
75+
}
76+
77+
public LogSwarmObjectImpl withTailAll(Boolean tailAll) {
78+
this.tailAll = tailAll;
79+
return this;
80+
}
81+
82+
public Integer getTail() {
83+
return tail;
84+
}
85+
86+
@Override
87+
public LogSwarmObjectImpl withTail(Integer tail) {
88+
this.tail = tail;
89+
return this;
90+
}
91+
92+
public Integer getSince() {
93+
return since;
94+
}
95+
96+
@Override
97+
public LogSwarmObjectImpl withSince(Integer since) {
98+
this.since = since;
99+
return this;
100+
}
101+
102+
public Boolean getFollow() {
103+
return follow;
104+
}
105+
106+
@Override
107+
public LogSwarmObjectImpl withFollow(Boolean follow) {
108+
this.follow = follow;
109+
return this;
110+
}
111+
112+
@Override
113+
public LogSwarmObjectCmd withDetails(Boolean details) {
114+
this.details = details;
115+
return this;
116+
}
117+
118+
public Boolean getDetails() {
119+
return details;
120+
}
121+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.github.dockerjava.core.exec;
2+
3+
import com.github.dockerjava.api.async.ResultCallback;
4+
import com.github.dockerjava.api.command.LogSwarmObjectCmd;
5+
import com.github.dockerjava.api.model.Frame;
6+
import com.github.dockerjava.core.WebTarget;
7+
8+
import com.github.dockerjava.core.DockerClientConfig;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
12+
public class LogSwarmObjectExec extends AbstrAsyncDockerCmdExec<LogSwarmObjectCmd, Frame> implements
13+
LogSwarmObjectCmd.Exec {
14+
private String endpoint = "";
15+
private static final Logger LOGGER = LoggerFactory.getLogger(LogSwarmObjectExec.class);
16+
17+
public LogSwarmObjectExec(com.github.dockerjava.core.WebTarget baseResource, DockerClientConfig dockerClientConfig, String endpoint) {
18+
super(baseResource, dockerClientConfig);
19+
this.endpoint = endpoint;
20+
}
21+
22+
@Override
23+
protected Void execute0(LogSwarmObjectCmd command, ResultCallback<Frame> resultCallback) {
24+
25+
WebTarget webTarget = getBaseResource().path("/" + endpoint + "/{id}/logs").resolveTemplate("id", command.getId());
26+
27+
if (command.getTail() != null) {
28+
webTarget = webTarget.queryParam("tail", command.getTail());
29+
} else {
30+
webTarget = webTarget.queryParam("tail", "all");
31+
}
32+
33+
if (command.getSince() != null) {
34+
webTarget = webTarget.queryParam("since", command.getSince());
35+
}
36+
37+
webTarget = booleanQueryParam(webTarget, "timestamps", command.getTimestamps());
38+
webTarget = booleanQueryParam(webTarget, "stdout", command.getStdout());
39+
webTarget = booleanQueryParam(webTarget, "stderr", command.getStderr());
40+
webTarget = booleanQueryParam(webTarget, "follow", command.getFollow());
41+
42+
LOGGER.trace("GET: {}", webTarget);
43+
44+
webTarget.request().get(resultCallback);
45+
46+
return null;
47+
}
48+
}

0 commit comments

Comments
 (0)