support commandline arguments. check if vserver exists before trying create it
[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.access_slice import access_slice
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     for node in nodelist:
47         if not node in config.nodes.keys():
48             continue
49         node = config.nodes[node]
50         node['vserver'] = config.plcs[plc_name]['vserver']
51         boot_node(config)(plc_name, node['hostname'])
52
53 def create_vserver(vserver_name, vserver_home, mailto):
54     # create vserver for this system test if it doesnt already exist
55     if not os.path.isdir('%(vserver_home)s/%(vserver_name)s' % locals()):
56         vserver_create(config)(vserver_name, distro, mailto)
57
58 def cleanup_vservers(max_vservers, vserver_home, vserver_basename):
59     # only keep the newest MAX_VSERVERS 
60     vservers = os.listdir("%(vserver_home)s" % locals())
61     valid_vservers = lambda vserver: vserver.startswith(vserver_basename)
62     vservers = filter(valid_vservers, vservers)
63     vservers.sort()
64     vservers.reverse()
65     expired_vservers = vservers[5:]
66     for vserver in expired_vservers:
67         utils.header("Deleting vserver: %(vserver)s" % locals())
68         #vserver_delete()(vserver)
69
70 usage="""
71 Usage: %prog [options]   
72 """
73 parser = OptionParser(usage=usage,add_help_option = False)
74 parser.add_option("-v", "--vserver", help = "Vserver where tests should run")
75 parser.add_option("-d", "--distro", help = "Fedora distro to use")
76 parser.add_option("-p", "--plcname", help = "Which plc do we use (from config file)")
77 parser.add_option("-m", "--mailto", help = "Vserver build mailto address")
78
79 (options, args) = parser.parse_args()
80
81 # choose which distros to use 
82 if options.distro is not None:  distros = [options.distro]
83 else: distros = ['f7']
84 # did the user specify a vserver or plc
85 vserver_name = options.vserver
86 if options.plcname is not None: plc_name = options.plcname
87 else: plc_name = 'TestPLC' 
88 # who gets emailed
89 if options.mailto is not None: mailto = options.mailto
90 else: mailto = 'tmack@cs.princeton.edu'     
91
92 # Define globals
93 # Determine vserver name, distribution and mailto
94 # The distribution and current date will be part of of the vserver name  
95 MAX_VSERVERS =  5
96 VSERVER_HOME = '/vservers/'
97 VSERVER_BASENAME = 'plc'
98
99 # Setup configuration 
100 config = Config()
101 config.load("qa/qa_config.py")  
102
103 if vserver_name:
104     # run tests in vserver specified by user
105     create_vserver(vserver_name, VSERVER_HOME, mailto)  
106     run_system_tests(config, vserver_name, plc_name)
107 else:
108     
109     # use todays date and defaults to determine which vservers to run tests in 
110     year, month, day = localtime()[:3]
111     YEAR, MONTH, DAY = [str(x) for x in [year,month,day]]
112     DATE = ".".join([YEAR, MONTH, DAY])
113     for distro in distros:
114         vserver_name = "%(VSERVER_BASENAME)s-%(distro)s-%(DATE)s" % locals()
115         create_vserver(vserver_name, VSERVER_HOME, mailto)      
116         try:    
117             run_system_tests(config, vserver_name, plc_name)
118         except:
119             utils.header("ERROR %(vserver_name)s tests failed" % locals())      
120             raise
121         
122 # remove old vsevers
123 cleanup_vservers(MAX_VSERVERS, VSERVER_HOME, VSERVER_BASENAME)
124