Skip to content
This repository has been archived by the owner on Jun 22, 2018. It is now read-only.

Commit

Permalink
Added Consul and Registrator back.
Browse files Browse the repository at this point in the history
  • Loading branch information
frankscholten committed Feb 24, 2017
1 parent 21f4672 commit c6f8952
Show file tree
Hide file tree
Showing 21 changed files with 238 additions and 12 deletions.
4 changes: 3 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ setup:
deps:
docker pull containersol/mesos-agent:1.0.0-0.1.0
docker pull containersol/mesos-master:1.0.0-0.1.0
docker pull mesosphere/mesos-dns:v0.6.0
docker pull gliderlabs/registrator:v6
docker pull consul:0.7.1
docker pull xebia/mesos-dns:v0.0.5
docker pull mesosphere/marathon:v1.3.5
docker pull jplock/zookeeper:3.4.6
docker pull containersol/alpine3.3-java8-jre:v1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ public void testFileContent() throws IOException {
assertTrue("agent section is not found", fileContent.contains("agent {"));
assertTrue("agent resources section is not found", fileContent.contains("resources {"));
assertTrue("zookeeper section is not found", fileContent.contains("zookeeper {"));
assertTrue("consul section is not found", fileContent.contains("consul {"));
assertTrue("registrator section is not found", fileContent.contains("registrator {"));
assertTrue("mesosdns section is not found", fileContent.contains("mesosdns {"));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public void testUpAndDestroy() {

assertTrue("Minimesos file at " + minimesosFile + " should exist", minimesosFile.exists());

assertEquals(5, cluster.getMemberProcesses().size());
assertEquals(7, cluster.getMemberProcesses().size());

cluster.destroy(new MesosClusterContainersFactory());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ minimesos {
}
}

consul {
imageName = "consul"
imageTag = "0.7.1"
}

marathon {
imageName = "mesosphere/marathon"
imageTag = "v1.3.5"
Expand All @@ -49,6 +54,11 @@ minimesos {
loggingLevel = "# INHERIT FROM CLUSTER"
}

registrator {
imageName = "gliderlabs/registrator"
imageTag = "v6"
}

mesosdns {
imageName = "xebia/mesos-dns"
imageTag = "0.0.5"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ minimesos {
}
}

consul {
imageName = "consul"
imageTag = "0.7.1"
}

marathon {
imageName = "mesosphere/marathon"
imageTag = "v1.3.5"
Expand All @@ -50,6 +55,11 @@ minimesos {
imageTag = "1.0.0-0.1.0"
}

registrator {
imageName = "gliderlabs/registrator"
imageTag = "v6"
}

mesosdns {
imageName = "xebia/mesos-dns"
imageTag = "0.0.5"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@
import com.containersol.minimesos.config.AppConfig;
import com.containersol.minimesos.config.ClusterConfig;
import com.containersol.minimesos.config.ConfigParser;
import com.containersol.minimesos.config.ConsulConfig;
import com.containersol.minimesos.config.MarathonConfig;
import com.containersol.minimesos.config.MesosAgentConfig;
import com.containersol.minimesos.config.MesosMasterConfig;
import com.containersol.minimesos.config.MesosDNSConfig;
import com.containersol.minimesos.config.MesosMasterConfig;
import com.containersol.minimesos.config.RegistratorConfig;
import com.containersol.minimesos.config.ZooKeeperConfig;

import org.slf4j.Logger;
Expand Down Expand Up @@ -84,6 +86,8 @@ public String getConfigFileContent() {
config.setMaster(new MesosMasterConfig(ClusterConfig.DEFAULT_MESOS_VERSION));
config.setZookeeper(new ZooKeeperConfig());
config.getAgents().add(new MesosAgentConfig(ClusterConfig.DEFAULT_MESOS_VERSION));
config.setConsul(new ConsulConfig());
config.setRegistrator(new RegistratorConfig());
config.setMesosdns(new MesosDNSConfig());

AppConfig weaveConfig = new AppConfig();
Expand Down
5 changes: 5 additions & 0 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,10 @@ Scalar values are simple key-value strings.
| agent resources mem | Block | Describes memory resources |
| agent resources ports | Block | Describes network ports resources |

## Consul and registrator

By default, minimesos starts consul and registrator containers giving you ability to configure service discovery.

## Mesos DNS

Mesos DNS registers Mesos processes and frameworks in its DNS server
Expand Down Expand Up @@ -229,6 +233,7 @@ export MINIMESOS_NETWORK_GATEWAY=172.17.0.1
export MINIMESOS_AGENT=http://172.17.0.5:5051; export MINIMESOS_AGENT_IP=172.17.0.5
export MINIMESOS_ZOOKEEPER=zk://172.17.0.3:2181/mesos; export MINIMESOS_ZOOKEEPER_IP=172.17.0.3
export MINIMESOS_MARATHON=http://172.17.0.6:8080; export MINIMESOS_MARATHON_IP=172.17.0.6
export MINIMESOS_CONSUL=http://172.17.0.7:8500; export MINIMESOS_CONSUL_IP=172.17.0.7
export MINIMESOS_MASTER=http://172.17.0.4:5050; export MINIMESOS_MASTER_IP=172.17.0.4
$ minimesos state | jq ".version"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ class ClusterConfig extends GroovyBlock {
ZooKeeperConfig zookeeper = null
MarathonConfig marathon = null
MesosDNSConfig mesosdns = null
ConsulConfig consul = null
RegistratorConfig registrator = null

def master(@DelegatesTo(MesosMasterConfig) Closure cl) {
if (master != null) {
Expand Down Expand Up @@ -71,6 +73,22 @@ class ClusterConfig extends GroovyBlock {
delegateTo(mesosdns, cl)
}

def consul(@DelegatesTo(ConsulConfig) Closure cl) {
if (consul != null) {
throw new RuntimeException("Cannot have more than 1 Consul server")
}
consul = new ConsulConfig()
delegateTo(consul, cl)
}

def registrator(@DelegatesTo(RegistratorConfig) Closure cl) {
if (registrator != null) {
throw new RuntimeException("Cannot have more than 1 registrator")
}
registrator = new RegistratorConfig()
delegateTo(registrator, cl)
}

void setLoggingLevel(String loggingLevel) {
if (!StringUtils.equalsIgnoreCase(loggingLevel, "WARNING") && !StringUtils.equalsIgnoreCase(loggingLevel, "INFO") && !StringUtils.equalsIgnoreCase(loggingLevel, "ERROR")) {
throw new RuntimeException("Property 'loggingLevel' can only have the values INFO, WARNING or ERROR. Got '" + loggingLevel + "'")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.containersol.minimesos.config;

public class ConsulConfig extends ContainerConfigBlock implements ContainerConfig {

public static final String CONSUL_IMAGE_NAME = "consul"
public static final String CONSUL_TAG_NAME = "0.7.1"

public static final int CONSUL_HTTP_PORT = 8500
public static final int CONSUL_DNS_PORT = 8600

public ConsulConfig() {
imageName = CONSUL_IMAGE_NAME
imageTag = CONSUL_TAG_NAME
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.containersol.minimesos.config;

public class RegistratorConfig extends ContainerConfigBlock implements ContainerConfig {

public static final String REGISTRATOR_IMAGE_NAME = "gliderlabs/registrator"
public static final String REGISTRATOR_TAG_NAME = "v6"

public RegistratorConfig() {
imageName = REGISTRATOR_IMAGE_NAME
imageTag = REGISTRATOR_TAG_NAME
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public static List<ClusterProcess> getDistinctRoleProcesses(List<ClusterProcess>
}

for (Map.Entry<String, Integer> role : roles.entrySet() ) {
if (role.getValue() >= 1) {
if (role.getValue() == 1) {
Optional<ClusterProcess> process = processes.stream().filter(withRole(role.getKey())).findFirst();
distinct.add(process.get());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.containersol.minimesos.cluster;

/**
* Consul functionality
*/
public interface Consul extends ClusterProcess {
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ public static Predicate<ClusterProcess> zooKeeper() {
return process -> process instanceof ZooKeeper;
}

public static Predicate<ClusterProcess> consul() {
return process -> process instanceof Consul;
}

public static Predicate<ClusterProcess> mesosMaster() {
return process -> process instanceof MesosMaster;
}
Expand All @@ -27,4 +31,5 @@ public static Predicate<ClusterProcess> withRole(String role) {
return process -> role.equals(process.getRole());
}

public static Predicate<ClusterProcess> registrator() { return process -> process instanceof Registrator; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,11 @@ public Marathon getMarathon() {
return marathon.isPresent() ? marathon.get() : null;
}

public Consul getConsul() {
Optional<Consul> container = getOne(Filter.consul());
return container.isPresent() ? container.get() : null;
}

/**
* Optionally get one of a certain type of type T. Note, this cast will always work because we are filtering on that type.
* If it doesn't find that type, the optional is empty so the cast doesn't need to be performed.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.containersol.minimesos.cluster;

/**
* Consul functionality
*/
public interface Registrator extends ClusterProcess {

void setConsul(Consul consul);
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,14 @@

import com.containersol.minimesos.MinimesosException;
import com.containersol.minimesos.cluster.ClusterProcess;
import com.containersol.minimesos.cluster.Consul;
import com.containersol.minimesos.cluster.Filter;
import com.containersol.minimesos.cluster.Marathon;
import com.containersol.minimesos.cluster.MesosAgent;
import com.containersol.minimesos.cluster.MesosCluster;
import com.containersol.minimesos.cluster.MesosClusterFactory;
import com.containersol.minimesos.cluster.MesosMaster;
import com.containersol.minimesos.cluster.MesosDNS;
import com.containersol.minimesos.cluster.Registrator;
import com.containersol.minimesos.cluster.ZooKeeper;
import com.containersol.minimesos.config.ClusterConfig;
import com.containersol.minimesos.config.ConfigParser;
Expand Down Expand Up @@ -53,8 +54,12 @@ public Marathon createMarathon(MesosCluster mesosCluster, String uuid, String co
return new MarathonContainer(mesosCluster, uuid, containerId);
}

public MesosDNS createMesosDNS(MesosCluster mesosCluster, String uuid, String containerId) {
return new MesosDNSContainer(mesosCluster, uuid, containerId);
public Consul createConsul(MesosCluster mesosCluster, String uuid, String containerId) {
return new ConsulContainer(mesosCluster, uuid, containerId);
}

public Registrator createRegistrator(MesosCluster mesosCluster, String uuid, String containerId) {
return new RegistratorContainer(mesosCluster, uuid, containerId);
}

@Override
Expand Down Expand Up @@ -93,8 +98,11 @@ public void loadRunningCluster(MesosCluster cluster) {
case "marathon":
containers.add(createMarathon(cluster, uuid, containerId));
break;
case "mesosDNS":
containers.add(createMesosDNS(cluster, uuid, containerId));
case "consul":
containers.add(createConsul(cluster, uuid, containerId));
break;
case "registrator":
containers.add(createRegistrator(cluster, uuid, containerId));
break;
}
}
Expand Down Expand Up @@ -167,8 +175,12 @@ private static ClusterContainers createProcesses(ClusterConfig clusterConfig) {
clusterContainers.add(new MarathonContainer(clusterConfig.getMarathon()));
}

if (clusterConfig.getMesosdns() != null) {
clusterContainers.add(new MesosDNSContainer(clusterConfig.getMesosdns()));
if (clusterConfig.getConsul() != null) {
clusterContainers.add(new ConsulContainer(clusterConfig.getConsul()));
}

if (clusterConfig.getRegistrator() != null) {
clusterContainers.add(new RegistratorContainer(clusterConfig.getRegistrator()));
}

return clusterContainers;
Expand All @@ -188,6 +200,10 @@ private static void validateProcesses(ClusterContainers clusterContainers) {
if (!isPresent(clusterContainers, Filter.mesosAgent())) {
throw new MinimesosException("Cluster requires at least 1 Mesos Agent. Please add one in the minimesosFile.");
}

if (isPresent(clusterContainers, Filter.registrator()) && !isPresent(clusterContainers, Filter.consul())) {
throw new MinimesosException("Registrator requires a single Consul. Please add consul in the minimesosFile.");
}
}

private static void connectProcesses(ClusterContainers clusterContainers) {
Expand All @@ -206,6 +222,12 @@ private static void connectProcesses(ClusterContainers clusterContainers) {
MesosAgent agent = (MesosAgent) a;
agent.setZooKeeper(zookeeper);
});

if (clusterContainers.getOne(Filter.registrator()).isPresent()) {
Consul consul = (Consul) clusterContainers.getOne(Filter.consul()).get();
Registrator registrator = (Registrator) clusterContainers.getOne(Filter.registrator()).get();
registrator.setConsul(consul);
}
}

private static Boolean isPresent(ClusterContainers clusterContainers, Predicate<ClusterProcess> filter) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.containersol.minimesos.mesos;

import com.containersol.minimesos.cluster.Consul;
import com.containersol.minimesos.cluster.MesosCluster;
import com.containersol.minimesos.cluster.Registrator;
import com.containersol.minimesos.config.ConsulConfig;
import com.containersol.minimesos.config.RegistratorConfig;
import com.containersol.minimesos.integrationtest.container.AbstractContainer;
import com.containersol.minimesos.docker.DockerClientFactory;
import com.github.dockerjava.api.command.CreateContainerCmd;
import com.github.dockerjava.api.model.Bind;

/**
* Registrator automatically registers and deregisters services for any Docker container by inspecting containers as they come online.
*/
public class RegistratorContainer extends AbstractContainer implements Registrator {

private RegistratorConfig config;

private Consul consul;

public RegistratorContainer(MesosCluster cluster, String uuid, String containerId) {
this(cluster, uuid, containerId, new RegistratorConfig());
}

private RegistratorContainer(MesosCluster cluster, String uuid, String containerId, RegistratorConfig config) {
super(cluster, uuid, containerId, config);
this.config = config;
}

public RegistratorContainer(RegistratorConfig registrator) {
super(registrator);
this.config = registrator;
}

@Override
public String getRole() {
return "registrator";
}

@Override
protected CreateContainerCmd dockerCommand() {
return DockerClientFactory.build().createContainerCmd(config.getImageName() + ":" + config.getImageTag())
.withNetworkMode("host")
.withBinds(Bind.parse("/var/run/docker.sock:/tmp/docker.sock"))
.withCmd("-internal", String.format("consul://%s:%d", consul.getIpAddress(), ConsulConfig.CONSUL_HTTP_PORT))
.withName(getName());
}

public void setConsul(ConsulContainer consul) {
this.consul = consul;
}

@Override
public void setConsul(Consul consul) {
this.consul = consul;
}
}
18 changes: 18 additions & 0 deletions minimesos/src/main/resources/marathon/mesos-consul.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"args": [
"--zk={{MINIMESOS_ZOOKEEPER}}",
"--consul=1",
"--consul-ip={{MINIMESOS_CONSUL_IP}}"
],
"container": {
"type": "DOCKER",
"docker": {
"network": "BRIDGE",
"image": "containersol/mesos-consul:latest"
}
},
"id": "mesos-consul",
"instances": 1,
"cpus": 0.1,
"mem": 256
}
Loading

0 comments on commit c6f8952

Please sign in to comment.