Statistics
| Branch: | Tag: | Revision:

root / test / pgerakios.py @ e0c7f0ba

History | View | Annotate | Download (27.8 kB)

1 e0c7f0ba Prodromos Gerakios
#!/usr/bin/env python
2 d4410730 Prodromos Gerakios
import sys
3 d4410730 Prodromos Gerakios
import os
4 1912b5b2 Prodromos Gerakios
from commissioning.clients.http import HTTP_API_Client, init_logger_stderr
5 d4410730 Prodromos Gerakios
from commissioning import QuotaholderAPI
6 1912b5b2 Prodromos Gerakios
import random
7 e0c7f0ba Prodromos Gerakios
import copy
8 97b987e4 Prodromos Gerakios
import inspect
9 d4410730 Prodromos Gerakios
10 e0c7f0ba Prodromos Gerakios
11 c278315e Prodromos Gerakios
init_logger_stderr('mylogger', level='INFO')
12 c278315e Prodromos Gerakios
13 1912b5b2 Prodromos Gerakios
def environ_get(key, default_value=''):
14 c278315e Prodromos Gerakios
    if os.environ.has_key(key):
15 c278315e Prodromos Gerakios
        return os.environ.get(key)
16 c278315e Prodromos Gerakios
    else:
17 c278315e Prodromos Gerakios
        return default_value
18 c278315e Prodromos Gerakios
19 d4410730 Prodromos Gerakios
QH_HOST = environ_get("TEST_QH_HOST", environ_get("QH_HOST", "127.0.0.1"))
20 d4410730 Prodromos Gerakios
QH_PORT = environ_get("TEST_QH_PORT", environ_get("QH_PORT", "8008"))
21 c278315e Prodromos Gerakios
QH_DEBUG = True
22 d4410730 Prodromos Gerakios
23 d4410730 Prodromos Gerakios
assert QH_HOST != None
24 d4410730 Prodromos Gerakios
assert QH_PORT != None
25 d4410730 Prodromos Gerakios
26 c278315e Prodromos Gerakios
def printf(fmt, *args):
27 c278315e Prodromos Gerakios
    global QH_DEBUG
28 c278315e Prodromos Gerakios
    if(QH_DEBUG):
29 1912b5b2 Prodromos Gerakios
        print(fmt.format(*args))
30 c278315e Prodromos Gerakios
    return 0
31 c278315e Prodromos Gerakios
32 1912b5b2 Prodromos Gerakios
33 53e42918 Prodromos Gerakios
def exn(fmt, *args):
34 1912b5b2 Prodromos Gerakios
    raise Exception(fmt.format(*args))
35 1912b5b2 Prodromos Gerakios
36 53e42918 Prodromos Gerakios
37 1912b5b2 Prodromos Gerakios
def cexn(b, fmt, *args):
38 53e42918 Prodromos Gerakios
    if(b):
39 1912b5b2 Prodromos Gerakios
        raise Exception(fmt.format(*args))
40 53e42918 Prodromos Gerakios
41 d4410730 Prodromos Gerakios
printf("Will connect to QH_HOST = {0}", QH_HOST)
42 d4410730 Prodromos Gerakios
printf("            and QH_PORT = {0}", QH_PORT)
43 d4410730 Prodromos Gerakios
44 d4410730 Prodromos Gerakios
QH_URL = "http://{0}:{1}/api/quotaholder/v".format(QH_HOST, QH_PORT)
45 c278315e Prodromos Gerakios
46 d4410730 Prodromos Gerakios
def new_qh_client():
47 d4410730 Prodromos Gerakios
    """
48 d4410730 Prodromos Gerakios
    Create a new quota holder api client
49 d4410730 Prodromos Gerakios
    """
50 1912b5b2 Prodromos Gerakios
51 d4410730 Prodromos Gerakios
    class QuotaholderHTTP(HTTP_API_Client):
52 d4410730 Prodromos Gerakios
        api_spec = QuotaholderAPI()
53 d4410730 Prodromos Gerakios
54 d4410730 Prodromos Gerakios
    global QH_URL
55 d4410730 Prodromos Gerakios
    return QuotaholderHTTP(QH_URL)
56 d4410730 Prodromos Gerakios
57 1912b5b2 Prodromos Gerakios
58 d4410730 Prodromos Gerakios
def rand_string():
59 1912b5b2 Prodromos Gerakios
    alphabet = 'abcdefghijklmnopqrstuvwxyz'
60 1912b5b2 Prodromos Gerakios
    min = 5
61 1912b5b2 Prodromos Gerakios
    max = 15
62 1912b5b2 Prodromos Gerakios
    string = ''
63 1912b5b2 Prodromos Gerakios
    for x in random.sample(alphabet, random.randint(min, max)):
64 1912b5b2 Prodromos Gerakios
        string += x
65 1912b5b2 Prodromos Gerakios
    return string
66 1912b5b2 Prodromos Gerakios
67 d4410730 Prodromos Gerakios
68 c278315e Prodromos Gerakios
def enum(*sequential, **named):
69 c278315e Prodromos Gerakios
    enums = dict(zip(sequential, range(len(sequential))), **named)
70 c278315e Prodromos Gerakios
    return type('Enum', (), enums)
71 c278315e Prodromos Gerakios
72 1912b5b2 Prodromos Gerakios
73 c278315e Prodromos Gerakios
def find(f, seq):
74 c278315e Prodromos Gerakios
    for item in seq:
75 1912b5b2 Prodromos Gerakios
        if f(item):
76 c278315e Prodromos Gerakios
            return item
77 c278315e Prodromos Gerakios
    return None
78 d4410730 Prodromos Gerakios
79 1912b5b2 Prodromos Gerakios
def split(f, seq):
80 53e42918 Prodromos Gerakios
    a = []
81 53e42918 Prodromos Gerakios
    b = []
82 53e42918 Prodromos Gerakios
    for item in seq:
83 1912b5b2 Prodromos Gerakios
        if f(item):
84 53e42918 Prodromos Gerakios
            a.append(item)
85 53e42918 Prodromos Gerakios
        else:
86 1912b5b2 Prodromos Gerakios
            b.append(item)
87 1912b5b2 Prodromos Gerakios
    return (a, b)
88 53e42918 Prodromos Gerakios
89 53e42918 Prodromos Gerakios
90 d4410730 Prodromos Gerakios
class Client(object):
91 c278315e Prodromos Gerakios
    qh = new_qh_client()
92 c278315e Prodromos Gerakios
    clientKey = rand_string()
93 c278315e Prodromos Gerakios
94 d4410730 Prodromos Gerakios
    @staticmethod
95 c278315e Prodromos Gerakios
    def get():
96 1912b5b2 Prodromos Gerakios
        return Client.qh
97 c278315e Prodromos Gerakios
98 c278315e Prodromos Gerakios
    #getPending
99 1912b5b2 Prodromos Gerakios
    @staticmethod
100 c278315e Prodromos Gerakios
    def getPending():
101 1912b5b2 Prodromos Gerakios
        #get_pending_commissions
102 1912b5b2 Prodromos Gerakios
        pass
103 1912b5b2 Prodromos Gerakios
104 c278315e Prodromos Gerakios
    #
105 1912b5b2 Prodromos Gerakios
    @staticmethod
106 c278315e Prodromos Gerakios
    def removePending():
107 1912b5b2 Prodromos Gerakios
        #resolve_pending_commissions
108 1912b5b2 Prodromos Gerakios
        pass
109 d4410730 Prodromos Gerakios
110 d4410730 Prodromos Gerakios
111 d4410730 Prodromos Gerakios
class Config(object):
112 c278315e Prodromos Gerakios
    Context = {}
113 c278315e Prodromos Gerakios
    Flags = 0
114 c278315e Prodromos Gerakios
115 c278315e Prodromos Gerakios
    @staticmethod
116 c278315e Prodromos Gerakios
    def con():
117 c278315e Prodromos Gerakios
        return Client.get()
118 c278315e Prodromos Gerakios
119 c278315e Prodromos Gerakios
120 c278315e Prodromos Gerakios
class Policy(Config):
121 c278315e Prodromos Gerakios
122 1912b5b2 Prodromos Gerakios
    PolicyState = enum('NOT_EXISTS', 'EXISTS', 'DUMMY')
123 1912b5b2 Prodromos Gerakios
124 1912b5b2 Prodromos Gerakios
    policies = {}
125 1912b5b2 Prodromos Gerakios
126 1912b5b2 Prodromos Gerakios
    @staticmethod
127 e0c7f0ba Prodromos Gerakios
    def copy(policy):
128 e0c7f0ba Prodromos Gerakios
        return copy.deepcopy(policy)
129 e0c7f0ba Prodromos Gerakios
130 e0c7f0ba Prodromos Gerakios
    @staticmethod
131 e0c7f0ba Prodromos Gerakios
    def union(policy1,policy2):
132 e0c7f0ba Prodromos Gerakios
        return copy(policy1)
133 e0c7f0ba Prodromos Gerakios
134 e0c7f0ba Prodromos Gerakios
    @staticmethod
135 1912b5b2 Prodromos Gerakios
    def get(name):
136 1912b5b2 Prodromos Gerakios
        #TODO:
137 1912b5b2 Prodromos Gerakios
        exn("Not implemented")
