[Erp5-report] r45236 luke - in /slapos/trunk/util: slapos.tool.monitor/ slapos.tool.monitor...

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Apr 8 12:55:36 CEST 2011


Author: luke
Date: Fri Apr  8 12:55:35 2011
New Revision: 45236

URL: http://svn.erp5.org?rev=45236&view=rev
Log:
 - SlapOS developed tools capable to easily SlapOFiy various software

Added:
    slapos/trunk/util/slapos.tool.monitor/
    slapos/trunk/util/slapos.tool.monitor/CHANGES.txt
    slapos/trunk/util/slapos.tool.monitor/README.txt
    slapos/trunk/util/slapos.tool.monitor/setup.cfg
    slapos/trunk/util/slapos.tool.monitor/setup.py
    slapos/trunk/util/slapos.tool.monitor/src/
    slapos/trunk/util/slapos.tool.monitor/src/__init__.py
    slapos/trunk/util/slapos.tool.monitor/src/slapos/
    slapos/trunk/util/slapos.tool.monitor/src/slapos/__init__.py
    slapos/trunk/util/slapos.tool.monitor/src/slapos/tool/
    slapos/trunk/util/slapos.tool.monitor/src/slapos/tool/__init__.py
    slapos/trunk/util/slapos.tool.monitor/src/slapos/tool/monitor/
    slapos/trunk/util/slapos.tool.monitor/src/slapos/tool/monitor/__init__.py
    slapos/trunk/util/slapos.tool.monitor/src/slapos/tool/monitor/slapmonitor.py
    slapos/trunk/util/slapos.tool.nosqltester/
    slapos/trunk/util/slapos.tool.nosqltester/CHANGES.txt
    slapos/trunk/util/slapos.tool.nosqltester/MANIFEST.in
    slapos/trunk/util/slapos.tool.nosqltester/README.txt
    slapos/trunk/util/slapos.tool.nosqltester/setup.cfg
    slapos/trunk/util/slapos.tool.nosqltester/setup.py
    slapos/trunk/util/slapos.tool.nosqltester/src/
    slapos/trunk/util/slapos.tool.nosqltester/src/slapos/
    slapos/trunk/util/slapos.tool.nosqltester/src/slapos/__init__.py
    slapos/trunk/util/slapos.tool.nosqltester/src/slapos/tool/
    slapos/trunk/util/slapos.tool.nosqltester/src/slapos/tool/__init__.py
    slapos/trunk/util/slapos.tool.nosqltester/src/slapos/tool/nosqltester/
    slapos/trunk/util/slapos.tool.nosqltester/src/slapos/tool/nosqltester/__init__.py
    slapos/trunk/util/slapos.tool.nosqltester_manager/
    slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/
    slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/CHANGES.txt
    slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/MANIFEST.in
    slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/README.txt
    slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/setup.cfg
    slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/setup.py
    slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/
    slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/
    slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/__init__.py
    slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/
    slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/__init__.py
    slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/nosqltester_manager/
    slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/nosqltester_manager/__init__.py
    slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/nosqltester_manager/kumo/
    slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/nosqltester_manager/kumo/__init__.py   (with props)
    slapos/trunk/util/slapos.tool.nosqltester_manager/CHANGES.txt
    slapos/trunk/util/slapos.tool.nosqltester_manager/MANIFEST.in
    slapos/trunk/util/slapos.tool.nosqltester_manager/README.txt
    slapos/trunk/util/slapos.tool.nosqltester_manager/setup.cfg
    slapos/trunk/util/slapos.tool.nosqltester_manager/setup.py
    slapos/trunk/util/slapos.tool.nosqltester_manager/src/
    slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/
    slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/__init__.py
    slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/
    slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/__init__.py
    slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/nosqltester_manager/
    slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/nosqltester_manager/__init__.py   (with props)
    slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/nosqltester_manager/templates/
    slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/nosqltester_manager/templates/ui.html
    slapos/trunk/util/slapos.tool.onetimeupload/
    slapos/trunk/util/slapos.tool.onetimeupload/CHANGES.txt
    slapos/trunk/util/slapos.tool.onetimeupload/MANIFEST.in
    slapos/trunk/util/slapos.tool.onetimeupload/README.txt
    slapos/trunk/util/slapos.tool.onetimeupload/setup.cfg
    slapos/trunk/util/slapos.tool.onetimeupload/setup.py
    slapos/trunk/util/slapos.tool.onetimeupload/src/
    slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/
    slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/__init__.py
    slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/
    slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/__init__.py
    slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/
    slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/__init__.py
    slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/static/
    slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/templates/
    slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/templates/done.html
    slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/templates/index.html

