[Erp5-report] r45909 arnaud.fontaine - in /slapos/trunk/util/slapos.tool.nosqltester: ./ sr...

nobody at svn.erp5.org nobody at svn.erp5.org
Sat Jun 18 10:22:10 CEST 2011


Author: arnaud.fontaine
Date: Sat Jun 18 10:22:10 2011
New Revision: 45909

URL: http://svn.erp5.org?rev=45909&view=rev
Log:
* Clean imports and add missing imports.
* Move arguments parsing to NoSQLTester class and use argparse to parse
  arguments (allow more flexibility such as being able to easily add options
  within children classes).

Modified:
    slapos/trunk/util/slapos.tool.nosqltester/setup.py
    slapos/trunk/util/slapos.tool.nosqltester/src/slapos/tool/nosqltester/__init__.py

Modified: slapos/trunk/util/slapos.tool.nosqltester/setup.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester/setup.py?rev=45909&r1=45908&r2=45909&view=diff
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester/setup.py [utf8] (original)
+++ slapos/trunk/util/slapos.tool.nosqltester/setup.py [utf8] Sat Jun 18 10:22:10 2011
@@ -12,6 +12,13 @@ long_description=( read('README.txt')
                    read('CHANGES.txt')
                  )
 
+install_require_list = ['setuptools', 'Flask']
+
+import sys
+python_major_version, python_minor_version = sys.version_info[:2]
+if python_major_version == 2 and python_minor_version < 7:
+  install_require_list.append('argparse')
+
 setup(
     name = name,
     version = version,
@@ -26,7 +33,7 @@ setup(
       ],
     packages = find_packages('src'),
     package_dir = {'':'src'},
-    install_requires = ['setuptools', 'Flask'],
+    install_requires = install_require_list,
     namespace_packages = ['slapos', 'slapos.tool'],
     entry_points = """
     [console_scripts]

Modified: slapos/trunk/util/slapos.tool.nosqltester/src/slapos/tool/nosqltester/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester/src/slapos/tool/nosqltester/__init__.py?rev=45909&r1=45908&r2=45909&view=diff
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester/src/slapos/tool/nosqltester/__init__.py [utf8] (original)
+++ slapos/trunk/util/slapos.tool.nosqltester/src/slapos/tool/nosqltester/__init__.py [utf8] Sat Jun 18 10:22:10 2011
@@ -27,55 +27,107 @@
 #
 ##############################################################################
 
-from flask import Flask, abort, request, render_template
+from flask import Flask, request
 from threading import Lock
 # from zipfile import ZipFile
 from logging import Formatter
-import sys, os, getopt, bz2
-import urllib, urllib2
-import logging, logging.handlers
+
+import sys
+import os
+import bz2
+import urllib
+import urllib2
+import logging
+import argparse
+import signal
 
 class NoSQLTester(object):
   """
   NoSQLTester class.
   """
-  
-  def __init__(self, params):
+  def __init__(self):
     """
     :func:`__init__` method of the NoSQLTester.
-    
-    :param params: The name to use.
-    :type params: dict.
-    
-    .. note::
-    
-      The params dictionnary should contains the following values:
-      address, port, host_address, host_port, report_path, binary,
-      report_filename, debug, compress_method, log_directory, plugin_name
       
     .. note::
     
       You may need to override this method in an inheritance class.
       
     """
-    
-    self.params = params
+    self.argument_namespace = self._parse_arguments(argparse.ArgumentParser(
+        description='Run scalability tester.',
+        # When adding arguments in the subclass having the same name, just
+        # override it
+        conflict_handler='resolve'))
+
     self.childpid = -1
     self.lock = Lock()
 
     # Logger initialization
     self.logger = logging.getLogger("slap.tool.nosqltester")
-    if self.params['debug']:
+    if self.argument_namespace.enable_debug:
       self.logger.setLevel(logging.DEBUG)
-    file_handler = logging.FileHandler(os.path.join(self.params['log_directory'], "nosqltester.log"))
+    file_handler = logging.FileHandler(os.path.join(self.argument_namespace.log_directory,
+                                                    "nosqltester.log"))
     file_handler.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))
     self.logger.addHandler(file_handler)
 
+  def _add_parser_arguments(self, parser):
+    parser.add_argument('--tester-address', '-a',
+                        default='127.0.0.1',
+                        help='Tester IP address')
+
+    parser.add_argument('--tester-port', '-p',
+                        type=int,
+                        default=5000,
+                        help='Tester TCP port')
+
+    parser.add_argument('--manager-address', '-m',
+                        required=True,
+                        help='Tester manager IP address')
+
+    parser.add_argument('--manager-port', '-q',
+                        default=5000,
+                        help='Tester manager TCP port')
+
+    parser.add_argument('--enable-debug', '-d',
+                        type=bool,
+                        default=True,
+                        help='Enable debug messages')
+
+    parser.add_argument('--report-directory', '-r',
+                        default='/var/log',
+                        help='Report directory')
+
+    parser.add_argument('--report-filename', '-o',
+                        default='report.log',
+                        help='Report filename (when executing a command)')
+
+    parser.add_argument('--compress-method', '-c',
+                        help='Compress method to use for the reports')
+
+    parser.add_argument('--log-directory', '-l',
+                        default='/var/log',
+                        help='Log directory to use')
+
+    parser.add_argument('--execute-command', '-b',
+                        help='Command to execute (when executing a command)')
+
+  def _parse_arguments(self, parser):
+    self._add_parser_arguments(parser)
+    namespace = parser.parse_args()
+
+    if namespace.tester_address == namespace.manager_address and \
+          namespace.tester_port == namespace.manager_port:
+      raise argparse.ArgumentTypeError(
+        "Tester and tester manager must not have the same address and port")
+
+    return namespace
+
   def run(self):
     """
     Defines and starts the HTTP server.
     """
-    
     app = Flask(__name__)
 
     @app.route('/result/<report>')
@@ -83,32 +135,35 @@ class NoSQLTester(object):
       """
       Sends the requested *report* file.
       
-      :params report: Name of the file to send.
+      :param report: Name of the file to send.
       :type report: unicode.
-      
+
       :returns: data to send.
       
       """
-      
       try:
         try:
           size = request.args['size']
         except KeyError:
           size = -1
 
-        if os.path.exists(os.path.join(self.params['report_path'], report.rstrip(self.params['compress_method']))):
+        if os.path.exists(os.path.join(self.argument_namespace.report_directory,
+                                       report.rstrip(self.argument_namespace.compress_method))):
           data = None
-          f = open(os.path.join(self.params['report_path'], report.rstrip(self.params['compress_method'])), "rb")
-          if self.params['compress_method'] == "":
+          f = open(os.path.join(self.argument_namespace.report_directory,
+                                report.rstrip(self.argument_namespace.compress_method)), "rb")
+          if not self.argument_namespace.compress_method:
             data = f.read(size)
-          elif self.params['compress_method'] == ".bz2":
+          elif self.argument_namespace.compress_method == ".bz2":
             data = bz2.compress(f.read(size), 9)
-          elif self.params['compress_method'] == ".zip":
-            # Zip compress
-            # z = ZipFile(os.path.join(os.getcwd(), self.params['report_filename']+compress_method), 'w')
-            # z.write(os.path.join(os.getcwd(), self.params['report_filename']), self.params['report_filename'])
+          elif self.argument_namespace.compress_method == ".zip":
+            # z = ZipFile(os.path.join(os.getcwd(),
+            #                          self.argument_namespace.report_filename + '.zip'),
+            #             'w')
+            # z.write(os.path.join(os.getcwd(), self.argument_namespace.report_filename),
+            #         self.argument_namespace.report_filename)
             # z.close()
-            pass
+            raise NotImplementedError
           f.close()
           return data
         else:
@@ -124,7 +179,6 @@ class NoSQLTester(object):
       
       :returns: empty string.
       """
-      
       if request.method == 'POST' and 'action' in request.form:
         if request.form['action'] == 'START':
           pid = os.fork()
@@ -147,35 +201,36 @@ class NoSQLTester(object):
             self.lock.release()
       return ""
 
-    app.run(host=self.params['address'], port=self.params['port'], threaded=True)
+    app.run(host=self.argument_namespace.tester_address,
+            port=self.argument_namespace.tester_port,
+            threaded=True)
 
   def send_result_availability_notification(self, filename, size=-1, partial=False):
     """
     Sends result availabilty notification to the manager.
     
     :param filename: name of the result file.
-    :type params: str.
+    :type filename: str.
     :param partial: is it a partial result ?
-    :type params: bool.
+    :type partial: bool.
     
     """
-    
     values = {}
     values['filename'] = filename
-    values['url'] = "http://%s:%d/result/%s?size=%d" % (self.params['address'],
-                                                        self.params['port'],
+    values['url'] = "http://%s:%d/result/%s?size=%d" % (self.argument_namespace.tester_address,
+                                                        self.argument_namespace.tester_port,
                                                         filename,
                                                         size)
-    values['compress_method'] = self.params['compress_method']
+    values['compress_method'] = self.argument_namespace.compress_method
     values['partial'] = partial
     
-    if self.params['compress_method'] != None:
-      values['url'] += self.params['compress_method']
+    if values['compress_method'] != None:
+      values['url'] += values['compress_method']
     
     data = urllib.urlencode(values)
     try:
-      f = urllib2.urlopen("http://%s:%d/report" % (self.params['host_address'],
-                                                   self.params['host_port']),
+      f = urllib2.urlopen("http://%s:%d/report" % (self.argument_namespace.manager_address,
+                                                   self.argument_namespace.manager_port),
                           data)
       f.close()
     except:
@@ -191,111 +246,24 @@ class NoSQLTester(object):
       You may need to override this method in an inheritance class.
     
     """
-    
-    command = "%s > %s" % (self.params['binary'],
-                           os.path.join(self.params['report_path'],
-                                        self.params['report_filename']))
+    command = "%s > %s" % (self.argument_namespace.execute_command,
+                           os.path.join(self.argument_namespace.report_directory,
+                                        self.argument_namespace.report_filename))
 
     result = os.WEXITSTATUS(os.system(command))
     if result == 127:
       raise ValueError, 'Command not found: %r' % command
 
     if result == 0:
-      self.send_result_availability_notification(self.params['report_filename'])
+      self.send_result_availability_notification(self.argument_namespace.report_filename)
 
     return result
 
-def usage():
-  """
-  Print usage.
-  """
-  
-  pass
-
-def main(argv=None):
+def main():
   """
   Main function. It's the entry point for this program.
-  
-  :params argv: command line arguments.
-  :type argv: list.
-  
   """
-
-  params = {
-            # Address and port of the tester
-            'address':"127.0.0.1",
-            'port':5000,
-            # Address and port of the program
-            # who wants to download the report
-            'host_address':"",
-            'host_port':5000,
-            'report_path':"/var/log",
-            'binary':"echo nothing",
-            'report_filename':"report.log",
-            # 'debug':False,
-            'debug':True,
-            'compress_method':"",
-            'log_directory':"/var/log",
-            'plugin_name':""}
-
-  if argv == None:
-    argv = sys.argv[1:]
-
-  try:
-    opts, args = getopt.getopt(argv, "m:q:a:p:n:r:b:o:dc:l:", \
-                                    ["manager=", "manager-port=", "address=", "port=", \
-                                     "plugin-name=", "report-path=","binary=","output=", \
-                                     "debug", "compress-method=", "log-directory="])
-  except getopt.GetoptError:
-    usage()
-    sys.exit()
-
-  for opt, arg in opts:
-    if opt in ("-m", "--manager"):
-      params['host_address'] = arg
-    elif opt in ("-q", "--manager-port"):
-      params['host_port'] = int(arg)
-    elif opt in ("-a", "--address"):
-      params['address'] = arg
-    elif opt in ("-p", "--port"):
-      params['port'] = int(arg)
-    elif opt in ("-n", "--plugin-name"):
-      params['plugin_name'] = int(arg)
-    elif opt in ("-r", "--report-path"):
-      params['report_path'] = arg
-    elif opt in ("-b", "--binary"):
-      params['binary'] = arg
-    elif opt in ("-o", "--output"):
-      params['report_filename'] = arg
-    elif opt in ("-d", "--debug"):
-      params['debug'] = True
-    elif opt in ("-c", "compress-method") and arg != "":
-      params['compress_method'] = "." + arg
-    elif opt in ("-l", "log-directory"):
-      params['log_directory'] = arg
-
-  if params['host_address'] == params['address'] and \
-     params['host_port'] == params['port']:
-    print "Host and client could not have the same address and the same port"
-    sys.exit()
-  elif params['host_address'] == "":
-    print "You must at least give the host address"
-    sys.exit()
-
-  if args.__len__() > 0:
-    params['argv'] = args
-  else:
-    params['argv'] = []
-
-  if params['plugin_name'] != "":
-    entry_point = iter_entry_points(group='slapos.tool.nosqltester.plugin', name=params['plugin_name']).next()
-    plugin_class = entry_point.load()
-    tester = plugin_class(params)
-  else:
-    tester = NoSQLTester(params)
-  
-  tester.run()
+  return NoSQLTester().run()
 
 if __name__ == "__main__":
-  main(sys.argv[1:])
-
+  main()



More information about the Erp5-report mailing list