package gr.grnet.aquarium.charging
-import gr.grnet.aquarium.charging.state.UserStateModel
+import gr.grnet.aquarium.charging.state.{UserStateModel, UserAgreementHistoryModel}
import gr.grnet.aquarium.computation.BillingMonthInfo
-import gr.grnet.aquarium.event.{CreditsModel, DetailsModel}
+import gr.grnet.aquarium.event.DetailsModel
import gr.grnet.aquarium.message.MessageConstants
-import gr.grnet.aquarium.message.avro.gen.{AnyValueMsg, WalletEntryMsg, ResourcesChargingStateMsg, ResourceTypeMsg, ResourceInstanceChargingStateMsg, ResourceEventMsg}
+import gr.grnet.aquarium.message.avro.gen.{UserStateMsg, WalletEntryMsg, ResourcesChargingStateMsg, ResourceTypeMsg, ResourceInstanceChargingStateMsg, ResourceEventMsg}
import gr.grnet.aquarium.message.avro.{MessageHelpers, AvroHelpers, MessageFactory}
import gr.grnet.aquarium.util.LogHelpers.Debug
import gr.grnet.aquarium.{AquariumInternalError, Aquarium}
+import gr.grnet.aquarium.Real
+import gr.grnet.aquarium.HrsOfMillis
+import gr.grnet.aquarium.MBsOfBytes
/**
* In practice a resource usage will be charged for the total amount of usage
def computeCreditsToSubtract(
resourceInstanceChargingState: ResourceInstanceChargingStateMsg,
- oldCredits: Double,
+ oldCredits: Real,
timeDeltaMillis: Long,
- unitPrice: Double
- ): (Double /* credits */, String /* explanation */) = {
+ unitPrice: Real
+ ): (Real /* credits */, String /* explanation */) = {
- val oldAccumulatingAmount = resourceInstanceChargingState.getOldAccumulatingAmount
- val credits = HrsOfMillis(timeDeltaMillis) * oldAccumulatingAmount * unitPrice
+ val bytes = Real(resourceInstanceChargingState.getOldAccumulatingAmount)
+ val MBs = MBsOfBytes(bytes)
+ val Hrs = HrsOfMillis(timeDeltaMillis)
+
+ val credits = Hrs * MBs * unitPrice
val explanation = "Hours(%s) * MBs(%s) * UnitPrice(%s)".format(
- HrsOfMillis(timeDeltaMillis),
- MBsOfBytes(oldAccumulatingAmount),
+ Hrs,
+ MBs,
unitPrice
)
currentResourceEvent: ResourceEventMsg,
referenceStartMillis: Long,
referenceStopMillis: Long,
- totalCredits: Double
+ totalCredits: Real
): List[String] = {
List(MessageConstants.DefaultSelectorKey)
}
eventDetails: DetailsModel.Type
) = {
- val oldAccumulatingAmount = CreditsModel.from(resourceInstanceChargingState.getOldAccumulatingAmount)
- val currentValue = CreditsModel.from(resourceInstanceChargingState.getCurrentValue)
+ val oldAccumulatingAmount = Real(resourceInstanceChargingState.getOldAccumulatingAmount)
+ val currentValue = Real(resourceInstanceChargingState.getCurrentValue)
- CreditsModel.add(oldAccumulatingAmount, currentValue)
+ oldAccumulatingAmount + currentValue
}
def constructImplicitEndEventFor(resourceEvent: ResourceEventMsg, newOccurredMillis: Long) = {
resourcesChargingState: ResourcesChargingStateMsg,
userStateModel: UserStateModel,
walletEntryRecorder: WalletEntryMsg ⇒ Unit
- ): (Int, CreditsModel.Type) = {
+ ): (Int, Real) = {
+
+ val userStateMsg = userStateModel.userStateMsg
// 1. Ensure proper initial state per resource and per instance
ensureInitializedWorkingState(resourcesChargingState, resourceEvent)
fillWorkingResourceInstanceChargingStateFromEvent(resourceInstanceChargingState, resourceEvent)
- val userAgreementHistoryModel = userStateModel.userAgreementHistoryModel
val previousEvents = resourceInstanceChargingState.getPreviousEvents
val previousEvent = previousEvents.size() match {
case 0 ⇒
val dummyFirstEventValue = "0.0" // TODO ? From configuration
- val millis = userAgreementHistoryModel.agreementByTimeslot.headOption match {
+ val millis = userStateModel.agreementByTimeslot.headOption match {
case None =>
throw new AquariumInternalError("No agreement!!!") // FIXME Better explanation
case Some((_,aggr)) =>
resourceEvent,
resourceType,
billingMonthInfo,
- userStateModel.totalCredits,
+ Real(userStateMsg.getTotalCredits),
previousEvent.getOccurredMillis,
resourceEvent.getOccurredMillis,
- userAgreementHistoryModel.agreementByTimeslot,
+ userStateModel.agreementByTimeslot,
resourcesChargingStateDetails,
resourceInstanceChargingState,
aquarium,