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