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._
8 import gr.grnet.aquarium.logic.accounting.{Policy, Accounting}
9 import gr.grnet.aquarium.util.{Loggable, ContextualLogger}
10 import com.ckkloverdos.maybe.{Just, NoVal}
11 import gr.grnet.aquarium.simulation._
12 import gr.grnet.aquarium.simulation.uid.{UIDGenerator, ConcurrentVMLocalUIDGenerator}
17 * @author Christos KK Loverdos <loverdos@gmail.com>
19 class UserStateComputationsTest extends Loggable {
33 descriminatorfield: vmid
38 costpolicy: continuous
47 bandwidth: function bandwidth() {return 1;}
48 vmtime: function vmtime() {return 1;}
49 diskspace: function diskspace() {return 1;}
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 = StdVMTimeResourceSim
83 val DiskspaceResource = StdDiskspaceResourceSim
84 val BandwidthResource = StdBandwidthResourceSim
86 // There are two client services, synnefo and pithos.
87 val TheUIDGenerator: UIDGenerator = new ConcurrentVMLocalUIDGenerator
88 val Synnefo = ClientSim("synnefo")(TheUIDGenerator)
89 val Pithos = ClientSim("pithos" )(TheUIDGenerator)
93 val clog = ContextualLogger.fromOther(NoVal, logger, "testOne()")
94 val StartOfBillingYearDateCalc = new MutableDateCalc(2012, 1, 1)
95 val UserCreationDate = new MutableDateCalc(2011, 11, 1).toDate
97 val computations = new UserStateComputations
99 val mc = Configurator.MasterConfigurator.withStoreProviderClass(classOf[MemStore])
100 Policy.withConfigurator(mc)
102 val storeProvider = mc.storeProvider
103 val userStateStore = storeProvider.userStateStore
104 val resourceEventStore = storeProvider.resourceEventStore
105 val policyStore = storeProvider.policyStore
107 // Store the default policy
108 val policyDateCalc = StartOfBillingYearDateCalc.copy
109 val policyOccurredMillis = policyDateCalc.toMillis
110 val policyValidFromMillis = policyDateCalc.copy.goPreviousYear.toMillis
111 val policyValidToMillis = policyDateCalc.copy.goNextYear.toMillis
112 policyStore.storePolicyEntry(DefaultPolicy.toPolicyEntry(policyOccurredMillis, policyValidFromMillis, policyValidToMillis))
114 val Aquarium = AquariumSim(List(VMTimeResource, DiskspaceResource, BandwidthResource), storeProvider.resourceEventStore)
115 val DefaultResourcesMap = Aquarium.resourcesMap
117 // A new user is created on 2012-01-15 00:00:00.000
118 val UserCKKL = Aquarium.newUser("CKKL", UserCreationDate)
121 // - synnefo is for VMTime and Bandwidth
122 // - pithos is for Diskspace
123 val VMTimeInstance = StdVMTimeInstanceSim ("VM.1", UserCKKL, Synnefo)
124 val BandwidthInstance = StdBandwidthInstanceSim("3G.1", UserCKKL, Synnefo)
125 val DiskInstance = StdDiskspaceInstanceSim("DISK.1", UserCKKL, Pithos)
127 // Let's create our dates of interest
128 val vmStartDateCalc = StartOfBillingYearDateCalc.copy.goPlusDays(1).goPlusHours(1)
129 val vmStartDate = vmStartDateCalc.toDate
131 // Within January, create one VM ON-OFF ...
132 VMTimeInstance.newONOFF(vmStartDate, 9)
134 val diskConsumptionDateCalc = StartOfBillingYearDateCalc.copy.goPlusHours(3)
135 val diskConsumptionDate1 = diskConsumptionDateCalc.toDate
136 val diskConsumptionDateCalc2 = diskConsumptionDateCalc.copy.goPlusDays(1).goPlusHours(1)
137 val diskConsumptionDate2 = diskConsumptionDateCalc2.toDate
139 // ... and two diskspace changes
140 DiskInstance.consumeMB(diskConsumptionDate1, 99)
141 DiskInstance.consumeMB(diskConsumptionDate2, 23)
143 // 100MB 3G bandwidth
144 val bwDateCalc = diskConsumptionDateCalc2.copy.goPlusDays(1)
145 BandwidthInstance.useBandwidth(bwDateCalc.toDate, 100.0)
147 // ... and one "future" event
148 DiskInstance.consumeMB(
149 StartOfBillingYearDateCalc.copy.
150 goNextMonth.goPlusDays(6).
154 goPlusMillis(7).toDate,
158 clog.begin("Events by OccurredMillis")
160 for(event <- UserCKKL.myResourceEventsByOccurredDate) {
161 clog.debug(event.toDebugString(DefaultResourcesMap))
164 clog.end("Events by OccurredMillis")
167 val billingMonthInfo = BillingMonthInfo.fromDateCalc(StartOfBillingYearDateCalc)
169 val initialUserState = computations.createFirstUserState(
170 userId = UserCKKL.userId,
171 userCreationMillis = UserCreationDate.getTime,
174 roleNames = List("user"),
175 agreementName = DSLAgreement.DefaultAgreementName
178 val currentUserState = initialUserState
180 // Policy: from 2012-01-01 to Infinity
182 clog.debugMap("DefaultResourcesMap", DefaultResourcesMap.map, 1)
184 val userStateM = computations.doFullMonthlyBilling(
190 UserCKKL.userCreationDate.getTime,
198 clog.debug("userStateM = %s".format(userStateM))
199 userStateM.forFailed { failed ⇒
201 failed.exception.printStackTrace()