Project

General

Profile

Revision 798

Utilization-based LWF generation (still needs some work, but mostly done)

View differences:

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