Revision 798
Added by Borja Sotomayor almost 14 years ago
generators.py | ||
---|---|---|
19 | 19 |
import haizea.common.stats as stats |
20 | 20 |
from haizea.core.leases import LeaseWorkload, LeaseAnnotation, LeaseAnnotations, Timestamp, Lease,\ |
21 | 21 |
Capacity, Duration, UnmanagedSoftwareEnvironment,\ |
22 |
DiskImageSoftwareEnvironment |
|
22 |
DiskImageSoftwareEnvironment, Site
|
|
23 | 23 |
from haizea.common.utils import round_datetime_delta |
24 | 24 |
from mx.DateTime import DateTimeDelta, TimeDelta, Parser |
25 | 25 |
import ConfigParser |
... | ... | |
235 | 235 |
|
236 | 236 |
class LWFGenerator(FileGenerator): |
237 | 237 |
|
238 |
SITE_OPT = "site" |
|
239 |
|
|
238 | 240 |
NUMLEASES_SEC = "numleases" |
239 | 241 |
|
240 | 242 |
NUMLEASES_TYPE_UTILIZATION = "utilization" |
... | ... | |
249 | 251 |
|
250 | 252 |
self.numleases_type = self.config.get(LWFGenerator.NUMLEASES_SEC, LWFGenerator.TYPE_OPT) |
251 | 253 |
|
252 |
if self.numleases_type == LWFGenerator.NUMLEASES_TYPE_INTERVAL: |
|
253 |
self.interval_dist = self._get_dist(LWFGenerator.NUMLEASES_SEC) |
|
254 |
else: |
|
255 |
self.interval_dist = None |
|
256 |
|
|
254 |
self.interval_dist = self._get_dist(LWFGenerator.NUMLEASES_SEC) |
|
255 |
|
|
257 | 256 |
def _get_interval(self): |
258 | 257 |
if self.interval_dist == None: |
259 | 258 |
return None |
... | ... | |
290 | 289 |
description = ET.SubElement(lwf, "description") |
291 | 290 |
description.text = "Created with haizea-generate" |
292 | 291 |
|
293 |
#if self.opt.site != None: |
|
294 |
# site_elem = ET.parse(self.opt.site).getroot() |
|
295 |
# site_num_nodes = int(site_elem.find("nodes").find("node-set").get("numnodes")) |
|
296 |
# lwf.append(site_elem) |
|
292 |
site = self.config.get(LWFGenerator.GENERAL_SEC, LWFGenerator.SITE_OPT) |
|
293 |
if site.startswith("file:"): |
|
294 |
sitefile = site.split(":") |
|
295 |
site = Site.from_xml_file(sitefile[1]) |
|
296 |
else: |
|
297 |
site = Site.from_resources_string(site) |
|
298 |
|
|
299 |
lwf.append(site.to_xml()) |
|
297 | 300 |
|
298 | 301 |
time = TimeDelta(seconds=0) |
299 |
requests = ET.SubElement(lwf, "lease-requests")
|
|
302 |
requests = ET.SubElement(lwf, "lease-requests") |
|
300 | 303 |
|
301 | 304 |
if self.numleases_type == LWFGenerator.NUMLEASES_TYPE_INTERVAL: |
302 | 305 |
leases = [] |
... | ... | |
308 | 311 |
for l in leases: |
309 | 312 |
interval = TimeDelta(seconds=self._get_interval()) |
310 | 313 |
time += interval |
311 |
print interval, time |
|
312 | 314 |
l.start.requested += time |
313 | 315 |
lease_request = ET.SubElement(requests, "lease-request") |
314 | 316 |
lease_request.set("arrival", str(time)) |
... | ... | |
318 | 320 |
last_request = self.config.get(LWFGenerator.NUMLEASES_SEC, LWFGenerator.NUMLEASES_LAST_REQUEST_OPT) |
319 | 321 |
last_request = Parser.DateTimeDeltaFromString(last_request) |
320 | 322 |
|
321 |
# TODO |
|
322 |
target_utilization = utilization |
|
323 |
accum_utilization = None |
|
323 |
max_utilization = 0 |
|
324 |
for res in site.nodes.get_all_nodes().values(): |
|
325 |
for i in range(1,res.get_ninstances("CPU") + 1): |
|
326 |
max_utilization += res.get_quantity_instance("CPU", i) * last_request.seconds |
|
327 |
target_utilization = int(max_utilization * utilization) |
|
324 | 328 |
|
329 |
accum_utilization = 0 |
|
330 |
|
|
325 | 331 |
leases = [] |
326 | 332 |
|
327 | 333 |
while accum_utilization < target_utilization: |
328 |
pass |
|
329 |
self.__gen_lease() |
|
334 |
lease = self.__gen_lease() |
|
335 |
leases.append(lease) |
|
336 |
duration = lease.duration.requested.seconds |
|
337 |
lease_utilization = 0 |
|
338 |
for res in lease.requested_resources.values(): |
|
339 |
for i in range(1,res.get_ninstances("CPU") + 1): |
|
340 |
lease_utilization += res.get_quantity_instance("CPU", i) * duration |
|
341 |
accum_utilization += lease_utilization |
|
330 | 342 |
|
331 |
# TODO: Set arrival times so they are evenly spaced |
|
343 |
time = TimeDelta(seconds=0) |
|
344 |
avg_interval = int(last_request.seconds / len(leases)) |
|
332 | 345 |
for l in leases: |
346 |
interval = avg_interval + TimeDelta(seconds=self._get_interval()) |
|
347 |
time = max(time + interval, TimeDelta(seconds=0)) |
|
348 |
l.start.requested += time |
|
333 | 349 |
lease_request = ET.SubElement(requests, "lease-request") |
334 | 350 |
lease_request.set("arrival", str(time)) |
335 |
lease_request.append(l.to_xml()) |
|
351 |
lease_request.append(l.to_xml())
|
|
336 | 352 |
|
337 |
|
|
338 |
print ET.tostring(lwf) |
|
353 |
tree = ET.ElementTree(lwf) |
|
354 |
|
|
355 |
outfile = open(self.outfile, "w") |
|
356 |
tree.write(outfile) |
|
357 |
outfile.close() |
|
339 | 358 |
|
340 | 359 |
class LWFAnnotationGenerator(FileGenerator): |
341 | 360 |
|
Also available in: Unified diff
Utilization-based LWF generation (still needs some work, but mostly done)