Various code style fixes for strings.
[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():
71   """Removes the watcher daemon's state file.
72
73   Args:
74     node: Node to be reset
75   """
76   master = qa_config.GetMasterNode()
77
78   cmd = ['rm', '-f', constants.WATCHER_STATEFILE]
79   AssertEqual(StartSSH(master['primary'],
80                        utils.ShellQuoteArgs(cmd)).wait(), 0)
81
82
83 def _RunWatcherDaemon():
84   """Runs the ganeti-watcher daemon on the master node.
85
86   """
87   master = qa_config.GetMasterNode()
88
89   cmd = ['ganeti-watcher', '-d']
90   AssertEqual(StartSSH(master['primary'],
91                        utils.ShellQuoteArgs(cmd)).wait(), 0)
92
93
94 def PrintCronWarning():
95   """Shows a warning about the cron job.
96
97   """
98   msg = ("For the following tests it's recommended to turn off the"
99          " ganeti-watcher cronjob.")
100   print
101   print qa_utils.FormatWarning(msg)
102
103
104 @qa_utils.DefineHook('daemon-automatic-restart')
105 def TestInstanceAutomaticRestart(node, instance):
106   """Test automatic restart of instance by ganeti-watcher.
107
108   """
109   master = qa_config.GetMasterNode()
110   inst_name = qa_utils.ResolveInstanceName(instance)
111
112   _ResetWatcherDaemon()
113   _XmShutdownInstance(node, inst_name)
114
115   _RunWatcherDaemon()
116   time.sleep(5)
117
118   if not _InstanceRunning(node, inst_name):
119     raise qa_error.Error("Daemon didn't restart instance")
120
121   cmd = ['gnt-instance', 'info', inst_name]
122   AssertEqual(StartSSH(master['primary'],
123                        utils.ShellQuoteArgs(cmd)).wait(), 0)
124
125
126 @qa_utils.DefineHook('daemon-consecutive-failures')
127 def TestInstanceConsecutiveFailures(node, instance):
128   """Test five consecutive instance failures.
129
130   """
131   master = qa_config.GetMasterNode()
132   inst_name = qa_utils.ResolveInstanceName(instance)
133
134   _ResetWatcherDaemon()
135
136   for should_start in ([True] * 5) + [False]:
137     _XmShutdownInstance(node, inst_name)
138     _RunWatcherDaemon()
139     time.sleep(5)
140
141     if bool(_InstanceRunning(node, inst_name)) != should_start:
142       if should_start:
143         msg = "Instance not started when it should"
144       else:
145         msg = "Instance started when it shouldn't"
146       raise qa_error.Error(msg)
147
148   cmd = ['gnt-instance', 'info', inst_name]
149   AssertEqual(StartSSH(master['primary'],
150                        utils.ShellQuoteArgs(cmd)).wait(), 0)