Cleanup colouring functions.
[ganeti-local] / qa / qa_daemon.py
1 # Copyright (C) 2007 Google Inc.
2 #
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
7 #
8 # This program is distributed in the hope that it will be useful, but
9 # WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 # General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software
15 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16 # 02110-1301, USA.
17
18
19 """Daemon related QA tests.
20
21 """
22
23 import time
24
25 from ganeti import utils
26 from ganeti import constants
27
28 import qa_config
29 import qa_utils
30 import qa_error
31
32 from qa_utils import AssertEqual, StartSSH
33
34
35 def _InstanceRunning(node, name):
36   """Checks whether an instance is running.
37
38   Args:
39     node: Node the instance runs on
40     name: Full name of Xen instance
41   """
42   cmd = utils.ShellQuoteArgs(['xm', 'list', name]) + ' >/dev/null'
43   ret = StartSSH(node['primary'], cmd).wait()
44   return ret == 0
45
46
47 def _XmShutdownInstance(node, name):
48   """Shuts down instance using "xm" and waits for completion.
49
50   Args:
51     node: Node the instance runs on
52     name: Full name of Xen instance
53   """
54   master = qa_config.GetMasterNode()
55
56   cmd = ['xm', 'shutdown', name]
57   AssertEqual(StartSSH(node['primary'],
58                        utils.ShellQuoteArgs(cmd)).wait(), 0)
59
60   # Wait up to a minute
61   end = time.time() + 60
62   while time.time() <= end:
63     if not _InstanceRunning(node, name):
64       break
65     time.sleep(5)
66   else:
67     raise qa_error.Error("xm shutdown failed")
68
69
70 def _ResetWatcherDaemon(node):
71   """Removes the watcher daemon's state file.
72
73   Args:
74     node: Node to be reset
75   """
76   cmd = ['rm', '-f', constants.WATCHER_STATEFILE]
77   AssertEqual(StartSSH(node['primary'],
78                        utils.ShellQuoteArgs(cmd)).wait(), 0)
79
80
81 def PrintCronWarning():
82   """Shows a warning about the required cron job.
83
84   """
85   print
86   print qa_utils.FormatWarning("The following tests require the cron script "
87                                "for ganeti-watcher to be set up.")
88
89
90 def TestInstanceAutomaticRestart(node, instance):
91   """Test automatic restart of instance by ganeti-watcher.
92
93   Note: takes up to 6 minutes to complete.
94   """
95   master = qa_config.GetMasterNode()
96   inst_name = qa_utils.ResolveInstanceName(instance)
97
98   _ResetWatcherDaemon(node)
99   _XmShutdownInstance(node, inst_name)
100
101   # Give it a bit more than five minutes to start again
102   restart_at = time.time() + 330
103
104   # Wait until it's running again
105   while time.time() <= restart_at:
106     if _InstanceRunning(node, inst_name):
107       break
108     time.sleep(15)
109   else:
110     raise qa_error.Error("Daemon didn't restart instance in time")
111
112   cmd = ['gnt-instance', 'info', inst_name]
113   AssertEqual(StartSSH(master['primary'],
114                        utils.ShellQuoteArgs(cmd)).wait(), 0)
115
116
117 def TestInstanceConsecutiveFailures(node, instance):
118   """Test five consecutive instance failures.
119
120   Note: takes at least 35 minutes to complete.
121   """
122   master = qa_config.GetMasterNode()
123   inst_name = qa_utils.ResolveInstanceName(instance)
124
125   _ResetWatcherDaemon(node)
126   _XmShutdownInstance(node, inst_name)
127
128   # Do shutdowns for 30 minutes
129   finished_at = time.time() + (35 * 60)
130
131   while time.time() <= finished_at:
132     if _InstanceRunning(node, inst_name):
133       _XmShutdownInstance(node, inst_name)
134     time.sleep(30)
135
136   # Check for some time whether the instance doesn't start again
137   check_until = time.time() + 330
138   while time.time() <= check_until:
139     if _InstanceRunning(node, inst_name):
140       raise qa_error.Error("Instance started when it shouldn't")
141     time.sleep(30)
142
143   cmd = ['gnt-instance', 'info', inst_name]
144   AssertEqual(StartSSH(master['primary'],
145                        utils.ShellQuoteArgs(cmd)).wait(), 0)