[haizea-commit] r756 - in branches/1.1: src/haizea/cli src/haizea/core/scheduler src/haizea/pluggable/accounting src/haizea/pluggable/policies tests

haizea-commit at mailman.cs.uchicago.edu haizea-commit at mailman.cs.uchicago.edu
Tue Jan 12 18:32:28 CST 2010


Author: borja
Date: 2010-01-12 18:32:28 -0600 (Tue, 12 Jan 2010)
New Revision: 756

Modified:
   branches/1.1/src/haizea/cli/annotator.py
   branches/1.1/src/haizea/core/scheduler/lease_scheduler.py
   branches/1.1/src/haizea/pluggable/accounting/leases.py
   branches/1.1/src/haizea/pluggable/policies/__init__.py
   branches/1.1/src/haizea/pluggable/policies/pricing.py
   branches/1.1/tests/base_config_simulator.conf
   branches/1.1/tests/price1.lwf
   branches/1.1/tests/price2.lwf
   branches/1.1/tests/pricedeadline.lwf
   branches/1.1/tests/test_simul_pricing.py
Log:
Terminology change: "rate" instead of "fair price" and "markup"

Modified: branches/1.1/src/haizea/cli/annotator.py
===================================================================
--- branches/1.1/src/haizea/cli/annotator.py	2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/src/haizea/cli/annotator.py	2010-01-13 00:32:28 UTC (rev 756)
@@ -37,7 +37,7 @@
     GENERAL_SEC = "general"
     START_DELAY_SEC = "start-delay"
     DEADLINE_STRETCH_SEC = "deadline-stretch"
-    MARKUP_SEC = "user-markup"
+    RATE_SEC = "user-rate"
     
     ATTRIBUTES_OPT = "attributes"
     TYPE_OPT = "type"
