Statistics
| Branch: | Tag: | Revision:

root / qa / qa_cluster.py @ c99a3cc0

History | View | Annotate | Download (6.5 kB)

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

24 cec9845c Michael Hanselmann
"""
25 cec9845c Michael Hanselmann
26 cec9845c Michael Hanselmann
import tempfile
27 cec9845c Michael Hanselmann
28 cec9845c Michael Hanselmann
from ganeti import utils
29 cec9845c Michael Hanselmann
30 cec9845c Michael Hanselmann
import qa_config
31 cec9845c Michael Hanselmann
import qa_utils
32 cec9845c Michael Hanselmann
import qa_error
33 cec9845c Michael Hanselmann
34 cec9845c Michael Hanselmann
from qa_utils import AssertEqual, StartSSH
35 cec9845c Michael Hanselmann
36 cec9845c Michael Hanselmann
37 830da270 Michael Hanselmann
def _RemoveFileFromAllNodes(filename):
38 830da270 Michael Hanselmann
  """Removes a file from all nodes.
39 830da270 Michael Hanselmann

40 830da270 Michael Hanselmann
  """
41 830da270 Michael Hanselmann
  for node in qa_config.get('nodes'):
42 830da270 Michael Hanselmann
    cmd = ['rm', '-f', filename]
43 830da270 Michael Hanselmann
    AssertEqual(StartSSH(node['primary'],
44 830da270 Michael Hanselmann
                         utils.ShellQuoteArgs(cmd)).wait(), 0)
45 830da270 Michael Hanselmann
46 830da270 Michael Hanselmann
47 830da270 Michael Hanselmann
def _CheckFileOnAllNodes(filename, content):
48 830da270 Michael Hanselmann
  """Verifies the content of the given file on all nodes.
49 830da270 Michael Hanselmann

