new AccountingException("No resource [%s]".format(ev.resource)))
}
+ /* This is a safeguard against the special case where the last
+ * resource state update, as marked by the lastUpdate parameter
+ * is equal to the time of the event occurrence. This means that
+ * this is the first time the resource state has been recorded.
+ * Charging in this case only makes sense for discrete resources.
+ */
+ if (lastUpdate.getTime == ev.occurredMillis) {
+ resource.costpolicy match {
+ case DiscreteCostPolicy => //Ok
+ case _ => return Some(List())
+ }
+ }
+
val amount = resource.costpolicy match {
case ContinuousCostPolicy => resState.asInstanceOf[Float]
case DiscreteCostPolicy => ev.value
// Calculate the wallet entries generated from this resource event
_userState.maybeDSLAgreement match {
case Just(agreement) ⇒
- // TODO: the snapshot time should be per instanceId?
- // TODO: Related events
val walletEntriesM = chargeEvent(ev, agreement, ev.value,
new Date(previousRCUpdateTime),
findRelatedEntries(resource, ev.getInstanceId(policy)))
case Failed(e, m) ⇒
ERROR("While loading user state from DB: [%s][%s] %s", e.getClass.getName, e.getMessage, m)
case NoVal ⇒
+ //TODO: Rebuild actor state here.
WARN("Request for unknown (to Aquarium) user")
}
}
case Just(x) => assertEquals(2, x.size)
case _ => fail("No results returned")
}
- wallet.foreach(x => x.foreach(a => println(a.toJson)))
//Complex resource event without details, should fail
evt = ResourceEvent("123", 1325762772000L, 1325762774000L, "12", "1", "vmtime", "1", 1, Map())
case Just(x) => assertEquals(2, x.size)
case _ => fail("No results returned")
}
- wallet.foreach(x => x.foreach(a => println(a.toJson)))
//Complex, onoff resource, with wrong states, should fail
evt = ResourceEvent("123", 1325762772000L, 1325762774000L, "12", "1", "vmtime", "1", 1, Map("vmid" -> "3"))
case Just(x) => assertEquals(1, x.size)
case _ => fail("No results returned")
}
- wallet.foreach(x => x.foreach(a => println(a.toJson)))
+
+ //Simple, discrete resource, time of last update equal to current event's occurred time
+ evt = ResourceEvent("123", 1325762772000L, 1325762774000L, "12", "1", "bookpages", "1", 120, Map())
+ wallet = chargeEvent(evt, agr, 15, new Date(1325762772000L), List())
+ 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", 123, Map())
+ wallet = chargeEvent(evt, agr, 15, new Date(1325762772000L), List())
+ assertEquals(0, wallet.getOr(List(WalletEntry.zero)).size)
}
}
\ No newline at end of file