138 c278315e Prodromos Gerakios
139 53e42918 Prodromos Gerakios
    # Dummy policies are neither loaded nor saved.
140 c278315e Prodromos Gerakios
    @staticmethod
141 1912b5b2 Prodromos Gerakios
    def newDummy(**kwargs):
142 1912b5b2 Prodromos Gerakios
        p = Policy(**kwargs)
143 1912b5b2 Prodromos Gerakios
        p.exist = Policy.PolicyState.DUMMY
144 1912b5b2 Prodromos Gerakios
        return p
145 c278315e Prodromos Gerakios
146 c278315e Prodromos Gerakios
    @staticmethod
147 1912b5b2 Prodromos Gerakios
    def splitRejected(policyList, rejectedList):
148 1912b5b2 Prodromos Gerakios
        (a, b) = split((lambda p: p.policyName not in rejectedList), policyList)
149 1912b5b2 Prodromos Gerakios
        if(b != []):
150 c278315e Prodromos Gerakios
            printf("Rejected entities (call to set_limits): {0}", rejectedList)
151 1912b5b2 Prodromos Gerakios
        return (a, b)
152 c278315e Prodromos Gerakios
153 c278315e Prodromos Gerakios
    @staticmethod
154 1912b5b2 Prodromos Gerakios
    def splitAccepted(policyList, acceptedList):
155 1912b5b2 Prodromos Gerakios
        acceptedListNames = [x[0] for x in acceptedList]
156 1912b5b2 Prodromos Gerakios
        (a, b) = split((lambda p: p.policyName in acceptedListNames), policyList)
157 1912b5b2 Prodromos Gerakios
        if(b != []):
158 c278315e Prodromos Gerakios
            printf("Accepted entities (call to get_limits): {0}", acceptedList)
159 1912b5b2 Prodromos Gerakios
        return (a, b)
160 c278315e Prodromos Gerakios
161 c278315e Prodromos Gerakios
    @staticmethod
162 c278315e Prodromos Gerakios
    def saveMany(policyList):
163 1912b5b2 Prodromos Gerakios
        inputList = [(p.policyName, p.quantity, p.capacity, p.importLimit, p.exportLimit)
164 1912b5b2 Prodromos Gerakios
                     for p in policyList if(p.valid() and not p.isDummy())]
165 c278315e Prodromos Gerakios
        rejectedList = Policy.con().set_limits(context=Policy.Context, set_limits=inputList)
166 1912b5b2 Prodromos Gerakios
        ok, notok = Policy.splitRejected(policyList, rejectedList)
167 c278315e Prodromos Gerakios
        for p in ok:
168 1912b5b2 Prodromos Gerakios
            p.exist = Policy.PolicyState.EXISTS
169 c278315e Prodromos Gerakios
        for p in notok:
170 1912b5b2 Prodromos Gerakios
            if(p.exist == Policy.EXISTS):
171 1912b5b2 Prodromos Gerakios
                p.exist = Policy.PolicyState.NOT_EXISTS
172 c278315e Prodromos Gerakios
        return notok
173 1912b5b2 Prodromos Gerakios
174 c278315e Prodromos Gerakios
    @staticmethod
175 c278315e Prodromos Gerakios
    def loadMany(policyList):
176 1912b5b2 Prodromos Gerakios
        inputList = [p.policyName for p in policyList if(not p.isDummy())]
177 1912b5b2 Prodromos Gerakios
        acceptedList = Policy.con().get_limits(context=Policy.Context, get_limits=inputList)
178 1912b5b2 Prodromos Gerakios
        (ok, notok) = Policy.splitAccepted(policyList, acceptedList)
179 c278315e Prodromos Gerakios
        # fill the policy
180 c278315e Prodromos Gerakios
        for p in ok:
181 1912b5b2 Prodromos Gerakios
            p.exist = Policy.PolicyState.EXISTS
182 1912b5b2 Prodromos Gerakios
        g = find((lambda x: x[0]), acceptedList)
183 1912b5b2 Prodromos Gerakios
        p.quantity = g[1]
184 1912b5b2 Prodromos Gerakios
        p.capacity = g[2]
185 1912b5b2 Prodromos Gerakios
        p.importLimit = g[3]
186 1912b5b2 Prodromos Gerakios
        p.exportLimit = g[4]
187 1912b5b2 Prodromos Gerakios
        for p in notok:
188 1912b5b2 Prodromos Gerakios
            if(p.exist == Policy.EXISTS):
189 1912b5b2 Prodromos Gerakios
                p.exist = Policy.PolicyState.NOT_EXISTS
190 1912b5b2 Prodromos Gerakios
191 1912b5b2 Prodromos Gerakios
        return notok
192 c278315e Prodromos Gerakios
193 c278315e Prodromos Gerakios
    def reset(self):
194 1912b5b2 Prodromos Gerakios
        self.set(None, 0, 0, 0, 0)
195 1912b5b2 Prodromos Gerakios
196 1912b5b2 Prodromos Gerakios
    def set(self, name, q, c, i, e):
197 1912b5b2 Prodromos Gerakios
        self.policyName = name
198 1912b5b2 Prodromos Gerakios
        self.quantity = q
199 1912b5b2 Prodromos Gerakios
        self.capacity = c
200 1912b5b2 Prodromos Gerakios
        self.importLimit = i
201 1912b5b2 Prodromos Gerakios
        self.exportLimit = e
202 1912b5b2 Prodromos Gerakios
        self.exist = Policy.PolicyState.NOT_EXISTS
203 1912b5b2 Prodromos Gerakios
204 1912b5b2 Prodromos Gerakios
    def __init__(self, **kwargs):
205 97b987e4 Prodromos Gerakios
        self.policyName = None
206 1912b5b2 Prodromos Gerakios
        self.reset()
207 1912b5b2 Prodromos Gerakios
        self.__dict__.update(kwargs)
208 c278315e Prodromos Gerakios
209 c278315e Prodromos Gerakios
210 c278315e Prodromos Gerakios
    def isDummy(self):
211 1912b5b2 Prodromos Gerakios
        return self.exist == Policy.PolicyState.DUMMY
212 c278315e Prodromos Gerakios
213 1912b5b2 Prodromos Gerakios
214 1912b5b2 Prodromos Gerakios
    def setDummy(self,v=True):
215 1912b5b2 Prodromos Gerakios
        if(v):
216 1912b5b2 Prodromos Gerakios
            self.exist = Policy.PolicyState.DUMMY
217 1912b5b2 Prodromos Gerakios
        else:
218 1912b5b2 Prodromos Gerakios
            self.exist = Policy.PolicyState.NOT_EXISTS
219 c278315e Prodromos Gerakios
220 c278315e Prodromos Gerakios
    def name(self):
221 1912b5b2 Prodromos Gerakios
        return self.policyName
222 1912b5b2 Prodromos Gerakios
223 c278315e Prodromos Gerakios
224 c278315e Prodromos Gerakios
    def valid(self):
225 1912b5b2 Prodromos Gerakios
        return  self.policyName == None or self.quantity == None or  self.capacity == None or  self.importLimit == None  or self.exportLimit == None
226 1912b5b2 Prodromos Gerakios
227 1912b5b2 Prodromos Gerakios
228 1912b5b2 Prodromos Gerakios
    def setExists(self,v=True):
229 1912b5b2 Prodromos Gerakios
        if(v):
230 1912b5b2 Prodromos Gerakios
            self.exist = Policy.PolicyState.EXISTS
231 1912b5b2 Prodromos Gerakios
        else:
232 1912b5b2 Prodromos Gerakios
            self.exist = Policy.PolicyState.NOT_EXISTS
233 1912b5b2 Prodromos Gerakios
234 1912b5b2 Prodromos Gerakios
    def exists(self):
235 1912b5b2 Prodromos Gerakios
        return self.exist
236 c278315e Prodromos Gerakios
237 c278315e Prodromos Gerakios
    def __eq__(self, other):
238 1912b5b2 Prodromos Gerakios
        if isinstance(other, Policy):
239 1912b5b2 Prodromos Gerakios
            return self.policyName == other.policyName
240 1912b5b2 Prodromos Gerakios
        elif isinstance(other, basestring):
241 1912b5b2 Prodromos Gerakios
            return self.policyName == other
242 1912b5b2 Prodromos Gerakios
        else:
243 1912b5b2 Prodromos Gerakios
            return False
244 c278315e Prodromos Gerakios
245 c278315e Prodromos Gerakios
    def __ne__(self, other):
246 1912b5b2 Prodromos Gerakios
        return not (self.__eq__(other))
247 c278315e Prodromos Gerakios
248 c278315e Prodromos Gerakios
249 c278315e Prodromos Gerakios
    def load(self):
250 1912b5b2 Prodromos Gerakios
        if(self.isDummy()):
251 1912b5b2 Prodromos Gerakios
            return True
252 1912b5b2 Prodromos Gerakios
        else:
253 1912b5b2 Prodromos Gerakios
            return Policy.loadMany([self]) == []
254 1912b5b2 Prodromos Gerakios
255 c278315e Prodromos Gerakios
256 c278315e Prodromos Gerakios
    def save(self):
257 1912b5b2 Prodromos Gerakios
        if(self.isDummy()):
258 1912b5b2 Prodromos Gerakios
            return True