50 830da270 Michael Hanselmann
  """
51 830da270 Michael Hanselmann
  cmd = utils.ShellQuoteArgs(["cat", filename])
52 830da270 Michael Hanselmann
  for node in qa_config.get('nodes'):
53 830da270 Michael Hanselmann
    AssertEqual(qa_utils.GetCommandOutput(node['primary'], cmd),
54 830da270 Michael Hanselmann
                content)
55 830da270 Michael Hanselmann
56 830da270 Michael Hanselmann
57 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('cluster-init')
58 cec9845c Michael Hanselmann
def TestClusterInit():
59 cec9845c Michael Hanselmann
  """gnt-cluster init"""
60 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
61 cec9845c Michael Hanselmann
62 cec9845c Michael Hanselmann
  cmd = ['gnt-cluster', 'init']
63 cec9845c Michael Hanselmann
64 cec9845c Michael Hanselmann
  if master.get('secondary', None):
65 cec9845c Michael Hanselmann
    cmd.append('--secondary-ip=%s' % master['secondary'])
66 cec9845c Michael Hanselmann
67 cec9845c Michael Hanselmann
  bridge = qa_config.get('bridge', None)
68 cec9845c Michael Hanselmann
  if bridge:
69 cec9845c Michael Hanselmann
    cmd.append('--bridge=%s' % bridge)
70 cec9845c Michael Hanselmann
    cmd.append('--master-netdev=%s' % bridge)
71 cec9845c Michael Hanselmann
72 b32f9859 Iustin Pop
  htype = qa_config.get('hypervisor-type', None)
73 b32f9859 Iustin Pop
  if htype:
74 b32f9859 Iustin Pop
    cmd.append('--hypervisor-type=%s' % htype)
75 b32f9859 Iustin Pop
76 cec9845c Michael Hanselmann
  cmd.append(qa_config.get('name'))
77 cec9845c Michael Hanselmann
78 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
79 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
80 cec9845c Michael Hanselmann
81 cec9845c Michael Hanselmann
82 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('cluster-verify')
83 cec9845c Michael Hanselmann
def TestClusterVerify():
84 cec9845c Michael Hanselmann
  """gnt-cluster verify"""
85 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
86 cec9845c Michael Hanselmann
87 283f9d4c Michael Hanselmann
  cmd = ['gnt-cluster', 'verify']
88 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
89 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
90 cec9845c Michael Hanselmann
91 cec9845c Michael Hanselmann
92 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('cluster-info')
93 cec9845c Michael Hanselmann
def TestClusterInfo():
94 cec9845c Michael Hanselmann
  """gnt-cluster info"""
95 283f9d4c Michael Hanselmann
  master = qa_config.GetMasterNode()
96 283f9d4c Michael Hanselmann
97 cec9845c Michael Hanselmann
  cmd = ['gnt-cluster', 'info']
98 283f9d4c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
99 283f9d4c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
100 283f9d4c Michael Hanselmann
101 283f9d4c Michael Hanselmann
102 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('cluster-getmaster')
103 283f9d4c Michael Hanselmann
def TestClusterGetmaster():
104 283f9d4c Michael Hanselmann
  """gnt-cluster getmaster"""
105 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
106 cec9845c Michael Hanselmann
107 283f9d4c Michael Hanselmann
  cmd = ['gnt-cluster', 'getmaster']
108 283f9d4c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
109 283f9d4c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
110 283f9d4c Michael Hanselmann
111 283f9d4c Michael Hanselmann
112 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('cluster-version')
113 283f9d4c Michael Hanselmann
def TestClusterVersion():
114 283f9d4c Michael Hanselmann
  """gnt-cluster version"""
115 283f9d4c Michael Hanselmann
  master = qa_config.GetMasterNode()
116 283f9d4c Michael Hanselmann
117 283f9d4c Michael Hanselmann
  cmd = ['gnt-cluster', 'version']
118 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
119 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
120 cec9845c Michael Hanselmann
121 cec9845c Michael Hanselmann
122 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('cluster-burnin')
123 cec9845c Michael Hanselmann
def TestClusterBurnin():
124 cec9845c Michael Hanselmann
  """Burnin"""
125 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
126 cec9845c Michael Hanselmann
127 23103544 Michael Hanselmann
  disk_template = (qa_config.get('options', {}).
128 23103544 Michael Hanselmann
                   get('burnin-disk-template', 'remote_raid1'))
129 23103544 Michael Hanselmann
130 cec9845c Michael Hanselmann
  # Get as many instances as we need
131 cec9845c Michael Hanselmann
  instances = []
132 cec9845c Michael Hanselmann
  try:
133 23103544 Michael Hanselmann
    try:
134 23103544 Michael Hanselmann
      num = qa_config.get('options', {}).get('burnin-instances', 1)
135 23103544 Michael Hanselmann
      for _ in xrange(0, num):
136 23103544 Michael Hanselmann
        instances.append(qa_config.AcquireInstance())
137 23103544 Michael Hanselmann
    except qa_error.OutOfInstancesError:
138 23103544 Michael Hanselmann
      print "Not enough instances, continuing anyway."
139 cec9845c Michael Hanselmann
140 23103544 Michael Hanselmann
    if len(instances) < 1:
141 23103544 Michael Hanselmann
      raise qa_error.Error("Burnin needs at least one instance")
142 cec9845c Michael Hanselmann
143 cec9845c Michael Hanselmann
    script = qa_utils.UploadFile(master['primary'], '../tools/burnin')
144 cec9845c Michael Hanselmann
    try:
145 23103544 Michael Hanselmann
      # Run burnin
146 cec9845c Michael Hanselmann
      cmd = [script,
147 cec9845c Michael Hanselmann
             '--os=%s' % qa_config.get('os'),
148 cec9845c Michael Hanselmann
             '--os-size=%s' % qa_config.get('os-size'),
149 23103544 Michael Hanselmann
             '--swap-size=%s' % qa_config.get('swap-size'),
150 23103544 Michael Hanselmann
             '--disk-template=%s' % disk_template]
151 cec9845c Michael Hanselmann
      cmd += [inst['name'] for inst in instances]
152 cec9845c Michael Hanselmann
      AssertEqual(StartSSH(master['primary'],
153 cec9845c Michael Hanselmann
                           utils.ShellQuoteArgs(cmd)).wait(), 0)
154 cec9845c Michael Hanselmann
    finally:
155 cec9845c Michael Hanselmann
      cmd = ['rm', '-f', script]
156 cec9845c Michael Hanselmann
      AssertEqual(StartSSH(master['primary'],
157 cec9845c Michael Hanselmann
                           utils.ShellQuoteArgs(cmd)).wait(), 0)
158 cec9845c Michael Hanselmann
  finally:
159 cec9845c Michael Hanselmann
    for inst in instances:
160 cec9845c Michael Hanselmann
      qa_config.ReleaseInstance(inst)
161 cec9845c Michael Hanselmann
162 cec9845c Michael Hanselmann
163 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('cluster-master-failover')
164 cec9845c Michael Hanselmann
def TestClusterMasterFailover():
165 cec9845c Michael Hanselmann
  """gnt-cluster masterfailover"""
166 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
167 cec9845c Michael Hanselmann
168 cec9845c Michael Hanselmann
  failovermaster = qa_config.AcquireNode(exclude=master)
169 cec9845c Michael Hanselmann
  try:
170 cec9845c Michael Hanselmann
    cmd = ['gnt-cluster', 'masterfailover']
171 cec9845c Michael Hanselmann
    AssertEqual(StartSSH(failovermaster['primary'],
172 cec9845c Michael Hanselmann
                         utils.ShellQuoteArgs(cmd)).wait(), 0)
173 cec9845c Michael Hanselmann
174 cec9845c Michael Hanselmann
    cmd = ['gnt-cluster', 'masterfailover']
175 cec9845c Michael Hanselmann
    AssertEqual(StartSSH(master['primary'],
176 cec9845c Michael Hanselmann
                         utils.ShellQuoteArgs(cmd)).wait(), 0)
177 cec9845c Michael Hanselmann
  finally:
178 cec9845c Michael Hanselmann
    qa_config.ReleaseNode(failovermaster)
179 cec9845c Michael Hanselmann
180 cec9845c Michael Hanselmann
181 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('cluster-copyfile')
182 cec9845c Michael Hanselmann
def TestClusterCopyfile():
183 cec9845c Michael Hanselmann
  """gnt-cluster copyfile"""
184 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
185 cec9845c Michael Hanselmann
186 24818e8f Michael Hanselmann
  uniqueid = utils.NewUUID()
187 830da270 Michael Hanselmann
188 cec9845c Michael Hanselmann
  # Create temporary file
189 cec9845c Michael Hanselmann
  f = tempfile.NamedTemporaryFile()
190 830da270 Michael Hanselmann
  f.write(uniqueid)
191 cec9845c Michael Hanselmann
  f.flush()
192 cec9845c Michael Hanselmann
  f.seek(0)
193 cec9845c Michael Hanselmann
194 cec9845c Michael Hanselmann
  # Upload file to master node
195 cec9845c Michael Hanselmann
  testname = qa_utils.UploadFile(master['primary'], f.name)
196 cec9845c Michael Hanselmann
  try:
197 cec9845c Michael Hanselmann
    # Copy file to all nodes
198 cec9845c Michael Hanselmann
    cmd = ['gnt-cluster', 'copyfile', testname]
199 cec9845c Michael Hanselmann
    AssertEqual(StartSSH(master['primary'],
200 cec9845c Michael Hanselmann
                         utils.ShellQuoteArgs(cmd)).wait(), 0)
201 830da270 Michael Hanselmann
    _CheckFileOnAllNodes(testname, uniqueid)
202 cec9845c Michael Hanselmann
  finally:
203 830da270 Michael Hanselmann
    _RemoveFileFromAllNodes(testname)
204 830da270 Michael Hanselmann
205 830da270 Michael Hanselmann
206 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('cluster-command')
207 830da270 Michael Hanselmann
def TestClusterCommand():
208 830da270 Michael Hanselmann
  """gnt-cluster command"""
209 830da270 Michael Hanselmann
  master = qa_config.GetMasterNode()
210 830da270 Michael Hanselmann
211 24818e8f Michael Hanselmann
  uniqueid = utils.NewUUID()
212 24818e8f Michael Hanselmann
  rfile = "/tmp/gnt%s" % utils.NewUUID()
213 830da270 Michael Hanselmann
  rcmd = utils.ShellQuoteArgs(['echo', '-n', uniqueid])
214 830da270 Michael Hanselmann
  cmd = utils.ShellQuoteArgs(['gnt-cluster', 'command',
215 830da270 Michael Hanselmann
                              "%s >%s" % (rcmd, rfile)])
216 830da270 Michael Hanselmann
217 830da270 Michael Hanselmann
  try:
218 830da270 Michael Hanselmann
    AssertEqual(StartSSH(master['primary'], cmd).wait(), 0)
219 830da270 Michael Hanselmann
    _CheckFileOnAllNodes(rfile, uniqueid)
220 830da270 Michael Hanselmann
  finally:
221 830da270 Michael Hanselmann
    _RemoveFileFromAllNodes(rfile)
222 cec9845c Michael Hanselmann
223 cec9845c Michael Hanselmann
224 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('cluster-destroy')
225 cec9845c Michael Hanselmann
def TestClusterDestroy():
226 cec9845c Michael Hanselmann
  """gnt-cluster destroy"""
227 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
228 cec9845c Michael Hanselmann
229 283f9d4c Michael Hanselmann
  cmd = ['gnt-cluster', 'destroy', '--yes-do-it']
230 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
231 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)