Skip to content
This repository has been archived by the owner on Oct 23, 2024. It is now read-only.

Commit

Permalink
Merge branch 'master' of github.com:mesosphere/marathon
Browse files Browse the repository at this point in the history
Conflicts:
	src/main/scala/mesosphere/marathon/api/v1/AppDefinition.scala
  • Loading branch information
florianleibert committed Sep 16, 2013
2 parents 710c512 + 02f89fe commit 35cf445
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 6 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ The team at [Mesosphere](https://mesosphe.re) is also happy to answer any questi

## Requirements

* [Mesos][Mesos] 0.14+ (see `pom.xml`)
* [Mesos][Mesos] 0.15+ (the current version of marathon requires Mesos 0.15+. If you are still running 0.14, you can change the version in the `pom.xml`)
* [Zookeeper][Zookeeper]
* JDK 1.6+
* Scala 2.10+
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class AppDefinition extends MarathonState[Protos.ServiceDefinition] {
var instances: Int = 0
var cpus: Double = 1.0
var mem: Double = 128.0
@Pattern(regexp="(^//cmd$)|(^/[^/].*$)")
@Pattern(regexp="(^//cmd$)|(^/[^/].*$)|")
var executor: String = ""

//TODO
Expand Down
14 changes: 11 additions & 3 deletions src/main/scala/mesosphere/mesos/TaskBuilder.scala
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ object TaskBuilder {
final val cpusResourceName = "cpus"
final val memResourceName = "mem"
final val portsResourceName = "ports"
final val portBlockSize = 5

def scalarResource(name: String, value: Double) = {
Resource.newBuilder
Expand Down Expand Up @@ -174,10 +175,17 @@ object TaskBuilder {
}

def getPort(resource: Resource): Option[Int] = {
if (resource.getRanges.getRangeCount > 0) {
Some(resource.getRanges.getRange(0).getBegin.toInt)
val ranges = resource.getRanges.getRangeList.asScala.map ( range => {
val portRangeBegin = range.getBegin.toInt + (range.getBegin.toInt % portBlockSize)
val blocksAvailable = (range.getEnd.toInt - portRangeBegin + 1) / portBlockSize
(portRangeBegin, blocksAvailable)
}).filter(range => (range._2 > 0))

if (ranges.size > 0) {
val range = util.Random.shuffle(ranges).head
Some((util.Random.nextInt(range._2) * 5) + range._1)
} else {
None
}
}
}
}
88 changes: 87 additions & 1 deletion src/test/scala/mesosphere/mesos/TaskBuilderTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -134,4 +134,90 @@ class TaskBuilderTest extends AssertionsForJUnit with MockitoSugar {
.build())
.build()
}
}

@Test
def testGetPortSingleRange() = {
val maxPort = 32000L
val minPort = 31000L

val range = Value.Range.newBuilder
.setBegin(minPort)
.setEnd(maxPort)
.build
val ranges = Ranges.newBuilder
.addRange(range)
.build
val portResource = Resource.newBuilder
.setName(TaskBuilder.portsResourceName)
.setType(Value.Type.RANGES)
.setRanges(ranges)
.build

val port = TaskBuilder.getPort(portResource)

assertTrue(port.get > minPort && port.get < maxPort)
assertEquals(port.get % TaskBuilder.portBlockSize,0)
}

@Test
def testGetPortMultipleRanges() = {
val maxPort1 = 31009L
val minPort1 = 31000L

val maxPort2 = 30003L
val minPort2 = 30000L

val range1 = Value.Range.newBuilder
.setBegin(minPort1)
.setEnd(maxPort1)
.build
val range2 = Value.Range.newBuilder
.setBegin(minPort2)
.setEnd(maxPort2)
.build
val ranges = Ranges.newBuilder
.addRange(range1)
.addRange(range2)
.build
val portResource = Resource.newBuilder
.setName(TaskBuilder.portsResourceName)
.setType(Value.Type.RANGES)
.setRanges(ranges)
.build

val port = TaskBuilder.getPort(portResource)

assertTrue(port.get == 31000 || port.get == 31005)
}

@Test
def testGetPortNotEnoughBlocksInRange() = {
val maxPort1 = 31003L
val minPort1 = 31000L

val maxPort2 = 30003L
val minPort2 = 30000L

val range1 = Value.Range.newBuilder
.setBegin(minPort1)
.setEnd(maxPort1)
.build
val range2 = Value.Range.newBuilder
.setBegin(minPort2)
.setEnd(maxPort2)
.build
val ranges = Ranges.newBuilder
.addRange(range1)
.addRange(range2)
.build
val portResource = Resource.newBuilder
.setName(TaskBuilder.portsResourceName)
.setType(Value.Type.RANGES)
.setRanges(ranges)
.build

val port = TaskBuilder.getPort(portResource)

assertTrue(port.isEmpty)
}
}

0 comments on commit 35cf445

Please sign in to comment.