#!/usr/bin/env python
"""
Generate random 'workflow' logs in BP (NetLogger)
format. Primary utility: database tester
"""
__rcsid__ = '$Id: nl_wflowgen 23923 2009-09-18 22:42:26Z ksb $'
__author__ = 'Dan Gunter (dkunter (at) lbl.gov)'

import sys
#
from netlogger.analysis.wflowgen import RandomWorkflow, GlobusWorkflow
from netlogger.nllog import OptionParser, get_logger

## Functions

def main():
    usage = "%prog [options] [-h]"
    desc = ''.join(__doc__.split('\n'))
    parser = OptionParser(usage=usage, description=desc)
    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()
    log = get_logger(__file__)  # Should be first done, just after parsing args
    if options.ofile is None:
        ofile = sys.stdout
    else:
        try:
            ofile = file(options.ofile, "w")
        except IOError, ioe:
            log.exc("open.ofile", ioe)
            return -1
    # Run
    log.info("run.start", mode=options.mode, ofile=ofile.name)
    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)
    log.debug("generate.start", workflow=wflow)
    wflow.generate()
    log.debug("generate.end", workflow=wflow)
    log.info("run.end", status=0, mode=options.mode, ofile=ofile.name)
    return 0

if __name__ == '__main__':
    sys.exit(main())