@@ -73,7 +73,7 @@
                                          ...
                                          """))
         
-        self.user_markups = {}
+        self.user_rates = {}
         
     def run(self):
         self.parse_options()      
@@ -88,7 +88,7 @@
         
         self.startdelay_dist = self.__get_dist(haizea_lwf_annotate.START_DELAY_SEC)
         self.deadlinestretch_dist = self.__get_dist(haizea_lwf_annotate.DEADLINE_STRETCH_SEC)
-        self.markup_dist = self.__get_dist(haizea_lwf_annotate.MARKUP_SEC)
+        self.rate_dist = self.__get_dist(haizea_lwf_annotate.RATE_SEC)
 
         start_type = self.config.get(haizea_lwf_annotate.START_DELAY_SEC, haizea_lwf_annotate.TYPE_OPT)
         deadline_type = self.config.get(haizea_lwf_annotate.DEADLINE_STRETCH_SEC, haizea_lwf_annotate.TYPE_OPT)
@@ -112,10 +112,10 @@
             
             software = self.__get_software(lease)
             
-            markup = self.__get_markup(lease)
+            rate = self.__get_rate(lease)
 
-            if markup != None:
-                extra["simul_pricemarkup"] = "%.2f" % markup
+            if rate != None:
+                extra["simul_userrate"] = "%.2f" % rate
             
             annotation = LeaseAnnotation(lease_id, start, deadline, software, extra)
             annotations[lease_id] = annotation
@@ -178,19 +178,19 @@
     def __get_software(self, lease):
         return None # TODO
     
-    def __get_markup(self, lease):
-        if self.markup_dist == None:
+    def __get_rate(self, lease):
+        if self.rate_dist == None:
             return None
         else:
             if lease.user_id == -1:
-                return self.markup_dist.get()
+                return self.rate_dist.get()
             else:
-                if self.user_markups.has_key(lease.user_id):
-                    return self.user_markups[lease.user_id]
+                if self.user_rates.has_key(lease.user_id):
+                    return self.user_rates[lease.user_id]
                 else:
-                    markup = self.markup_dist.get()
-                    self.user_markups[lease.user_id] = markup
-                    return markup
+                    rate = self.rate_dist.get()
+                    self.user_rates[lease.user_id] = rate
+                    return rate
     
     def __get_dist(self, section):
         if self.config.has_section(section):

Modified: branches/1.1/src/haizea/core/scheduler/lease_scheduler.py
===================================================================
--- branches/1.1/src/haizea/core/scheduler/lease_scheduler.py	2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/src/haizea/core/scheduler/lease_scheduler.py	2010-01-13 00:32:28 UTC (rev 756)
@@ -189,10 +189,6 @@
                 if lease.price == -1:
                     lease.set_state(Lease.STATE_REJECTED_BY_USER)
                 else:
-                    # We still want to record the fair price
-                    if get_config().get("policy.pricing") != "free":
-                        fair_price = get_policy().pricing.get_fair_price(lease)
-                        lease.extras["fair_price"] = fair_price
                     lease.set_state(Lease.STATE_REJECTED)                    
                 self.completed_leases.add(lease)
                 self.accounting.at_lease_done(lease)
@@ -593,15 +589,16 @@
         
         # Determine whether to accept price or not (this in particular
         # should happen in the lease admission step)
-        if lease.extras.has_key("simul_pricemarkup"):
-            markup = float(lease.extras["simul_pricemarkup"])
+        if lease.extras.has_key("simul_userrate"):
+            user_rate = float(lease.extras["simul_userrate"])
             if get_config().get("policy.pricing") != "free":
-                fair_price = get_policy().pricing.get_fair_price(lease)
-                lease.extras["fair_price"] = fair_price
-                if lease_price > fair_price * markup:
+                user_price = get_policy().pricing.get_base_price(lease, user_rate)
+                # We want to record the rate at which the lease was priced
+                lease.extras["rate"] = get_policy().pricing.rate
+                if lease_price > user_price:
                     lease.price = -1
                     lease.extras["rejected_price"] = lease_price
-                    raise NotSchedulableException, "Lease priced at %.2f. User is only willing to pay %.2f" % (lease_price, fair_price * markup)
+                    raise NotSchedulableException, "Lease priced at %.2f. User is only willing to pay %.2f" % (lease_price, user_price)
         
         lease.price = lease_price
         ## END NOT-FIT-FOR-PRODUCTION CODE

Modified: branches/1.1/src/haizea/pluggable/accounting/leases.py
===================================================================
--- branches/1.1/src/haizea/pluggable/accounting/leases.py	2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/src/haizea/pluggable/accounting/leases.py	2010-01-13 00:32:28 UTC (rev 756)
@@ -20,6 +20,7 @@
 
 from haizea.core.accounting import AccountingProbe, AccountingDataCollection
 from haizea.core.leases import Lease
+from haizea.common.utils import get_policy
 
 from mx.DateTime import TimeDelta
           
@@ -262,7 +263,7 @@
     COUNTER_MISSED_REVENUE_REJECT="Missed revenue (reject)"
     COUNTER_MISSED_REVENUE_REJECT_BY_USER="Missed revenue (reject by user)"
     STAT_REVENUE="Revenue"
-    STAT_SURCHARGE="Revenue"
+    STAT_SURCHARGE="Surcharge"
     STAT_MISSED_REVENUE_UNDERCHARGE="Missed revenue (undercharging)"
     STAT_MISSED_REVENUE_REJECT="Missed revenue (reject)"
     STAT_MISSED_REVENUE_REJECT_BY_USER="Missed revenue (reject by user)"
@@ -293,7 +294,7 @@
         self._set_stat_from_counter(PriceProbe.STAT_MISSED_REVENUE_UNDERCHARGE, PriceProbe.COUNTER_MISSED_REVENUE_UNDERCHARGE)
         self._set_stat_from_counter(PriceProbe.STAT_MISSED_REVENUE_REJECT, PriceProbe.COUNTER_MISSED_REVENUE_REJECT)
         self._set_stat_from_counter(PriceProbe.STAT_MISSED_REVENUE_REJECT_BY_USER, PriceProbe.COUNTER_MISSED_REVENUE_REJECT_BY_USER)
-        
+     
         r1 = self.accounting.get_last_counter_value(PriceProbe.COUNTER_MISSED_REVENUE_UNDERCHARGE)
         r2 = self.accounting.get_last_counter_value(PriceProbe.COUNTER_MISSED_REVENUE_REJECT)
         r3 = self.accounting.get_last_counter_value(PriceProbe.COUNTER_MISSED_REVENUE_REJECT_BY_USER)
@@ -303,15 +304,17 @@
     def at_lease_done(self, lease):
         """See AccountingProbe.at_lease_done"""        
         if lease.get_state() == Lease.STATE_DONE:
-            self.accounting.incr_counter(PriceProbe.STAT_REVENUE, lease.id, lease.price)
+            self.accounting.incr_counter(PriceProbe.COUNTER_REVENUE, lease.id, lease.price)
             self.accounting.set_lease_stat(PriceProbe.LEASE_STAT_PRICE, lease.id, lease.price)
 
-        if lease.extras.has_key("fair_price"):
-            markup = float(lease.extras["simul_pricemarkup"])
-            fair_price = float(lease.extras["fair_price"])
-            user_price = markup * fair_price
+        if lease.extras.has_key("rate") and lease.extras.has_key("simul_userrate"):
+            user_rate = float(lease.extras["simul_userrate"])
+            user_price = get_policy().pricing.get_base_price(lease, user_rate)
+            
             if lease.get_state() == Lease.STATE_DONE:
+                surcharge = lease.price - get_policy().pricing.get_base_price(lease, lease.extras["rate"])
                 self.accounting.incr_counter(PriceProbe.STAT_MISSED_REVENUE_UNDERCHARGE, lease.id, user_price - lease.price)
+                self.accounting.incr_counter(PriceProbe.STAT_SURCHARGE, lease.id, surcharge)
             elif lease.get_state() == Lease.STATE_REJECTED:
                 self.accounting.incr_counter(PriceProbe.STAT_MISSED_REVENUE_REJECT, lease.id, user_price)
             elif lease.get_state() == Lease.STATE_REJECTED_BY_USER:

Modified: branches/1.1/src/haizea/pluggable/policies/__init__.py
===================================================================
--- branches/1.1/src/haizea/pluggable/policies/__init__.py	2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/src/haizea/pluggable/policies/__init__.py	2010-01-13 00:32:28 UTC (rev 756)
@@ -33,7 +33,7 @@
                        "greedy": "haizea.pluggable.policies.host_selection.GreedyPolicy"}
 
 pricing_mappings = {"free": "haizea.pluggable.policies.pricing.FreePolicy",
-                    "always-fair": "haizea.pluggable.policies.pricing.AlwaysFairPricePolicy",
-                    "random": "haizea.pluggable.policies.pricing.RandomMultipleOfFairPricePolicy",
-                    "maximum": "haizea.pluggable.policies.pricing.MaxMultipleOfFairPricePolicy",
-                    "adaptive": "haizea.pluggable.policies.pricing.AdaptiveFairPricePolicy"}
\ No newline at end of file
+                    "constant": "haizea.pluggable.policies.pricing.ConstantRatePricePolicy",
+                    "random": "haizea.pluggable.policies.pricing.RandomRatePricePolicy",
+                    "maximum": "haizea.pluggable.policies.pricing.MaximumPricePolicy",
+                    "adaptive": "haizea.pluggable.policies.pricing.AdaptiveRatePricePolicy"}
\ No newline at end of file

Modified: branches/1.1/src/haizea/pluggable/policies/pricing.py
===================================================================
--- branches/1.1/src/haizea/pluggable/policies/pricing.py	2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/src/haizea/pluggable/policies/pricing.py	2010-01-13 00:32:28 UTC (rev 756)
@@ -52,8 +52,8 @@
         """                    
         return 0.0
 