259 1912b5b2 Prodromos Gerakios
        else:
260 1912b5b2 Prodromos Gerakios
            return Policy.saveMany([self]) == []
261 1912b5b2 Prodromos Gerakios
262 1912b5b2 Prodromos Gerakios
263 1912b5b2 Prodromos Gerakios
class Resource(Config):
264 c278315e Prodromos Gerakios
265 1912b5b2 Prodromos Gerakios
    ResourceState = enum('DIRTY', 'LOADED')
266 c278315e Prodromos Gerakios
267 1912b5b2 Prodromos Gerakios
    @staticmethod
268 e0c7f0ba Prodromos Gerakios
    def copy(resource):
269 e0c7f0ba Prodromos Gerakios
        return copy.copy(resource)
270 e0c7f0ba Prodromos Gerakios
271 e0c7f0ba Prodromos Gerakios
    @staticmethod
272 1912b5b2 Prodromos Gerakios
    def allDirty(resourceList):
273 1912b5b2 Prodromos Gerakios
        for r in resourceList:
274 1912b5b2 Prodromos Gerakios
            r.setDirty()
275 1912b5b2 Prodromos Gerakios
276 1912b5b2 Prodromos Gerakios
    # When a dummy policy is used, the policy is also loaded by get_quota
277 1912b5b2 Prodromos Gerakios
    # if it is a normal policy only the resource is loaded but not the corresponding
278 1912b5b2 Prodromos Gerakios
    @staticmethod
279 1912b5b2 Prodromos Gerakios
    def loadMany(resourceList0,dirtyOnly=True):
280 1912b5b2 Prodromos Gerakios
        if(dirtyOnly):
281 1912b5b2 Prodromos Gerakios
            resourceList = [r for r in resourceList0 if(r.isDirty())]
282 1912b5b2 Prodromos Gerakios
        else:
283 1912b5b2 Prodromos Gerakios
            resourceList = resourceList0
284 1912b5b2 Prodromos Gerakios
        #
285 1912b5b2 Prodromos Gerakios
        (rl1,rl2) = split((lambda r: r.policy.isDummy()),resourceList)
286 1912b5b2 Prodromos Gerakios
        #
287 1912b5b2 Prodromos Gerakios
        iList1 = [(r.entity.entityName, r.resourceName, r.entity.entityKey) for r in rl1]
288 1912b5b2 Prodromos Gerakios
        if(iList1 == []):
289 1912b5b2 Prodromos Gerakios
            oList1 = []
290 1912b5b2 Prodromos Gerakios
        else:
291 1912b5b2 Prodromos Gerakios
            oList1 = Resource.con().get_quota(context=Resource.Context, get_quota=iList1)
292 1912b5b2 Prodromos Gerakios
            for e, res, q, c, il, el, p, i, e, r1, r2, f in oList1:
293 1912b5b2 Prodromos Gerakios
                res1 = find((lambda r: r.resourceName == res), rl1)
294 1912b5b2 Prodromos Gerakios
                res1.imported = i
295 1912b5b2 Prodromos Gerakios
                res1.exported = e
296 1912b5b2 Prodromos Gerakios
                res1.returned = r1
297 1912b5b2 Prodromos Gerakios
                res1.released = r2
298 1912b5b2 Prodromos Gerakios
                res1.flags = f
299 1912b5b2 Prodromos Gerakios
                res1.policy.quantity = q
300 1912b5b2 Prodromos Gerakios
                res1.policy.capacity = c
301 1912b5b2 Prodromos Gerakios
                res1.policy.importLimit = il
302 1912b5b2 Prodromos Gerakios
                res1.policy.exportLimit = el
303 1912b5b2 Prodromos Gerakios
                res1.state = Resource.ResourceState.LOADED
304 1912b5b2 Prodromos Gerakios
        #
305 1912b5b2 Prodromos Gerakios
        iList2 = [(r.entity.entityName,r.resourceName,r.entity.entityKey) for r in rl2]
306 1912b5b2 Prodromos Gerakios
        if(iList2 == []):
307 1912b5b2 Prodromos Gerakios
            oList2 = []
308 1912b5b2 Prodromos Gerakios
        else:
309 1912b5b2 Prodromos Gerakios
            oList2 = Resource.con().get_holding(context=Resource.Context,get_holding=iList2)
310 1912b5b2 Prodromos Gerakios
            for e,res,p,im,ex,ret,rel,f in oList2:
311 1912b5b2 Prodromos Gerakios
                res1 = find((lambda r: r.resourceName == res), rl2)
312 1912b5b2 Prodromos Gerakios
                res1.imported = im
313 1912b5b2 Prodromos Gerakios
                res1.exported = ex
314 1912b5b2 Prodromos Gerakios
                res1.returned = ret
315 1912b5b2 Prodromos Gerakios
                res1.released = rel
316 1912b5b2 Prodromos Gerakios
                res1.flags = f
317 1912b5b2 Prodromos Gerakios
                res1.state = Resource.ResourceState.LOADED
318 1912b5b2 Prodromos Gerakios
        #
319 1912b5b2 Prodromos Gerakios
        rejectedList = [r for r in resourceList if(r.resourceName not in oList1 and r.resourceName not in oList2)]
320 1912b5b2 Prodromos Gerakios
        return rejectedList
321 1912b5b2 Prodromos Gerakios
322 1912b5b2 Prodromos Gerakios
    # set_holding or set_quota (if dummy)
323 1912b5b2 Prodromos Gerakios
    @staticmethod
324 1912b5b2 Prodromos Gerakios
    def saveMany(resourceList0,dirtyOnly=True):
325 1912b5b2 Prodromos Gerakios
        if(dirtyOnly):
326 1912b5b2 Prodromos Gerakios
            resourceList = [r for r in resourceList0 if(r.isDirty())]
327 1912b5b2 Prodromos Gerakios
        else:
328 1912b5b2 Prodromos Gerakios
            resourceList = resourceList0
329 1912b5b2 Prodromos Gerakios
        #
330 1912b5b2 Prodromos Gerakios
        (rl1, rl2) = split((lambda r: not r.policy.isDummy()), resourceList)
331 1912b5b2 Prodromos Gerakios
        #
332 1912b5b2 Prodromos Gerakios
        if(rl1 == []):
333 1912b5b2 Prodromos Gerakios
            ol1 = []
334 1912b5b2 Prodromos Gerakios
        else:
335 1912b5b2 Prodromos Gerakios
            il1 = [(r.entity.entityName, r.resourceName, r.entity.entityKey,r.policy.quantity,
336 1912b5b2 Prodromos Gerakios
                    r.policy.capacity,r.policy.importLimit,r.policy.ExportLimit,Resource.Flags) for r in rl1]
337 1912b5b2 Prodromos Gerakios
            ol1 = Resource.con().set_quota(context=Resource.Context,set_quota=il1)
338 1912b5b2 Prodromos Gerakios
339 97b987e4 Prodromos Gerakios
        if(rl2 == []):
340 97b987e4 Prodromos Gerakios
            ol2 = []
341 97b987e4 Prodromos Gerakios
        else:
342 97b987e4 Prodromos Gerakios
            il2 = [(r.entity.entityName,r.resourceName,r.entity.entityKey,r.policy.policyName) for r in rl2]
343 97b987e4 Prodromos Gerakios
            ol2 = Resource.con().set_holding(context=Resource.Context,set_holding=il2)
344 e0c7f0ba Prodromos Gerakios
345 97b987e4 Prodromos Gerakios
        rejectedList = []
346 97b987e4 Prodromos Gerakios
347 97b987e4 Prodromos Gerakios
348 1912b5b2 Prodromos Gerakios
        #TODO:
349 1912b5b2 Prodromos Gerakios
350 1912b5b2 Prodromos Gerakios
        # 1. set_holding
351 1912b5b2 Prodromos Gerakios
        # 2. rejected lists
352 1912b5b2 Prodromos Gerakios
353 1912b5b2 Prodromos Gerakios
        if(rl2 == []):
354 1912b5b2 Prodromos Gerakios
            ol2 = []
355 1912b5b2 Prodromos Gerakios
        else:
356 1912b5b2 Prodromos Gerakios
            ol2 = []
357 1912b5b2 Prodromos Gerakios
        #
358 1912b5b2 Prodromos Gerakios
        #
359 1912b5b2 Prodromos Gerakios
        #TODO
360 1912b5b2 Prodromos Gerakios
361 1912b5b2 Prodromos Gerakios
362 1912b5b2 Prodromos Gerakios
    def isDirty(self):
363 1912b5b2 Prodromos Gerakios
        return self.state == Resource.ResourceState.DIRTY
364 1912b5b2 Prodromos Gerakios
365 1912b5b2 Prodromos Gerakios
    def setDirty(self,val=True):
366 1912b5b2 Prodromos Gerakios
        if(val):
367 1912b5b2 Prodromos Gerakios
            self.state = Resource.ResourceState.DIRTY
368 1912b5b2 Prodromos Gerakios
        else:
369 1912b5b2 Prodromos Gerakios
            self.state = Resource.ResourceState.LOADED
370 1912b5b2 Prodromos Gerakios
371 97b987e4 Prodromos Gerakios
    def set(self,**kwargs):