Added: slapos/trunk/util/slapos.tool.monitor/CHANGES.txt
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.monitor/CHANGES.txt?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.monitor/CHANGES.txt (added)
+++ slapos/trunk/util/slapos.tool.monitor/CHANGES.txt [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,35 @@
+0.0.6dev (unreleased)
+---------------------
+  - Used psutil for evaluating cpu time
+    [Davide TAMMARO]
+  - New XML features
+    [Davide TAMMARO]
+  - New class for getting CPU informations
+    [Davide TAMMARO]
+  - New lib used ---> psutil
+    [Davide TAMMARO]
+
+0.0.5 (2010-07-12)
+------------------
+ - Invert - slap_monitor will run by subprocess.
+    [Lukasz Nowak]
+
+0.0.4 (2010-07-12)
+------------------
+ - Removed numpy as not needed.
+    [Lukasz Nowak]
+
+0.0.3 (2010-07-12)
+------------------
+ - Define dependencies.
+    [Lukasz Nowak]
+
+0.0.2 (2010-07-12)
+------------------
+ - Expose entry point accepting command line arguments.
+    [Lukasz Nowak]
+
+0.0.1 (2010-07-05)
+------------------
+ - Initial version.
+    [VILLETTE Charles]

Added: slapos/trunk/util/slapos.tool.monitor/README.txt
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.monitor/README.txt?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.monitor/README.txt (added)
+++ slapos/trunk/util/slapos.tool.monitor/README.txt [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,5 @@
+slap.monitor
+============
+
+Monitoring for SLAP (Simple Language for Accounting and Provisioning) python library.
+

Added: slapos/trunk/util/slapos.tool.monitor/setup.cfg
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.monitor/setup.cfg?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.monitor/setup.cfg (added)
+++ slapos/trunk/util/slapos.tool.monitor/setup.cfg [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,3 @@
+[egg_info]
+tag_build = .dev
+tag_svn_revision = 1

Added: slapos/trunk/util/slapos.tool.monitor/setup.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.monitor/setup.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.monitor/setup.py (added)
+++ slapos/trunk/util/slapos.tool.monitor/setup.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,41 @@
+from setuptools import setup, find_packages
+import os
+
+name = "slapos.tool.monitor"
+version = '0.0.6dev'
+
+def read(*rnames):
+  return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
+
+long_description=(
+        read('README.txt')
+        + '\n' +
+        read('CHANGES.txt')
+    )
+
+setup(
+    name = name,
+    version = version,
+    description = "Monitoring for SlapOS provided partitions",
+    long_description=long_description,
+    license = "GPLv3",
+    keywords = "slapos partition monitor",
+    classifiers=[
+      "Programming Language :: Python",
+      ],
+    packages = find_packages('src'),
+    include_package_data = True,
+    package_dir = {'':'src'},
+    namespace_packages = [ 'slapos' ],
+    install_requires = [
+      'setuptools', # namespaces
+      'lxml',
+      'psutil',
+    ],
+    zip_safe=True,
+    entry_points = """
+    [console_scripts]
+    slapmonitor = %(name)s.slapmonitor:run_slapmonitor
+    slapreport = %(name)s.slapmonitor:run_slapreport
+    """ % dict(name=name),
+    )

Added: slapos/trunk/util/slapos.tool.monitor/src/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.monitor/src/__init__.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.monitor/src/__init__.py (added)
+++ slapos/trunk/util/slapos.tool.monitor/src/__init__.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)

Added: slapos/trunk/util/slapos.tool.monitor/src/slapos/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.monitor/src/slapos/__init__.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.monitor/src/slapos/__init__.py (added)
+++ slapos/trunk/util/slapos.tool.monitor/src/slapos/__init__.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,7 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)
+

Added: slapos/trunk/util/slapos.tool.monitor/src/slapos/tool/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.monitor/src/slapos/tool/__init__.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.monitor/src/slapos/tool/__init__.py (added)
+++ slapos/trunk/util/slapos.tool.monitor/src/slapos/tool/__init__.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,7 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)
+

Added: slapos/trunk/util/slapos.tool.monitor/src/slapos/tool/monitor/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.monitor/src/slapos/tool/monitor/__init__.py?rev=45236&view=auto
==============================================================================
    (empty)

