Statistics
| Branch: | Tag: | Revision:

root / qa / qa_daemon.py @ d06565e0

History | View | Annotate | Download (3.9 kB)

1 cec9845c Michael Hanselmann
# Copyright (C) 2007 Google Inc.
2 cec9845c Michael Hanselmann
#
3 cec9845c Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
4 cec9845c Michael Hanselmann
# it under the terms of the GNU General Public License as published by
5 cec9845c Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
6 cec9845c Michael Hanselmann
# (at your option) any later version.
7 cec9845c Michael Hanselmann
#
8 cec9845c Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
9 cec9845c Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
10 cec9845c Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 cec9845c Michael Hanselmann
# General Public License for more details.
12 cec9845c Michael Hanselmann
#
13 cec9845c Michael Hanselmann
# You should have received a copy of the GNU General Public License
14 cec9845c Michael Hanselmann
# along with this program; if not, write to the Free Software
15 cec9845c Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16 cec9845c Michael Hanselmann
# 02110-1301, USA.
17 cec9845c Michael Hanselmann
18 cec9845c Michael Hanselmann
19 cec9845c Michael Hanselmann
"""Daemon related QA tests.
20 cec9845c Michael Hanselmann

21 cec9845c Michael Hanselmann
"""
22 cec9845c Michael Hanselmann
23 cec9845c Michael Hanselmann
import time
24 cec9845c Michael Hanselmann
25 cec9845c Michael Hanselmann
from ganeti import utils
26 cec9845c Michael Hanselmann
from ganeti import constants
27 cec9845c Michael Hanselmann
28 cec9845c Michael Hanselmann
import qa_config
29 cec9845c Michael Hanselmann
import qa_utils
30 cec9845c Michael Hanselmann
import qa_error
31 cec9845c Michael Hanselmann
32 cec9845c Michael Hanselmann
from qa_utils import AssertEqual, StartSSH
33 cec9845c Michael Hanselmann
34 cec9845c Michael Hanselmann
35 cec9845c Michael Hanselmann
def _InstanceRunning(node, name):
36 cec9845c Michael Hanselmann
  """Checks whether an instance is running.
37 cec9845c Michael Hanselmann

38 cec9845c Michael Hanselmann
  Args:
39 cec9845c Michael Hanselmann
    node: Node the instance runs on
40 cec9845c Michael Hanselmann
    name: Full name of Xen instance
41 cec9845c Michael Hanselmann
  """
42 cec9845c Michael Hanselmann
  cmd = utils.ShellQuoteArgs(['xm', 'list', name]) + ' >/dev/null'
43 cec9845c Michael Hanselmann
  ret = StartSSH(node['primary'], cmd).wait()
44 cec9845c Michael Hanselmann
  return ret == 0
45 cec9845c Michael Hanselmann
46 cec9845c Michael Hanselmann
47 cec9845c Michael Hanselmann
def _XmShutdownInstance(node, name):
48 cec9845c Michael Hanselmann
  """Shuts down instance using "xm" and waits for completion.
49 cec9845c Michael Hanselmann

50 cec9845c Michael Hanselmann
  Args:
51 cec9845c Michael Hanselmann
    node: Node the instance runs on
52 cec9845c Michael Hanselmann
    name: Full name of Xen instance
53 cec9845c Michael Hanselmann
  """
54 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
55 cec9845c Michael Hanselmann
56 cec9845c Michael Hanselmann
  cmd = ['xm', 'shutdown', name]
