#!/usr/bin/env python

import sys
import random
from optparse import OptionParser


def main():
    usage = "usage: %prog --files N --mirrors N [--samples N]"
    parser = OptionParser(usage=usage)
    parser.add_option("-f", "--files", dest="nf", help="number of files", metavar="N")
    parser.add_option("-m", "--mirrors", dest="nm", help="number of mirrors", metavar="N")
    parser.add_option("-s", "--samples", dest="samplesize", default=100000,
            help="number of samples to randomly run", metavar="N")
    (options, args) = parser.parse_args()

    if not options.nf or not options.nm:
        sys.exit(parser.get_usage())

    nf = float(options.nf)
    nm = float(options.nm)
    samplesize = int(options.samplesize)

    
    mirrors = {}
    for i in range(int(nm)):
        mirrors[i] = { 'name': 'mirror%s' % i,
                       'count_req': 0,
                       'files': set() }
    files = {}
    for i in range(int(nf)):
        files[i] = 'file%s' % i
    
    for s in range(samplesize):
        f = random.randint(0, nf-1)
        sel = ( random.random() * (nm/nf) + f * (nm/nf) )
        sel = int(sel)

        mirrors[sel]['count_req'] += 1
        mirrors[sel]['files'].add(files[f])
    
    for i in mirrors.keys():
        m = mirrors[i]
        print '%6d requests (%d%%) to %s for %s' % \
                (m['count_req'], 
                 m['count_req'] / float(samplesize) * 100, 
                 m['name'], 
                 ', '.join([f for f in m['files']]))

if __name__ == '__main__':
    main()

