Take care of first time state changes
authorGeorgios Gousios <gousiosg@gmail.com>
Wed, 11 Jan 2012 09:44:12 +0000 (11:44 +0200)
committerGeorgios Gousios <gousiosg@gmail.com>
Wed, 11 Jan 2012 09:44:12 +0000 (11:44 +0200)
src/main/scala/gr/grnet/aquarium/logic/accounting/Accounting.scala
src/main/scala/gr/grnet/aquarium/user/actor/UserActor.scala
src/test/scala/gr/grnet/aquarium/logic/test/AccountingTest.scala

index 14a85d0..9cda07c 100644 (file)
@@ -77,6 +77,19 @@ trait Accounting extends DSLUtils with Loggable {
         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
index c986e69..493c07a 100644 (file)
@@ -420,8 +420,6 @@ class UserActor extends AquariumActor with Loggable with Accounting {
             // 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)))
@@ -549,6 +547,7 @@ class UserActor extends AquariumActor with Loggable with Accounting {
         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")
       }
     }
index f9c6926..cc35d29 100644 (file)
@@ -87,7 +87,6 @@ class AccountingTest extends DSLTestBase with Accounting with TestMethods {
       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())
@@ -100,7 +99,6 @@ class AccountingTest extends DSLTestBase with Accounting with TestMethods {
       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"))
@@ -113,6 +111,15 @@ class AccountingTest extends DSLTestBase with Accounting with TestMethods {
       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