372 97b987e4 Prodromos Gerakios
        self.__dict__.update(kwargs)
373 97b987e4 Prodromos Gerakios
        self.setDirty()
374 97b987e4 Prodromos Gerakios
375 1912b5b2 Prodromos Gerakios
    def __init__(self,name,entity):
376 1912b5b2 Prodromos Gerakios
        self.resourceName = name
377 1912b5b2 Prodromos Gerakios
        self.entity = entity
378 97b987e4 Prodromos Gerakios
        self.policy = None
379 97b987e4 Prodromos Gerakios
        self.imported = 0
380 97b987e4 Prodromos Gerakios
        self.exported = 0
381 97b987e4 Prodromos Gerakios
        self.returned = 0
382 97b987e4 Prodromos Gerakios
        self.released = 0
383 97b987e4 Prodromos Gerakios
        self.flags = 0
384 97b987e4 Prodromos Gerakios
        self.state = Resource.ResourceState.DIRTY
385 97b987e4 Prodromos Gerakios
        self.setPolicy(Policy.newDummy())
386 1912b5b2 Prodromos Gerakios
387 1912b5b2 Prodromos Gerakios
    def __eq__(self, other):
388 1912b5b2 Prodromos Gerakios
        if isinstance(other, Resource):
389 1912b5b2 Prodromos Gerakios
            return self.resourceName == other.resourceName
390 1912b5b2 Prodromos Gerakios
        elif isinstance(other, basestring):
391 1912b5b2 Prodromos Gerakios
            return self.resourceName == other
392 1912b5b2 Prodromos Gerakios
        else:
393 1912b5b2 Prodromos Gerakios
            return False
394 c278315e Prodromos Gerakios
395 c278315e Prodromos Gerakios
    def __ne__(self, other):
396 1912b5b2 Prodromos Gerakios
        return not (self.__eq__(other))
397 1912b5b2 Prodromos Gerakios
398 c278315e Prodromos Gerakios
399 53e42918 Prodromos Gerakios
    def name(self):
400 c278315e Prodromos Gerakios
        return self.resourceName
401 1912b5b2 Prodromos Gerakios
402 1912b5b2 Prodromos Gerakios
403 1912b5b2 Prodromos Gerakios
    def policy(self, query=False):
404 1912b5b2 Prodromos Gerakios
        if(query):
405 1912b5b2 Prodromos Gerakios
            self.load()
406 c278315e Prodromos Gerakios
        return self.policy
407 c278315e Prodromos Gerakios
408 1912b5b2 Prodromos Gerakios
409 1912b5b2 Prodromos Gerakios
    def setPolicy(self, policy):
410 c278315e Prodromos Gerakios
        self.policy = policy
411 97b987e4 Prodromos Gerakios
        self.setDirty(True)
412 53e42918 Prodromos Gerakios
413 e0c7f0ba Prodromos Gerakios
    def setFromPolicy(self):
414 e0c7f0ba Prodromos Gerakios
        self.set(quantity=self.policy.quantity,capacity=self.policy.capacity)
415 e0c7f0ba Prodromos Gerakios
416 1912b5b2 Prodromos Gerakios
    def quantity(self, query=False):
417 1912b5b2 Prodromos Gerakios
        if(query):
418 1912b5b2 Prodromos Gerakios
            self.load()
419 1912b5b2 Prodromos Gerakios
            #FIXME: Is this correct ?
420 1912b5b2 Prodromos Gerakios
        return self.policy.quantity
421 d4410730 Prodromos Gerakios
422 c278315e Prodromos Gerakios
423 1912b5b2 Prodromos Gerakios
    def load(self,dirtyOnly=True):
424 e0c7f0ba Prodromos Gerakios
        if(not self.policy.isDummy()):
425 e0c7f0ba Prodromos Gerakios
            self.policy.load()
426 1912b5b2 Prodromos Gerakios
        return Resource.loadMany([self],dirtyOnly) == []
427 1912b5b2 Prodromos Gerakios
428 1912b5b2 Prodromos Gerakios
    def save(self,dirtyOnly=True):
429 1912b5b2 Prodromos Gerakios
        return Resource.saveMany([self],dirtyOnly) == []
430 c278315e Prodromos Gerakios
431 1912b5b2 Prodromos Gerakios
432 1912b5b2 Prodromos Gerakios
class Commission(Config):
433 1912b5b2 Prodromos Gerakios
    CommissionState = enum('NOT_ISSUED', 'PENDING', 'ACCEPTED', 'REJECTED')
434 53e42918 Prodromos Gerakios
435 53e42918 Prodromos Gerakios
    @staticmethod
436 53e42918 Prodromos Gerakios
    def saveAll(comList):
437 1912b5b2 Prodromos Gerakios
        inputList = [c.serial for c in comList if(c.isPending())]
438 1912b5b2 Prodromos Gerakios
        rejectedList = Commission.con().accept_commission(context=Commission.Context,
439 1912b5b2 Prodromos Gerakios
            clientKey=Client.clientKey,
440 1912b5b2 Prodromos Gerakios
            serials=inputList, reason='ACCEPT')
441 53e42918 Prodromos Gerakios
        for c in inputList:
442 1912b5b2 Prodromos Gerakios
            c.state = Commission.CommissionState.ACCEPTED
443 1912b5b2 Prodromos Gerakios
            #TODO: not implemented yet because the API does not support this.
444 1912b5b2 Prodromos Gerakios
        return [c for c in comList if(c not in inputList)]
445 53e42918 Prodromos Gerakios
446 1912b5b2 Prodromos Gerakios
    @staticmethod
447 1912b5b2 Prodromos Gerakios
    def denyAll(comList):
448 1912b5b2 Prodromos Gerakios
        inputList = [c.serial for c in comList if(c.isPending())]
449 1912b5b2 Prodromos Gerakios
        rejectedList = Commission.con().accept_commission(context=Commission.Context,
450 1912b5b2 Prodromos Gerakios
            clientKey=Client.clientKey,
451 1912b5b2 Prodromos Gerakios
            serials=inputList, reason='REJECT')
452 53e42918 Prodromos Gerakios
        for c in inputList:
453 1912b5b2 Prodromos Gerakios
            c.state = Commission.CommissionState.REJECTED
454 1912b5b2 Prodromos Gerakios
            #TODO: not implemented yet because the API does not support this.
455 1912b5b2 Prodromos Gerakios
        return [c for c in comList if(c not in inputList)]
456 c278315e Prodromos Gerakios
457 97b987e4 Prodromos Gerakios
    def __init__(self, target):
458 1912b5b2 Prodromos Gerakios
        self.clientKey = Client.clientKey
459 1912b5b2 Prodromos Gerakios
        self.serial = None
460 1912b5b2 Prodromos Gerakios
        self.state = Commission.CommissionState.NOT_ISSUED
461 1912b5b2 Prodromos Gerakios
        self.resources_quant = []
462 1912b5b2 Prodromos Gerakios
        self.target = target
463 c278315e Prodromos Gerakios
464 c278315e Prodromos Gerakios
    def __eq__(self, other):
465 1912b5b2 Prodromos Gerakios
        if isinstance(other, Commission):
466 1912b5b2 Prodromos Gerakios
            return self.serial == other.serial
467 1912b5b2 Prodromos Gerakios
        elif isinstance(other, int):
468 1912b5b2 Prodromos Gerakios
            return self.serial == other
469 1912b5b2 Prodromos Gerakios
        else:
470 1912b5b2 Prodromos Gerakios
            return False
471 c278315e Prodromos Gerakios
472 c278315e Prodromos Gerakios
    def __ne__(self, other):
473 1912b5b2 Prodromos Gerakios
        return not (self.__eq__(other))
474 1912b5b2 Prodromos Gerakios
475 c278315e Prodromos Gerakios
476 e0c7f0ba Prodromos Gerakios
    def inverse(self):
477 e0c7f0ba Prodromos Gerakios
        ret = copy.copy(self)
478 e0c7f0ba Prodromos Gerakios
        ret.resources_quant = [(r,-q) for r,q in ret.resources_quant]
479 e0c7f0ba Prodromos Gerakios
        return ret
480 e0c7f0ba Prodromos Gerakios
481 53e42918 Prodromos Gerakios
    def canChange(self):
482 1912b5b2 Prodromos Gerakios
        return self.state == Commission.CommissionState.NOT_ISSUED
483 1912b5b2 Prodromos Gerakios
484 53e42918 Prodromos Gerakios
485 53e42918 Prodromos Gerakios
    def isPending(self):
486 1912b5b2 Prodromos Gerakios
        return self.state == Commission.CommissionState.PENDING
487 1912b5b2 Prodromos Gerakios
488 53e42918 Prodromos Gerakios
489 c278315e Prodromos Gerakios
    def issue(self):
490 1912b5b2 Prodromos Gerakios
        prov = [(r.entity.entityName, r.resourceName, q) for r, q in self.resources_quant]
491 53e42918 Prodromos Gerakios
        self.serial = Commission.con().issue_commission(context=Commission.Context,
492 1912b5b2 Prodromos Gerakios
            target=self.target.entityName,
493 1912b5b2 Prodromos Gerakios
            clientKey=Client.clientKey,
494 1912b5b2 Prodromos Gerakios
            owner=self.target.parent.entityName,
495 1912b5b2 Prodromos Gerakios
            ownerKey=self.target.parent.entityKey,
496 1912b5b2 Prodromos Gerakios
            provisions=prov)