Added: slapos/trunk/util/slapos.tool.monitor/src/slapos/tool/monitor/slapmonitor.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.monitor/src/slapos/tool/monitor/slapmonitor.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.monitor/src/slapos/tool/monitor/slapmonitor.py (added)
+++ slapos/trunk/util/slapos.tool.monitor/src/slapos/tool/monitor/slapmonitor.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,250 @@
+##############################################################################
+#
+# Copyright (c) 2010 Vifib SARL and Contributors. All Rights Reserved.
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsibility of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# guarantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 3
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+##############################################################################
+import datetime
+import os
+import time
+import resource
+from time import strftime
+import logging
+import sys
+from lxml import etree as ElementTree
+import platform
+import psutil
+from optparse import OptionParser
+import tempfile
+import sqlite3.dbapi2 as sqlite3
+
+#define global variable for log file
+log_file = False
+
+class MonitoringTool(object):
+  """Provide functions to monitor CPU and Memory"""
+  def __init__(self):
+    pass
+
+  def get_cpu_and_memory_usage(self, proc):
+    """Return CPU and Memory usage (percent) and 
+    the specific moment used for the measure"""
+    return [proc.get_cpu_percent(), sum(proc.get_cpu_times()), proc.get_memory_percent(), proc.get_memory_info()[0], datetime.datetime.now()]
+
+class GenerateXML(object):
+  """Return a XML file upon request by reading from database"""
+  
+  def __init__(self, element_tree, path_database, path_xml):
+    self.element_tree = element_tree
+    self.path_database = path_database
+    self.path_xml = path_xml
+
+  def dump_xml(self):
+    """This func read data from database and through
+    _write_xml_output write result on xml file"""  
+
+    consumption_infos = []
+    #This list hold the consuption infos in the following order
+    #[CPU % usage, CPU time usage (seconds), Memory % usage, Memory space usage (byte), date, time]
+    
+    conn = sqlite3.connect(self.path_database)
+    cursor = conn.cursor()
+    cursor.execute("SELECT * FROM data")
+    for row in cursor:
+      consumption_infos.append(row)
+    
+    consumption_summary = self._eval_consumption_summary (consumption_infos)  
+    self._write_xml_output(consumption_summary, self.path_xml)
+    #Once we got infos we delete the table 'data'
+    cursor.execute("DELETE FROM data")
+    conn.commit()
+    cursor.close()
+    conn.close()
+
+  def _eval_consumption_summary(self, consumption_infos):
+    """This function return a resources usage summary, for pricing purpose"""
+    cpu_percentage = []
+    memory_percentage = []
+    memory_space = []
+    
+    #The total time that the cpu spent to work on it
+    cpu_time = consumption_infos[-1][1]
+    #start-end time and date
+    start_time = consumption_infos[0][5]
+    end_time = consumption_infos[-1][5]
+    start_date = consumption_infos[0][4]
+    end_date = consumption_infos[-1][4]
+    
+    for item in consumption_infos:
+      cpu_percentage.append(item[0])
+      memory_percentage.append(item[2])
+      memory_space.append(item[3])
+  
+    
+    return [cpu_time, sum(memory_space) / float(len(memory_space)), end_date, end_time, end_time]
+    #return [scipy.mean(cpu_percentage), cpu_time, scipy.mean(memory_percentage),
+    #      scipy.mean(memory_space), start_time, end_time, start_date, end_date]
+
+
+
+  def _write_xml_output(self, res_list, storage_path):
+    """This function provide to dump on xml the consumption infos, 
+    the res_list contains the following informations:
+
+    [CPU mean %, CPU whole usage (seconds), Memory mean %, Memory mean space usage (byte), 
+    start_time, end_time, start_date, end_date]"""
+
+    #XXX- NOTE
+
+    """The res_list has been recently changed, now it contains  
+    [CPU whole usage (seconds), Memory mean space usage (byte)]"""
+    
+
+    res_list = map(str, res_list)
+
+    cpu_list = ['Cpu consumption',
+                'Cpu consumption of the partition on %s at %s' % (res_list[2], res_list[3]),
+                res_list[0], 
+                ]
+
+    memory_list = ['Memory consumption', 
+                  'Memory consumption of the partition on %s at %s' % (res_list[2], res_list[3]),
+                  res_list[1],
+                  ]
+    root = ElementTree.Element("consumption")
+    #Now we'll add two movement elements, one for cpu
+    tree = self._add_nodes(root, cpu_list )
+    tree.write(storage_path)
+
+    #one for memory
+    tree = self._add_nodes(root, memory_list)
+    tree.write(storage_path)
+  
+  def _add_nodes(self, root, single_resource_list):
+    
+    child_root = ElementTree.SubElement(root, "movement")
+    #child_root.set ('type', 'Sale Packing List')
+    
+    child_data_start_date = ElementTree.SubElement(child_root, "resource")
+    child_data_start_date.text = single_resource_list[0]
+    child_data_end_date = ElementTree.SubElement(child_root, "title")
+    child_data_end_date.text = single_resource_list[1]
+    child_data_end_date = ElementTree.SubElement(child_root, "reference")
+    child_data_end_date.text = ''
+    child_data_end_date = ElementTree.SubElement(child_root, "quantity")
+    child_data_end_date.text = single_resource_list[2]
+    child_data_end_date = ElementTree.SubElement(child_root, "price")
+    child_data_end_date.text = ''
+    child_data_end_date = ElementTree.SubElement(child_root, "VAT")
+    child_data_end_date.text = ''
+    child_data_end_date = ElementTree.SubElement(child_root, "category")
+    child_data_end_date.text = ''
+
+    tree = self.element_tree.ElementTree(root)
+    return tree
+
+
+def parse_opt():
+
+  usage="""usage: slapmonitor [options] PID_FILE_PATH DATABASE_PATH
+Usage: slapreport [options] XML_PATH DATABASE_PATH """
+
+  parser = OptionParser(usage=usage)
+  parser.add_option('-t', '--update_time',type=int, dest='update_time', help='Specify the interval'\
+                    '(in seconds) to check resources consumption [default 30 seconds]', default=3)
+  parser.add_option('-l', '--log_file', dest='path_log_file',help='Specify the logfile destination path',
+                    metavar='FILE')
+  return parser
+
+class SlapMonitor(object):
+    
+  def __init__(self, proc, update_time, path_database):
+    self.proc = proc
+    self.update_time = update_time
+    self.path_database = path_database
+    self.start_monitor()        
+        
+
+  def start_monitor(self):
+        
+    temporary_monitoring = MonitoringTool()
+    #check if the process is alive == None, instead zero value == proc is over
+    while self.proc.pid in psutil.get_pid_list():
+      conn = sqlite3.connect(self.path_database)
+      cursor = conn.cursor()
+      cursor.execute("create table if not exists data (cpu real, cpu_time real, memory real, rss real," \
+                      "date text, time text)")
+      try:
+        res_list = temporary_monitoring.get_cpu_and_memory_usage(self.proc)
+        date_catched = "-".join([str(res_list[4].year), str(res_list[4].month), str(res_list[4].day)])
+        time_catched = ":".join([str(res_list[4].hour), str(res_list[4].minute), str(res_list[4].second)])
+        res_list[4] = date_catched
+        res_list.append(time_catched)
+        cursor.execute("insert into data values (?,?,?,?,?,?)" , res_list)
+        conn.commit()
+        cursor.close()
+        conn.close()
+        time.sleep(self.update_time)
+      except IOError:
+        if log_file: 
+          logging.info("ERROR : process with pid : %s watched by slap monitor exited too quickly at %s" 
+                % (self.proc.pid, strftime("%Y-%m-%d at %H:%m")))
+        sys.exit(1)        
+    if log_file:
+      logging.info("EXIT 0: Process terminated normally!")
+    sys.exit(0)
+
+def run_slapmonitor():
+  #This function require the pid file and the database path
+  parser = parse_opt()
+  opts, args = parser.parse_args()
+  if len(args) != 2:
+    parser.error("Incorrect number of arguments, 2 required but "+str(len(args))+" detected" )
+
+  if opts.path_log_file:
+    logging.basicConfig(filename=opts.path_log_file,level=logging.DEBUG)
+    global log_file 
+    log_file = True
+  
+  fed = open(args[0], 'r')
+  pid_read = fed.read()
+  fed.close()
+  proc = psutil.Process(int(pid_read))
+  SlapMonitor(proc, opts.update_time, args[1])
+  
+
+def run_slapreport():
+  #This function require the xml_path and database_path
+  parser = parse_opt()
+  opts, args = parser.parse_args()
+  if len(args) != 2:
+    parser.error("Incorrect number of arguments, 2 required but "+str(len(args))+" detected" )
+
+  if opts.path_log_file:
+    logging.basicConfig(filename=opts.path_log_file,level=logging.DEBUG)
+    global log_file
+    log_file = True
+
+  get_xml_hand = GenerateXML(ElementTree, args[1], args[0])
+  get_xml_hand.dump_xml()
+

