Package haizea :: Package core :: Package frontends :: Module tracefile
[hide private]
[frames] | no frames]

Source Code for Module haizea.core.frontends.tracefile

  1  # -------------------------------------------------------------------------- # 
  2  # Copyright 2006-2009, University of Chicago                                 # 
  3  # Copyright 2008-2009, Distributed Systems Architecture Group, Universidad   # 
  4  # Complutense de Madrid (dsa-research.org)                                   # 
  5  #                                                                            # 
  6  # Licensed under the Apache License, Version 2.0 (the "License"); you may    # 
  7  # not use this file except in compliance with the License. You may obtain    # 
  8  # a copy of the License at                                                   # 
  9  #                                                                            # 
 10  # http://www.apache.org/licenses/LICENSE-2.0                                 # 
 11  #                                                                            # 
 12  # Unless required by applicable law or agreed to in writing, software        # 
 13  # distributed under the License is distributed on an "AS IS" BASIS,          # 
 14  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   # 
 15  # See the License for the specific language governing permissions and        # 
 16  # limitations under the License.                                             # 
 17  # -------------------------------------------------------------------------- # 
 18   
 19  import haizea.common.constants as constants 
 20  from haizea.common.utils import get_clock 
 21  from haizea.core.frontends import RequestFrontend 
 22  from haizea.core.leases import LeaseWorkload, Lease, DiskImageSoftwareEnvironment 
 23  import operator 
 24  import logging 
 25   
26 -class TracefileFrontend(RequestFrontend):
27 - def __init__(self, starttime):
28 RequestFrontend.__init__(self) 29 self.logger = logging.getLogger("TFILE") 30 self.starttime = starttime
31
32 - def load(self, manager):
33 config = manager.config 34 35 tracefile = config.get("tracefile") 36 injectfile = config.get("injectionfile") 37 imagefile = config.get("imagefile") 38 39 # Read trace file 40 # Requests is a list of lease requests 41 self.logger.info("Loading tracefile %s" % tracefile) 42 self.requests = None 43 if tracefile.endswith(".swf"): 44 self.requests = LeaseWorkload.from_swf_file(tracefile, self.starttime) 45 elif tracefile.endswith(".lwf") or tracefile.endswith(".xml"): 46 lease_workload = LeaseWorkload.from_xml_file(tracefile, self.starttime) 47 self.requests = lease_workload.get_leases() 48 49 if injectfile != None: 50 self.logger.info("Loading injection file %s" % injectfile) 51 inj_lease_workload = LeaseWorkload.from_xml_file(injectfile, self.starttime) 52 inj_leases = inj_lease_workload.get_leases() 53 self.requests += inj_leases 54 self.requests.sort(key=operator.attrgetter("submit_time")) 55 56 if imagefile != None: 57 self.logger.info("Loading image file %s" % imagefile) 58 file = open (imagefile, "r") 59 imagesizes = {} 60 images = [] 61 state = 0 # 0 -> Reading image sizes 1 -> Reading image sequence 62 for line in file: 63 if line[0]=='#': 64 state = 1 65 elif state == 0: 66 image, size = line.split() 67 imagesizes[image] = int(size) 68 elif state == 1: 69 images.append(line.strip()) 70 for lease, image_id in zip(self.requests, images): 71 lease.software = DiskImageSoftwareEnvironment(image_id, imagesizes[image_id]) 72 73 # Add runtime overhead, if necessary 74 add_overhead = config.get("add-overhead") 75 76 if add_overhead != constants.RUNTIMEOVERHEAD_NONE: 77 slowdown_overhead = config.get("runtime-slowdown-overhead") 78 boot_overhead = config.get("bootshutdown-overhead") 79 for r in self.requests: 80 if add_overhead == constants.RUNTIMEOVERHEAD_ALL or (add_overhead == constants.RUNTIMEOVERHEAD_BE and r.get_type() == Lease.BEST_EFFORT): 81 if slowdown_overhead != 0: 82 r.add_runtime_overhead(slowdown_overhead) 83 r.add_boot_overhead(boot_overhead) 84 85 # Override requested memory, if necessary 86 memory = config.get("override-memory") 87 if memory != constants.NO_MEMORY_OVERRIDE: 88 for r in self.requests: 89 r.requested_resources.set_by_type(constants.RES_MEM, memory) 90 91 types = {} 92 for r in self.requests: 93 types[r.get_type()] = types.setdefault(r.get_type(), 0) + 1 94 types_str = " + ".join(["%i %s" % (types[t],Lease.type_str[t]) for t in types]) 95 96 self.logger.info("Loaded workload with %i requests (%s)" % (len(self.requests), types_str))
97 98
99 - def get_accumulated_requests(self):
100 # When reading from a trace file, there are no 101 # "accumulated requests". Rather, we just take whatever 102 # requests are in the trace up to the current time 103 # reported by the resource manager 104 time = get_clock().get_time() 105 nowreq = [r for r in self.requests if r.submit_time <= time] 106 self.requests = [r for r in self.requests if r.submit_time > time] 107 return nowreq
108
109 - def exists_more_requests(self):
110 return len(self.requests) != 0
111
112 - def get_next_request_time(self):
113 if self.exists_more_requests(): 114 return self.requests[0].submit_time 115 else: 116 return None
117