497 1912b5b2 Prodromos Gerakios
        self.state = Commission.CommissionState.PENDING
498 53e42918 Prodromos Gerakios
        return True
499 c278315e Prodromos Gerakios
500 1912b5b2 Prodromos Gerakios
501 c278315e Prodromos Gerakios
    def accept(self):
502 1912b5b2 Prodromos Gerakios
        return Commission.saveAll([self]) == []
503 c278315e Prodromos Gerakios
504 c278315e Prodromos Gerakios
    def reject(self):
505 1912b5b2 Prodromos Gerakios
        return Commission.denyAll([self]) == []
506 1912b5b2 Prodromos Gerakios
507 1912b5b2 Prodromos Gerakios
        #TODO: assert that resource.entity is the same as self.entity !!
508 1912b5b2 Prodromos Gerakios
509 1912b5b2 Prodromos Gerakios
510 1912b5b2 Prodromos Gerakios
    def addResource(self, resource, quantity):
511 1912b5b2 Prodromos Gerakios
        cexn(self.state != Commission.CommissionState.NOT_ISSUED,
512 1912b5b2 Prodromos Gerakios
            "Attempted to add a resource to a commission that has been issued.")
513 1912b5b2 Prodromos Gerakios
        cexn(resource in [r  for r, q in self.resources_quant],
514 1912b5b2 Prodromos Gerakios
            "Resource {0} already exists in commission.", resource.resourceName)
515 53e42918 Prodromos Gerakios
        cexn(resource.quantity() < quantity,
516 1912b5b2 Prodromos Gerakios
            "Insufficient quantity: Resource {0} quantity is {1} but {2} is required.",
517 1912b5b2 Prodromos Gerakios
            resource.resourceName, resource.quantity(), quantity)
518 1912b5b2 Prodromos Gerakios
        self.resources_quant.append((resource, quantity))
519 1912b5b2 Prodromos Gerakios
        return True
520 c278315e Prodromos Gerakios
521 c278315e Prodromos Gerakios
522 c278315e Prodromos Gerakios
class Entity(Config):
523 c278315e Prodromos Gerakios
    # static  field (in some sense --- if it is assigned it will create a new binding)
524 1912b5b2 Prodromos Gerakios
    EntityState = enum('NOT_EXISTS', 'EXISTS')
525 53e42918 Prodromos Gerakios
526 53e42918 Prodromos Gerakios
    allEntities = {}
527 d4410730 Prodromos Gerakios
528 d4410730 Prodromos Gerakios
    @staticmethod
529 e0c7f0ba Prodromos Gerakios
    def getClass(className,name="", key="", parent=None):
530 53e42918 Prodromos Gerakios
        e = Entity.allEntities.get(name)
531 53e42918 Prodromos Gerakios
        if(e == None):
532 e0c7f0ba Prodromos Gerakios
            e = locals()[className]()
533 53e42918 Prodromos Gerakios
            if(name == "system" or name == ""):
534 1912b5b2 Prodromos Gerakios
                e.set("system", "", None)
535 53e42918 Prodromos Gerakios
            else:
536 1912b5b2 Prodromos Gerakios
                cexn(parent == None, "Entity.get of a non-existent entity with name {0} and no parent.", name)
537 e0c7f0ba Prodromos Gerakios
                #cexn(not isinstance(parent, Entity), "Entity.get parent of {0} is not an Entity!", name)
538 1912b5b2 Prodromos Gerakios
                e.set(name, key, parent)
539 53e42918 Prodromos Gerakios
            Entity.allEntities[name] = e
540 1912b5b2 Prodromos Gerakios
541 1912b5b2 Prodromos Gerakios
        return e
542 53e42918 Prodromos Gerakios
543 53e42918 Prodromos Gerakios
    @staticmethod
544 e0c7f0ba Prodromos Gerakios
    def get(name="", key="", parent=None):
545 e0c7f0ba Prodromos Gerakios
        Entity.get("Entity",name,key,parent)
546 e0c7f0ba Prodromos Gerakios
547 e0c7f0ba Prodromos Gerakios
548 e0c7f0ba Prodromos Gerakios
    @staticmethod
549 53e42918 Prodromos Gerakios
    def list():
550 1912b5b2 Prodromos Gerakios
        return [v for k, v in Entity.allEntities.iteritems()]
551 d4410730 Prodromos Gerakios
552 d4410730 Prodromos Gerakios
    @staticmethod
553 1912b5b2 Prodromos Gerakios
    def split(entityList, rejectedList, op):
554 1912b5b2 Prodromos Gerakios
        (a, b) = split((lambda e: e.entityName not in rejectedList), entityList)
555 1912b5b2 Prodromos Gerakios
        if(rejectedList != []):
556 1912b5b2 Prodromos Gerakios
            printf("Rejected entities (call to {0}): {1}", op, rejectedList)
557 1912b5b2 Prodromos Gerakios
        return (a, b)
558 d4410730 Prodromos Gerakios
559 d4410730 Prodromos Gerakios
    @staticmethod
560 c278315e Prodromos Gerakios
    def saveMany(entityList):
561 1912b5b2 Prodromos Gerakios
        inputList = [(e.entityName, e.parent.entityName, e.entityKey, e.parent.entityKey) for e in entityList]
562 d4410730 Prodromos Gerakios
        printf("Creating entities: {0}", inputList)
563 1912b5b2 Prodromos Gerakios
        rejectedList = Entity.con().create_entity(context=Entity.Context, create_entity=inputList)
564 1912b5b2 Prodromos Gerakios
        (ok, notok) = Entity.split(entityList, rejectedList, "create")
565 c278315e Prodromos Gerakios
        printf("\n")
566 d4410730 Prodromos Gerakios
        for e in ok:
567 1912b5b2 Prodromos Gerakios
            e.state = Entity.EntityState.EXISTS
568 d4410730 Prodromos Gerakios
        for e in notok:
569 1912b5b2 Prodromos Gerakios
            e.state = Entity.EntityState.NOT_EXISTS
570 d8d464a0 Prodromos Gerakios
        return notok
571 d4410730 Prodromos Gerakios
572 c278315e Prodromos Gerakios
    @staticmethod
573 1912b5b2 Prodromos Gerakios
    def deleteMany(entityList):
574 1912b5b2 Prodromos Gerakios
        inputList = [(e.entityName, e.entityKey) for e in entityList]
575 d4410730 Prodromos Gerakios
        printf("Releasing entities: {0}", inputList)
576 1912b5b2 Prodromos Gerakios
        rejectedList = Entity.con().release_entity(context=Entity.Context, release_entity=inputList)
577 1912b5b2 Prodromos Gerakios
        (ok, notok) = Entity.split(entityList, rejectedList, "release")
578 c278315e Prodromos Gerakios
        printf("\n")
579 d4410730 Prodromos Gerakios
        for e in ok:
580 1912b5b2 Prodromos Gerakios
            e.state = Entity.EntityState.NOT_EXISTS
581 d4410730 Prodromos Gerakios
        for e in notok:
582 1912b5b2 Prodromos Gerakios
            e.state = Entity.EntityState.EXISTS
583 d8d464a0 Prodromos Gerakios
        return notok
584 d4410730 Prodromos Gerakios
585 d4410730 Prodromos Gerakios
    @staticmethod
586 d4410730 Prodromos Gerakios
    def checkMany(entityList):
587 1912b5b2 Prodromos Gerakios
        inputList = [(e.entityName, e.entityKey) for e in entityList]
588 d4410730 Prodromos Gerakios
        printf("Get entities: {0}", inputList)
589 1912b5b2 Prodromos Gerakios
        acceptedList = Entity.con().get_entity(context=Entity.Context, get_entity=inputList)
590 1912b5b2 Prodromos Gerakios
        rejectedList = [e.entityName for e in entityList if e.entityName not in [n for n, k in acceptedList]]
591 1912b5b2 Prodromos Gerakios
        (ok, notok) = Entity.split(entityList, rejectedList, "get_entity")
592 c278315e Prodromos Gerakios
        printf("\n")
593 97b987e4 Prodromos Gerakios
        for name,parentName in acceptedList:
594 97b987e4 Prodromos Gerakios
            e = find((lambda e: e.entityName == name),entityList)
595 97b987e4 Prodromos Gerakios
            if(parentName !=  e.parent.entityName):
596 97b987e4 Prodromos Gerakios
                exn("Parent of {0} is {1} and not {2}.",e.entityName,parentName,e.parent.parentName)
597 d8d464a0 Prodromos Gerakios
        for e in ok:
598 1912b5b2 Prodromos Gerakios
            e.state = Entity.EntityState.EXISTS
599 d8d464a0 Prodromos Gerakios
        for e in notok:
600 1912b5b2 Prodromos Gerakios
            e.state = Entity.EntityState.NOT_EXISTS
601 d8d464a0 Prodromos Gerakios
        return notok
602 d4410730 Prodromos Gerakios
603 d4410730 Prodromos Gerakios
    #release entity implies that each ENTITY in the system has a unique name
604 d4410730 Prodromos Gerakios
    #therefore we don't have to check for equality recursively but we do it anyway.
