6 from optparse import OptionParser
7 from random import Random
8 from time import localtime
9 from qa.utils import commands
11 from qa.Config import Config
12 from qa.tests.vserver_create import vserver_create
13 from qa.tests.vserver_delete import vserver_delete
14 from qa.tests.plc_configure import plc_configure
15 from qa.tests.plc_stop import plc_stop
16 from qa.tests.plc_start import plc_start
17 from qa.tests.add_test_data import add_test_data
18 from qa.tests.api_unit_test import api_unit_test
19 from qa.tests.sync_person_key import sync_person_key
20 from qa.tests.boot_node import boot_node
21 from qa.tests.node_run_tests import node_run_tests
23 def run_system_tests(config, vserver_name, plc_name):
24 # configure the plc in this vserver
25 config.plcs[plc_name]['vserver'] = vserver_name
26 config.plcs[plc_name]['host'] = config.hostname
27 config.plcs[plc_name]['ip'] = config.ip
28 config.plcs[plc_name].update_ip()
30 plc_configure(config)(plc_name)
32 for service in ['API', 'WWW', 'BOOT',' DB']:
33 options['PLC_'+service+'_HOST'] = config.plcs[plc_name]['ip']
34 options['PLC_'+service+'_IP'] = config.plcs[plc_name]['ip']
35 plc_configure(config)(plc_name, options)
36 plc_start(config)(plc_name)
38 # Add test site, node, person and slice data
39 # Adds slice to node and person to slice
40 add_test_data(config)(plc_name)
41 plc_start(config)(plc_name)
42 person_email = config.persons.values()[0]['email']
43 sync_person_key(config)(person_email)
46 try: api_unit_test(config)(plc_name)
47 except: utils.header("Error: %s" % traceback.format_exc(), logfile = config.logfile)
49 # Boot test node and confirm boot state
50 nodelist = ['vm1.paris.cs.princeton.edu', 'vm41.test.org']
51 slice = config.slices['ts_slice1']
53 if not node in config.nodes.keys():
55 node = config.nodes[node]
56 node['vserver'] = config.plcs[plc_name]['vserver']
58 boot_node(config)(plc_name, node['hostname'])
60 node_run_tests(config)(node['hostname'], plc_name)
62 utils.header("Error: %s" % traceback.format_exc(), logfile = config.logfile)
63 def create_vserver(vserver_name, vserver_home, mailto):
64 # create vserver for this system test if it doesnt already exist
65 if not os.path.isdir('%(vserver_home)s/%(vserver_name)s' % locals()):
66 vserver_create(config)(vserver_name, distro, mailto)
68 def cleanup_vservers(max_vservers, vserver_home, vserver_basename):
69 # only keep the newest MAX_VSERVERS
70 vservers = os.listdir("%(vserver_home)s" % locals())
71 valid_vservers = lambda vserver: vserver.startswith(vserver_basename) and os.path.isdir(vserver)
72 vservers = filter(valid_vservers, vservers)
75 expired_vservers = vservers[max_vservers:]
76 for vserver in expired_vservers:
77 utils.header("Deleting vserver: %(vserver)s" % locals(), logfile = config.logfile)
78 #vserver_delete()(vserver)
81 Usage: %prog [options]
83 parser = OptionParser(usage=usage,add_help_option = False)
84 parser.add_option("-v", "--vserver", help = "Vserver where tests should run")
85 parser.add_option("-d", "--distro", help = "Fedora distro to use")
86 parser.add_option("-p", "--plcname", help = "Which plc do we use (from config file)")
87 parser.add_option("-m", "--mailto", help = "Vserver build mailto address")
90 # Determine vserver name, distribution and mailto
91 # The distribution and current date will be part of of the vserver name
93 VSERVER_HOME = '/vservers/'
94 VSERVER_BASENAME = 'plc'
96 # use todays date and defaults to determine which vservers to run tests in
97 year, month, day = localtime()[:3]
98 YEAR, MONTH, DAY = [str(x) for x in [year,month,day]]
99 DATE = ".".join([YEAR, MONTH, DAY])
100 vserver_name = "%(VSERVER_BASENAME)s-%(distro)s-%(DATE)s" % locals()
102 (options, args) = parser.parse_args()
103 # choose which distros to use
104 if options.distro is not None: distros = [options.distro]
105 else: distros = ['f8']
107 # did the user specify a vserver or plc
108 if options.vserver is not None: vserver_name = options.vserver
110 if options.plcname is not None: plc_name = options.plcname
111 else: plc_name = 'TestPLC'
114 if options.mailto is not None: mailto = options.mailto
115 else: mailto = 'tmack@cs.princeton.edu'
117 # Setup configuration
118 logfile_dir = "/var/log/qaapi/%(vserver_name)s" % locals()
119 config = Config(logdir = logfile_dir)
120 config.load("qa/qa_config.py")
123 # run tests in vserver specified by user
124 create_vserver(vserver_name, VSERVER_HOME, mailto)
125 run_system_tests(config, vserver_name, plc_name)
127 for distro in distros:
129 vserver_name = "%(VSERVER_BASENAME)s-%(distro)s-%(DATE)s" % locals()
130 create_vserver(vserver_name, VSERVER_HOME, mailto)
131 run_system_tests(config, vserver_name, plc_name)
133 utils.header("ERROR %(vserver_name)s tests failed" % locals(), logfile = config.logfile)
134 utils.header("%s" % traceback.format_exc(), logfile = config.logfile)
137 cleanup_vservers(MAX_VSERVERS, VSERVER_HOME, VSERVER_BASENAME)