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
+    }
 }

Reply via email to