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 |