import repository from arizona
[raven.git] / tools / phonehome / phonehome_control.py
1 #!/usr/bin/python
2
3 import os, sys, time, shutil
4 import glob
5 import plcapilib
6
7 # Parse additional options
8 shortopts = "s:xyc"
9 longopts = ["slicename=", "reset", "startup", "comon", "addnodes", "removenodes", "setinitscript"]
10 moreusage = """
11 usage: %s [OPTION]...
12
13 Shell options:
14         -s (--slicename) slicename      Slice name to reset
15         -x --reset                      Reset the slice (remove all nodes)
16         -y --startup                    Startup the slice (add all nodes)
17         -c --comon                      Download updated comon stats
18            --addnodes                   Add nodes on cmd line to the slice
19            --removenodes                Remove nodes on cmd line from the slice
20            --setinitscript              set the initscript
21 """ % sys.argv[0]
22
23 # nodes that refuse to allow planetlab slice instantiation
24 glo_ignore_nodes = ["measurement-lab", "hptest-3.cs.princeton.edu", "gpctest-1.cs.princeton.edu"]
25
26 reset = False
27 startup = False
28 addnodes = False
29 removenodes = False
30 setinitscript = False
31 getComon = False
32 slicename = None
33
34 def archive_file(fn, tnow):
35    try:
36       yesterday_fn = fn + "^yesterday"
37       shutil.copyfile(fn, yesterday_fn)
38    except:
39       pass
40    try:
41        old_fn = fn + "^" + str(tnow)
42        os.rename(fn, old_fn)
43    except:
44        pass
45
46 def generate_comon(fn):
47    print "downloading comon statistics to " + fn
48    try:
49        os.system("curl -o " + fn + " http://summer.cs.princeton.edu/status/tabulator.cgi?table=table_nodeviewshort\&format=formatcsv")
50    except:
51        print "failed to download comon statistics"
52        pass
53
54 def remove_names(list, name):
55    new_list = []
56    for node in list:
57        if not (name in node):
58            new_list.append(node)
59    return new_list
60
61 def main():
62    global slicename
63    global reset, startup, getComon, addnodes, removenodes, setinitscript
64    global string0, string1, int2
65
66    (plcapi, moreopts, argv) = plcapilib.plcapi(globals(), sys.argv, shortopts, longopts, moreusage)
67    for opt, optval in moreopts.iteritems():
68        if opt == "-s" or opt == "--slicename":
69            slicename = optval
70        if opt == '-x' or opt == '--reset':
71            reset = True
72        if opt == '-y' or opt == '--startup':
73            startup = True
74        if opt == '-c' or opt == '--comon':
75            getComon = True
76        if opt == "--addnodes":
77            addnodes = True
78        if opt == "--removenodes":
79            removenodes = True
80        if opt == "--setinitscript":
81            setinitscript = True
82
83    if not slicename:
84        print "must use --slicename"
85        sys.exit(1)
86
87    tartest_fn = "/repository/phonehome/smbphonehome_tar_" + slicename + ".txt"
88    tarbench_fn = "/repository/phonehome/tarbench_" + slicename + ".txt"
89    cpubench_fn = "/repository/phonehome/cpubench_" + slicename + ".txt"
90    membench_fn = "/repository/phonehome/membench_" + slicename + ".txt"
91    loopbench_fn = "/repository/phonehome/loopbench_" + slicename + ".txt"
92    sha1bench_fn = "/repository/phonehome/sha1bench_" + slicename + ".txt"
93    httpbench_fn = "/repository/phonehome/httpbench_" + slicename + ".txt"
94    s3bench_fn = "/repository/phonehome/s3bench_" + slicename + ".txt"
95    nodelist_fn = "/repository/phonehome/nodelist_" + slicename + ".txt"
96    comon_fn = "/repository/phonehome/comon_" + slicename + ".txt"
97    warning_filemask = "/repository/phonehome/warning.*.txt"
98
99    if reset:
100       slicenodes = SliceNodesList(slicename)
101       print "deleting " + str(len(slicenodes)) + " nodes from " + slicename
102       result = SliceNodesDel(slicename, slicenodes)
103       print "result = " + str(result)
104
105    if setinitscript:
106       initscript_name = argv[0]
107       if (initscript_name != "stork") and (initscript_name != "storkstop"):
108           print "bad initscript", initscript_name
109           sys.exit(-1)
110       slice_data = {}
111       slice_data['name'] = slicename
112       slice_id = GetSlices(slice_data)[0]['slice_id']
113       filter = {}
114       filter['slice_id'] = slice_id
115       filter['tagname'] = "initscript"
116       attributes = GetSliceTags(filter)
117       found = False
118       for attribute in attributes:
119          if (attribute["value"] == initscript_name):
120              print "already have", initscript_name
121              found = True
122          else:
123              print "removing attribute", attribute
124              DeleteSliceTag(attribute['slice_tag_id'])
125       if not found:
126           print "adding", initscript_name
127           string0 = slicename # bug in plcapilib?
128           string1 = "initscript" # bug in plcapilib?
129           AddSliceTag(slice_id, "initscript", initscript_name)
130
131    if addnodes:
132       if (len(argv) > 0) and (argv[0] == "*"):
133           nodes = GetNodes()
134           hostnames = [node['hostname'] for node in nodes]
135       else:
136           hostnames = argv
137
138       for name in glo_ignore_nodes:
139           hostnames = remove_names(hostnames, name)
140
141       print "adding: " + str(hostnames)
142       try:
143           result = SliceNodesAdd(slicename, hostnames)
144       except Exception, e:
145           print "exception in SliceNodesAdd:", str(e)
146           result = "exception"
147       print "result = " + str(result)
148
149    if removenodes:
150       if (len(argv) > 0) and (argv[0] == "*"):
151           hostnames = SliceNodesList(slicename)
152       else:
153           hostnames = argv
154       print "removing: " + str(hostnames)
155       result = SliceNodesDel(slicename, hostnames)
156       print "result = " + str(result)
157
158    if startup:
159       nodes = GetNodes()
160       hostnames = []
161       for node in nodes:
162          hostnames.append(node['hostname'])
163
164       for name in glo_ignore_nodes:
165           hostnames = remove_names(hostnames, name)
166
167       print "adding " + str(len(hostnames)) + " nodes to " + slicename
168
169       try:
170           result = SliceNodesAdd(slicename, hostnames)
171       except Exception, e:
172           print "exception in SliceNodesAdd:", str(e)
173           result = "exception"
174       print "result = " + str(result)
175
176       tnow = int(time.time())
177
178       # archive files to ^yesterday and ^tnow
179       archive_file(nodelist_fn, tnow)
180       archive_file(tartest_fn, tnow)
181       archive_file(comon_fn, tnow)
182       archive_file(tarbench_fn, tnow)
183       archive_file(cpubench_fn, tnow)
184       archive_file(membench_fn, tnow)
185       archive_file(loopbench_fn, tnow)
186       archive_file(sha1bench_fn, tnow)
187       archive_file(s3bench_fn, tnow)
188       archive_file(httpbench_fn, tnow)
189
190       for fn in glob.glob(warning_filemask):
191          archive_file(fn, tnow)
192
193       # create the new nodelist file
194       try:
195           f = open(nodelist_fn, "w")
196           for hostname in hostnames:
197               f.write(hostname + "\n")
198           f.close()
199       except:
200           print "failed to create nodelist file " + nodelist_fn
201
202       # get the comon statistics at start-of-test
203       generate_comon(comon_fn)
204
205    if getComon:
206       generate_comon(comon_fn)
207
208    print "done."
209
210 if __name__ == "__main__":
211    main()