605 d4410730 Prodromos Gerakios
    def __eq__(self, other):
606 1912b5b2 Prodromos Gerakios
        if isinstance(other, Entity):
607 1912b5b2 Prodromos Gerakios
            return self.entityName == other.entityName and (self.parent == other.parent)
608 1912b5b2 Prodromos Gerakios
        elif isinstance(other, basestring):
609 1912b5b2 Prodromos Gerakios
            return self.entityName == other
610 1912b5b2 Prodromos Gerakios
        else:
611 1912b5b2 Prodromos Gerakios
            return False
612 d4410730 Prodromos Gerakios
613 d4410730 Prodromos Gerakios
    def __ne__(self, other):
614 1912b5b2 Prodromos Gerakios
        return not (self.__eq__(other))
615 d4410730 Prodromos Gerakios
616 c278315e Prodromos Gerakios
    def __init__(self):
617 1912b5b2 Prodromos Gerakios
        self.set(None, None, None)
618 1912b5b2 Prodromos Gerakios
        self._commissions = []
619 1912b5b2 Prodromos Gerakios
        self._resources = []
620 1912b5b2 Prodromos Gerakios
621 53e42918 Prodromos Gerakios
    def _check(self):
622 1912b5b2 Prodromos Gerakios
    #       cexn(self != Entity.allEntities.get(self.entityName),"Entity {0} does not exist in global dict",self.entityName)
623 53e42918 Prodromos Gerakios
        pass
624 d4410730 Prodromos Gerakios
625 e0c7f0ba Prodromos Gerakios
    def getChildren(self):
626 e0c7f0ba Prodromos Gerakios
        list = Entity.con().list_entities(context=Entity.Context,entity=self.entityName,key=self.entityKey)
627 e0c7f0ba Prodromos Gerakios
        return [Entity.get(e,"",self) for e in list]
628 e0c7f0ba Prodromos Gerakios
629 c278315e Prodromos Gerakios
    def reset(self):
630 1912b5b2 Prodromos Gerakios
        self.set(None, None, None)
631 c278315e Prodromos Gerakios
632 1912b5b2 Prodromos Gerakios
    def set(self, name, password, parent):
633 1912b5b2 Prodromos Gerakios
        self.entityName = name
634 1912b5b2 Prodromos Gerakios
        self.entityKey = password
635 1912b5b2 Prodromos Gerakios
        self.parent = parent
636 1912b5b2 Prodromos Gerakios
        self.state = Entity.EntityState.NOT_EXISTS
637 d4410730 Prodromos Gerakios
638 1912b5b2 Prodromos Gerakios
    def exists(self, query=False):
639 53e42918 Prodromos Gerakios
        self._check()
640 53e42918 Prodromos Gerakios
        if(query):
641 1912b5b2 Prodromos Gerakios
            self.checkMany([self])
642 53e42918 Prodromos Gerakios
        return self.state != self.EntityState.NOT_EXISTS
643 1912b5b2 Prodromos Gerakios
644 1912b5b2 Prodromos Gerakios
    def create(self, query=False):
645 1912b5b2 Prodromos Gerakios
        self._check()
646 1912b5b2 Prodromos Gerakios
        if(not self.exists(query)):
647 1912b5b2 Prodromos Gerakios
            self.saveMany([self])
648 1912b5b2 Prodromos Gerakios
        return self.exists()
649 1912b5b2 Prodromos Gerakios
650 1912b5b2 Prodromos Gerakios
    def release(self, query=False):
651 1912b5b2 Prodromos Gerakios
        self._check()
652 1912b5b2 Prodromos Gerakios
        if(self.exists(query)):
653 1912b5b2 Prodromos Gerakios
            self.deleteMany([self])
654 1912b5b2 Prodromos Gerakios
        return not self.exists()
655 1912b5b2 Prodromos Gerakios
656 1912b5b2 Prodromos Gerakios
    def addResourceWith(self,name,**kwargs):
657 1912b5b2 Prodromos Gerakios
        p = Policy.newDummy(quantity=0,capacity=10)
658 97b987e4 Prodromos Gerakios
        return self.addResource(name,p)
659 1912b5b2 Prodromos Gerakios
660 1912b5b2 Prodromos Gerakios
    # Resource-related API
661 1912b5b2 Prodromos Gerakios
    def addResource(self,name,policy=None):
662 1912b5b2 Prodromos Gerakios
        r1 = Resource(name,self)
663 1912b5b2 Prodromos Gerakios
        if(isinstance(policy,Policy)):
664 1912b5b2 Prodromos Gerakios
            r1.policy = policy
665 1912b5b2 Prodromos Gerakios
        self._resources.append(r1)
666 1912b5b2 Prodromos Gerakios
        return r1
667 1912b5b2 Prodromos Gerakios
668 1912b5b2 Prodromos Gerakios
    def markAllResourcesAsDirty(self):
669 1912b5b2 Prodromos Gerakios
        Resource.allDirty(self._resources)
670 1912b5b2 Prodromos Gerakios
671 1912b5b2 Prodromos Gerakios
    # save dirty only
672 1912b5b2 Prodromos Gerakios
    def saveResources(self,all=False):
673 1912b5b2 Prodromos Gerakios
        Resource.saveMany(self._resources,not all)
674 1912b5b2 Prodromos Gerakios
675 97b987e4 Prodromos Gerakios
    def getResource(self,name ,query=False):
676 97b987e4 Prodromos Gerakios
        r1 = self.getResources(query)
677 97b987e4 Prodromos Gerakios
        return find((lambda r: r.resourceName == name),r1)
678 d4410730 Prodromos Gerakios
679 c278315e Prodromos Gerakios
    # list and load resources
680 1912b5b2 Prodromos Gerakios
    def getResources(self, query=False):
681 53e42918 Prodromos Gerakios
        self._check()
682 53e42918 Prodromos Gerakios
        if(query):
683 53e42918 Prodromos Gerakios
            resourceList = Entity.con().list_resources(context=Entity.Context,
684 1912b5b2 Prodromos Gerakios
                entity=self.entityName,
685 1912b5b2 Prodromos Gerakios
                key=self.entityKey)
686 97b987e4 Prodromos Gerakios
            ret = []
687 53e42918 Prodromos Gerakios
            for r in resourceList:
688 1912b5b2 Prodromos Gerakios
                r1 = Resource(r,self)
689 97b987e4 Prodromos Gerakios
                ret.append(r1)
690 97b987e4 Prodromos Gerakios
            Resource.loadMany(ret)
691 97b987e4 Prodromos Gerakios
            self_resources = ret + [r for r in self._resources if(r not in ret)]
692 1912b5b2 Prodromos Gerakios
693 1912b5b2 Prodromos Gerakios
        return self._resources
694 53e42918 Prodromos Gerakios
695 1912b5b2 Prodromos Gerakios
    # Commission-related API
696 97b987e4 Prodromos Gerakios
    # self = target entity
697 1912b5b2 Prodromos Gerakios
    def addCommission(self):
698 53e42918 Prodromos Gerakios
        q = Commission(self)
699 1912b5b2 Prodromos Gerakios
        self._commissions.append(q)
700 c278315e Prodromos Gerakios
        return q
701 c278315e Prodromos Gerakios
702 1912b5b2 Prodromos Gerakios
    def getCommissions(self):
703 1912b5b2 Prodromos Gerakios
        return self._commissions
704 53e42918 Prodromos Gerakios
705 1912b5b2 Prodromos Gerakios
    def issueAllCommissions(self):
706 1912b5b2 Prodromos Gerakios
        valid = [c for c in self.commissions() if(c.canChange())]
707 1912b5b2 Prodromos Gerakios
        for c in valid:
708 1912b5b2 Prodromos Gerakios
            c.issue()
709 1912b5b2 Prodromos Gerakios
        return valid
710 53e42918 Prodromos Gerakios
711 1912b5b2 Prodromos Gerakios
    def commitAllCommissions(self, accept=True):
712 1912b5b2 Prodromos Gerakios
        self.issueAll()
713 1912b5b2 Prodromos Gerakios
        valid = [c for c in self.commissions() if(c.isPending())]
714 1912b5b2 Prodromos Gerakios
        if(accept):
715 1912b5b2 Prodromos Gerakios
            return Commission.saveAll(valid) == []
716 1912b5b2 Prodromos Gerakios
        else:
717 1912b5b2 Prodromos Gerakios
            return Commission.denyAll(valid) == []
718 53e42918 Prodromos Gerakios
719 53e42918 Prodromos Gerakios
720 e0c7f0ba Prodromos Gerakios
    def clearFinished(self):
721 e0c7f0ba Prodromos Gerakios
        self.commissions = [c for c in self.commissions() if(c.canChange())]
722 e0c7f0ba Prodromos Gerakios
723 e0c7f0ba Prodromos Gerakios
#########################################################################################################
724 e0c7f0ba Prodromos Gerakios
725 e0c7f0ba Prodromos Gerakios
class ResourceHolder(Entity):
726 e0c7f0ba Prodromos Gerakios
727 e0c7f0ba Prodromos Gerakios
    root = Entity.get("pgerakios", "key1",Entity.get())
728 e0c7f0ba Prodromos Gerakios
    resourceNames = ["pithos","cyclades.vm","cyclades.cpu","cyclades.mem"]