-class FairPricePolicy(PricingPolicy):
-    """Base class for policies that rely on the notion of a fair rate for computation
+class RatePricePolicy(PricingPolicy):
+    """Base class for policies that rely on the notion of a rate for computation
     """    
     def __init__(self, slottable):
         """Constructor
@@ -62,24 +62,26 @@
         slottable -- A fully constructed SlotTable
         """        
         PricingPolicy.__init__(self, slottable)
-        self.fair_rate = get_config().config.getfloat("pricing", "fair-rate")
+        self.rate = get_config().config.getfloat("pricing", "rate")
     
-    def get_fair_price(self, lease):
-        return (lease.duration.requested.seconds / 3600.0) * lease.numnodes * self.fair_rate 
-    
+    def get_base_price(self, lease, rate = None):
+        if rate == None:
+            rate = self.rate
+        return (lease.duration.requested.seconds / 3600.0) * lease.numnodes * rate 
+   
     def get_surcharge(self, preempted_leases):
         surcharge = 0
         for l in preempted_leases:
             suspend_time = l.estimate_suspend_time()
             resume_time = l.estimate_resume_time()
-            surcharge += ((suspend_time + resume_time).seconds / 3600.0) * l.numnodes * self.fair_rate 
+            surcharge += ((suspend_time + resume_time).seconds / 3600.0) * l.numnodes * self.rate 
 
         return surcharge    
     
     def get_price(self, lease, preempted_leases):
-        return self.get_fair_price(lease) + self.get_surcharge(preempted_leases)
+        return self.get_base_price(lease) + self.get_surcharge(preempted_leases)
     
-class AlwaysFairPricePolicy(FairPricePolicy):
+class ConstantRatePricePolicy(RatePricePolicy):
     """...
     """    
     def __init__(self, slottable):
@@ -88,7 +90,7 @@
         Argument
         slottable -- A fully constructed SlotTable
         """        
