minor updates
[tests.git] / qaapi / system-test.py
1 #!/usr/bin/python
2 import commands
3 import os
4 import sys
5 from optparse import OptionParser
6 from random import Random
7 from time import localtime
8 from qa.utils import commands
9 from qa import utils 
10 from qa.Config import Config 
11 from qa.tests.vserver_create import vserver_create
12 from qa.tests.vserver_delete import vserver_delete
13 from qa.tests.plc_configure import plc_configure
14 from qa.tests.plc_stop import plc_stop
15 from qa.tests.plc_start import plc_start
16 from qa.tests.add_test_data import add_test_data
17 from qa.tests.sync_person_key import sync_person_key
18 from qa.tests.boot_node import boot_node
19 from qa.tests.node_run_tests import node_run_tests
20
21 def run_system_tests(config, vserver_name, plc_name):
22     # configure the plc in this vserver
23     config.plcs[plc_name]['vserver'] = vserver_name
24     config.plcs[plc_name]['host'] = config.hostname
25     config.plcs[plc_name]['ip'] = config.ip
26     config.plcs[plc_name].update_ip()
27         
28     plc_configure(config)(plc_name)
29     options = {}
30     for service in ['API', 'WWW', 'BOOT',' DB']:
31         options['PLC_'+service+'_HOST'] = config.plcs[plc_name]['ip']
32         options['PLC_'+service+'_IP'] = config.plcs[plc_name]['ip']
33     plc_configure(config)(plc_name, options)
34     plc_start(config)(plc_name)
35
36     # Add test site, node, person and slice data
37     # Adds slice to node and person to slice 
38     add_test_data(config)(plc_name)
39     plc_stop(config)(plc_name)
40     plc_start(config)(plc_name)
41     person_email = config.persons.values()[0]['email']
42     sync_person_key(config)(person_email)
43
44     # Boot test node and confirm boot state
45     nodelist = ['vm1.paris.cs.princeton.edu']
46     slice = config.slices['ts_slice1']  
47     for node in nodelist:
48         if not node in config.nodes.keys():
49             continue
50         node = config.nodes[node]
51         node['vserver'] = config.plcs[plc_name]['vserver']
52         boot_node(config)(plc_name, node['hostname'])
53         if node.is_ready():
54             node_run_tests(config)(node['hostname'], plc_name)  
55
56 def create_vserver(vserver_name, vserver_home, mailto):
57     # create vserver for this system test if it doesnt already exist
58     if not os.path.isdir('%(vserver_home)s/%(vserver_name)s' % locals()):
59         vserver_create(config)(vserver_name, distro, mailto)
60
61 def cleanup_vservers(max_vservers, vserver_home, vserver_basename):
62     # only keep the newest MAX_VSERVERS 
63     vservers = os.listdir("%(vserver_home)s" % locals())
64     valid_vservers = lambda vserver: vserver.startswith(vserver_basename) and os.path.isdir(vserver)
65     vservers = filter(valid_vservers, vservers)
66     vservers.sort()
67     vservers.reverse()
68     expired_vservers = vservers[5:]
69     for vserver in expired_vservers:
70         utils.header("Deleting vserver: %(vserver)s" % locals())
71         #vserver_delete()(vserver)
72
73 usage="""
74 Usage: %prog [options]   
75 """
76 parser = OptionParser(usage=usage,add_help_option = False)
77 parser.add_option("-v", "--vserver", help = "Vserver where tests should run")
78 parser.add_option("-d", "--distro", help = "Fedora distro to use")
79 parser.add_option("-p", "--plcname", help = "Which plc do we use (from config file)")
80 parser.add_option("-m", "--mailto", help = "Vserver build mailto address")
81
82 (options, args) = parser.parse_args()
83
84 # choose which distros to use 
85 if options.distro is not None:  distros = [options.distro]
86 else: distros = ['f7']
87 # did the user specify a vserver or plc
88 vserver_name = options.vserver
89 if options.plcname is not None: plc_name = options.plcname
90 else: plc_name = 'TestPLC' 
91 # who gets emailed
92 if options.mailto is not None: mailto = options.mailto
93 else: mailto = 'tmack@cs.princeton.edu'     
94
95 # Define globals
96 # Determine vserver name, distribution and mailto
97 # The distribution and current date will be part of of the vserver name  
98 MAX_VSERVERS =  5
99 VSERVER_HOME = '/vservers/'
100 VSERVER_BASENAME = 'plc'
101
102 # Setup configuration 
103 config = Config()
104 config.load("qa/qa_config.py")  
105
106 if vserver_name:
107     # run tests in vserver specified by user
108     create_vserver(vserver_name, VSERVER_HOME, mailto)  
109     run_system_tests(config, vserver_name, plc_name)
110 else:
111     
112     # use todays date and defaults to determine which vservers to run tests in 
113     year, month, day = localtime()[:3]
114     YEAR, MONTH, DAY = [str(x) for x in [year,month,day]]
115     DATE = ".".join([YEAR, MONTH, DAY])
116     for distro in distros:
117         vserver_name = "%(VSERVER_BASENAME)s-%(distro)s-%(DATE)s" % locals()
118         create_vserver(vserver_name, VSERVER_HOME, mailto)      
119         try:    
120             run_system_tests(config, vserver_name, plc_name)
121         except:
122             utils.header("ERROR %(vserver_name)s tests failed" % locals())      
123             raise
124         
125 # remove old vsevers
126 cleanup_vservers(MAX_VSERVERS, VSERVER_HOME, VSERVER_BASENAME)
127