729 e0c7f0ba Prodromos Gerakios
730 e0c7f0ba Prodromos Gerakios
    def __init__(self):
731 e0c7f0ba Prodromos Gerakios
        super(Entity,self).__init__()
732 e0c7f0ba Prodromos Gerakios
        self.commission = Commission(self)
733 e0c7f0ba Prodromos Gerakios
        for r in ResourceHolder.resourceNames:
734 e0c7f0ba Prodromos Gerakios
            self.addResource(r)
735 e0c7f0ba Prodromos Gerakios
736 e0c7f0ba Prodromos Gerakios
    def newCommission(self):
737 e0c7f0ba Prodromos Gerakios
        self.commission = Commission(self)
738 e0c7f0ba Prodromos Gerakios
        return self.commission
739 e0c7f0ba Prodromos Gerakios
740 e0c7f0ba Prodromos Gerakios
    def loadResources(self):
741 e0c7f0ba Prodromos Gerakios
        self.getResource(True)
742 e0c7f0ba Prodromos Gerakios
743 e0c7f0ba Prodromos Gerakios
    def commit(self):
744 e0c7f0ba Prodromos Gerakios
        self.issue()
745 e0c7f0ba Prodromos Gerakios
        return self.commission.accept()
746 e0c7f0ba Prodromos Gerakios
747 e0c7f0ba Prodromos Gerakios
    def reject(self):
748 e0c7f0ba Prodromos Gerakios
        self.issue()
749 e0c7f0ba Prodromos Gerakios
        return self.commission.reject()
750 e0c7f0ba Prodromos Gerakios
751 e0c7f0ba Prodromos Gerakios
    def release(self):
752 e0c7f0ba Prodromos Gerakios
        if(not self.commission.canChange()):
753 e0c7f0ba Prodromos Gerakios
            exn("The joinGroup commission is not finalized! Nothing to do.")
754 e0c7f0ba Prodromos Gerakios
            # commit the inverse stuff (send stuff back to groups)
755 e0c7f0ba Prodromos Gerakios
        self.commission = self.commission.inverse()
756 e0c7f0ba Prodromos Gerakios
        b = self.commit()
757 e0c7f0ba Prodromos Gerakios
        self.newCommission()
758 e0c7f0ba Prodromos Gerakios
        # Remove entity
759 e0c7f0ba Prodromos Gerakios
        return b and super(ResourceHolder,self).release()
760 e0c7f0ba Prodromos Gerakios
761 e0c7f0ba Prodromos Gerakios
class Group(ResourceHolder):
762 e0c7f0ba Prodromos Gerakios
763 e0c7f0ba Prodromos Gerakios
    groupRoot =   Entity.getClass("Group","group","group",ResourceHolder.root)
764 e0c7f0ba Prodromos Gerakios
    systemGroupName = "system"
765 e0c7f0ba Prodromos Gerakios
    systemGroupKey  = "system"
766 e0c7f0ba Prodromos Gerakios
767 e0c7f0ba Prodromos Gerakios
    @staticmethod
768 e0c7f0ba Prodromos Gerakios
    def getSystemGroup(self):
769 e0c7f0ba Prodromos Gerakios
        return Group.get(Group.systemGroupName,Group.systemGroupKey)
770 e0c7f0ba Prodromos Gerakios
771 e0c7f0ba Prodromos Gerakios
    @staticmethod
772 e0c7f0ba Prodromos Gerakios
    def listGroups():
773 e0c7f0ba Prodromos Gerakios
        return Group.groupRoot.getChildren()
774 e0c7f0ba Prodromos Gerakios
775 e0c7f0ba Prodromos Gerakios
    @staticmethod
776 e0c7f0ba Prodromos Gerakios
    def get(name,key):
777 e0c7f0ba Prodromos Gerakios
        ret = Entity.getClass("Group",name,key,Group.groupRoot)
778 e0c7f0ba Prodromos Gerakios
        if(name == Group.systemGroupName):
779 e0c7f0ba Prodromos Gerakios
            ret.makeSystem()
780 e0c7f0ba Prodromos Gerakios
        elif(ret.exists(True) == False):
781 e0c7f0ba Prodromos Gerakios
            ret.drawResources()
782 e0c7f0ba Prodromos Gerakios
        return ret
783 e0c7f0ba Prodromos Gerakios
784 e0c7f0ba Prodromos Gerakios
    def __init__(self):
785 e0c7f0ba Prodromos Gerakios
        super(ResourceHolder,self).__init__()
786 e0c7f0ba Prodromos Gerakios
        self.users = []
787 e0c7f0ba Prodromos Gerakios
        self.userResourcePolicies = {}
788 e0c7f0ba Prodromos Gerakios
        self.initializedSystem = False
789 e0c7f0ba Prodromos Gerakios
790 e0c7f0ba Prodromos Gerakios
        # load policies for groups
791 e0c7f0ba Prodromos Gerakios
        self.loadGroupResourcePolicies()
792 e0c7f0ba Prodromos Gerakios
        # load policies for users
793 e0c7f0ba Prodromos Gerakios
        self.loadUserResourcePolicies()
794 e0c7f0ba Prodromos Gerakios
795 e0c7f0ba Prodromos Gerakios
    def loadGroupResourcePolicies(self):
796 e0c7f0ba Prodromos Gerakios
        for r in self.getResources():
797 e0c7f0ba Prodromos Gerakios
            r.policy.load()
798 e0c7f0ba Prodromos Gerakios
799 e0c7f0ba Prodromos Gerakios
    def loadUserResourcePolicies(self):
800 e0c7f0ba Prodromos Gerakios
        for r in self.resourceNames:
801 e0c7f0ba Prodromos Gerakios
            self.userResourcePolicies[r] = Policy.get("{0}.{1}".format(self.entityName,r))
802 e0c7f0ba Prodromos Gerakios
803 e0c7f0ba Prodromos Gerakios
804 e0c7f0ba Prodromos Gerakios
    def getUserPolicyFor(self,resourceName):
805 e0c7f0ba Prodromos Gerakios
        return self.userResourcePolicies[resourceName]
806 e0c7f0ba Prodromos Gerakios
807 e0c7f0ba Prodromos Gerakios
    def getUserPolicies(self):
808 e0c7f0ba Prodromos Gerakios
        return self.userResourcePolicies
809 e0c7f0ba Prodromos Gerakios
810 e0c7f0ba Prodromos Gerakios
    def makeSystem(self):
811 e0c7f0ba Prodromos Gerakios
        if(self.initializedSystem):
812 e0c7f0ba Prodromos Gerakios
            return
813 e0c7f0ba Prodromos Gerakios
        #TODO: create system resources here
814 e0c7f0ba Prodromos Gerakios
        self.initializedSystem = True
815 e0c7f0ba Prodromos Gerakios
816 e0c7f0ba Prodromos Gerakios
817 e0c7f0ba Prodromos Gerakios
    def drawResources(self):
818 e0c7f0ba Prodromos Gerakios
        for r in self.getResources():
819 e0c7f0ba Prodromos Gerakios
            self.commission.addResource(r,r.policy.quantity)
820 e0c7f0ba Prodromos Gerakios
        #
821 e0c7f0ba Prodromos Gerakios
        self.commission.commit()
822 e0c7f0ba Prodromos Gerakios
823 e0c7f0ba Prodromos Gerakios
    def savePolicyQuantities(self,**kwargs):
824 e0c7f0ba Prodromos Gerakios
        res  = self.getResources()
825 e0c7f0ba Prodromos Gerakios
        policies = []
826 e0c7f0ba Prodromos Gerakios
        for name,quantity in kwargs:
827 e0c7f0ba Prodromos Gerakios
            r = self.getResource(name)
828 e0c7f0ba Prodromos Gerakios
            r.policy.quantity = quantity
829 e0c7f0ba Prodromos Gerakios
            policies.append(r)
830 e0c7f0ba Prodromos Gerakios
        Policy.save(policies)
831 e0c7f0ba Prodromos Gerakios
832 e0c7f0ba Prodromos Gerakios
833 e0c7f0ba Prodromos Gerakios
class User(ResourceHolder):
834 e0c7f0ba Prodromos Gerakios
835 e0c7f0ba Prodromos Gerakios
    userRoot = Entity.getClass("User","user","user",ResourceHolder.root)
836 e0c7f0ba Prodromos Gerakios
837 e0c7f0ba Prodromos Gerakios
    @staticmethod
838 e0c7f0ba Prodromos Gerakios
    def listUsers():
839 e0c7f0ba Prodromos Gerakios
        return User.userRoot.getChildren()
840 e0c7f0ba Prodromos Gerakios
841 e0c7f0ba Prodromos Gerakios
    @staticmethod
842 e0c7f0ba Prodromos Gerakios
    def get(name,key):
843 e0c7f0ba Prodromos Gerakios
        return Entity.getClass("User",name,key,User.userRoot)
844 e0c7f0ba Prodromos Gerakios
845 e0c7f0ba Prodromos Gerakios
    def __init__(self):
846 e0c7f0ba Prodromos Gerakios
        super(ResourceHolder,self).__init__(None)
847 e0c7f0ba Prodromos Gerakios
        self.groups = []