-        FairPricePolicy.__init__(self, slottable)
+        RatePricePolicy.__init__(self, slottable)
     
     def price_lease(self, lease, preempted_leases):
         """Computes the price of a lease
@@ -103,8 +105,8 @@
         """
         return self.get_price(lease, preempted_leases)
     
-class RandomMultipleOfFairPricePolicy(FairPricePolicy):
-    """Base class for policies that rely on the notion of a fair rate for computation
+class RandomRatePricePolicy(RatePricePolicy):
+    """...
     """    
     def __init__(self, slottable):
         """Constructor
@@ -112,7 +114,7 @@
         Argument
         slottable -- A fully constructed SlotTable
         """        
-        FairPricePolicy.__init__(self, slottable)
+        RatePricePolicy.__init__(self, slottable)
         random.seed(get_config().config.getint("pricing", "seed"))
         self.min_multiplier = get_config().config.getfloat("pricing", "min-multiplier")
         self.max_multiplier = get_config().config.getfloat("pricing", "max-multiplier")
@@ -128,12 +130,11 @@
         lease -- Lease that is being scheduled.
         preempted_leases -- Leases that would have to be preempted to support this lease.
         """
-        mult = random.uniform(self.min_multiplier, self.max_multiplier)
-        fair_price = self.get_fair_price(lease)
-        return mult * fair_price
+        rate = random.uniform(self.min_multiplier, self.max_multiplier)
+        return self.get_price(lease, rate)
     
-class MaxMultipleOfFairPricePolicy(FairPricePolicy):
-    """Base class for policies that rely on the notion of a fair rate for computation
+class MaximumPricePolicy(RatePricePolicy):
+    """...
     """    
     def __init__(self, slottable):
         """Constructor
@@ -141,7 +142,7 @@
         Argument
         slottable -- A fully constructed SlotTable
         """        
-        FairPricePolicy.__init__(self, slottable)
+        RatePricePolicy.__init__(self, slottable)
     
     def price_lease(self, lease, preempted_leases):
         """Computes the price of a lease
@@ -154,21 +155,20 @@
         lease -- Lease that is being scheduled.
         preempted_leases -- Leases that would have to be preempted to support this lease.
         """
-        mult = float(lease.extras["simul_pricemarkup"])
-        fair_price = self.get_fair_price(lease)
-        return mult * fair_price    
+        rate = float(lease.extras["simul_userrate"])
+        return self.get_base_price(lease, rate)
     
 class UserInfo(object):
     def __init__(self):
-        self.min_markup_accept = None
-        self.max_markup_accept = None
-        self.min_markup_reject = None
-        self.max_markup_reject = None
-        self.markup_estimate = None
+        self.min_rate_accept = None
+        self.max_rate_accept = None
+        self.min_rate_reject = None
+        self.max_rate_reject = None
+        self.rate_estimate = None
         self.found = False
     
-class AdaptiveFairPricePolicy(FairPricePolicy):
-    """Base class for policies that rely on the notion of a fair rate for computation
+class AdaptiveRatePricePolicy(RatePricePolicy):
+    """...
     """    
     def __init__(self, slottable):
         """Constructor
@@ -176,8 +176,7 @@
         Argument
         slottable -- A fully constructed SlotTable
         """        