Added: slapos/trunk/util/slapos.tool.nosqltester/CHANGES.txt
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester/CHANGES.txt?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester/CHANGES.txt (added)
+++ slapos/trunk/util/slapos.tool.nosqltester/CHANGES.txt [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,26 @@
+Changelog
+=========
+
+0.0.4 (2011/03/29)
+------------------
+
+ - Correcting setup.py
+   [Guillaume Bottex]
+
+0.0.3 (2011/02/24)
+------------------
+
+ - Fixing mistakes
+   [Guillaume Bottex]
+
+0.0.2 (2011/02/24)
+------------------
+
+ - Fixing mistakes
+   [Guillaume Bottex]
+
+0.0.1dev (2011/02/24)
+---------------------
+
+ - Initial version
+   [Guillaume Bottex]

Added: slapos/trunk/util/slapos.tool.nosqltester/MANIFEST.in
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester/MANIFEST.in?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester/MANIFEST.in (added)
+++ slapos/trunk/util/slapos.tool.nosqltester/MANIFEST.in [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1 @@
+include CHANGES.txt

Added: slapos/trunk/util/slapos.tool.nosqltester/README.txt
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester/README.txt?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester/README.txt (added)
+++ slapos/trunk/util/slapos.tool.nosqltester/README.txt [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,2 @@
+slapos.tool.nosqltester
+=======================

Added: slapos/trunk/util/slapos.tool.nosqltester/setup.cfg
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester/setup.cfg?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester/setup.cfg (added)
+++ slapos/trunk/util/slapos.tool.nosqltester/setup.cfg [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,3 @@
+[egg_info]
+tag_build = .dev
+tag_svn_revision = 1

Added: slapos/trunk/util/slapos.tool.nosqltester/setup.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester/setup.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester/setup.py (added)
+++ slapos/trunk/util/slapos.tool.nosqltester/setup.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,35 @@
+from setuptools import setup, find_packages
+import os
+
+name = "slapos.tool.nosqltester"
+version = '0.0.4'
+
+def read(*rnames):
+  return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
+
+long_description=( read('README.txt')
+                   + '\n' +
+                   read('CHANGES.txt')
+                 )
+
+setup(
+    name = name,
+    version = version,
+    author = 'Guillaume Bottex, for Nexedi',
+    author_email = 'gbottex at tiolive.com',
+    description = "NoSQL systems tester",
+    license = "GPL",
+    keywords = "nosql test",
+    classifiers=[
+        "Framework :: Buildout",
+        "Programming Language :: Python",
+      ],
+    packages = find_packages('src'),
+    package_dir = {'':'src'},
+    install_requires = ['Flask'],
+    namespace_packages = ['slapos', 'slapos.tool'],
+    entry_points = """
+    [console_scripts]
+    nosqltester = %s:main
+    """  % name,
+    )

Added: slapos/trunk/util/slapos.tool.nosqltester/src/slapos/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester/src/slapos/__init__.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester/src/slapos/__init__.py (added)
+++ slapos/trunk/util/slapos.tool.nosqltester/src/slapos/__init__.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__) 

Added: slapos/trunk/util/slapos.tool.nosqltester/src/slapos/tool/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester/src/slapos/tool/__init__.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester/src/slapos/tool/__init__.py (added)
+++ slapos/trunk/util/slapos.tool.nosqltester/src/slapos/tool/__init__.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__) 

Added: 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=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester/src/slapos/tool/nosqltester/__init__.py (added)
+++ slapos/trunk/util/slapos.tool.nosqltester/src/slapos/tool/nosqltester/__init__.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,137 @@
+#!/usr/bin/python
+
+##############################################################################
+#
+# Copyright (c) 2010 Vifib SARL and Contributors. All Rights Reserved.
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsibility of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# guarantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 3
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+##############################################################################
+
+from flask import Flask, abort, request, render_template
+import sys, os, getopt
+import urllib, urllib2
+
+app = Flask(__name__)
+
+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,
+          'num':1000,
+          'report_path':"/var/log",
+          'binary':"memstrike"}
+
+ at app.route('/result/<report>')
+def download(report):
+  if os.path.exists(os.path.join(params['report_path'],report)):
+    f = open(os.path.join(params['report_path'], report), "rb")
+    data = f.read()
+    f.close()
+    return data
+  else:
+    return None
+
+ at app.route('/start', methods=['POST'])
+def start():
+  if request.method == 'POST' and \
+     'action' in request.form and \
+     request.form['action'] == 'GO':
+    pid = os.fork()
+    if pid ==0:
+      result = launch_tester()
+      if result ==0:
+        send_result_availability_notification()
+      os._exit(os.EX_OK)
+  return ""
+
+def send_result_availability_notification():
+  values = {}
+  values['filename'] = str(os.getpid())+".log"
+  values['url'] = "http://"+params['address']+":"+str(params['port'])+"/result/report.log" #+values['filename']
+  data = urllib.urlencode(values)
+  try:
+    f = urllib2.urlopen("http://"+params['host_address']+":"+str(params['host_port'])+"/report", data)
+    f.close()
+  except:
+    # print sys.exc_info()
+    pass
+
+def execute(command):
+  result = os.WEXITSTATUS(os.system(command))
+  if result == 127:
+    raise ValueError, 'Command not found: %r' % (command, )
+  return result
+
+def launch_tester():
+  command = params['binary']
+  command += " > " + os.path.join(params['report_path'],"report.log")
+  return execute(command)
+
+def usage():
+  pass
+
+def main(argv=None):
+
+  if argv == None:
+    argv = sys.argv[1:]
+
+  try:
+    opts, args = getopt.getopt(argv, "h:q:a:p:n:r:b:", \
+                                    ["host=", "host-port=", "address=", "port=", "request-number=", "report-path=","binary="])
+  except getopt.GetoptError:
+    usage()
+    sys.exit()
+
+  for opt, arg in opts:
+    if opt in ("-h", "--host"):
+      params['host_address'] = arg
+    elif opt in ("-q", "--host-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", "--request-number"):
+      params['num'] = int(arg)
+    elif opt in ("-r", "--report-path"):
+      params['report_path'] = arg
+    elif opt in ("-b", "--binary"):
+      params['binary'] = 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()
+
+  app.run(host=params['address'], port=params['port'])
+
+if __name__ == "__main__":
+  main(sys.argv[1:])
+

Added: slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/CHANGES.txt
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/CHANGES.txt?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/CHANGES.txt (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/CHANGES.txt [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,8 @@
+Changelog
+=========
+
+0.0.1dev (2011/03/29)
+---------------------
+
+ - Initial version
+   [Guillaume Bottex]

Added: slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/MANIFEST.in
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/MANIFEST.in?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/MANIFEST.in (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/MANIFEST.in [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1 @@
+include CHANGES.txt
\ No newline at end of file

Added: slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/README.txt
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/README.txt?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/README.txt (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/README.txt [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,2 @@
+slapos.tool.nosqltester_manager.kumo
+====================================

Added: slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/setup.cfg
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/setup.cfg?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/setup.cfg (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/setup.cfg [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,3 @@
+[egg_info]
+tag_build = .dev
+tag_svn_revision = 1

Added: slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/setup.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/setup.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/setup.py (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/setup.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,36 @@
+from setuptools import setup, find_packages
+import os
+
+name = "slapos.tool.nosqltester_manager.kumo"
+version = '0.0.1'
+
+def read(*rnames):
+  return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
+
+long_description=( read('README.txt')
+                   + '\n' +
+                   read('CHANGES.txt')
+                 )
+
+setup(
+    name = name,
+    version = version,
+    author = 'Guillaume Bottex, for Nexedi',
+    author_email = 'gbottex at tiolive.com',
+    description = "Manager for Kumofs tester",
+    license = "GPL",
+    keywords = "kumofs test manager scheduler",
+    classifiers=[
+        "Framework :: Buildout",
+        "Programming Language :: Python",
+      ],
+    packages = find_packages('src'),
+    include_package_data = True,
+    package_dir = {'':'src'},
+    install_requires = ['Flask', 'slapos.tool.nosqltester_manager'],
+    namespace_packages = ['slapos', 'slapos.tool', 'slapos.tool.nosqltester_manager'],
+    entry_points = """
+    [slapos.tool.nosqltester_manager.plugin]
+    kumo=%s:KumoTesterManager
+    """  % name,
+    )

Added: slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/__init__.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/__init__.py (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/__init__.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__) 

Added: slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/__init__.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/__init__.py (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/__init__.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__) 

Added: slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/nosqltester_manager/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/nosqltester_manager/__init__.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/nosqltester_manager/__init__.py (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/nosqltester_manager/__init__.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__) 

Added: slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/nosqltester_manager/kumo/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/nosqltester_manager/kumo/__init__.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/nosqltester_manager/kumo/__init__.py (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/nosqltester_manager/kumo/__init__.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,122 @@
+#!/usr/bin/python
+
+##############################################################################
+#
+# Copyright (c) 2010 Vifib SARL and Contributors. All Rights Reserved.
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsibility of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# guarantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 3
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+##############################################################################
+
+import sys, logging, csv, re
+from slapos.tool.nosqltester_manager import NoSQLTesterManager
+
+class KumoTesterManager(NoSQLTesterManager):
+
+  def __init__(self, params):
+    NoSQLTesterManager.__init__(self, params)
+    # self.software_release_type = 'kumo'
+    self.host_address = params['address']
+    
+    argv = sys.argv[16:]
+    
+    if argv.__len__() < 1:
+      self.nb_thread = 1
+    else:
+      self.nb_thread = argv[0]
+      
+    if argv.__len__() < 2:
+      self.nb_request = 1000
+    else:
+      self.nb_request = argv[1]
+
+  def _kumo_init(self):
+    try:
+      self.logger.debug("Kumo manager")
+      manager_computer_partition = self.computer_partition.request(self.software_release_url, 'kumo_manager', 'kumo_manager')
+
+      self.logger.debug("Kumo server 1")
+      self.computer_partition.request(self.software_release_url, 'kumo_server', 'kumo_server'+str(self.server_count),
+                   partition_parameter_kw={'manager_address':manager_computer_partition.getConnectionParameter('address'),
+                                           'manager_port':manager_computer_partition.getConnectionParameter('port')})
+
+      self.logger.debug("Kumo gateway")
+      gateway_computer_partition = self.computer_partition.request(self.software_release_url, 'kumo_gateway', 'kumo_gateway',
+                   partition_parameter_kw={'manager_address':manager_computer_partition.getConnectionParameter('address'),
+                                           'manager_port':manager_computer_partition.getConnectionParameter('port')})
+
+      tester_computer_partition = []
+      for i in range(0, self.max_tester):
+        """
+        tester_computer_partition.append(self.computer_partition.request(self.software_release_url, 'nosqltester', 'nosqltester'+str(i),
+                   partition_parameter_kw={'gateway_address':gateway_computer_partition.getConnectionParameter('gateway_address'),
+                                           'gateway_port':gateway_computer_partition.getConnectionParameter('gateway_port'),
+                                           'host_address':params['address']}))
+        """
+        self.logger.debug("Kumo tester "+str(i))
+        tester_computer_partition.append(self.computer_partition.request(self.software_release_url, 'kumo_tester', 'kumo_tester'+str(i),
+                   partition_parameter_kw={'gateway_address':gateway_computer_partition.getConnectionParameter('address'),
+                                           'gateway_port':gateway_computer_partition.getConnectionParameter('port'),
+                                           'host_address':self.host_address,
+                                           'nb_thread':self.nb_thread,
+                                           'nb_request':self.nb_request}))
+      for partition in tester_computer_partition:
+        self.logger.debug("Appending Kumo testers' start url")
+        self.tester_urls.append(partition.getConnectionParameter('start_url'))
+      self.logger.debug("Before remove duplicates: %s" % str(self.tester_urls))
+      self.tester_urls = list(set(self.tester_urls)) # remove duplicates
+      self.logger.debug("After remove duplicates: %s" % str(self.tester_urls))
+      self.todo = self.tester_urls.__len__()
+      self.manager_computer_partition = manager_computer_partition
+      return True
+    except:
+      self.logger.debug(str(sys.exc_info()))
+      return False
+
+  def _add_kumo_server_node(self):
+    try:
+      self.logger.debug("Adding a Kumo server node")
+      partition = self.computer_partition.request(self.software_release_url, 'kumo_server', 'kumo_server'+str(self.server_count),
+                   partition_parameter_kw={'manager_address':self.manager_computer_partition.getConnectionParameter('address'),
+                                           'manager_port':self.manager_computer_partition.getConnectionParameter('port')})
+      # line made to crash the function call until we call slapgrid
+      partition.getConnectionParameter('address')
+      return True
+    except:
+      self.logger.debug(str(sys.exc_info()))
+      return False
+
+  def writeCSV(self, inputnames, outputname):
+    output = csv.writer(open(outputname, 'wb'), delimiter=';', quotechar='|', quoting=csv.QUOTE_MINIMAL)
+    # Header
+    output.writerow(['set sec', 'set MB', 'set Mbps', 'set req/sec', 'set usec/req',
+                     'get sec', 'get MB', 'get Mbps', 'get req/sec', 'get usec/req'])
+    for inputname in inputnames:
+      l = []
+      f = open(inputname, "r")
+      lines = f.readlines()
+      f.close()
+      for i in range(8, lines.__len__()):
+        if i != 13 and i != 14:
+          l.append(re.findall(r'\d+\.\d+|\d+',lines[i])[0].replace('.', ','))
+      output.writerow(l)
+

Propchange: slapos/trunk/util/slapos.tool.nosqltester_manager.kumo/src/slapos/tool/nosqltester_manager/kumo/__init__.py
------------------------------------------------------------------------------
    svn:executable = *

Added: slapos/trunk/util/slapos.tool.nosqltester_manager/CHANGES.txt
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager/CHANGES.txt?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager/CHANGES.txt (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager/CHANGES.txt [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,63 @@
+Changelog
+=========
+
+0.0.10 (2011/03/29)
+-------------------
+
+ - Now works with plugins
+ - New parameter to set the maximum number of servers and testers
+   [Guillaume Bottex]
+
+0.0.9 (2011/03/09)
+------------------
+
+ - Logging debug information to a log file
+   [Guillaume Bottex]
+
+0.0.8 (2011/03/07)
+------------------
+
+ - Adding debugging info to stderr
+   [Guillaume Bottex]
+
+0.0.7 (2011/03/04)
+------------------
+
+ - Showing more information on the web ui
+   [Guillaume Bottex]
+
+0.0.6 (2011/03/03)
+------------------
+
+ - Adapting request calls due to changes in slap.recipe.nosqltestbed
+   [Guillaume Bottex]
+
+0.0.5 (2011/03/01)
+------------------
+
+ - Fixing setup.py to correctly intall the template files
+   [Guillaume Bottex]
+
+0.0.4 (2011/02/28)
+------------------
+
+ - Adding web user interface
+   [Guillaume Bottex]
+
+0.0.3 (2011/02/24)
+------------------
+
+ - Fixing mistakes
+   [Guillaume Bottex]
+
+0.0.2 (2011/02/24)
+------------------
+
+ - Fixing mistakes
+   [Guillaume Bottex]
+
+0.0.1dev (2011/02/24)
+---------------------
+
+ - Initial version
+   [Guillaume Bottex]

Added: slapos/trunk/util/slapos.tool.nosqltester_manager/MANIFEST.in
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager/MANIFEST.in?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager/MANIFEST.in (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager/MANIFEST.in [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,2 @@
+include CHANGES.txt
+recursive-include src/slapos/tool/nosqltester_manager/templates *.html

Added: slapos/trunk/util/slapos.tool.nosqltester_manager/README.txt
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager/README.txt?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager/README.txt (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager/README.txt [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,2 @@
+slapos.tool.nosqltester_manager
+===============================

Added: slapos/trunk/util/slapos.tool.nosqltester_manager/setup.cfg
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager/setup.cfg?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager/setup.cfg (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager/setup.cfg [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,3 @@
+[egg_info]
+tag_build = .dev
+tag_svn_revision = 1

Added: slapos/trunk/util/slapos.tool.nosqltester_manager/setup.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager/setup.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager/setup.py (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager/setup.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,36 @@
+from setuptools import setup, find_packages
+import os
+
+name = "slapos.tool.nosqltester_manager"
+version = '0.0.10'
+
+def read(*rnames):
+  return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
+
+long_description=( read('README.txt')
+                   + '\n' +
+                   read('CHANGES.txt')
+                 )
+
+setup(
+    name = name,
+    version = version,
+    author = 'Guillaume Bottex, for Nexedi',
+    author_email = 'gbottex at tiolive.com',
+    description = "Manager for NoSQL systems tester",
+    license = "GPL",
+    keywords = "nosql test manager scheduler",
+    classifiers=[
+        "Framework :: Buildout",
+        "Programming Language :: Python",
+      ],
+    packages = find_packages('src'),
+    include_package_data = True,
+    package_dir = {'':'src'},
+    install_requires = ['Flask'],
+    namespace_packages = ['slapos', 'slapos.tool'],
+    entry_points = """
+    [console_scripts]
+    nosqltester_manager = %s:main
+    """  % name,
+    )

Added: slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/__init__.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/__init__.py (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/__init__.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__) 

Added: slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/__init__.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/__init__.py (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/__init__.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__) 

Added: 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=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/nosqltester_manager/__init__.py (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/nosqltester_manager/__init__.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,281 @@
+#!/usr/bin/python
+
+##############################################################################
+#
+# Copyright (c) 2010 Vifib SARL and Contributors. All Rights Reserved.
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsibility of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# guarantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 3
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+##############################################################################
+
+from flask import Flask, abort, request, render_template, send_file
+from pkg_resources import iter_entry_points
+import sys, os, getopt, tarfile, tempfile
+import logging, logging.handlers
+import urllib, urllib2
+import time
+from slapos import slap
+
+class NoSQLTesterManager:
+
+  def __init__(self, params):
+    self.log_directory = params['report_path']
+    self.work_directory = os.path.split(os.path.split(self.log_directory)[0])[0]
+    self.tmp_directory = os.path.join(self.work_directory, 'tmp')
+    self.tester_urls = []
+    self.todo = 0
+    self.reports = []
+    self.max_server = int(params['nb_server_max'])
+    self.max_tester = int(params['nb_tester_max'])
+
+    self.software_release_url = params['software_release_url']
+    self.server_url = params['server_url']
+    self.key_file = params['key_file']
+    self.cert_file = params['cert_file']
+    self.computer_id = params['computer_id']
+    self.computer_partition_id = params['computer_partition_id']
+
+    self.slap = slap.slap()
+    self.slap.initializeConnection(self.server_url, self.key_file, self.cert_file)
+    self.computer_partition = self.slap.registerComputerPartition(self.computer_id, self.computer_partition_id)
+    self.server_count = 1
+    self.manager_computer_partition = None
+    self.write_pipe = -1
+    self.software_release_type = params['plugin_name']
+
+    # Logger initialization
+    self.logger = logging.getLogger("slap.tool.nosqltester_manager")
+    if params['debug']:
+      self.logger.setLevel(logging.DEBUG)
+    file_handler = logging.FileHandler(os.path.join(self.log_directory, "nosqltester_manager.log"))
+    file_handler.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))
+    self.logger.addHandler(file_handler)
+
+  def default_init(self):
+    if self.software_release_type == None:
+      pass
+    elif "_%s_init" % self.software_release_type in dir(self) and \
+      callable(getattr(self, "_%s_init" % self.software_release_type)):
+      while not getattr(self, "_%s_init" % self.software_release_type)():
+        time.sleep(1)
+
+  def add_server_node(self):
+    if self.software_release_type == None:
+      pass
+    elif "_add_%s_server_node" % self.software_release_type in dir(self) and \
+      callable(getattr(self, "_add_%s_server_node" % self.software_release_type)):
+      while not getattr(self, "_add_%s_server_node" % self.software_release_type)():
+        time.sleep(1)
+
+  def setWritePipe(self, write_pipe):
+    self.write_pipe = write_pipe
+
+  def get(self, url):
+    f = urllib2.urlopen(url)
+    f.close()
+
+  def post(self, url, **values):
+    try:
+      data = urllib.urlencode(values)
+      f = urllib2.urlopen(url, data)
+      f.close()
+    except:
+      return False
+    return True
+
+  def do_scheduling(self):
+    for url in self.tester_urls:
+      while not self.post(url, action='GO'):
+        time.sleep(1)
+
+  def waitForReports(self, **host_parameter_kw):
+    if 'host' not in host_parameter_kw or \
+       'port' not in host_parameter_kw:
+      pass
+
+    app = Flask(__name__)
+
+    @app.route('/')
+    def ui():
+      web_page = None
+      url_all = 'http://'+"[%s]" % host_parameter_kw['host']+':5000/result/all.tar.bz2'
+      try:
+        results = []
+        
+        for f in sorted(os.listdir(self.log_directory)):
+          s = os.path.split(f)[1]
+          # if s.find("report") == 0:
+          item = {}
+          item['name'] = s
+          item['href'] = 'http://'+"[%s]" % host_parameter_kw['host']+':5000/result/'+item['name']
+          results.append(item)
+        
+        web_page = render_template('ui.html', tester_urls = self.tester_urls, url_all = url_all, done  = self.server_count-1, total = self.max_server, results=results)
+      except:
+        web_page = str(sys.exc_info())
+      
+      return web_page
+
+    @app.route('/result/<report>')
+    def getResult(report):
+      try:
+        if report == "all.tar.bz2":
+          tmp = tempfile.NamedTemporaryFile(dir=self.tmp_directory)
+          tar = tarfile.open(None, "w:bz2", tmp)
+          for f in sorted(os.listdir(self.log_directory)):
+            s = os.path.split(f)[1]
+            # if s.find("report") == 0:
+            tar.add(os.path.join(self.log_directory, s), s, False)
+          tar.close()
+          tar_file = send_file(tmp.name)
+          tmp.close()
+          return tar_file
+        elif os.path.exists(os.path.join(self.log_directory, report)):
+          return send_file(os.path.join(self.log_directory, report))
+        else:
+          return None
+      except:
+        return sys.exc_info()
+
+    @app.route('/report', methods=['POST'])
+    def receiveReport():
+      if request.method == 'POST' and \
+         'url' in request.form and \
+         'filename' in request.form:
+        try:
+          f = urllib2.urlopen(request.form['url'])
+          data = f.read()
+          f.close()
+        except:
+          self.logger.debug(str(sys.exc_info()))
+        if data is not None:
+          filepathname = os.path.join(self.log_directory, request.form['filename'])
+          self.reports.append(filepathname)
+          f = open(filepathname, "w")
+          f.write(data)
+          f.close()
+          self.todo -= 1
+          if self.todo == 0:
+            self.writeCSV(self.reports, os.path.join(self.log_directory, 'report'+str(self.server_count)+'.csv'))
+            self.reports = []
+            self.server_count += 1
+            
+            if self.server_count <= self.max_server:
+              self.add_server_node()
+              self.todo = self.tester_urls.__len__()
+              os.write(self.write_pipe, "GO")
+            else:
+              os.write(self.write_pipe, "END")
+              os.close(self.write_pipe)
+              self.write_pipe = -1
+      return ""
+
+    app.run(host=host_parameter_kw['host'], port=host_parameter_kw['port'])
+
+  def writeCSV(self, inputnames, outputname):
+    pass
+
+
+def go(params):
+  entry_point = iter_entry_points(group='slapos.tool.nosqltester_manager.plugin', name=params['plugin_name']).next()
+  plugin_class = entry_point.load()
+  scheduler = plugin_class(params)
+
+  scheduler.default_init()
+
+  r, w = os.pipe()
+  pid = os.fork()
+  if pid == 0:
+    s = ""
+    while s != "END":
+      time.sleep(1)
+      scheduler.do_scheduling()
+      s = os.read(r, 255)
+      time.sleep(1)
+    os.close(r)
+    os._exit(os.EX_OK)
+  else:
+    scheduler.setWritePipe(w)
+    scheduler.waitForReports(host=params['address'], port=params['port'])
+
+def usage():
+  pass
+
+def main(argv=None):
+
+  # Default values
+  params = {
+    'address':"127.0.0.1",
+    'port':5000,
+    'report_path':"/var/log",
+    'server_url':None,
+    'nb_server_max':3,
+    'nb_tester_max':3,
+    'key_file':None,
+    'cert_file':None,
+    'computer_id':None,
+    'computer_partition_id':None,
+    'plugin_name':'kumo',
+    # 'debug':False}
+    'debug':True}
+
+  if argv == None:
+    argv = sys.argv[1:]
+
+  try:
+    opts, args = getopt.getopt(argv, "a:dp:r:s:t:", \
+                                    ["address=", "port=", "report-path=", "nb-server-max=", "nb-tester-max="])
+  except getopt.GetoptError:
+    usage()
+    sys.exit()
+
+  for opt, arg in opts:
+    if opt in ("-a", "--address"):
+      params['address'] = arg
+    elif opt in ("-d", "--debug"):
+      params['debug'] = True
+    elif opt in ("-p", "--port"):
+      params['port'] = int(arg)
+    elif opt in ("-r", "--report-path"):
+      params['report_path'] = arg
+    elif opt in ("-s", "--nb-server-max"):
+      params['nb_server_max'] = arg
+    elif opt in ("-t", "--nb-tester-max"):
+      params['nb_tester_max'] = arg
+
+  if args.__len__() < 7:
+    usage()
+    sys.exit()
+
+  params['software_release_url'] = args[0]
+  params['server_url'] = args[1]
+  params['key_file'] = args[2]
+  params['cert_file'] = args[3]
+  params['computer_id'] = args[4]
+  params['computer_partition_id'] = args[5]
+  params['plugin_name'] = args[6]
+
+  go(params)
+
+if __name__ == "__main__":
+  main(sys.argv[1:])
+

Propchange: slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/nosqltester_manager/__init__.py
------------------------------------------------------------------------------
    svn:executable = *

Added: slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/nosqltester_manager/templates/ui.html
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/nosqltester_manager/templates/ui.html?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/nosqltester_manager/templates/ui.html (added)
+++ slapos/trunk/util/slapos.tool.nosqltester_manager/src/slapos/tool/nosqltester_manager/templates/ui.html [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+  <title>No SQL tester</title>
+</head>
+<body>
+  Testers addresses:<br>
+  <ul id="testers_urls">
+    {% for url in tester_urls %}
+      <li>{{ url }}</li>
+    {% endfor %}
+  </ul>
+  I've done {{ done }} tests of {{ total }} so far.<br>
+  Here are the available resut files:
+  <ul id="results">
+    {% if done > 0 %}
+      <li><a href="{{ url_all }}">All (tar.bz2)</a></li>
+    {% endif %}
+    {% for item in results %}
+      <li><a href="{{ item.href }}">{{ item.name }}</a></li>
+    {% endfor %}
+  </ul>
+</body>
+</html>
+

Added: slapos/trunk/util/slapos.tool.onetimeupload/CHANGES.txt
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.onetimeupload/CHANGES.txt?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.onetimeupload/CHANGES.txt (added)
+++ slapos/trunk/util/slapos.tool.onetimeupload/CHANGES.txt [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,8 @@
+0.0.1 (2010-11-09)
+------------------
+
+ - Add logging facility
+ - Add a secret key to validate upload
+ - Initial version.
+    [Romain Courteaud]
+

Added: slapos/trunk/util/slapos.tool.onetimeupload/MANIFEST.in
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.onetimeupload/MANIFEST.in?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.onetimeupload/MANIFEST.in (added)
+++ slapos/trunk/util/slapos.tool.onetimeupload/MANIFEST.in [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,3 @@
+include CHANGES.txt
+recursive-include src/slapos/tool/onetimeupload/templates *.html
+recursive-include src/slapos/tool/onetimeupload/static *

Added: slapos/trunk/util/slapos.tool.onetimeupload/README.txt
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.onetimeupload/README.txt?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.onetimeupload/README.txt (added)
+++ slapos/trunk/util/slapos.tool.onetimeupload/README.txt [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,5 @@
+onetimeupload
+=============
+
+onetimeupload is an HTTP application which only accepts one file to be
+uploaded.

Added: slapos/trunk/util/slapos.tool.onetimeupload/setup.cfg
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.onetimeupload/setup.cfg?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.onetimeupload/setup.cfg (added)
+++ slapos/trunk/util/slapos.tool.onetimeupload/setup.cfg [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,3 @@
+[egg_info]
+tag_build = .dev
+tag_svn_revision = 1

Added: slapos/trunk/util/slapos.tool.onetimeupload/setup.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.onetimeupload/setup.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.onetimeupload/setup.py (added)
+++ slapos/trunk/util/slapos.tool.onetimeupload/setup.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,41 @@
+from setuptools import setup, find_packages
+import os
+
+name = "slapos.tool.onetimeupload"
+version = '0.0.1'
+
+def read(*rnames):
+  return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
+
+long_description=(
+        read('README.txt')
+        + '\n' +
+        read('CHANGES.txt')
+    )
+
+setup(
+    name = name,
+    version = version,
+    description = "onetimeupload -- tools to upload a file",
+    long_description=long_description,
+    license = "GPLv3",
+    keywords = "upload web",
+    classifiers=[
+        "Programming Language :: Python",
+      ],
+    packages = find_packages('src'),
+    include_package_data = True,
+    package_dir = {'':'src'},
+    namespace_packages = [ 'slapos', 'slapos.tool' ],
+    install_requires = [
+      'setuptools', # namespaces
+      'Flask',
+    ],
+    url='https://svn.erp5.org/repos/vifib/trunk/utils/slapos.tool.onetimeupload/',
+    zip_safe=False,
+    entry_points = """
+    [console_scripts]
+    onetimeupload = slapos.tool.onetimeupload:main
+    """,
+    )
+

Added: slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/__init__.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/__init__.py (added)
+++ slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/__init__.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)

Added: slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/__init__.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/__init__.py (added)
+++ slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/__init__.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,7 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)
+

Added: slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/__init__.py
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/__init__.py?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/__init__.py (added)
+++ slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/__init__.py [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,125 @@
+##############################################################################
+#
+# Copyright (c) 2010 Vifib SARL and Contributors. All Rights Reserved.
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsibility of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# guarantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 3
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+##############################################################################
+import os
+import sys
+from flask import Flask, request, redirect
+from optparse import OptionParser, Option
+import logging
+import logging.handlers
+
+
+class Parser(OptionParser):
+  """
+  Parse all arguments.
+  """
+  def __init__(self, usage=None, version=None):
+    """
+    Initialize all options possibles.
+    """
+    OptionParser.__init__(self, usage=usage, version=version,
+                          option_list=[
+      Option("-l", "--log_file",
+             help="The path of the log file",
+             type=str,
+             dest="log_file_path"),
+    ])
+
+
+  def check_args(self):
+    """
+    Check arguments
+    """
+    (options, args) = self.parse_args()
+    if len(args) != 4:
+      self.error("Incorrect number of arguments")
+    host, port, upload_file, key = args
+
+    upload_file = os.path.abspath(upload_file)
+
+    return options, host, port, upload_file, key
+
+class Config:
+  def setConfig(self, option_dict, host, port, upload_file, key):
+    """
+    Set options given by parameters.
+    """
+    # Set options parameters
+    for option, value in option_dict.__dict__.items():
+      setattr(self, option, value)
+    self.host = host
+    self.port = int(port)
+    self.upload_file = upload_file
+    self.key = key
+
+def run(config):
+
+  app = Flask(__name__)
+
+  if config.log_file_path is not None:
+    file_handler = logging.handlers.RotatingFileHandler(
+                config.log_file_path, maxBytes=500000, backupCount=5)
+
+    file_handler.setLevel(logging.WARNING)
+
+    app.logger.addHandler(file_handler)
+    logging.getLogger('werkzeug').addHandler(file_handler)
+
+  @app.route('/', methods=['GET', 'POST'])
+  def upload_file():
+    if os.path.exists(config.upload_file):
+      template = app.open_resource('templates/done.html')
+      return template.read()
+    else:
+      if request.method == 'POST':
+        file = request.files['file']
+        key = "%s" % request.form.get('key')
+        if file and key:
+          if key == config.key:
+            file.save(config.upload_file)
+            return redirect('/')
+      template = app.open_resource('templates/index.html')
+      return template.read()
+
+  app.run(host=config.host, port=config.port, ssl_context='adhoc')
+
+def main():
+  "Run default configuration."
+  usage = "usage: onetimeupload [options] HOST PORT UPLOAD_FILE KEY"
+
+  try:
+    # Parse arguments
+    config = Config()
+    config.setConfig(*Parser(usage=usage).check_args())
+
+    run(config)
+    return_code = 0
+  except SystemExit, err:
+    # Catch exception raise by optparse
+    return_code = err
+
+  sys.exit(return_code)
+

Added: slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/templates/done.html
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/templates/done.html?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/templates/done.html (added)
+++ slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/templates/done.html [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,3 @@
+<!doctype html>
+<title>File Uploaded</title>
+<h1>File Uploaded</h1>

Added: slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/templates/index.html
URL: http://svn.erp5.org/slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/templates/index.html?rev=45236&view=auto
==============================================================================
--- slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/templates/index.html (added)
+++ slapos/trunk/util/slapos.tool.onetimeupload/src/slapos/tool/onetimeupload/templates/index.html [utf8] Fri Apr  8 12:55:35 2011
@@ -0,0 +1,10 @@
+<!doctype html>
+<title>Upload new File</title>
+<h1>Upload new File</h1>
+<form action="" method=post enctype=multipart/form-data>
+  <p>
+    <input type=file name=file><br/>
+    Secret Key <input type=text name=key><br/>
+    <input type=submit value=Upload>
+  </p>
+</form>



More information about the Erp5-report mailing list