Support for health checks in the Marathon binding.
diff --git a/containers-marathon/src/main/java/org/apache/aries/containers/marathon/impl/MarathonServiceManager.java b/containers-marathon/src/main/java/org/apache/aries/containers/marathon/impl/MarathonServiceManager.java
index d2e0e55..7735af0 100644
--- a/containers-marathon/src/main/java/org/apache/aries/containers/marathon/impl/MarathonServiceManager.java
+++ b/containers-marathon/src/main/java/org/apache/aries/containers/marathon/impl/MarathonServiceManager.java
@@ -25,6 +25,8 @@
 import java.util.Map;
 import java.util.Set;
 
+import javax.naming.OperationNotSupportedException;
+
 import org.apache.aries.containers.Service;
 import org.apache.aries.containers.ServiceConfig;
 import org.apache.aries.containers.ServiceManager;
@@ -34,9 +36,11 @@
 import mesosphere.marathon.client.Marathon;
 import mesosphere.marathon.client.MarathonClient;
 import mesosphere.marathon.client.model.v2.App;
+import mesosphere.marathon.client.model.v2.Command;
 import mesosphere.marathon.client.model.v2.Container;
 import mesosphere.marathon.client.model.v2.Docker;
 import mesosphere.marathon.client.model.v2.GetAppsResponse;
+import mesosphere.marathon.client.model.v2.HealthCheck;
 import mesosphere.marathon.client.model.v2.Port;
 
 public class MarathonServiceManager implements ServiceManager {
@@ -89,6 +93,7 @@
         app.setMem(config.getRequestedMemory());
         app.setInstances(config.getRequestedInstances());
         app.setEnv(Collections.unmodifiableMap(config.getEnvVars()));
+        app.addLabel(SERVICE_NAME, config.getServiceName());
 
         StringBuilder cmd = new StringBuilder();
         if (config.getEntryPoint() != null) {
@@ -112,7 +117,7 @@
 
         Docker docker = new Docker();
         docker.setImage(config.getContainerImage());
-        docker.setNetwork("BRIDGE"); // TODO is this correct?
+        docker.setNetwork("BRIDGE");
         List<Port> ports = new ArrayList<>();
         for (int p : config.getContainerPorts()) {
             Port port = new Port();
@@ -124,12 +129,38 @@
         Container container = new Container();
         container.setType("DOCKER");
         container.setDocker(docker);
-
         app.setContainer(container);
-        app.addLabel(SERVICE_NAME, config.getServiceName());
+
+        List<HealthCheck> healthChecks = new ArrayList<>();
+        for (org.apache.aries.containers.HealthCheck hc : config.getHealthChecks()) {
+            HealthCheck healthCheck = new HealthCheck();
+            healthCheck.setProtocol(hc.getType().toString());
+            healthCheck.setGracePeriodSeconds(hc.getGracePeriod());
+            healthCheck.setIntervalSeconds(hc.getInterval());
+            healthCheck.setMaxConsecutiveFailures(hc.getMaxFailures());
+            healthCheck.setTimeoutSeconds(hc.getTimeout());
+
+            switch (hc.getType()) {
+            case HTTP:
+                healthCheck.setPath(hc.getParameters());
+                // Fallthrough as the other params are the same as TCP
+            case TCP:
+                healthCheck.setPort(hc.getPort());
+                healthCheck.setPortIndex(hc.getPortIndex());
+                break;
+            case COMMAND:
+                Command command = new Command();
+                command.setValue(hc.getParameters());
+                healthCheck.setCommand(command);
+                break;
+            default:
+                throw new OperationNotSupportedException(hc.getType() + " health checks are not yet supported");
+            }
+            healthChecks.add(healthCheck);
+        }
+        app.setHealthChecks(healthChecks);
 
         App res = marathonClient.createApp(app);
-
         return createServiceFromApp(res, config);
     }
 
diff --git a/containers-marathon/src/test/java/org/apache/aries/containers/marathon/impl/MarathonServiceManagerTest.java b/containers-marathon/src/test/java/org/apache/aries/containers/marathon/impl/MarathonServiceManagerTest.java
index 0baf722..c0152e9 100644
--- a/containers-marathon/src/test/java/org/apache/aries/containers/marathon/impl/MarathonServiceManagerTest.java
+++ b/containers-marathon/src/test/java/org/apache/aries/containers/marathon/impl/MarathonServiceManagerTest.java
@@ -26,6 +26,7 @@
 import java.util.List;
 import java.util.Set;
 
+import org.apache.aries.containers.HealthCheck;
 import org.apache.aries.containers.Service;
 import org.apache.aries.containers.ServiceConfig;
 import org.junit.Test;
@@ -103,7 +104,7 @@
     }
 
     @Test
-    public void testGetService2() throws Exception {
+    public void testGetServiceWithHealthCheck() throws Exception {
         GetAppsResponse nar = Mockito.mock(GetAppsResponse.class);
 
         List<App> appsCreated = new ArrayList<>();
@@ -121,9 +122,18 @@
 
         MarathonServiceManager msm = new MarathonServiceManager(mc);
 
+        HealthCheck hc1 = HealthCheck.builder(HealthCheck.Type.HTTP).parameters("/").portIndex(0).
+                build();
+        HealthCheck hc2 = HealthCheck.builder(HealthCheck.Type.TCP).port(8080).
+                build();
+        HealthCheck hc3 = HealthCheck.builder(HealthCheck.Type.COMMAND).parameters("ping test.com").
+                build();
         ServiceConfig cfg = ServiceConfig.builder("my-other-service", "animage").
                 entryPoint("/bin/sh").
                 commandLine("-c", "ls -la").
+                healthCheck(hc1).
+                healthCheck(hc2).
+                healthCheck(hc3).
                 build();
 
         assertEquals("Precondition", 0, appsCreated.size());
@@ -132,6 +142,30 @@
 
         App app = appsCreated.iterator().next();
         assertEquals("/bin/sh -c 'ls -la'", app.getCmd());
+
+        List<mesosphere.marathon.client.model.v2.HealthCheck> checks = app.getHealthChecks();
+        assertEquals(3, checks.size());
+
+        Set<String> foundTypes = new HashSet<>();
+        for (mesosphere.marathon.client.model.v2.HealthCheck check : checks) {
+            foundTypes.add(check.getProtocol());
+
+            switch (check.getProtocol()) {
+            case "HTTP":
+                assertEquals("/", check.getPath());
+                assertEquals((Integer) 0, check.getPortIndex());
+                assertNull(check.getPort());
+                break;
+            case "TCP":
+                assertEquals(8080, (int) check.getPort());
+                assertNull(check.getPortIndex());
+                break;
+            case "COMMAND":
+                assertEquals("ping test.com", check.getCommand().getValue());
+                break;
+            }
+        }
+
         assertSame(cfg, svc.getConfiguration());
     }