Repository: aries-containers Updated Branches: refs/heads/master cef77e6c5 -> ae855488b
Support for ContainerFactory.listServices() Project: http://git-wip-us.apache.org/repos/asf/aries-containers/repo Commit: http://git-wip-us.apache.org/repos/asf/aries-containers/commit/ae855488 Tree: http://git-wip-us.apache.org/repos/asf/aries-containers/tree/ae855488 Diff: http://git-wip-us.apache.org/repos/asf/aries-containers/diff/ae855488 Branch: refs/heads/master Commit: ae855488b2c614495d270c6516019e9c9bad5d5f Parents: cef77e6 Author: David Bosschaert <[email protected]> Authored: Fri May 26 09:33:50 2017 +0100 Committer: David Bosschaert <[email protected]> Committed: Fri May 26 09:33:50 2017 +0100 ---------------------------------------------------------------------- .../aries/containers/ContainerFactory.java | 4 ++ .../org/apache/aries/containers/Service.java | 12 +++++ .../docker/local/impl/ContainerImpl.java | 45 ++++++++++++++++++ .../local/impl/LocalDockerContainerFactory.java | 48 ++++++++++++++++---- .../local/impl/LocalDockerController.java | 14 +++--- .../docker/local/impl/ServiceImpl.java | 17 +++++++ 6 files changed, 124 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aries-containers/blob/ae855488/containers-api/src/main/java/org/apache/aries/containers/ContainerFactory.java ---------------------------------------------------------------------- diff --git a/containers-api/src/main/java/org/apache/aries/containers/ContainerFactory.java b/containers-api/src/main/java/org/apache/aries/containers/ContainerFactory.java index ec69264..d6d91d9 100644 --- a/containers-api/src/main/java/org/apache/aries/containers/ContainerFactory.java +++ b/containers-api/src/main/java/org/apache/aries/containers/ContainerFactory.java @@ -1,8 +1,12 @@ package org.apache.aries.containers; +import java.util.Set; + import org.osgi.annotation.versioning.ProviderType; @ProviderType public interface ContainerFactory { Service getService(ServiceConfig config) throws Exception; + + Set<String> listServices() throws Exception; } http://git-wip-us.apache.org/repos/asf/aries-containers/blob/ae855488/containers-api/src/main/java/org/apache/aries/containers/Service.java ---------------------------------------------------------------------- diff --git a/containers-api/src/main/java/org/apache/aries/containers/Service.java b/containers-api/src/main/java/org/apache/aries/containers/Service.java index 6b334d0..f440ceb 100644 --- a/containers-api/src/main/java/org/apache/aries/containers/Service.java +++ b/containers-api/src/main/java/org/apache/aries/containers/Service.java @@ -18,6 +18,8 @@ */ package org.apache.aries.containers; +import java.util.List; + import org.osgi.annotation.versioning.ProviderType; @ProviderType @@ -33,5 +35,15 @@ public interface Service { */ int getActualInstanceCount(); + ServiceConfig getConfiguration(); + + List<Container> listContainers(); + void setInstanceCount(int count); + + /** + * Update the internal representation of the service with the actual runtime state + * which can be useful if it has been changed from the outside. + */ + void refresh(); } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/aries-containers/blob/ae855488/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/ContainerImpl.java ---------------------------------------------------------------------- diff --git a/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/ContainerImpl.java b/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/ContainerImpl.java index 66f3f83..4895433 100644 --- a/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/ContainerImpl.java +++ b/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/ContainerImpl.java @@ -65,4 +65,49 @@ public class ContainerImpl implements Container { void setService(ServiceImpl svc) { service = svc; } + + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + ((ip == null) ? 0 : ip.hashCode()); + result = prime * result + ((ports == null) ? 0 : ports.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + + ContainerImpl other = (ContainerImpl) obj; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + if (ip == null) { + if (other.ip != null) + return false; + } else if (!ip.equals(other.ip)) + return false; + if (ports == null) { + if (other.ports != null) + return false; + } else if (!ports.equals(other.ports)) + return false; + return true; + } + + @Override + public String toString() { + return "ContainerImpl [id=" + id + ", ip=" + ip + ", ports=" + ports + + ", service=" + service.getConfiguration().getServiceName() + "]"; + } } http://git-wip-us.apache.org/repos/asf/aries-containers/blob/ae855488/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/LocalDockerContainerFactory.java ---------------------------------------------------------------------- diff --git a/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/LocalDockerContainerFactory.java b/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/LocalDockerContainerFactory.java index 11ad192..307712e 100644 --- a/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/LocalDockerContainerFactory.java +++ b/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/LocalDockerContainerFactory.java @@ -27,15 +27,16 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Pattern; import java.util.stream.Stream; +import org.apache.aries.containers.Container; import org.apache.aries.containers.ContainerFactory; import org.apache.aries.containers.Service; import org.apache.aries.containers.ServiceConfig; @@ -60,14 +61,10 @@ public class LocalDockerContainerFactory implements ContainerFactory { private volatile LocalDockerController docker; - private final AtomicBoolean initialized = new AtomicBoolean(false); private final ConcurrentMap<String, Service> services = new ConcurrentHashMap<>(); - private void init() { - if (!initialized.compareAndSet(false, true)) - return; - + public LocalDockerContainerFactory() { if (docker == null) docker = new LocalDockerController(); } @@ -78,8 +75,6 @@ public class LocalDockerContainerFactory implements ContainerFactory { @Override public Service getService(ServiceConfig config) throws Exception { - init(); - Service existingService = services.get(config.getServiceName()); if (existingService != null) return existingService; @@ -163,7 +158,7 @@ public class LocalDockerContainerFactory implements ContainerFactory { if (ids.size() == 0) return Collections.emptyList(); - String infoJSON = docker.inspect(ids.toArray(new String [] {})); + String infoJSON = docker.inspect(ids); List<Object> data = new JSONParser(infoJSON).getParsedList(); for (Object d : data) { if (!(d instanceof Map)) @@ -199,6 +194,7 @@ public class LocalDockerContainerFactory implements ContainerFactory { } } } + // TODO check that the settings match! res.add(new ContainerImpl(m.get("Id").toString(), LocalDockerContainerFactory.getContainerHost(), ports)); } return res; @@ -213,4 +209,38 @@ public class LocalDockerContainerFactory implements ContainerFactory { public static String getContainerHost() { return CONTAINER_HOST; } + + @Override + public Set<String> listServices() throws Exception { + Set<String> res = new HashSet<>(); + List<String> ids = docker.ps(SERVICE_NAME); + + for (Service svc : services.values()) { + res.add(svc.getConfiguration().getServiceName()); + for (Container c : svc.listContainers()) { + ids.remove(c.getID()); + } + } + + String json = docker.inspect(ids); + for (Object data : new JSONParser(json).getParsedList()) { + // These are services that have been launched previously and are not internally synced yet + if (!(data instanceof Map)) { + continue; + } + + Object cd = ((Map) data).get("Config"); + if (cd instanceof Map) { + Object ld = ((Map) cd).get("Labels"); + if (ld instanceof Map) { + Object serviceName = ((Map) ld).get(SERVICE_NAME); + if (serviceName instanceof String) { + res.add((String) serviceName); + } + } + } + } + + return res; + } } http://git-wip-us.apache.org/repos/asf/aries-containers/blob/ae855488/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/LocalDockerController.java ---------------------------------------------------------------------- diff --git a/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/LocalDockerController.java b/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/LocalDockerController.java index bb36d07..94801b6 100644 --- a/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/LocalDockerController.java +++ b/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/LocalDockerController.java @@ -49,7 +49,7 @@ public class LocalDockerController { } public List<String> ps(String labelFilter) { - String res = runCommand("docker", "ps", "-q", "-f", "label=" + labelFilter); + String res = runCommand("docker", "ps", "-q", "--no-trunc","-f", "label=" + labelFilter); String[] sa = res.trim().split("\\s+"); List<String> sl = new ArrayList<>(sa.length); @@ -61,12 +61,12 @@ public class LocalDockerController { return sl; } - public String inspect(String... ids) { - String[] command = new String[ids.length+2]; - command[0] = "docker"; - command[1] = "inspect"; - System.arraycopy(ids, 0, command, 2, ids.length); - return runCommand(command); + public String inspect(List<String> ids) { + List<String> cmd = new ArrayList<>(); + cmd.add("docker"); + cmd.add("inspect"); + cmd.addAll(ids); + return runCommand(cmd.toArray(new String [] {})); } String runCommandExpectSingleID(String ... command) throws Exception { http://git-wip-us.apache.org/repos/asf/aries-containers/blob/ae855488/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/ServiceImpl.java ---------------------------------------------------------------------- diff --git a/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/ServiceImpl.java b/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/ServiceImpl.java index 76484f0..895d809 100644 --- a/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/ServiceImpl.java +++ b/containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/ServiceImpl.java @@ -18,9 +18,11 @@ */ package org.apache.aries.containers.docker.local.impl; +import java.util.Collections; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import org.apache.aries.containers.Container; import org.apache.aries.containers.Service; import org.apache.aries.containers.ServiceConfig; @@ -49,6 +51,11 @@ public class ServiceImpl implements Service { } @Override + public ServiceConfig getConfiguration() { + return config; + } + + @Override public void setInstanceCount(int count) { try { int curSize = containers.size(); @@ -72,4 +79,14 @@ public class ServiceImpl implements Service { public void killAndReplaceContainer(ContainerImpl containerImpl) { // TODO implement } + + @Override + public List<Container> listContainers() { + return Collections.unmodifiableList(containers); + } + + @Override + public void refresh() { + // TODO + } }
