1 package gr.grnet.aquarium.user
4 import gr.grnet.aquarium.Configurator
5 import gr.grnet.aquarium.store.memory.MemStore
6 import gr.grnet.aquarium.util.date.MutableDateCalc
7 import gr.grnet.aquarium.logic.accounting.dsl._
9 import simulation.{ConcurrentVMLocalUIDGenerator, ClientServiceSim, UserSim}
10 import gr.grnet.aquarium.logic.accounting.{Policy, Accounting}
11 import gr.grnet.aquarium.util.{Loggable, ContextualLogger}
12 import com.ckkloverdos.maybe.{Just, NoVal}
17 * @author Christos KK Loverdos <loverdos@gmail.com>
19 class UserStateComputationsTest extends Loggable {
33 descriminatorfield: vmid
38 costpolicy: continuous
78 val DefaultPolicy = new DSL{}.parse(PolicyYAML)
80 // TODO: integrate this with the rest of the simulation stuff
81 // TODO: since, right now, the resource strings have to be given twice
82 val VMTimeResource = DSLComplexResource("vmtime", "Hr", OnOffCostPolicy, "")
83 val DiskspaceResource = DSLComplexResource("diskspace", "MB/Hr", ContinuousCostPolicy, "")
84 val BandwidthResource = DSLComplexResource("bandwidth", "MB/Hr", DiscreteCostPolicy, "")
85 val DefaultResourcesMap = new DSLResourcesMap(VMTimeResource :: DiskspaceResource :: BandwidthResource :: Nil)
87 // There are two client services, synnefo and pithos.
88 val TheUIDGenerator = new ConcurrentVMLocalUIDGenerator
89 val Synnefo = ClientServiceSim("synnefo")(TheUIDGenerator)
90 val Pithos = ClientServiceSim("pithos")(TheUIDGenerator)
94 val clog = ContextualLogger.fromOther(NoVal, logger, "testOne()")
95 val StartOfBillingYearDateCalc = new MutableDateCalc(2012, 1, 1)
96 // println("StartOfBillingYearDateCalc = %s".format(StartOfBillingYearDateCalc))
97 val UserCreationDateCalc = StartOfBillingYearDateCalc.copy.goMinusMonths(2)
98 // println("UserCreationDateCalc = %s".format(UserCreationDateCalc))
100 val computer = new UserStateComputations
102 val mc = Configurator.MasterConfigurator.withStoreProviderClass(classOf[MemStore])
103 Policy.withConfigurator(mc)
105 val storeProvider = mc.storeProvider
106 val userStateStore = storeProvider.userStateStore
107 val resourceEventStore = storeProvider.resourceEventStore
108 val policyStore = storeProvider.policyStore
110 val policyOccurredMillis = StartOfBillingYearDateCalc.toMillis
111 val policyValidFromMillis = StartOfBillingYearDateCalc.copy.goPreviousYear.toMillis
112 val policyValidToMillis = StartOfBillingYearDateCalc.copy.goNextYear.toMillis
113 policyStore.storePolicyEntry(DefaultPolicy.toPolicyEntry(policyOccurredMillis, policyValidFromMillis, policyValidToMillis))
115 // A new user is created on 2012-01-15 00:00:00.000
116 val UserCKKL = UserSim("CKKL", UserCreationDateCalc.toDate, storeProvider.resourceEventStore)
119 // - synnefo is for VMTime and Bandwidth
120 // - pithos is for Diskspace
121 val VMTimeInstance = Synnefo.newVMTime (UserCKKL, "VM.1")
122 val BandwidthInstance = Synnefo.newBandwidth(UserCKKL, "3G.1")
123 val DiskInstance = Pithos .newDiskspace(UserCKKL, "DISK.1")
125 // Let's create our dates of interest
126 val vmStartDateCalc = StartOfBillingYearDateCalc.copy.goPlusDays(1).goPlusHours(1)
127 // println("vmStartDateCalc = %s".format(vmStartDateCalc))
128 // 2012-01-16 01:00:00.000
129 val vmStartDate = vmStartDateCalc.toDate
131 // Within January, create one VM ON-OFF ...
132 val onOff1_M = VMTimeInstance.newONOFF(vmStartDate, 9)
134 val diskConsumptionDateCalc = StartOfBillingYearDateCalc.copy.goPlusHours(3)
135 // 2012-01-16 04:00:00.000
136 val diskConsumptionDate1 = diskConsumptionDateCalc.toDate
137 // 2012-01-17 05:00:00.000
138 val diskConsumptionDateCalc2 = diskConsumptionDateCalc.copy.goPlusDays(1).goPlusHours(1)
139 val diskConsumptionDate2 = diskConsumptionDateCalc2.toDate
141 // ... and two diskspace changes
142 val consume1_M = DiskInstance.consumeMB(diskConsumptionDate1, 99)
143 val consume2_M = DiskInstance.consumeMB(diskConsumptionDate2, 23)
145 // 100MB 3G bandwidth
146 val bwDateCalc = diskConsumptionDateCalc2.copy.goPlusDays(1)
147 BandwidthInstance.useBandwidth(bwDateCalc.toDate, 100.0)
149 // ... and one "future" event
150 // 2012-02-07 07:07:07.007
151 DiskInstance.consumeMB(
152 StartOfBillingYearDateCalc.copy.
153 goNextMonth.goPlusDays(6).
157 goPlusMillis(7).toDate,
161 clog.debug("=== Events by OccurredMillis ===")
163 for(event <- UserCKKL.myResourceEventsByOccurredDate) {
164 clog.debug(event.toDebugString(DefaultResourcesMap))
167 clog.debug("=== Events by OccurredMillis ===")
170 val billingMonthInfo = BillingMonthInfo.fromDateCalc(StartOfBillingYearDateCalc)
172 val initialUserState = computer.createFirstUserState(
173 userId = UserCKKL.userId,
174 millis = StartOfBillingYearDateCalc.copy.goPreviousYear.toMillis
177 val userStateM = computer.doFullMonthlyBilling(
183 UserCKKL.userCreationDate.getTime,
192 clog.debug("userStateM = %s".format(userStateM))
193 userStateM.forFailed { failed ⇒
195 failed.exception.printStackTrace()