Statistics
| Branch: | Tag: | Revision:

root / qa / qa_daemon.py @ 5d640672

History | View | Annotate | Download (3.7 kB)

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 TestInstanceAutomaticRestart(node, instance):
82
  """Test automatic restart of instance by ganeti-watcher.
83

84
  Note: takes up to 6 minutes to complete.
85
  """
86
  master = qa_config.GetMasterNode()
87
  inst_name = qa_utils.ResolveInstanceName(instance)
88

    
89
  _ResetWatcherDaemon(node)
90
  _XmShutdownInstance(node, inst_name)
91

    
92
  # Give it a bit more than five minutes to start again
93
  restart_at = time.time() + 330
94

    
95
  # Wait until it's running again
96
  while time.time() <= restart_at:
97
    if _InstanceRunning(node, inst_name):
98
      break
99
    time.sleep(15)
100
  else:
101
    raise qa_error.Error("Daemon didn't restart instance in time")
102

    
103
  cmd = ['gnt-instance', 'info', inst_name]
104
  AssertEqual(StartSSH(master['primary'],
105
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
106

    
107

    
108
def TestInstanceConsecutiveFailures(node, instance):
109
  """Test five consecutive instance failures.
110

111
  Note: takes at least 35 minutes to complete.
112
  """
113
  master = qa_config.GetMasterNode()
114
  inst_name = qa_utils.ResolveInstanceName(instance)
115

    
116
  _ResetWatcherDaemon(node)
117
  _XmShutdownInstance(node, inst_name)
118

    
119
  # Do shutdowns for 30 minutes
120
  finished_at = time.time() + (35 * 60)
121

    
122
  while time.time() <= finished_at:
123
    if _InstanceRunning(node, inst_name):
124
      _XmShutdownInstance(node, inst_name)
125
    time.sleep(30)
126

    
127
  # Check for some time whether the instance doesn't start again
128
  check_until = time.time() + 330
129
  while time.time() <= check_until:
130
    if _InstanceRunning(node, inst_name):
131
      raise qa_error.Error("Instance started when it shouldn't")
132
    time.sleep(30)
133

    
134
  cmd = ['gnt-instance', 'info', inst_name]
135
  AssertEqual(StartSSH(master['primary'],
136
                       utils.ShellQuoteArgs(cmd)).wait(), 0)