57 5d640672 Michael Hanselmann
  AssertEqual(StartSSH(node['primary'],
58 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
59 cec9845c Michael Hanselmann
60 cec9845c Michael Hanselmann
  # Wait up to a minute
61 cec9845c Michael Hanselmann
  end = time.time() + 60
62 cec9845c Michael Hanselmann
  while time.time() <= end:
63 cec9845c Michael Hanselmann
    if not _InstanceRunning(node, name):
64 cec9845c Michael Hanselmann
      break
65 cec9845c Michael Hanselmann
    time.sleep(5)
66 cec9845c Michael Hanselmann
  else:
67 cec9845c Michael Hanselmann
    raise qa_error.Error("xm shutdown failed")
68 cec9845c Michael Hanselmann
69 cec9845c Michael Hanselmann
70 cec9845c Michael Hanselmann
def _ResetWatcherDaemon(node):
71 cec9845c Michael Hanselmann
  """Removes the watcher daemon's state file.
72 cec9845c Michael Hanselmann

73 cec9845c Michael Hanselmann
  Args:
74 cec9845c Michael Hanselmann
    node: Node to be reset
75 cec9845c Michael Hanselmann
  """
76 cec9845c Michael Hanselmann
  cmd = ['rm', '-f', constants.WATCHER_STATEFILE]
77 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(node['primary'],
78 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
79 cec9845c Michael Hanselmann
80 cec9845c Michael Hanselmann
81 23269c5b Michael Hanselmann
def PrintCronWarning():
82 23269c5b Michael Hanselmann
  """Shows a warning about the required cron job.
83 23269c5b Michael Hanselmann

84 23269c5b Michael Hanselmann
  """
85 23269c5b Michael Hanselmann
  print
86 dfe11bad Michael Hanselmann
  print qa_utils.FormatWarning("The following tests require the cron script "
87 dfe11bad Michael Hanselmann
                               "for ganeti-watcher to be set up.")
88 23269c5b Michael Hanselmann
89 23269c5b Michael Hanselmann
90 cec9845c Michael Hanselmann
def TestInstanceAutomaticRestart(node, instance):
91 cec9845c Michael Hanselmann
  """Test automatic restart of instance by ganeti-watcher.
92 cec9845c Michael Hanselmann

93 cec9845c Michael Hanselmann
  Note: takes up to 6 minutes to complete.
94 cec9845c Michael Hanselmann
  """
95 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
96 5d640672 Michael Hanselmann
  inst_name = qa_utils.ResolveInstanceName(instance)
97 cec9845c Michael Hanselmann
98 cec9845c Michael Hanselmann
  _ResetWatcherDaemon(node)
99 cec9845c Michael Hanselmann
  _XmShutdownInstance(node, inst_name)
100 cec9845c Michael Hanselmann
101 cec9845c Michael Hanselmann
  # Give it a bit more than five minutes to start again
102 cec9845c Michael Hanselmann
  restart_at = time.time() + 330
103 cec9845c Michael Hanselmann
104 cec9845c Michael Hanselmann
  # Wait until it's running again
105 cec9845c Michael Hanselmann
  while time.time() <= restart_at:
106 cec9845c Michael Hanselmann
    if _InstanceRunning(node, inst_name):
107 cec9845c Michael Hanselmann
      break
108 cec9845c Michael Hanselmann
    time.sleep(15)
109 cec9845c Michael Hanselmann
  else:
110 cec9845c Michael Hanselmann
    raise qa_error.Error("Daemon didn't restart instance in time")
111 cec9845c Michael Hanselmann
112 cec9845c Michael Hanselmann
  cmd = ['gnt-instance', 'info', inst_name]
113 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
114 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
115 cec9845c Michael Hanselmann
116 cec9845c Michael Hanselmann
117 cec9845c Michael Hanselmann
def TestInstanceConsecutiveFailures(node, instance):
118 cec9845c Michael Hanselmann
  """Test five consecutive instance failures.
119 cec9845c Michael Hanselmann

120 cec9845c Michael Hanselmann
  Note: takes at least 35 minutes to complete.
121 cec9845c Michael Hanselmann
  """
122 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
123 5d640672 Michael Hanselmann
  inst_name = qa_utils.ResolveInstanceName(instance)
124 cec9845c Michael Hanselmann
125 cec9845c Michael Hanselmann
  _ResetWatcherDaemon(node)
126 cec9845c Michael Hanselmann
  _XmShutdownInstance(node, inst_name)
127 cec9845c Michael Hanselmann
128 cec9845c Michael Hanselmann
  # Do shutdowns for 30 minutes
129 cec9845c Michael Hanselmann
  finished_at = time.time() + (35 * 60)
130 cec9845c Michael Hanselmann
131 cec9845c Michael Hanselmann
  while time.time() <= finished_at:
132 cec9845c Michael Hanselmann
    if _InstanceRunning(node, inst_name):
133 cec9845c Michael Hanselmann
      _XmShutdownInstance(node, inst_name)
134 cec9845c Michael Hanselmann
    time.sleep(30)
135 cec9845c Michael Hanselmann
136 cec9845c Michael Hanselmann
  # Check for some time whether the instance doesn't start again
137 cec9845c Michael Hanselmann
  check_until = time.time() + 330
138 cec9845c Michael Hanselmann
  while time.time() <= check_until:
139 cec9845c Michael Hanselmann
    if _InstanceRunning(node, inst_name):
140 cec9845c Michael Hanselmann
      raise qa_error.Error("Instance started when it shouldn't")
141 cec9845c Michael Hanselmann
    time.sleep(30)
142 cec9845c Michael Hanselmann
143 cec9845c Michael Hanselmann
  cmd = ['gnt-instance', 'info', inst_name]
144 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
145 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)