From 369cb01ff08743a36d7a07f3bdf175d25117b6a1 Mon Sep 17 00:00:00 2001 From: Wolfgang Jung Date: Wed, 9 Jul 2014 13:49:13 +0200 Subject: [PATCH] Added Container-Linking Linking is now available through StartContainerCmd --- .../client/command/StartContainerCmd.java | 11 ++- .../github/dockerjava/client/model/Link.java | 63 +++++++++++++++ .../github/dockerjava/client/model/Links.java | 76 +++++++++++++++++++ .../client/model/StartContainerConfig.java | 13 ++++ 4 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/github/dockerjava/client/model/Link.java create mode 100644 src/main/java/com/github/dockerjava/client/model/Links.java diff --git a/src/main/java/com/github/dockerjava/client/command/StartContainerCmd.java b/src/main/java/com/github/dockerjava/client/command/StartContainerCmd.java index 9cdc9a637..fb06741e7 100644 --- a/src/main/java/com/github/dockerjava/client/command/StartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/client/command/StartContainerCmd.java @@ -1,3 +1,4 @@ + package com.github.dockerjava.client.command; import javax.ws.rs.core.MediaType; @@ -8,6 +9,7 @@ import com.github.dockerjava.client.DockerException; import com.github.dockerjava.client.NotFoundException; import com.github.dockerjava.client.model.Bind; +import com.github.dockerjava.client.model.Link; import com.github.dockerjava.client.model.LxcConf; import com.github.dockerjava.client.model.Ports; import com.github.dockerjava.client.model.StartContainerConfig; @@ -37,7 +39,14 @@ public StartContainerCmd withBinds(Bind... binds) { return this; } - public StartContainerCmd withLxcConf(LxcConf[] lxcConf) { + public StartContainerCmd withLinks(final Link... links) + { + startContainerConfig.setLinks(links); + return this; + } + + public StartContainerCmd withLxcConf(final LxcConf[] lxcConf) + { startContainerConfig.setLxcConf(lxcConf); return this; } diff --git a/src/main/java/com/github/dockerjava/client/model/Link.java b/src/main/java/com/github/dockerjava/client/model/Link.java new file mode 100644 index 000000000..4e3eb1379 --- /dev/null +++ b/src/main/java/com/github/dockerjava/client/model/Link.java @@ -0,0 +1,63 @@ + +package com.github.dockerjava.client.model; + +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; + +public class Link +{ + + private final String name; + + private final String alias; + + public Link(final String name, final String alias) + { + this.name = name; + this.alias = alias; + } + + public String getName() + { + return name; + } + + public String getAlias() + { + return alias; + } + + public static Link parse(final String serialized) + { + try { + final String[] parts = serialized.split(":"); + switch (parts.length) { + case 2: { + return new Link(parts[0], parts[1]); + } + default: { + throw new RuntimeException("Error parsing Link '" + serialized + "'"); + } + } + } catch (final Exception e) { + throw new RuntimeException("Error parsing Link '" + serialized + "'"); + } + } + + @Override + public boolean equals(final Object obj) + { + if (obj instanceof Link) { + final Link other = (Link) obj; + return new EqualsBuilder().append(name, other.getName()).append(alias, other.getAlias()).isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() + { + return new HashCodeBuilder().append(name).append(alias).toHashCode(); + } + +} diff --git a/src/main/java/com/github/dockerjava/client/model/Links.java b/src/main/java/com/github/dockerjava/client/model/Links.java new file mode 100644 index 000000000..24a02bdda --- /dev/null +++ b/src/main/java/com/github/dockerjava/client/model/Links.java @@ -0,0 +1,76 @@ + +package com.github.dockerjava.client.model; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.ObjectCodec; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.node.NullNode; + +@JsonSerialize(using = Links.Serializer.class) +@JsonDeserialize(using = Links.Deserializer.class) +public class Links +{ + + private final Link[] links; + + public Links(final Link... links) + { + this.links = links; + } + + public Link[] getLinks() + { + return links; + } + + public static class Serializer extends JsonSerializer + { + + @Override + public void serialize(final Links links, final JsonGenerator jsonGen, final SerializerProvider serProvider) throws IOException, JsonProcessingException + { + jsonGen.writeStartArray(); + for (final Link link : links.getLinks()) { + final String s = link.getName() + ":" + link.getAlias(); + jsonGen.writeString(s); + } + jsonGen.writeEndArray(); + } + + } + + public static class Deserializer extends JsonDeserializer + { + + @Override + public Links deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException + { + final List binds = new ArrayList(); + final ObjectCodec oc = jsonParser.getCodec(); + final JsonNode node = oc.readTree(jsonParser); + for (final Iterator> it = node.fields(); it.hasNext();) { + + final Map.Entry field = it.next(); + if (!field.getValue().equals(NullNode.getInstance())) { + binds.add(Link.parse(field.getKey())); + } + } + return new Links(binds.toArray(new Link[0])); + } + } + +} diff --git a/src/main/java/com/github/dockerjava/client/model/StartContainerConfig.java b/src/main/java/com/github/dockerjava/client/model/StartContainerConfig.java index ab2b3a154..ae8088f92 100644 --- a/src/main/java/com/github/dockerjava/client/model/StartContainerConfig.java +++ b/src/main/java/com/github/dockerjava/client/model/StartContainerConfig.java @@ -15,6 +15,9 @@ public class StartContainerConfig { @JsonProperty("Binds") private Binds binds = new Binds(); + @JsonProperty("Links") + private Links links = new Links(); + @JsonProperty("LxcConf") private LxcConf[] lxcConf; @@ -43,6 +46,16 @@ public void setBinds(Bind[] binds) { this.binds = new Binds(binds); } + @JsonIgnore + public Link[] getLinks() { + return links.getLinks(); + } + + @JsonIgnore + public void setLinks(Link[] links) { + this.links = new Links(links); + } + public LxcConf[] getLxcConf() { return lxcConf; }