[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