case _ => tbi.get
}
+ // The following check that the policy is applicable within
+ // the timeframe of the requested resolution
+ assert(timeslot.to.before(policy.effective.to.getOrElse(maxdate)),
+ "Policy effectivity ends before expansion timeslot")
+ assert(timeslot.from.after(policy.effective.from),
+ "Policy effectivity starts after expansion timeslot")
+
val eff = allEffectiveTimeslots(policy.effective,
- oneYearBack(timeslot.from, policy.effective.from),
- oneYearAhead (timeslot.to, policy.effective.to.getOrElse(maxdate)))
+ Timeslot(oneYearBack(timeslot.from, policy.effective.from),
+ oneYearAhead (timeslot.to, policy.effective.to.getOrElse(maxdate))))
+
+ logger.debug("effective timeslots: %d".format(eff.size))
immutable.SortedMap[Timeslot, T]() ++
timeslot.overlappingTimeslots(eff).flatMap {
* Get a list of all timeslots within which a timeframe
* is effective, whithin the provided time bounds.
*/
- def allEffectiveTimeslots(spec: DSLTimeFrame, from: Date, to: Date):
+ def allEffectiveTimeslots(spec: DSLTimeFrame, t: Timeslot):
List[Timeslot] = {
//A timeframe with no repetition defined
if (spec.repeat.isEmpty) {
- val fromDate = if (spec.from.before(from)) from else spec.from
- val toDate = if (spec.to.getOrElse(to).after(to)) to else spec.to.getOrElse(to)
+ val fromDate = if (spec.from.before(t.from)) t.from else spec.from
+ val toDate = if (spec.to.getOrElse(t.to).after(t.to)) t.to else spec.to.getOrElse(t.to)
return List(Timeslot(fromDate, toDate))
}
val l = spec.repeat.flatMap {
- r => effectiveTimeslots(r, from, Some(to))
+ r => effectiveTimeslots(r, t.from, Some(t.to))
} sortWith sorter
mergeOverlaps(l)
}
/**
- * Get a list of all time periods within which a time frame is active.
+ * Get a list of all timeslots within which a time frame is active.
* If the to date is None, the expansion takes place within a timeframe
* between `from .. from` + 1 year. The result is returned sorted by
* timeframe start date.
def effectiveTimeslots(spec: DSLTimeFrameRepeat, from: Date, to: Option[Date]):
List[Timeslot] = {
- assert(spec.start.size == spec.end.size)
-
val endDate = to match {
case None => //One year from now
val c = new GregorianCalendar()
def testAlignTimeslots() {
before
val from = new Date(1322555880000L) //Tue, 29 Nov 2011 10:38:00 EET
- val to = new Date(1322689082000L) //Wed, 30 Nov 2011 23:38:02 EET
- val agr = dsl.findAgreement("scaledbandwidth").get
- val a = resolveEffectiveAlgorithmsForTimeslot(Timeslot(from, to), agr).keys.toList
- val b = resolveEffectivePricelistsForTimeslot(Timeslot(from, to), agr).keys.toList
+ val to = new Date(1322689082000L) //Wed, 30 Nov 2011 23:38:02 EET
+ val agr = dsl.findAgreement("complextimeslots").get
+ val a = resolveEffectiveAlgorithmsForTimeslot(Timeslot(from, to), agr).keySet.toList
+ val b = resolveEffectivePricelistsForTimeslot(Timeslot(from, to), agr).keySet.toList
val result = alignTimeslots(a, b)
- assertEquals(12, result.size)
+ assertEquals(9, result.size)
+ assertEquals(result.last, b.last)
}
@Test
//Simple, continuous resource
var evt = ResourceEvent("123", 1325762772000L, 1325762774000L, "12", "1", "bandwidthup", "1", "1", 123, Map())
- var wallet = chargeEvent(evt, agr, 112, new Date(1325755902000L), List())
+ var wallet = chargeEvent(evt, agr, 112, new Date(1325755902000L), List(), None)
wallet match {
case Just(x) => assertEquals(2, x.size)
case _ => fail("No results returned")
//Complex resource event without details, should fail
evt = ResourceEvent("123", 1325762772000L, 1325762774000L, "12", "1", "vmtime", "1", "1", 1, Map())
- assertFailed[Exception, List[WalletEntry]](chargeEvent(evt, agr, 1, new Date(1325755902000L), List()))
+ assertFailed[Exception, List[WalletEntry]](chargeEvent(evt, agr, 1, new Date(1325755902000L), List(), None))
//Complex, onoff resource
evt = ResourceEvent("123", 1325762772000L, 1325762774000L, "12", "1", "vmtime", "1", "1", 1, Map("vmid" -> "3"))
- wallet = chargeEvent(evt, agr, 0, new Date(1325755902000L), List())
+ wallet = chargeEvent(evt, agr, 0, new Date(1325755902000L), List(), None)
wallet match {
case Just(x) => assertEquals(2, x.size)
case _ => fail("No results returned")
//Complex, onoff resource, with wrong states, should fail
evt = ResourceEvent("123", 1325762772000L, 1325762774000L, "12", "1", "vmtime", "1", "1", 1, Map("vmid" -> "3"))
- assertFailed[Exception, List[WalletEntry]](chargeEvent(evt, agr, 1, new Date(1325755902000L), List()))
+ assertFailed[Exception, List[WalletEntry]](chargeEvent(evt, agr, 1, new Date(1325755902000L), List(), None))
//Simple, discrete resource
evt = ResourceEvent("123", 1325762772000L, 1325762774000L, "12", "1", "bookpages", "1", "1", 120, Map())
- wallet = chargeEvent(evt, agr, 15, new Date(1325755902000L), List())
+ wallet = chargeEvent(evt, agr, 15, new Date(1325755902000L), List(), None)
wallet match {
case Just(x) => assertEquals(1, x.size)
case _ => fail("No results returned")
//Simple, discrete resource, time of last update equal to current event's occurred time
evt = ResourceEvent("123", 1325762772000L, 1325762774000L, "12", "1", "bookpages", "1", "1", 120, Map())
- wallet = chargeEvent(evt, agr, 15, new Date(1325762772000L), List())
+ wallet = chargeEvent(evt, agr, 15, new Date(1325762772000L), List(), None)
assertEquals(1, wallet.getOr(List(WalletEntry.zero, WalletEntry.zero)).size)
//Simple, continuous resource, time of last update equal to current event's occurred time
evt = ResourceEvent("123", 1325762772000L, 1325762774000L, "12", "1", "bandwidthup", "1", "1", 123, Map())
- wallet = chargeEvent(evt, agr, 15, new Date(1325762772000L), List())
+ wallet = chargeEvent(evt, agr, 15, new Date(1325762772000L), List(), None)
assertEquals(0, wallet.getOr(List(WalletEntry.zero)).size)
}
}
\ No newline at end of file