Skip to content

Commit e24f915

Browse files
zmalikZain Malik
authored and
Zain Malik
committed
Add mesos primitives, Unavailability support
1 parent f47aa98 commit e24f915

File tree

3 files changed

+75
-3
lines changed

3 files changed

+75
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.apache.mesos.chronos.scheduler.mesos
2+
3+
import java.util.logging.Logger
4+
5+
import org.apache.mesos.Protos
6+
7+
/**
8+
* Helper for checking availability using mesos primitives
9+
*/
10+
object AvailabilityChecker {
11+
12+
private[this] val log = Logger.getLogger(getClass.getName)
13+
14+
def checkAvailability(offer: Protos.Offer): Boolean = {
15+
val now = System.nanoTime()
16+
if (offer.hasUnavailability && offer.getUnavailability.hasStart) {
17+
val start = offer.getUnavailability.getStart.getNanoseconds
18+
if (now.>=(start)) {
19+
if (offer.getUnavailability.hasDuration) {
20+
return start.+(offer.getUnavailability.getDuration.getNanoseconds).<(now)
21+
} else {
22+
return false;
23+
}
24+
25+
}
26+
}
27+
return true
28+
}
29+
30+
}

src/main/scala/org/apache/mesos/chronos/scheduler/mesos/MesosJobFramework.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ class MesosJobFramework @Inject()(
131131
case None =>
132132
val neededResources = new Resources(job)
133133
offerResources.toIterator.find { ors =>
134-
ors._2.canSatisfy(neededResources) && ConstraintChecker.checkConstraints(ors._1, job.constraints)
134+
ors._2.canSatisfy(neededResources) && ConstraintChecker.checkConstraints(ors._1, job.constraints) && AvailabilityChecker.checkAvailability(ors._1)
135135
} match {
136136
case Some((offer, resources)) =>
137137
// Subtract this job's resource requirements from the remaining available resources in this offer.

src/test/scala/org/apache/mesos/chronos/scheduler/mesos/MesosJobFrameworkSpec.scala

+44-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package org.apache.mesos.chronos.scheduler.mesos
22

33
import mesosphere.mesos.protos._
44
import mesosphere.mesos.util.FrameworkIdUtil
5-
import org.apache.mesos.Protos.Offer
5+
import org.apache.mesos.Protos.{DurationInfo, Offer, TimeInfo, Unavailability}
66
import org.apache.mesos.chronos.ChronosTestHelper._
77
import org.apache.mesos.chronos.scheduler.jobs.{BaseJob, JobScheduler, MockJobUtils, TaskManager}
88
import org.apache.mesos.{Protos, SchedulerDriver}
@@ -76,6 +76,33 @@ class MesosJobFrameworkSpec extends SpecificationWithJUnit with Mockito {
7676
there was one(mockSchedulerDriver).declineOffer(OfferID("1"), Protos.Filters.getDefaultInstance)
7777
}
7878

79+
"Reject unavailable offer" in {
80+
import mesosphere.mesos.protos.Implicits._
81+
82+
import scala.collection.JavaConverters._
83+
84+
val mockDriverFactory = MockJobUtils.mockDriverFactory
85+
val mockSchedulerDriver = mockDriverFactory.get
86+
87+
val mesosJobFramework = spy(
88+
new MesosJobFramework(
89+
mockDriverFactory,
90+
mock[JobScheduler],
91+
mock[TaskManager],
92+
makeConfig(),
93+
mock[FrameworkIdUtil],
94+
mock[MesosTaskBuilder],
95+
mock[MesosOfferReviver]))
96+
97+
val tasks = mutable.Buffer[(String, BaseJob, Offer)]()
98+
doReturn(tasks).when(mesosJobFramework).generateLaunchableTasks(any)
99+
100+
val offer: Offer = makeUnavailableOffer
101+
mesosJobFramework.resourceOffers(mockSchedulerDriver, Seq[Protos.Offer](offer).asJava)
102+
103+
there was one(mockSchedulerDriver).declineOffer(OfferID("1"), Protos.Filters.getDefaultInstance)
104+
}
105+
79106
"Reject unused offers with default RefuseSeconds if --decline_offer_duration is not set" in {
80107
import mesosphere.mesos.protos.Implicits._
81108

@@ -176,6 +203,22 @@ class MesosJobFrameworkSpec extends SpecificationWithJUnit with Mockito {
176203
}
177204

178205
private[this] def makeBasicOffer: Offer = {
206+
207+
makeBasicOfferBuilder
208+
.build()
209+
}
210+
211+
private[this] def makeUnavailableOffer: Offer = {
212+
213+
makeBasicOfferBuilder.setUnavailability(
214+
Unavailability.newBuilder()
215+
.setStart(TimeInfo.newBuilder().setNanoseconds(System.nanoTime()))
216+
.setDuration(DurationInfo.newBuilder().setNanoseconds(-1l))
217+
.build())
218+
.build()
219+
}
220+
221+
private[this] def makeBasicOfferBuilder: Offer.Builder = {
179222
import mesosphere.mesos.protos.Implicits._
180223

181224
Protos.Offer.newBuilder()
@@ -186,7 +229,6 @@ class MesosJobFrameworkSpec extends SpecificationWithJUnit with Mockito {
186229
.addResources(ScalarResource(Resource.CPUS, 1, "*"))
187230
.addResources(ScalarResource(Resource.MEM, 100, "*"))
188231
.addResources(ScalarResource(Resource.DISK, 100, "*"))
189-
.build()
190232
}
191233

192234

0 commit comments

Comments
 (0)