Share Pastebin
Guest
Public paste!

mlk

By: a guest | Sep 28th, 2008 | Syntax: Python | Size: 2.27 KB | Hits: 393 | Expires: Never
Copy text to clipboard
  1. from peak.events.trellis import *
  2.  
  3. ##
  4. ## Example #2: Observing and managing server instances in a cluster
  5. ##
  6.  
  7. class ServerInstance(Component):
  8.     started = attr(False)
  9.     cpu_load = attr(0.0) # 100% is 1.0
  10.  
  11.  
  12. class ServerCluster(Component):
  13.     servers = make(Set)
  14.  
  15.     @compute
  16.     def avg_load(self):
  17.         if not self.servers:
  18.             return 1.0
  19.         return sum(s.cpu_load for s in self.servers) / len(self.servers)
  20.  
  21.  
  22.     max_load = attr(0.9)
  23.  
  24.     @compute
  25.     def need_more_servers(self):
  26.         # we use `not servers.added` to avoid CircularityError due to avg_load recalculation
  27.         # after pending server has started
  28.         return (self.avg_load > self.max_load) and not self.servers.added
  29.  
  30.     @maintain
  31.     def autostart_servers(self):
  32.         if self.need_more_servers and self.pending_server is None:
  33.             self.start_new_server()
  34.  
  35.  
  36.  
  37.     pending_server = attr()
  38.  
  39.     @modifier
  40.     def start_new_server(self):
  41.         assert not self.pending_server
  42.         self.pending_server = ServerInstance()
  43.  
  44.     @maintain
  45.     def on_started(self):
  46.         if self.pending_server and self.pending_server.started:
  47.             self.servers.add(self.pending_server)
  48.             self.pending_server =  None
  49.  
  50.  
  51.  
  52.  
  53. class ClusterReporter(Component):
  54.     cluster = attr()
  55.  
  56.     def __init__(self, cluster):
  57.         self.cluster = cluster
  58.  
  59.     @perform
  60.     def watch_server_count(self):
  61.         print 'Servers: %d; Average load: %d%%; Pending: %s' % (
  62.                                         len(self.cluster.servers),
  63.                                         100 * self.cluster.avg_load,
  64.                                         'YES' if self.cluster.pending_server else 'NO')
  65.  
  66.  
  67.  
  68. ##########################################
  69. ##########################################
  70.  
  71.  
  72. cl = ServerCluster()
  73. rep = ClusterReporter(cl)
  74. # Servers: 0; Average load: 100%; Pending: YES
  75.  
  76. s1 = cl.pending_server
  77. s1.started = True
  78. # Servers: 1; Average load: 0%; Pending: NO
  79.  
  80. s1.cpu_load = 1.0
  81. # Servers: 1; Average load: 100%; Pending: YES
  82.  
  83. s2 = cl.pending_server
  84. s2.started = True
  85. # Servers: 2; Average load: 50%; Pending: NO
  86.  
  87. s2.cpu_load = 0.5
  88. # Servers: 2; Average load: 75%; Pending: NO
  89.  
  90. s2.cpu_load = 0.9
  91. # Servers: 2; Average load: 95%; Pending: YES