POPI experiment moved into nepi
[nepi.git] / examples / POPI / run_one_experiment.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 from nepi.core.execute import ExperimentController
5 import os
6 import re
7 import time
8 import commands
9 import subprocess
10 import collections
11 import signal
12 import traceback
13 import shutil
14 import sys
15 import cPickle
16 import gzip
17
18 class PopiExperiment(object):
19     def run(self, duration, xml_filepath, testset, results_dir, iteration):
20         app_guid = 8
21
22         testset_dir = os.path.join(results_dir, testset)
23         
24         # create test results file
25         test_dir = os.path.join(testset_dir, str(iteration))
26
27         # replace results values in xml
28         replacements = cPickle.loads(os.environ['POPI_REPLACEMENTS'].strip().decode("base64"))
29         file = open(xml_filepath)
30         xml2 = xml = file.read()
31         file.close()
32
33         for key,value in replacements.iteritems():
34             xml2 = xml2.replace("##%s##" % (key,), value)
35
36         # launch experiment
37         controller = ExperimentController(xml2, results_dir)
38         
39         try:
40             controller.start()
41
42             t0 = time.time()
43             t1 = t0
44             while (t1-t0) < duration and not controller.is_finished(app_guid):
45                 time.sleep(10)
46             
47             # download results
48             for testbed_guid, guids in controller.traces_info().iteritems():
49                 for guid, traces in guids.iteritems():
50                     for name, data in traces.iteritems():
51                         path = data["filepath"]
52                         print >>sys.stderr, "Downloading trace", path
53                         
54                         filepath = os.path.join(test_dir, path)
55                         
56                         try:
57                             trace = controller.trace(guid, name)
58                         except:
59                             traceback.print_exc(file=sys.stderr)
60                             continue
61                         try:
62                             if not os.path.exists(os.path.dirname(filepath)):
63                                 os.makedirs(os.path.dirname(filepath))
64                         except:
65                             traceback.print_exc(file=sys.stderr)
66                         
67                         try:
68                             if len(trace) >= 2**20:
69                                 # Bigger than 1M, compress
70                                 tracefile = gzip.GzipFile(filepath+".gz", "wb")
71                             else:
72                                 tracefile = open(filepath,"wb")
73                             try:
74                                 tracefile.write(trace)
75                             finally:
76                                 tracefile.close()
77                         except:
78                             traceback.print_exc(file=sys.stderr)
79
80         finally:
81             # clean up
82             try:
83                 controller.stop()
84             except:
85                 pass
86             try:
87                 controller.shutdown()
88             except:
89                 pass
90
91     def results_append(self, file, testset, sta_pcap, ap_pcap):
92         line = "%s %s %s\n" % (testset, sta_pcap, ap_pcap)
93         file.write(line)
94
95 if __name__ == '__main__':
96     experiment = PopiExperiment()
97     duration = int(sys.argv[1])
98     xml_filepath = sys.argv[2]
99     testset = sys.argv[3]
100     results_dir = sys.argv[4]
101     iteration = sys.argv[5]
102     experiment.run(duration, xml_filepath, testset, results_dir, iteration)
103