diff --git a/cluster/mesos/cluster.go b/cluster/mesos/cluster.go index 6449ce27c5..7c28cbe4e4 100644 --- a/cluster/mesos/cluster.go +++ b/cluster/mesos/cluster.go @@ -46,6 +46,7 @@ const ( frameworkName = "swarm" defaultDockerEnginePort = "2375" defaultDockerEngineTLSPort = "2376" + dockerPortAttribute = "docker_port" defaultOfferTimeout = 10 * time.Minute defaultTaskCreationTimeout = 5 * time.Second ) diff --git a/cluster/mesos/driver.go b/cluster/mesos/driver.go index c5f1682a97..0c5e626056 100644 --- a/cluster/mesos/driver.go +++ b/cluster/mesos/driver.go @@ -1,6 +1,8 @@ package mesos import ( + "fmt" + log "github.com/Sirupsen/logrus" "github.com/docker/swarm/cluster" "github.com/mesos/mesos-go/mesosproto" @@ -28,9 +30,20 @@ func (c *Cluster) ResourceOffers(_ mesosscheduler.SchedulerDriver, offers []*mes for _, offer := range offers { slaveID := offer.SlaveId.GetValue() + dockerPort := c.dockerEnginePort + for _, attribute := range offer.GetAttributes() { + if attribute.GetName() == dockerPortAttribute { + switch attribute.GetType() { + case mesosproto.Value_SCALAR: + dockerPort = fmt.Sprintf("%d", int(attribute.GetScalar().GetValue())) + case mesosproto.Value_TEXT: + dockerPort = attribute.GetText().GetValue() + } + } + } s, ok := c.slaves[slaveID] if !ok { - engine := cluster.NewEngine(*offer.Hostname+":"+c.dockerEnginePort, 0) + engine := cluster.NewEngine(*offer.Hostname+":"+dockerPort, 0) if err := engine.Connect(c.TLSConfig); err != nil { log.Error(err) } else { diff --git a/test/integration/mesos/api.bats b/test/integration/mesos/api.bats index e2ce253e36..3b2f72deac 100644 --- a/test/integration/mesos/api.bats +++ b/test/integration/mesos/api.bats @@ -9,12 +9,12 @@ function teardown() { } @test "docker info" { - start_docker 1 + start_docker 2 start_mesos swarm_manage_mesos run docker_swarm info [ "$status" -eq 0 ] - [[ "${output}" == *'Offers'* ]] + [[ "${output}" == *'Offers: 2'* ]] } @test "docker run no resources" { diff --git a/test/integration/mesos/mesos_helpers.bash b/test/integration/mesos/mesos_helpers.bash index 7575d62d73..e7558bdc93 100644 --- a/test/integration/mesos/mesos_helpers.bash +++ b/test/integration/mesos/mesos_helpers.bash @@ -4,38 +4,40 @@ load ../helpers MESOS_IMAGE=jimenez/mesos-dev:clang MESOS_MASTER_PORT=$(( ( RANDOM % 1000 ) + 10000 )) -BASE_PORT=2375 # Start mesos master and slave. function start_mesos() { + local current=${#DOCKER_CONTAINERS[@]} MESOS_MASTER=$( docker_host run -d --name mesos-master --net=host \ $MESOS_IMAGE /mesos/build/bin/mesos-master.sh --ip=127.0.0.1 --work_dir=/ --registry=in_memory --port=$MESOS_MASTER_PORT ) retry 10 1 eval "docker_host ps | grep 'mesos-master'" - - MESOS_SLAVE=$( - docker_host run --privileged -d --name mesos-slave --volumes-from node-0 -e DOCKER_HOST="${HOSTS[0]}" -v /sys/fs/cgroup:/sys/fs/cgroup --net=host \ - $MESOS_IMAGE /mesos/build/bin/mesos-slave.sh --master=127.0.0.1:$MESOS_MASTER_PORT --containerizers=docker --hostname=127.0.0.1 --port=$(($MESOS_MASTER_PORT + 1)) - ) - - retry 10 1 eval "docker_host ps | grep 'mesos-slave'" + for ((i=0; i < current; i++)); do + local docker_port=$(echo ${HOSTS[$i]} | cut -d: -f2) + MESOS_SLAVES[$i]=$( + docker_host run --privileged -d --name mesos-slave-$i --volumes-from node-$i -e DOCKER_HOST="${HOSTS[$i]}" -v /sys/fs/cgroup:/sys/fs/cgroup --net=host \ + $MESOS_IMAGE /mesos/build/bin/mesos-slave.sh --master=127.0.0.1:$MESOS_MASTER_PORT --containerizers=docker --attributes="docker_port:$docker_port" --hostname=127.0.0.1 --port=$(($MESOS_MASTER_PORT + (1 + $i))) + ) + retry 10 1 eval "docker_host ps | grep 'mesos-slave-$i'" + done } # Start the swarm manager in background. function swarm_manage_mesos() { + local current=${#DOCKER_CONTAINERS[@]} "$SWARM_BINARY" -l debug manage -H "$SWARM_HOST" --cluster-driver mesos-experimental --cluster-opt mesos.user=daemon 127.0.0.1:$MESOS_MASTER_PORT & SWARM_PID=$! - retry 10 1 eval "docker_swarm info | grep 'Offers: 1'" + retry 10 1 eval "docker_swarm info | grep 'Offers: $current'" } # Stop mesos master and slave. function stop_mesos() { - echo "Stopping $DOCKER_CONTAINER" - docker_host rm -f -v $DOCKER_CONTAINER > /dev/null; echo "Stopping $MESOS_MASTER" docker_host rm -f -v $MESOS_MASTER > /dev/null; - echo "Stopping $MESOS_SLAVE" - docker_host rm -f -v $MESOS_SLAVE > /dev/null; + for id in ${MESOS_SLAVES[@]}; do + echo "Stopping $id" + docker_host rm -f -v $id > /dev/null; + done }