[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