no more lxc-enter-namespace - use ssh
[tests.git] / qaapi / qa / Step.py
1 import os
2 import socket
3 import traceback
4 from sendmail import sendmail
5 from Table import Table
6 from qa import utils
7
8 class Step(dict):
9     
10     def __init__(self, name, method, args, log_filename, fatal = True, mailto = []):
11         
12         self.name = name
13         self.method = method
14         self.args = args
15         self.mailto = mailto
16         self.fatal = fatal
17         self.passed = None
18         self.status = "Not Tested" 
19         self.next_steps = []
20
21         # transform logfile path into its url path
22         hostname = socket.gethostname()
23         port = '51080'
24         self.update_logfile(log_filename, hostname, port)
25
26     def update_logfile(self, log_filename, hostname, port):
27         logfile_path = log_filename.replace('/var/log/', '')
28         self.logfile = 'http://%(hostname)s:%(port)s/%(logfile_path)s' % locals()
29     
30     def run(self):
31         try:
32             result = self.method(*self.args)
33             self.passed = True
34             self.status = "Passed"
35             for step in self.next_steps:
36                 step.run()      
37             return result
38         except:
39             self.passed = False
40             self.status = "Failed"
41             utils.header("%s" % traceback.format_exc()) 
42             if not self.fatal:
43                 for step in  self.next_steps:
44                     step.run()
45
46         return None
47             
48     def notify_contacts(self):
49         if not self.mailto:
50             return None 
51  
52         to = self.mailto
53         subject = "QA Test %s %s" % (self.name, self.status)
54         log = self.logfile
55         body = """
56         Hello PlanetLab developer,
57         
58         The test script for your module has %(status)s. Please review this
59         tests log for further details.
60         %(log)s
61         """ % locals()
62                 
63         sendmail(to, subject, body)
64
65     def get_results(self):
66         (name, result, log) = (self.name, self.status, self.logfile)
67         
68         if result in ['Passed', 'Failed']:
69             body = "%(result)s\t (*) %(name)s %(log)s\n" % locals()
70         else:
71             body = "%(result)s\t (*) %(name)s\n" % locals()
72
73         for step in self.next_steps:
74             body += step.get_results()
75         
76         return body