#!/usr/bin/env python
"""
Generate random 'workflow' logs in BP (NetLogger)
format. Primary utility: database tester
"""
__rcsid__ = '$Id: nl_wflowgen 445 2007-12-19 19:52:10Z dang $'
__author__ = 'Dan Gunter (dkunter (at) lbl.gov)'

import optparse # option parsing
import sys # argv
from netlogger.analysis.wflowgen import RandomWorkflow, GlobusWorkflow

def run(shell_args):
    usage = "%prog [options] [-h]"
    parser = optparse.OptionParser(usage=usage, version="0.1")
    parser.add_option('-m', '--mode', action="store", dest="mode",
                      type="choice", choices=('random', 'globus'),
                      default='random',
                      help="Run mode (default=%default). Modes: "+
                           "'random' = a random workflow 'tree'; " +
                           "'globus' = Globus job submit")
    parser.add_option('-o','--output',action="store", dest="ofile",
                      default=None,
                      help="output filename. use stdout if not given")
    parser.add_option('','--num', action='store', type="int", dest='num',
                      default=100,
                      help="[random, globus] number of events, total (default=%default)")
    parser.add_option('','--mindepth', action='store',  type="int",
                      dest='min_depth',  default=1,
                      help="[random] minimum number of nested events in a workflow (default=%default)")
    parser.add_option('','--maxdepth', action='store',  type="int",
                      dest='max_depth', default=5,
                      help="[random] maximum number of nested events in a workflow (default=%default)")
    parser.add_option('','--fail', action='store',  type="float",
                      dest='fail', default=0.1,
                      help="[random] probability of failure for a .end event (default=%default)")
    parser.add_option('','--nest', action='store',  type="float",
                      dest='nest', default=0.5,
                      help="[random] probability of nesting events, at any point (default=%default)")
    options, args = parser.parse_args(shell_args)
    if options.ofile is None:
        ofile = sys.stdout
    else:
        try:
            ofile = file(options.ofile, "w")
        except:
            parser.error("cannot open file '%s' for writing" % options.ofile)
    if options.mode == 'random':
        if options.fail < 0 or options.fail > 1:
            parser.error("failure rate out of range 0..1")
        d = options.__dict__
        del d['ofile']
        wflow = RandomWorkflow(ofile, **d)
    elif options.mode == 'globus':
        wflow = GlobusWorkflow(ofile, options.num)
    wflow.generate()
            
if __name__ == '__main__':
    run(sys.argv[1:])
