[Erp5-report] r45969 arnaud.fontaine - /slapos/trunk/util/slapos.tool.nosqltester_manager/s...

nobody at svn.erp5.org nobody at svn.erp5.org
Wed Jul 6 16:14:53 CEST 2011


Author: arnaud.fontaine
Date: Wed Jul  6 16:14:52 2011
New Revision: 45969

URL: http://svn.erp5.org?rev=45969&view=rev
Log:
Add pre/post specific to ERP5 results publication for now.

Modified:
    slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/nosqltester_manager/__init__.py

Modified: slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/nosqltester_manager/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/nosqltester_manager/__init__.py?rev=45969&r1=45968&r2=45969&view=diff
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/nosqltester_manager/__init__.py [utf8] (original)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/nosqltester_manager/__init__.py [utf8] Wed Jul  6 16:14:52 2011
@@ -93,6 +93,8 @@ class NoSQLTesterManager(object):
     self.cert_file = parameter_dict['cert_file']
     self.computer_id = parameter_dict['computer_id']
     self.computer_partition_id = parameter_dict['computer_partition_id']
+    self.erp5_publish_url = parameter_dict['erp5_publish_url']
+    self.erp5_publish_project = parameter_dict['erp5_publish_project']
 
     self.slap = slap.slap()
     self.slap.initializeConnection(self.server_url, self.key_file, self.cert_file)
@@ -139,6 +141,12 @@ class NoSQLTesterManager(object):
     parser.add_argument('--node-increment', '-i', type=int, default=1,
                         help='Number of nodes to add at the end of an iteration')
 
+    parser.add_argument('--erp5-publish-url',
+                        help='ERP5 URL to publish the results to '
+                             '(default: disabled, thus writing to CSV files)')
+
+    parser.add_argument('--erp5-publish-project', help='ERP5 publish project')
+
     parser.add_argument('software_release_url', help='Software Release URL')
     parser.add_argument('server_url', help='Server URL')
     parser.add_argument('key_file', help='SSL key file')
@@ -218,6 +226,27 @@ class NoSQLTesterManager(object):
       return False
     return True
 
+  def preRun(self):
+    start_value_dict = {}
+
+    if self.erp5_publish_url and self.erp5_publish_project:
+      if self.nb_init_tester != self.max_tester:
+        nb_users = (self.nb_init_tester, self.max_tester)
+      else:
+        nb_users = self.max_tester
+
+        from erp5.utils.benchmark.benchmark import ERP5BenchmarkResult
+        new_document_id = ERP5BenchmarkResult.createResultDocument(self.erp5_publish_url,
+                                                                   self.erp5_publish_project,
+                                                                   1,
+                                                                   nb_users)
+
+      self.erp5_publish_url = '/'.join((self.erp5_publish_url, new_document_id))
+      start_value_dict['erp5_publish_url'] = self.erp5_publish_url
+      start_value_dict['erp5_publish_project'] = self.erp5_publish_project
+
+    return start_value_dict
+
   def do_scheduling(self, action):
     """
     Sends an action to all the testers know by the manager.
@@ -226,9 +255,12 @@ class NoSQLTesterManager(object):
     :type action: str.
     
     """
+    start_value_dict = {'action': action}
+    start_value_dict.update(self.preRun())
+        
     for i in range(0, self.tester_urls.__len__()):
       self.logger.debug("send %s to %s" % (action, self.tester_urls[i]))
-      while not self.post(self.tester_urls[i]+'/action', action=action):
+      while not self.post(self.tester_urls[i]+'/action', **start_value_dict):
         self.logger.debug("sleep")
         time.sleep(1)
       self.testers_status[i] = action.upper()+('P' if action == 'stop' else '')+'ED'
@@ -338,6 +370,20 @@ class NoSQLTesterManager(object):
       except:
         return sys.exc_info()
 
+    def _allCurrentTesterExecuted(*args, **kwargs):
+      if self.node_count < getattr(self, "max_%s" % self.node_type):
+        self.logger.debug("Adding %d nodes" % self.node_increment)
+        self.add_node()
+        self.todo = self.tester_urls.__len__()
+        os.write(self.write_pipe, "GO")
+        self.node_count += self.node_increment
+      else:
+        self.logger.debug("Stopping")
+        os.write(self.write_pipe, "END")
+        os.close(self.write_pipe)
+        self.write_pipe = -1
+        self.postRun()
+
     @app.route('/report', methods=['POST'])
     def receiveReport():
       """
@@ -371,18 +417,8 @@ class NoSQLTesterManager(object):
             if self.todo == 0:
               self.process_report(self.reports)
               self.reports = []
+              _allCurrentTesterExecuted()
 
-              if self.node_count < getattr(self, "max_%s" % self.node_type):
-                self.logger.debug("Adding %d nodes" % self.node_increment)
-                self.add_node()
-                self.todo = self.tester_urls.__len__()
-                os.write(self.write_pipe, "GO")
-                self.node_count += self.node_increment
-              else:
-                self.logger.debug("Stopping")
-                os.write(self.write_pipe, "END")
-                os.close(self.write_pipe)
-                self.write_pipe = -1
           else:
             self.logger.debug("No data: url='%s', filename='%s', "
                               "compress_method='%s'" % (request.form['url'],
@@ -391,6 +427,23 @@ class NoSQLTesterManager(object):
         except:
           self.logger.debug(str(sys.exc_info()))
           self.logger.debug(Formatter().formatException(sys.exc_info()))
+
+      elif request.method == 'POST' and 'error_message_set' in request.form and \
+           self.erp5_publish_url and self.erp5_publish_project:
+        self.todo -= 1
+
+        error_message_set = \
+            set([message for message in request.form['error_message_set'].split('|') if message])
+
+        try:
+          self.error_message_set.update(error_message_set)
+        except AttributeError:
+          self.error_message_set = error_message_set
+
+        self.logger.warning(repr(self.error_message_set))
+        if self.todo == 0:
+          _allCurrentTesterExecuted()
+
       else:
         self.logger.debug("Invalid request: method='%s' (expected: 'POST'), "
                           "url='%s', filename='%s'" % \
@@ -408,6 +461,12 @@ class NoSQLTesterManager(object):
     """
     pass
 
+  def postRun(self):
+    if self.erp5_publish_url and self.erp5_publish_project:
+      from erp5.utils.benchmark.benchmark import ERP5BenchmarkResult
+      ERP5BenchmarkResult.closeResultDocument(self.erp5_publish_url,
+                                              tuple(self.error_message_set))
+
 def scheduler_thread(scheduler, read):
   s = ""
   while s != "END":
@@ -420,10 +479,6 @@ def scheduler_thread(scheduler, read):
 def main():
   """
   Main function. It's the entry point for this program.
-  
-  :params argv: command line arguments.
-  :type argv: list.
-  
   """
   # FIXME: Hack to make the  flask's render_template method work with packages
   # plugins



More information about the Erp5-report mailing list