-        FairPricePolicy.__init__(self, slottable)
-        self.multiplier = 1.0
+        RatePricePolicy.__init__(self, slottable)
         self.users = {}
     
     def price_lease(self, lease, preempted_leases):
@@ -191,8 +190,7 @@
         lease -- Lease that is being scheduled.
         preempted_leases -- Leases that would have to be preempted to support this lease.
         """
-        fair_price = self.get_fair_price(lease)
-        return self.multiplier * fair_price
+        return self.get_price(lease)
     
     def feedback(self, lease):
         """Called after a lease has been accepted or rejected, to provide
@@ -203,47 +201,43 @@
         """
         if lease.price == None:
             return
-        fair_price = lease.extras["fair_price"]
-        price = lease.price
-        if price == -1:
-            price = lease.extras["rejected_price"]
 
-        lease_multiplier = price / fair_price
+        rate = lease.extras["rate"]
         
         if not self.users.has_key(lease.user_id):
             self.users[lease.user_id] = UserInfo()
             
         if lease.get_state() == Lease.STATE_REJECTED_BY_USER:
-            if self.users[lease.user_id].min_markup_reject == None:
-                self.users[lease.user_id].min_markup_reject = lease_multiplier
-                self.users[lease.user_id].max_markup_reject = lease_multiplier
+            if self.users[lease.user_id].min_rate_reject == None:
+                self.users[lease.user_id].min_rate_reject = lease_multiplier
+                self.users[lease.user_id].max_rate_reject = lease_multiplier
             else:
-                self.users[lease.user_id].min_markup_reject = min(lease_multiplier, self.users[lease.user_id].min_markup_reject)
-                self.users[lease.user_id].max_markup_reject = max(lease_multiplier, self.users[lease.user_id].max_markup_reject)
+                self.users[lease.user_id].min_rate_reject = min(lease_multiplier, self.users[lease.user_id].min_rate_reject)
+                self.users[lease.user_id].max_rate_reject = max(lease_multiplier, self.users[lease.user_id].max_rate_reject)
         else:
-            if self.users[lease.user_id].min_markup_accept == None:
-                self.users[lease.user_id].min_markup_accept = lease_multiplier
-                self.users[lease.user_id].max_markup_accept = lease_multiplier
+            if self.users[lease.user_id].min_rate_accept == None:
+                self.users[lease.user_id].min_rate_accept = lease_multiplier
+                self.users[lease.user_id].max_rate_accept = lease_multiplier
             else:
-                if self.users[lease.user_id].min_markup_reject != None:
+                if self.users[lease.user_id].min_rate_reject != None:
                     self.users[lease.user_id].found = True
                 else:
-                    self.users[lease.user_id].min_markup_accept = min(lease_multiplier, self.users[lease.user_id].min_markup_accept)
-                    self.users[lease.user_id].max_markup_accept = max(lease_multiplier, self.users[lease.user_id].max_markup_accept)
+                    self.users[lease.user_id].min_rate_accept = min(lease_multiplier, self.users[lease.user_id].min_rate_accept)
+                    self.users[lease.user_id].max_rate_accept = max(lease_multiplier, self.users[lease.user_id].max_rate_accept)
                 
         for user in self.users:
             if not self.users[user].found:
-                if self.users[user].min_markup_reject == None:
+                if self.users[user].min_rate_reject == None:
                     # All accepts
-                    estimate = self.users[user].max_markup_accept * 1.5
-                elif self.users[user].min_markup_accept == None:
+                    estimate = self.users[user].max_rate_accept * 1.5
+                elif self.users[user].min_rate_accept == None:
                     # All rejects
-                    estimate = self.users[user].min_markup_reject * 0.5
+                    estimate = self.users[user].min_rate_reject * 0.5
                 else:
-                    estimate = (self.users[user].max_markup_accept + self.users[user].min_markup_reject) / 2
+                    estimate = (self.users[user].max_rate_accept + self.users[user].min_rate_reject) / 2
                     
-                self.users[user].markup_estimate = estimate
+                self.users[user].rate_estimate = estimate
             
-        estimates = sorted([u.markup_estimate for u in self.users.values()])
+        estimates = sorted([u.rate_estimate for u in self.users.values()])
         
         self.multiplier = percentile(estimates, 0.5)
\ No newline at end of file

Modified: branches/1.1/tests/base_config_simulator.conf
===================================================================
--- branches/1.1/tests/base_config_simulator.conf	2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/tests/base_config_simulator.conf	2010-01-13 00:32:28 UTC (rev 756)
@@ -46,4 +46,4 @@
 
 [accounting]
 datafile: /var/tmp/haizea/results.dat
-probes: ar best-effort immediate cpu-utilization
\ No newline at end of file
+probes: ar best-effort immediate cpu-utilization deadline price
\ No newline at end of file

Modified: branches/1.1/tests/price1.lwf
===================================================================
--- branches/1.1/tests/price1.lwf	2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/tests/price1.lwf	2010-01-13 00:32:28 UTC (rev 756)
@@ -31,7 +31,7 @@
           <none/>
         </software>
         <extra>
-          <attr name="simul_pricemarkup" value="1.0"/>
+          <attr name="simul_userrate" value="1.0"/>
         </extra>        
       </lease>
     </lease-request>

Modified: branches/1.1/tests/price2.lwf
===================================================================
--- branches/1.1/tests/price2.lwf	2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/tests/price2.lwf	2010-01-13 00:32:28 UTC (rev 756)
@@ -31,7 +31,7 @@
           <none/>
         </software>
         <extra>
-          <attr name="simul_pricemarkup" value="0.5"/>
+          <attr name="simul_userrate" value="0.5"/>
         </extra>        
       </lease>
     </lease-request>

Modified: branches/1.1/tests/pricedeadline.lwf
===================================================================
--- branches/1.1/tests/pricedeadline.lwf	2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/tests/pricedeadline.lwf	2010-01-13 00:32:28 UTC (rev 756)
@@ -32,7 +32,7 @@
           <disk-image id="foobar1.img" size="1024"/>
         </software>
         <extra>
-          <attr name="simul_pricemarkup" value="10.0"/>
+          <attr name="simul_userrate" value="10.0"/>
         </extra>        
       </lease>
     </lease-request>
@@ -53,7 +53,7 @@
           <disk-image id="foobar1.img" size="1024"/>
         </software>
         <extra>
-          <attr name="simul_pricemarkup" value="10.0"/>
+          <attr name="simul_userrate" value="10.0"/>
         </extra>        
       </lease>
     </lease-request>

Modified: branches/1.1/tests/test_simul_pricing.py
===================================================================
--- branches/1.1/tests/test_simul_pricing.py	2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/tests/test_simul_pricing.py	2010-01-13 00:32:28 UTC (rev 756)
@@ -13,21 +13,21 @@
         self._verify_done([1])
 
     def test_pricing2(self):
-        self.config.set("scheduling", "policy-pricing", "always-fair")
-        self.config.set("pricing", "fair-rate", "0.10")        
+        self.config.set("scheduling", "policy-pricing", "constant")
+        self.config.set("pricing", "rate", "0.10")        
         self._tracefile_test("price1.lwf")
         self._verify_done([1])
         
     def test_pricing3(self):
-        self.config.set("scheduling", "policy-pricing", "always-fair")
-        self.config.set("pricing", "fair-rate", "0.10")        
+        self.config.set("scheduling", "policy-pricing", "constant")
+        self.config.set("pricing", "rate", "1.00")        
         self._tracefile_test("price2.lwf")
         self._verify_rejected_by_user([1])
         
     def test_pricing_surcharge(self):
         self.config.set("scheduling", "policy-preemption", "deadline")
         self.config.set("scheduling", "suspension", "all")
-        self.config.set("scheduling", "policy-pricing", "always-fair")
-        self.config.set("pricing", "fair-rate", "0.10")        
+        self.config.set("scheduling", "policy-pricing", "constant")
+        self.config.set("pricing", "rate", "0.10")        
         self._tracefile_test("pricedeadline.lwf")
         self._verify_done([1])        
\ No newline at end of file



More information about the Haizea-commit mailing list