[haizea-commit] r602 - in branches/TP2.0/src/haizea: common core core/enact core/scheduler
haizea-commit at mailman.cs.uchicago.edu
haizea-commit at mailman.cs.uchicago.edu
Tue Jul 7 05:43:12 CDT 2009
Author: borja
Date: 2009-07-07 05:43:04 -0500 (Tue, 07 Jul 2009)
New Revision: 602
Modified:
branches/TP2.0/src/haizea/common/constants.py
branches/TP2.0/src/haizea/core/configfile.py
branches/TP2.0/src/haizea/core/enact/__init__.py
branches/TP2.0/src/haizea/core/enact/simulated.py
branches/TP2.0/src/haizea/core/leases.py
branches/TP2.0/src/haizea/core/manager.py
branches/TP2.0/src/haizea/core/scheduler/slottable.py
Log:
Allow site information to be loaded from tracefile, a separate XML file, or the old "resource string".
Modified: branches/TP2.0/src/haizea/common/constants.py
===================================================================
--- branches/TP2.0/src/haizea/common/constants.py 2009-07-06 17:23:31 UTC (rev 601)
+++ branches/TP2.0/src/haizea/common/constants.py 2009-07-07 10:43:04 UTC (rev 602)
@@ -17,17 +17,12 @@
# -------------------------------------------------------------------------- #
# Types of resources
-RES_CPU = 0
-RES_MEM = 1
-RES_NETIN = 2
-RES_NETOUT = 3
-RES_DISK = 4
+RES_CPU = "CPU"
+RES_MEM = "Memory"
+RES_NETIN = "Net-in"
+RES_NETOUT = "Net-out"
+RES_DISK = "Disk"
-# Types of types of resources
-RESTYPE_FLOAT = 0
-RESTYPE_INT = 1
-
-
COMMON_SEC="common"
MULTI_SEC="multi"
BASEDATADIR_OPT="basedatadir"
Modified: branches/TP2.0/src/haizea/core/configfile.py
===================================================================
--- branches/TP2.0/src/haizea/core/configfile.py 2009-07-06 17:23:31 UTC (rev 601)
+++ branches/TP2.0/src/haizea/core/configfile.py 2009-07-07 10:43:04 UTC (rev 602)
@@ -420,16 +420,8 @@
required_if = [(("simulation","clock"),constants.CLOCK_SIMULATED)],
doc = """
Time at which simulated clock will start.
- """),
+ """),
- Option(name = "nodes",
- getter = "simul.nodes",
- type = OPTTYPE_INT,
- required = True,
- doc = """
- Number of nodes in the simulated cluster
- """) ,
-
Option(name = "resources",
getter = "simul.resources",
type = OPTTYPE_STRING,
Modified: branches/TP2.0/src/haizea/core/enact/__init__.py
===================================================================
--- branches/TP2.0/src/haizea/core/enact/__init__.py 2009-07-06 17:23:31 UTC (rev 601)
+++ branches/TP2.0/src/haizea/core/enact/__init__.py 2009-07-07 10:43:04 UTC (rev 602)
@@ -21,12 +21,8 @@
class ResourcePoolInfo(object):
def __init__(self):
- # Initialize the resource types in the ResourceTuple class
- # TODO: Do this in a less kludgy way
- resourcetypes = self.get_resource_types()
- ResourceTuple.set_resource_types(resourcetypes)
+ pass
-
def get_nodes(self):
""" Returns the nodes in the resource pool. """
abstract()
Modified: branches/TP2.0/src/haizea/core/enact/simulated.py
===================================================================
--- branches/TP2.0/src/haizea/core/enact/simulated.py 2009-07-06 17:23:31 UTC (rev 601)
+++ branches/TP2.0/src/haizea/core/enact/simulated.py 2009-07-07 10:43:04 UTC (rev 602)
@@ -29,34 +29,38 @@
self.logger = logging.getLogger("ENACT.SIMUL.INFO")
config = get_config()
- numnodes = config.get("simul.nodes")
+ if not ("CPU" in site.resource_types and "Memory" in site.resource_types):
+ # CPU and Memory must be specified
+ # TODO: raise something more meaningful
+ raise
+
+ self.resource_types = []
+ self.resource_types.append((constants.RES_CPU,"CPU"))
+ self.resource_types.append((constants.RES_MEM,"Memory"))
- capacity = self.parse_resources_string(config.get("simul.resources"))
+ # Disk and network should be specified but, if not, we can
+ # just add arbitrarily large values.
+ if not "Disk" in site.resource_types:
+ site.add_resource("Disk", 1000000)
+
+ if not "Net-in" in site.resource_types:
+ site.add_resource("Net-in", 1000000)
+
+ if not "Net-out" in site.resource_types:
+ site.add_resource("Net-out", 1000000)
- self.nodes = [Node(i+1, "simul-%i" % (i+1), capacity) for i in range(numnodes)]
+ nodes = site.nodes.get_all_nodes()
+
+ self.nodes = [Node(id, "simul-%i" % id, capacity) for (id, capacity) in nodes.items()]
for n in self.nodes:
- n.enactment_info = n.nod_id
+ n.enactment_info = n.nod_id
def get_nodes(self):
return self.nodes
def get_resource_types(self):
- return [(constants.RES_CPU, constants.RESTYPE_FLOAT, "CPU"),
- (constants.RES_MEM, constants.RESTYPE_INT, "Memory"),
- (constants.RES_DISK, constants.RESTYPE_INT, "Disk"),
- (constants.RES_NETIN, constants.RESTYPE_INT, "Net (in)"),
- (constants.RES_NETOUT, constants.RESTYPE_INT, "Net (out)")]
-
- def parse_resources_string(self, resources):
- resources = resources.split(";")
- desc2type = dict([(x[2], x[0]) for x in self.get_resource_types()])
- capacity = ResourceTuple.create_empty()
- for r in resources:
- resourcename = r.split(",")[0]
- resourcecapacity = r.split(",")[1]
- capacity.set_by_type(desc2type[resourcename], int(resourcecapacity))
- return capacity
-
+ return self.resource_types
+
def get_migration_bandwidth(self):
return 100 # TODO: Get from config file
@@ -103,15 +107,13 @@
config = get_config()
self.bandwidth = config.get("imagetransfer-bandwidth")
-
- # Image repository nodes
- numnodes = config.get("simul.nodes")
imgcapacity = ResourceTuple.create_empty()
imgcapacity.set_by_type(constants.RES_NETOUT, self.bandwidth)
- self.fifo_node = Node(numnodes+1, "FIFOnode", imgcapacity)
- self.edf_node = Node(numnodes+2, "EDFnode", imgcapacity)
+ # TODO: Determine node number based on site
+ self.fifo_node = Node(1000, "FIFOnode", imgcapacity)
+ self.edf_node = Node(1001, "EDFnode", imgcapacity)
def get_edf_node(self):
return self.edf_node
Modified: branches/TP2.0/src/haizea/core/leases.py
===================================================================
--- branches/TP2.0/src/haizea/core/leases.py 2009-07-06 17:23:31 UTC (rev 601)
+++ branches/TP2.0/src/haizea/core/leases.py 2009-07-07 10:43:04 UTC (rev 602)
@@ -218,7 +218,7 @@
nodes = Nodes.from_xml_element(element.find("nodes"))
- requested_resources = nodes.nodes
+ requested_resources = nodes.get_all_nodes()
start = element.find("start")
if len(start.getchildren()) == 0:
@@ -444,54 +444,98 @@
class Site(object):
- def __init__(self, inittime, site = None):
- self.inittime = inittime
- self.entries = []
- self.site = site
+ def __init__(self, nodes, resource_types, attr_types):
+ self.nodes = nodes
+ self.resource_types = resource_types
+ self.attr_types = attr_types
- def from_xml_file(self, xml_file):
- self.__from_xml(ET.parse(xml_file).getroot())
+ def add_resource(self, name, amount):
+ from haizea.core.scheduler.slottable import ResourceTuple
+ ResourceTuple.add_resource_type(name)
+ self.resource_types.add(name)
+ self.nodes.add_resource(name, amount)
+ @classmethod
+ def from_xml_file(cls, xml_file):
+ return cls.__from_xml_element(ET.parse(xml_file).getroot())
+
+ @classmethod
+ def from_lwf_file(cls, xml_file):
+ return cls.__from_xml_element(ET.parse(xml_file).getroot().find("site"))
+
+ @classmethod
+ def __from_xml_element(cls, site_element):
+ from haizea.core.scheduler.slottable import ResourceTuple
+
+ resource_types = site_element.find("resource-types")
+ resource_types = set(resource_types.get("names").split())
+ for resource_type in resource_types:
+ ResourceTuple.add_resource_type(resource_type)
+
+ # TODO: Attributes
+
+ nodes = Nodes.from_xml_element(site_element.find("nodes"))
+
+ return cls(nodes, resource_types, None)
- def __from_xml(self, leaseworkload_element):
- reqs = leaseworkload_element.findall("lease-requests/lease-request")
- for r in reqs:
- lease = r.find("lease")
- # Add time lease is submitted
- submittime = self.inittime + Parser.DateTimeDeltaFromString(r.get("arrival"))
- lease.set("submit-time", str(submittime))
+ @classmethod
+ def from_resources_string(cls, resource_str):
+ from haizea.core.scheduler.slottable import ResourceTuple
+
+ resource_str = resource_str.split(" ")
+ numnodes = int(resource_str[0])
+ resources = resource_str[1].split(";")
+ res = {}
+
+ for r in resources:
+ type = r.split(",")[0]
+ amount = int(r.split(",")[1])
+ ResourceTuple.add_resource_type(type)
+ res[type] = amount
- # If an exact starting time is specified, add the init time
- exact = lease.find("start/exact")
- if exact != None:
- start = self.inittime + Parser.DateTimeDeltaFromString(exact.get("time"))
- exact.set("time", str(start))
-
- lease = Lease.from_xml_element(lease)
- self.entries.append(lease)
+ capacity = ResourceTuple.create_empty()
+ for (type,amount) in res.items():
+ capacity.set_by_type(type, amount)
+
+ nodes = Nodes([(numnodes,capacity)])
+ return cls(nodes, res.keys(), [])
+
class Nodes(object):
- def __init__(self, nodes):
- self.nodes = nodes
+ def __init__(self, node_sets):
+ self.node_sets = node_sets
+ def get_all_nodes(self):
+ nodes = {}
+ nodenum = 1
+ for node_set in self.node_sets:
+ numnodes = node_set[0]
+ r = node_set[1]
+ for i in range(numnodes):
+ nodes[nodenum] = r
+ nodenum += 1
+ return nodes
+
+ def add_resource(self, type, amount):
+ for node_set in self.node_sets:
+ r = node_set[1]
+ r.set_by_type(type, amount)
+
@classmethod
def from_xml_element(cls, nodes_element):
from haizea.core.scheduler.slottable import ResourceTuple
- nodes = {}
- nodenum = 1
- nodesets = nodes_element.findall("node-set")
- for nodeset in nodesets:
+ nodesets = []
+ nodesets_elems = nodes_element.findall("node-set")
+ for nodeset_elem in nodesets_elems:
r = ResourceTuple.create_empty()
- resources = nodeset.findall("res")
+ resources = nodeset_elem.findall("res")
for i, res in enumerate(resources):
type = res.get("type")
amount = int(res.get("amount"))
- r._res[i] = amount
+ r.set_by_type(type, amount)
+ numnodes = int(nodeset_elem.get("numnodes"))
+
+ nodesets.append((numnodes,r))
- numnodes = int(nodeset.get("numnodes"))
- for i in range(numnodes):
- nodes[nodenum] = r
- nodenum += 1
-
- return cls(nodes)
\ No newline at end of file
+ return cls(nodesets)
\ No newline at end of file
Modified: branches/TP2.0/src/haizea/core/manager.py
===================================================================
--- branches/TP2.0/src/haizea/core/manager.py 2009-07-06 17:23:31 UTC (rev 601)
+++ branches/TP2.0/src/haizea/core/manager.py 2009-07-07 10:43:04 UTC (rev 602)
@@ -46,7 +46,7 @@
from haizea.core.scheduler.slottable import SlotTable
from haizea.core.scheduler.policy import SimplePolicy
from haizea.core.scheduler.resourcepool import ResourcePool, ResourcePoolWithReusableImages
-from haizea.core.leases import Lease
+from haizea.core.leases import Lease, Site
from haizea.core.rpcserver import RPCServer
from haizea.common.utils import abstract, round_datetime, Singleton
@@ -122,9 +122,17 @@
self.clock = RealClock(self, wakeup_interval, non_sched)
self.rpc_server = RPCServer(self)
- # TODO Load the specification of the simulated site.
- site = None
-
+ resources = self.config.get("simul.resources")
+
+ if resources == "in-tracefile":
+ tracefile = self.config.get("tracefile")
+ site = Site.from_lwf_file(tracefile)
+ elif resources.startswith("file:"):
+ sitefile = resources.split(":")
+ site = Site.from_xml_file(sitefile)
+ else:
+ site = Site.from_resources_string(resources)
+
# Enactment modules
info_enact = SimulatedResourcePoolInfo(site)
vm_enact = SimulatedVMEnactment()
Modified: branches/TP2.0/src/haizea/core/scheduler/slottable.py
===================================================================
--- branches/TP2.0/src/haizea/core/scheduler/slottable.py 2009-07-06 17:23:31 UTC (rev 601)
+++ branches/TP2.0/src/haizea/core/scheduler/slottable.py 2009-07-07 10:43:04 UTC (rev 602)
@@ -41,6 +41,10 @@
This class ...
"""
+ type2pos = {}
+ pos2type = {}
+ nres = 0
+
def __init__(self, res):
self._res = res
@@ -53,10 +57,14 @@
return cls(rt._res[:])
@classmethod
- def set_resource_types(cls, resourcetypes):
- cls.type2pos = dict([(x[0], i) for i, x in enumerate(resourcetypes)])
- cls.descriptions = dict([(i, x[2]) for i, x in enumerate(resourcetypes)])
- cls.tuplelength = len(resourcetypes)
+ def add_resource_type(cls, name):
+ if name in cls.type2pos:
+ # Can't add a resourcetype more than once
+ # TODO: Raise something more meaningful
+ raise
+ cls.type2pos[name] = cls.nres
+ cls.pos2type[cls.nres] = name
+ cls.nres += 1
@classmethod
def get_resource_types(cls):
@@ -64,7 +72,7 @@
@classmethod
def create_empty(cls):
- return cls([0 for x in range(cls.tuplelength)])
+ return cls([0 for x in range(cls.nres)])
def fits_in(self, res2):
fits = True
@@ -103,7 +111,7 @@
def __repr__(self):
r=""
for i, x in enumerate(self._res):
- r += "%s:%.2f " % (self.descriptions[i], x)
+ r += "%s:%.2f " % (self.pos2type[i], x)
return r
def __eq__(self, res2):
More information about the Haizea-commit
mailing list