Statistics
| Branch: | Tag: | Revision:

root / src / test / scala / gr / grnet / aquarium / user / UserStateComputationsTest.scala @ e9b44c33

History | View | Annotate | Download (5 kB)

1
package gr.grnet.aquarium.user
2

    
3
import org.junit.Test
4
import gr.grnet.aquarium.Configurator
5
import gr.grnet.aquarium.store.memory.MemStore
6
import gr.grnet.aquarium.util.date.DateCalculator
7
import gr.grnet.aquarium.logic.accounting.dsl._
8
import java.util.Date
9
import gr.grnet.aquarium.logic.accounting.Accounting
10
import com.ckkloverdos.maybe.NoVal
11
import simulation.{ConcurrentVMLocalUIDGenerator, ClientServiceSim, UserSim}
12

    
13

    
14
/**
15
 *
16
 * @author Christos KK Loverdos <loverdos@gmail.com>
17
 */
18
class UserStateComputationsTest {
19
  @Test
20
  def testOne: Unit = {
21
    val StartOfBillingYearDateCalc = new DateCalculator(2012, 1, 1)
22
//    println("StartOfBillingYearDateCalc = %s".format(StartOfBillingYearDateCalc))
23
    val UserCreationDateCalc = StartOfBillingYearDateCalc.copy.goMinusMonths(2)
24
//    println("UserCreationDateCalc = %s".format(UserCreationDateCalc))
25

    
26
    // TODO: integrate this with the rest of the simulation stuff
27
    // TODO: since, right now, the resource strings have to be given twice
28
    val VMTIME_RESOURCE    = DSLComplexResource("vmtime",    "Hr",    OnOffCostPolicy,      "")
29
    val DISKSPACE_RESOURCE = DSLComplexResource("diskspace", "MB/Hr", ContinuousCostPolicy, "")
30

    
31
    val DEFAULT_RESOURCES_MAP = new DSLResourcesMap(VMTIME_RESOURCE :: DISKSPACE_RESOURCE :: Nil)
32

    
33
    val FOR_EVER = DSLTimeFrame(new Date(0), None, Nil)
34
    val THE_PRICES_MAP: Map[DSLResource, Double] = Map(VMTIME_RESOURCE -> 1.0, DISKSPACE_RESOURCE -> 1.0)
35

    
36
    val THE_PRICE_LIST  = DSLPriceList("default", None, THE_PRICES_MAP, FOR_EVER)
37
    val THE_CREDIT_PLAN = DSLCreditPlan("default", None, 100, Nil, "", FOR_EVER)
38
    val THE_ALGORITHM   = DSLAlgorithm("default", None, Map(), FOR_EVER)
39
    val THE_AGREEMENT   = DSLAgreement("default", None, THE_ALGORITHM, THE_PRICE_LIST, THE_CREDIT_PLAN)
40

    
41
    val THE_RESOURCES = DEFAULT_RESOURCES_MAP.toResourcesList
42

    
43
    val DEFAULT_POLICY = DSLPolicy(
44
      Nil,
45
      THE_PRICE_LIST :: Nil,
46
      THE_RESOURCES,
47
      THE_CREDIT_PLAN :: Nil,
48
      THE_AGREEMENT :: Nil
49
    )
50

    
51
    val computer = new UserStateComputations
52

    
53
    val mc = Configurator.MasterConfigurator.withStoreProviderClass(classOf[MemStore])
54
    val storeProvider = mc.storeProvider
55
    val userStateStore = storeProvider.userStateStore
56
    val resourceEventStore = storeProvider.resourceEventStore
57
    val policyStore = storeProvider.policyStore
58

    
59
    // A new user is created on 2012-01-15 00:00:00.000
60
    val christos  = UserSim("Christos", UserCreationDateCalc.toDate, storeProvider.resourceEventStore)
61

    
62
    // There are two client services, synnefo and pithos.
63
    val uidGenerator = new ConcurrentVMLocalUIDGenerator
64
    val synnefo = ClientServiceSim("synnefo")(uidGenerator)
65
    val pithos  = ClientServiceSim("pithos")(uidGenerator)
66

    
67
    // By convention
68
    // - synnefo is for VMTime and
69
    // - pithos is for Diskspace
70
    val vm   = synnefo.newVMTime(christos, "VM.1")
71
    val disk = pithos.newDiskspace(christos, "DISK.1")
72

    
73
    // Let's create our dates of interest
74
    val vmStartDateCalc = StartOfBillingYearDateCalc.copy.goPlusDays(1).goPlusHours(1)
75
//    println("vmStartDateCalc = %s".format(vmStartDateCalc))
76
    // 2012-01-16 01:00:00.000
77
    val vmStartDate = vmStartDateCalc.toDate
78

    
79
    // Within January, create one VM ON-OFF ...
80
    val onOff1_M = vm.newONOFF(vmStartDate, 9)
81

    
82
    val diskConsumptionDateCalc = StartOfBillingYearDateCalc.copy.goPlusHours(3)
83
    // 2012-01-16 04:00:00.000
84
    val diskConsumptionDate1 = diskConsumptionDateCalc.toDate
85
    // 2012-01-17 05:00:00.000
86
    val diskConsumptionDate2 = diskConsumptionDateCalc.copy.goPlusDays(1).goPlusHours(1).toDate
87

    
88
    // ... and two diskspace changes
89
    val consume1_M = disk.consumeMB(diskConsumptionDate1, 99)
90
    val consume2_M = disk.consumeMB(diskConsumptionDate2, 23)
91

    
92
    // ... and one "future" event
93
    // 2012-02-07 07:07:07.007
94
    disk.consumeMB(
95
      StartOfBillingYearDateCalc.copy.
96
        goNextMonth.goPlusDays(6).
97
        goPlusHours(7).
98
        goPlusMinutes(7).
99
        goPlusSeconds(7).
100
        goPlusMillis(7).toDate,
101
      777)
102

    
103
    println("=============================")
104
    for {
105
      event <- christos.myResourceEventsByReceivedDate
106
    } {
107
      val when = new DateCalculator(event.receivedMillis)
108
      val resource  = event.resource
109
      val instanceId = event.instanceId
110
      val value = event.beautifyValue(DEFAULT_RESOURCES_MAP)
111
      println("%s [%s, %s] %s".format(when, resource, instanceId, value))
112
    }
113
    println("=============================")
114

    
115
    val userStateM = computer.doFullMonthlyBilling(
116
      christos.userId,
117
      StartOfBillingYearDateCalc.getYear,
118
      StartOfBillingYearDateCalc.getMonthOfYear,
119
      userStateStore,
120
      resourceEventStore,
121
      policyStore,
122
      christos.userCreationDate.getTime,
123
      computer.createFirstUserState(christos.userId),
124
      computer.createFirstUserState(christos.userId),
125
      DEFAULT_POLICY,
126
      DEFAULT_RESOURCES_MAP,
127
      new Accounting{}
128
    )
129
    
130
    println("!! userStateM = %s".format(userStateM))
131
    userStateM.forFailed { failed ⇒
132
      failed.exception.printStackTrace()
133
      NoVal
134
    }
135
  }
136
}