848 e0c7f0ba Prodromos Gerakios
        self.loadPolicy()
849 e0c7f0ba Prodromos Gerakios
850 e0c7f0ba Prodromos Gerakios
851 e0c7f0ba Prodromos Gerakios
    def reload(self):
852 e0c7f0ba Prodromos Gerakios
        # order does matter!
853 e0c7f0ba Prodromos Gerakios
        self.clearFinished()
854 e0c7f0ba Prodromos Gerakios
        self.reject()
855 e0c7f0ba Prodromos Gerakios
        self.loadResources()
856 e0c7f0ba Prodromos Gerakios
        self.loadPolicies()
857 e0c7f0ba Prodromos Gerakios
858 e0c7f0ba Prodromos Gerakios
    def loadPolices(self):
859 e0c7f0ba Prodromos Gerakios
        dict = {}
860 e0c7f0ba Prodromos Gerakios
        for g in self.groups:
861 e0c7f0ba Prodromos Gerakios
            for r in self.resourceNames:
862 e0c7f0ba Prodromos Gerakios
                p = g.getUserPolicyFor(r.name)
863 e0c7f0ba Prodromos Gerakios
                if(dict[r.name] == None):
864 e0c7f0ba Prodromos Gerakios
                    dict[r.name] = Policy.copy(p)
865 e0c7f0ba Prodromos Gerakios
                else:
866 e0c7f0ba Prodromos Gerakios
                    dict[r.name] = Policy.union(dict[r.name],p)
867 e0c7f0ba Prodromos Gerakios
868 e0c7f0ba Prodromos Gerakios
        # Change user policy to dummy !!! its a copy of the group policy so
869 e0c7f0ba Prodromos Gerakios
        # we can modify its fields
870 e0c7f0ba Prodromos Gerakios
        for r in  self.getResources():
871 e0c7f0ba Prodromos Gerakios
            dict[r.name].setDummy(True)
872 e0c7f0ba Prodromos Gerakios
            r.setPolicy(dict[r.name])
873 e0c7f0ba Prodromos Gerakios
            ## FIXME: THIS IS NOT CORRECT
874 e0c7f0ba Prodromos Gerakios
            r.setFromPolicy()
875 e0c7f0ba Prodromos Gerakios
876 e0c7f0ba Prodromos Gerakios
877 e0c7f0ba Prodromos Gerakios
    def joinGroup(self,group):
878 e0c7f0ba Prodromos Gerakios
        self.groups.append(group)
879 e0c7f0ba Prodromos Gerakios
        self.groups.users.append(self)
880 e0c7f0ba Prodromos Gerakios
        #
881 e0c7f0ba Prodromos Gerakios
        for r in self.getResources():
882 e0c7f0ba Prodromos Gerakios
            groupUserPolicy = group.getUserPolicyFor(r.resourceName)
883 e0c7f0ba Prodromos Gerakios
            self.commission.addResource(r,groupUserPolicy.quantity)
884 e0c7f0ba Prodromos Gerakios
        self.commit()
885 e0c7f0ba Prodromos Gerakios
886 e0c7f0ba Prodromos Gerakios
887 e0c7f0ba Prodromos Gerakios
# Main program
888 e0c7f0ba Prodromos Gerakios
889 e0c7f0ba Prodromos Gerakios
try:
890 e0c7f0ba Prodromos Gerakios
891 e0c7f0ba Prodromos Gerakios
    # Group1
892 e0c7f0ba Prodromos Gerakios
    group1 = Group.get("group1","group1")
893 e0c7f0ba Prodromos Gerakios
894 e0c7f0ba Prodromos Gerakios
    #["pithos","cyclades.vm","cyclades.cpu","cyclades.mem"]
895 e0c7f0ba Prodromos Gerakios
    group1.savePolicyQuantities('pithos'=10,'cyclades.vm'=2,'cyclades.mem'=3)
896 e0c7f0ba Prodromos Gerakios
897 e0c7f0ba Prodromos Gerakios
898 e0c7f0ba Prodromos Gerakios
    user1 = User.get("prodromos", "key1")
899 e0c7f0ba Prodromos Gerakios
    user1.joinGroup(group1)
900 e0c7f0ba Prodromos Gerakios
901 e0c7f0ba Prodromos Gerakios
finally:
902 e0c7f0ba Prodromos Gerakios
    for e in Entity.list():
903 e0c7f0ba Prodromos Gerakios
        if(e.entityName != "system" and e.entityName != "pgerakios"):
904 e0c7f0ba Prodromos Gerakios
            e.release()
905 e0c7f0ba Prodromos Gerakios
906 e0c7f0ba Prodromos Gerakios
907 e0c7f0ba Prodromos Gerakios
908 e0c7f0ba Prodromos Gerakios
909 e0c7f0ba Prodromos Gerakios
910 e0c7f0ba Prodromos Gerakios
printf("Hello world!")
911 e0c7f0ba Prodromos Gerakios
912 e0c7f0ba Prodromos Gerakios
exit(0)
913 e0c7f0ba Prodromos Gerakios
914 e0c7f0ba Prodromos Gerakios
915 1912b5b2 Prodromos Gerakios
# Main program
916 53e42918 Prodromos Gerakios
root = Entity.get()
917 1912b5b2 Prodromos Gerakios
#TODO: implement Entity.get recursively !! using get_entity !!!!
918 1912b5b2 Prodromos Gerakios
# TODO: correct Entity.checkAll
919 1912b5b2 Prodromos Gerakios
pgerakios = Entity.get("pgerakios", "key1", root)
920 d8d464a0 Prodromos Gerakios
pgerakios.create()
921 d4410730 Prodromos Gerakios
922 1912b5b2 Prodromos Gerakios
try:
923 1912b5b2 Prodromos Gerakios
    # Transfer resources
924 1912b5b2 Prodromos Gerakios
    e = Entity.get(rand_string(), "key1", pgerakios)
925 1912b5b2 Prodromos Gerakios
    e.create()
926 1912b5b2 Prodromos Gerakios
927 1912b5b2 Prodromos Gerakios
    p = Policy.newDummy(quantity=0,capacity=10)
928 1912b5b2 Prodromos Gerakios
    r1 = e.addResource("CPU",p)
929 1912b5b2 Prodromos Gerakios
930 1912b5b2 Prodromos Gerakios
    r2 =e.addResourceWith("MEMORY",quantity=0,capacity=25)
931 1912b5b2 Prodromos Gerakios
    rl1 = e.getResources(False)
932 97b987e4 Prodromos Gerakios
    for r in rl1:
933 97b987e4 Prodromos Gerakios
        printf("Resources of e before : {0}", r.resourceName)
934 97b987e4 Prodromos Gerakios
935 1912b5b2 Prodromos Gerakios
    e.saveResources()
936 1912b5b2 Prodromos Gerakios
    rl2 = e.getResources(True)
937 1912b5b2 Prodromos Gerakios
938 1912b5b2 Prodromos Gerakios
    for r in rl2:
939 97b987e4 Prodromos Gerakios
        printf("r is {0}",r)
940 97b987e4 Prodromos Gerakios
        printf("dict of r : {0}", r.__dict__)
941 1912b5b2 Prodromos Gerakios
        printf("Resources of e after : {0}", r.resourceName)
942 1912b5b2 Prodromos Gerakios
943 1912b5b2 Prodromos Gerakios
944 1912b5b2 Prodromos Gerakios
    e1 = Entity.get(rand_string(), "key1", pgerakios)
945 97b987e4 Prodromos Gerakios
    e1.create()
946 1912b5b2 Prodromos Gerakios
    rl3 = e1.getResources(True)
947 1912b5b2 Prodromos Gerakios
    q= e1.addCommission()
948 1912b5b2 Prodromos Gerakios
    q.addResource(r1,3)
949 1912b5b2 Prodromos Gerakios
    q.addResource(r1,4)
950 1912b5b2 Prodromos Gerakios
    e1.commitAllCommissions(False)
951 1912b5b2 Prodromos Gerakios
    rl4 = e1.getResources(True)
952 53e42918 Prodromos Gerakios
953 1912b5b2 Prodromos Gerakios
    for r in rl3:
954 1912b5b2 Prodromos Gerakios
        printf("Resources of e1 before : {0}", r.resourceName)
955 1912b5b2 Prodromos Gerakios
    for r in rl4:
956 1912b5b2 Prodromos Gerakios
        printf("Resources of e1 after : {0}", r.resourceName)
957 53e42918 Prodromos Gerakios
958 1912b5b2 Prodromos Gerakios
finally:
959 1912b5b2 Prodromos Gerakios
    for e in Entity.list():
960 1912b5b2 Prodromos Gerakios
        if(e.entityName != "system" and e.entityName != "pgerakios"):
961 1912b5b2 Prodromos Gerakios
            e.release()
962 53e42918 Prodromos Gerakios
963 53e42918 Prodromos Gerakios
964 53e42918 Prodromos Gerakios
965 53e42918 Prodromos Gerakios
966 53e42918 Prodromos Gerakios
967 53e42918 Prodromos Gerakios
968 53e42918 Prodromos Gerakios
969 53e42918 Prodromos Gerakios
970 53e42918 Prodromos Gerakios
971 d4410730 Prodromos Gerakios
972 d4410730 Prodromos Gerakios