2 * Copyright 2011-2012 GRNET S.A. All rights reserved.
4 * Redistribution and use in source and binary forms, with or
5 * without modification, are permitted provided that the following
8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following
12 * 2. Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following
14 * disclaimer in the documentation and/or other materials
15 * provided with the distribution.
17 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
30 * The views and conclusions contained in the software and
31 * documentation are those of the authors and should not be
32 * interpreted as representing official policies, either expressed
33 * or implied, of GRNET S.A.
36 package gr.grnet.aquarium.computation.data
41 * @author Christos KK Loverdos <loverdos@gmail.com>
44 case class OwnedResourcesSnapshot(resourceInstanceSnapshots: List[ResourceInstanceSnapshot]) {
46 def toResourcesMap: OwnedResourcesMap = {
47 val tuples = for(rc <- resourceInstanceSnapshots) yield ((rc.resource, rc.instanceId), (rc.instanceAmount))
49 new OwnedResourcesMap(Map(tuples.toSeq: _*))
52 def resourceInstanceSnapshotsExcept(resource: String, instanceId: String) = {
53 // Unfortunately, we have to use a List for data, since JSON serialization is not as flexible
54 // (at least out of the box). Thus, the update is O(L), where L is the length of the data List.
55 resourceInstanceSnapshots.filterNot(_.isSameResourceInstance(resource, instanceId))
58 def findResourceInstanceSnapshot(resource: String, instanceId: String): Option[ResourceInstanceSnapshot] = {
59 resourceInstanceSnapshots.find(x => resource == x.resource && instanceId == x.instanceId)
62 def getResourceInstanceAmount(resource: String, instanceId: String, defaultValue: Double): Double = {
63 findResourceInstanceSnapshot(resource, instanceId).map(_.instanceAmount).getOrElse(defaultValue)
66 def computeResourcesSnapshotUpdate(resource: String, // resource name
67 instanceId: String, // resource instance id
69 snapshotTime: Long): (OwnedResourcesSnapshot,
70 Option[ResourceInstanceSnapshot],
71 ResourceInstanceSnapshot) = {
73 val newResourceInstance = ResourceInstanceSnapshot(resource, instanceId, newAmount)
74 val oldResourceInstanceOpt = this.findResourceInstanceSnapshot(resource, instanceId)
76 val newResourceInstances = oldResourceInstanceOpt match {
77 case Some(oldResourceInstance) ⇒
78 // Resource instance found, so delete the old one and add the new one
79 newResourceInstance :: resourceInstanceSnapshotsExcept(resource, instanceId)
82 // Resource not found, so this is the first time and we just add the new snapshot
83 newResourceInstance :: resourceInstanceSnapshots
86 val newOwnedResources = OwnedResourcesSnapshot(newResourceInstances)
88 (newOwnedResources, oldResourceInstanceOpt, newResourceInstance)