Statistics
| Branch: | Tag: | Revision:

root / qa / qa_cluster.py @ 04b8aebf

History | View | Annotate | Download (16.5 kB)

1 c68d1f43 Michael Hanselmann
#
2 c68d1f43 Michael Hanselmann
#
3 c68d1f43 Michael Hanselmann
4 69df9d2b Iustin Pop
# Copyright (C) 2007, 2010, 2011 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 49ceab21 Michael Hanselmann
import os.path
28 cec9845c Michael Hanselmann
29 6d4a1656 Michael Hanselmann
from ganeti import constants
30 66d1f035 René Nussbaumer
from ganeti import compat
31 cec9845c Michael Hanselmann
from ganeti import utils
32 cec9845c Michael Hanselmann
33 cec9845c Michael Hanselmann
import qa_config
34 cec9845c Michael Hanselmann
import qa_utils
35 cec9845c Michael Hanselmann
import qa_error
36 cec9845c Michael Hanselmann
37 66d1f035 René Nussbaumer
from qa_utils import AssertEqual, AssertCommand, GetCommandOutput
38 cec9845c Michael Hanselmann
39 cec9845c Michael Hanselmann
40 c2a0947d Iustin Pop
#: cluster verify command
41 c2a0947d Iustin Pop
_CLUSTER_VERIFY = ["gnt-cluster", "verify"]
42 c2a0947d Iustin Pop
43 21bf2e2e Andrea Spadaccini
44 830da270 Michael Hanselmann
def _RemoveFileFromAllNodes(filename):
45 830da270 Michael Hanselmann
  """Removes a file from all nodes.
46 830da270 Michael Hanselmann

47 830da270 Michael Hanselmann
  """
48 2f4b4f78 Iustin Pop
  for node in qa_config.get("nodes"):
49 2f4b4f78 Iustin Pop
    AssertCommand(["rm", "-f", filename], node=node)
50 830da270 Michael Hanselmann
51 830da270 Michael Hanselmann
52 830da270 Michael Hanselmann
def _CheckFileOnAllNodes(filename, content):
53 830da270 Michael Hanselmann
  """Verifies the content of the given file on all nodes.
54 830da270 Michael Hanselmann

55 830da270 Michael Hanselmann
  """
56 830da270 Michael Hanselmann
  cmd = utils.ShellQuoteArgs(["cat", filename])
57 2f4b4f78 Iustin Pop
  for node in qa_config.get("nodes"):
58 2f4b4f78 Iustin Pop
    AssertEqual(qa_utils.GetCommandOutput(node["primary"], cmd), content)
59 830da270 Michael Hanselmann
60 830da270 Michael Hanselmann
61 725ec2f1 René Nussbaumer
def TestClusterInit(rapi_user, rapi_secret):
62 cec9845c Michael Hanselmann
  """gnt-cluster init"""
63 13d2e231 Andrea Spadaccini
  # data for testing failures due to bad keys/values for disk parameters
64 13d2e231 Andrea Spadaccini
  fail_params = ("-D nonexistent:resync-rate=1",
65 13d2e231 Andrea Spadaccini
                 "-D drbd:nonexistent=1",
66 13d2e231 Andrea Spadaccini
                 "-D drbd:resync-rate=invalid")
67 13d2e231 Andrea Spadaccini
68 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
69 cec9845c Michael Hanselmann
70 49ceab21 Michael Hanselmann
  rapi_dir = os.path.dirname(constants.RAPI_USERS_FILE)
71 49ceab21 Michael Hanselmann
72 725ec2f1 René Nussbaumer
  # First create the RAPI credentials
73 a62d1901 Michael Hanselmann
  fh = tempfile.NamedTemporaryFile()
74 a62d1901 Michael Hanselmann
  try:
75 a62d1901 Michael Hanselmann
    fh.write("%s %s write\n" % (rapi_user, rapi_secret))
76 a62d1901 Michael Hanselmann
    fh.flush()
77 a62d1901 Michael Hanselmann
78 a62d1901 Michael Hanselmann
    tmpru = qa_utils.UploadFile(master["primary"], fh.name)
79 a62d1901 Michael Hanselmann
    try:
80 49ceab21 Michael Hanselmann
      AssertCommand(["mkdir", "-p", rapi_dir])
81 2f4b4f78 Iustin Pop
      AssertCommand(["mv", tmpru, constants.RAPI_USERS_FILE])
82 a62d1901 Michael Hanselmann
    finally:
83 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", tmpru])
84 a62d1901 Michael Hanselmann
  finally:
85 a62d1901 Michael Hanselmann
    fh.close()
86 a62d1901 Michael Hanselmann
87 a62d1901 Michael Hanselmann
  # Initialize cluster
88 d0c8c01d Iustin Pop
  cmd = ["gnt-cluster", "init"]
89 cec9845c Michael Hanselmann
90 9486f6ae Manuel Franceschini
  cmd.append("--primary-ip-version=%d" %
91 9486f6ae Manuel Franceschini
             qa_config.get("primary_ip_version", 4))
92 04b8aebf Agata Murawska
  cmd.append("--specs-mem-size=max=1024")
93 04b8aebf Agata Murawska
  cmd.append("--specs-disk-size=min=512")
94 9486f6ae Manuel Franceschini
95 d0c8c01d Iustin Pop
  if master.get("secondary", None):
96 d0c8c01d Iustin Pop
    cmd.append("--secondary-ip=%s" % master["secondary"])
97 cec9845c Michael Hanselmann
98 d0c8c01d Iustin Pop
  bridge = qa_config.get("bridge", None)
99 cec9845c Michael Hanselmann
  if bridge:
100 d0c8c01d Iustin Pop
    cmd.append("--bridge=%s" % bridge)
101 d0c8c01d Iustin Pop
    cmd.append("--master-netdev=%s" % bridge)
102 cec9845c Michael Hanselmann
103 d0c8c01d Iustin Pop
  htype = qa_config.get("enabled-hypervisors", None)
104 b32f9859 Iustin Pop
  if htype:
105 d0c8c01d Iustin Pop
    cmd.append("--enabled-hypervisors=%s" % htype)
106 b32f9859 Iustin Pop
107 13d2e231 Andrea Spadaccini
  # test gnt-cluster init failures due to bad keys/values in disk parameters
108 13d2e231 Andrea Spadaccini
  for param in fail_params:
109 13d2e231 Andrea Spadaccini
    cmd.extend([param, qa_config.get("name")])
110 13d2e231 Andrea Spadaccini
    AssertCommand(cmd, fail=True)
111 13d2e231 Andrea Spadaccini
    cmd.pop()
112 13d2e231 Andrea Spadaccini
    cmd.pop()
113 cec9845c Michael Hanselmann
114 13d2e231 Andrea Spadaccini
  cmd.append(qa_config.get("name"))
115 2f4b4f78 Iustin Pop
  AssertCommand(cmd)
116 cec9845c Michael Hanselmann
117 5abecc1c Iustin Pop
  cmd = ["gnt-cluster", "modify"]
118 13d2e231 Andrea Spadaccini
  # test gnt-cluster modify failures due to bad keys/values in disk parameters
119 13d2e231 Andrea Spadaccini
  for param in fail_params:
120 13d2e231 Andrea Spadaccini
    cmd.append(param)
121 13d2e231 Andrea Spadaccini
    AssertCommand(cmd, fail=True)
122 13d2e231 Andrea Spadaccini
    cmd.pop()
123 13d2e231 Andrea Spadaccini
124 5abecc1c Iustin Pop
  # hypervisor parameter modifications
125 5abecc1c Iustin Pop
  hvp = qa_config.get("hypervisor-parameters", {})
126 5abecc1c Iustin Pop
  for k, v in hvp.items():
127 5abecc1c Iustin Pop
    cmd.extend(["-H", "%s:%s" % (k, v)])
128 5abecc1c Iustin Pop
  # backend parameter modifications
129 5abecc1c Iustin Pop
  bep = qa_config.get("backend-parameters", "")
130 5abecc1c Iustin Pop
  if bep:
131 5abecc1c Iustin Pop
    cmd.extend(["-B", bep])
132 5abecc1c Iustin Pop
133 5abecc1c Iustin Pop
  if len(cmd) > 2:
134 5abecc1c Iustin Pop
    AssertCommand(cmd)
135 5abecc1c Iustin Pop
136 5abecc1c Iustin Pop
  # OS parameters
137 5abecc1c Iustin Pop
  osp = qa_config.get("os-parameters", {})
138 5abecc1c Iustin Pop
  for k, v in osp.items():
139 5abecc1c Iustin Pop
    AssertCommand(["gnt-os", "modify", "-O", v, k])
140 5abecc1c Iustin Pop
141 5abecc1c Iustin Pop
  # OS hypervisor parameters
142 5abecc1c Iustin Pop
  os_hvp = qa_config.get("os-hvp", {})
143 5abecc1c Iustin Pop
  for os_name in os_hvp:
144 5abecc1c Iustin Pop
    for hv, hvp in os_hvp[os_name].items():
145 5abecc1c Iustin Pop
      AssertCommand(["gnt-os", "modify", "-H", "%s:%s" % (hv, hvp), os_name])
146 5abecc1c Iustin Pop
147 cec9845c Michael Hanselmann
148 caea3b32 Iustin Pop
def TestClusterRename():
149 caea3b32 Iustin Pop
  """gnt-cluster rename"""
150 d0c8c01d Iustin Pop
  cmd = ["gnt-cluster", "rename", "-f"]
151 caea3b32 Iustin Pop
152 d0c8c01d Iustin Pop
  original_name = qa_config.get("name")
153 d0c8c01d Iustin Pop
  rename_target = qa_config.get("rename", None)
154 caea3b32 Iustin Pop
  if rename_target is None:
155 caea3b32 Iustin Pop
    print qa_utils.FormatError('"rename" entry is missing')
156 caea3b32 Iustin Pop
    return
157 caea3b32 Iustin Pop
158 2f4b4f78 Iustin Pop
  for data in [
159 2f4b4f78 Iustin Pop
    cmd + [rename_target],
160 c2a0947d Iustin Pop
    _CLUSTER_VERIFY,
161 2f4b4f78 Iustin Pop
    cmd + [original_name],
162 c2a0947d Iustin Pop
    _CLUSTER_VERIFY,
163 2f4b4f78 Iustin Pop
    ]:
164 2f4b4f78 Iustin Pop
    AssertCommand(data)
165 caea3b32 Iustin Pop
166 caea3b32 Iustin Pop
167 69df9d2b Iustin Pop
def TestClusterOob():
168 69df9d2b Iustin Pop
  """out-of-band framework"""
169 f55312bd René Nussbaumer
  oob_path_exists = "/tmp/ganeti-qa-oob-does-exist-%s" % utils.NewUUID()
170 f55312bd René Nussbaumer
171 c2a0947d Iustin Pop
  AssertCommand(_CLUSTER_VERIFY)
172 f55312bd René Nussbaumer
  AssertCommand(["gnt-cluster", "modify", "--node-parameters",
173 f55312bd René Nussbaumer
                 "oob_program=/tmp/ganeti-qa-oob-does-not-exist-%s" %
174 f55312bd René Nussbaumer
                 utils.NewUUID()])
175 f55312bd René Nussbaumer
176 c2a0947d Iustin Pop
  AssertCommand(_CLUSTER_VERIFY, fail=True)
177 f55312bd René Nussbaumer
178 69df9d2b Iustin Pop
  AssertCommand(["touch", oob_path_exists])
179 69df9d2b Iustin Pop
  AssertCommand(["chmod", "0400", oob_path_exists])
180 69df9d2b Iustin Pop
  AssertCommand(["gnt-cluster", "copyfile", oob_path_exists])
181 f55312bd René Nussbaumer
182 f55312bd René Nussbaumer
  try:
183 f55312bd René Nussbaumer
    AssertCommand(["gnt-cluster", "modify", "--node-parameters",
184 f55312bd René Nussbaumer
                   "oob_program=%s" % oob_path_exists])
185 f55312bd René Nussbaumer
186 c2a0947d Iustin Pop
    AssertCommand(_CLUSTER_VERIFY, fail=True)
187 f55312bd René Nussbaumer
188 69df9d2b Iustin Pop
    AssertCommand(["chmod", "0500", oob_path_exists])
189 69df9d2b Iustin Pop
    AssertCommand(["gnt-cluster", "copyfile", oob_path_exists])
190 f55312bd René Nussbaumer
191 c2a0947d Iustin Pop
    AssertCommand(_CLUSTER_VERIFY)
192 f55312bd René Nussbaumer
  finally:
193 69df9d2b Iustin Pop
    AssertCommand(["gnt-cluster", "command", "rm", oob_path_exists])
194 f55312bd René Nussbaumer
195 f55312bd René Nussbaumer
  AssertCommand(["gnt-cluster", "modify", "--node-parameters",
196 f55312bd René Nussbaumer
                 "oob_program="])
197 69df9d2b Iustin Pop
198 69df9d2b Iustin Pop
199 66d1f035 René Nussbaumer
def TestClusterEpo():
200 66d1f035 René Nussbaumer
  """gnt-cluster epo"""
201 66d1f035 René Nussbaumer
  master = qa_config.GetMasterNode()
202 66d1f035 René Nussbaumer
203 66d1f035 René Nussbaumer
  # Assert that OOB is unavailable for all nodes
204 66d1f035 René Nussbaumer
  result_output = GetCommandOutput(master["primary"],
205 66d1f035 René Nussbaumer
                                   "gnt-node list --verbose --no-header -o"
206 66d1f035 René Nussbaumer
                                   " powered")
207 66d1f035 René Nussbaumer
  AssertEqual(compat.all(powered == "(unavail)"
208 66d1f035 René Nussbaumer
                         for powered in result_output.splitlines()), True)
209 66d1f035 René Nussbaumer
210 66d1f035 René Nussbaumer
  # Conflicting
211 66d1f035 René Nussbaumer
  AssertCommand(["gnt-cluster", "epo", "--groups", "--all"], fail=True)
212 66d1f035 René Nussbaumer
  # --all doesn't expect arguments
213 66d1f035 René Nussbaumer
  AssertCommand(["gnt-cluster", "epo", "--all", "some_arg"], fail=True)
214 66d1f035 René Nussbaumer
215 66d1f035 René Nussbaumer
  # Unless --all is given master is not allowed to be in the list
216 66d1f035 René Nussbaumer
  AssertCommand(["gnt-cluster", "epo", "-f", master["primary"]], fail=True)
217 66d1f035 René Nussbaumer
218 66d1f035 René Nussbaumer
  # This shouldn't fail
219 66d1f035 René Nussbaumer
  AssertCommand(["gnt-cluster", "epo", "-f", "--all"])
220 66d1f035 René Nussbaumer
221 66d1f035 René Nussbaumer
  # All instances should have been stopped now
222 66d1f035 René Nussbaumer
  result_output = GetCommandOutput(master["primary"],
223 66d1f035 René Nussbaumer
                                   "gnt-instance list --no-header -o status")
224 66d1f035 René Nussbaumer
  AssertEqual(compat.all(status == "ADMIN_down"
225 66d1f035 René Nussbaumer
                         for status in result_output.splitlines()), True)
226 66d1f035 René Nussbaumer
227 66d1f035 René Nussbaumer
  # Now start everything again
228 66d1f035 René Nussbaumer
  AssertCommand(["gnt-cluster", "epo", "--on", "-f", "--all"])
229 66d1f035 René Nussbaumer
230 66d1f035 René Nussbaumer
  # All instances should have been started now
231 66d1f035 René Nussbaumer
  result_output = GetCommandOutput(master["primary"],
232 66d1f035 René Nussbaumer
                                   "gnt-instance list --no-header -o status")
233 66d1f035 René Nussbaumer
  AssertEqual(compat.all(status == "running"
234 66d1f035 René Nussbaumer
                         for status in result_output.splitlines()), True)
235 66d1f035 René Nussbaumer
236 66d1f035 René Nussbaumer
237 69df9d2b Iustin Pop
def TestClusterVerify():
238 69df9d2b Iustin Pop
  """gnt-cluster verify"""
239 c2a0947d Iustin Pop
  AssertCommand(_CLUSTER_VERIFY)
240 c6953b6e Iustin Pop
  AssertCommand(["gnt-cluster", "verify-disks"])
241 cec9845c Michael Hanselmann
242 1377433b Michael Hanselmann
243 1377433b Michael Hanselmann
def TestJobqueue():
244 1377433b Michael Hanselmann
  """gnt-debug test-jobqueue"""
245 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-debug", "test-jobqueue"])
246 1377433b Michael Hanselmann
247 1377433b Michael Hanselmann
248 5a85b99e Michael Hanselmann
def TestDelay(node):
249 5a85b99e Michael Hanselmann
  """gnt-debug delay"""
250 5a85b99e Michael Hanselmann
  AssertCommand(["gnt-debug", "delay", "1"])
251 5a85b99e Michael Hanselmann
  AssertCommand(["gnt-debug", "delay", "--no-master", "1"])
252 5a85b99e Michael Hanselmann
  AssertCommand(["gnt-debug", "delay", "--no-master",
253 5a85b99e Michael Hanselmann
                 "-n", node["primary"], "1"])
254 5a85b99e Michael Hanselmann
255 5a85b99e Michael Hanselmann
256 452913ed Iustin Pop
def TestClusterReservedLvs():
257 452913ed Iustin Pop
  """gnt-cluster reserved lvs"""
258 2f4b4f78 Iustin Pop
  for fail, cmd in [
259 c2a0947d Iustin Pop
    (False, _CLUSTER_VERIFY),
260 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "--reserved-lvs", ""]),
261 2f4b4f78 Iustin Pop
    (False, ["lvcreate", "-L1G", "-nqa-test", "xenvg"]),
262 21bf2e2e Andrea Spadaccini
    (True, _CLUSTER_VERIFY),
263 84d7e26b Dmitry Chernyak
    (False, ["gnt-cluster", "modify", "--reserved-lvs",
264 84d7e26b Dmitry Chernyak
             "xenvg/qa-test,.*/other-test"]),
265 c2a0947d Iustin Pop
    (False, _CLUSTER_VERIFY),
266 84d7e26b Dmitry Chernyak
    (False, ["gnt-cluster", "modify", "--reserved-lvs", ".*/qa-.*"]),
267 c2a0947d Iustin Pop
    (False, _CLUSTER_VERIFY),
268 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "--reserved-lvs", ""]),
269 21bf2e2e Andrea Spadaccini
    (True, _CLUSTER_VERIFY),
270 2f4b4f78 Iustin Pop
    (False, ["lvremove", "-f", "xenvg/qa-test"]),
271 c2a0947d Iustin Pop
    (False, _CLUSTER_VERIFY),
272 452913ed Iustin Pop
    ]:
273 2f4b4f78 Iustin Pop
    AssertCommand(cmd, fail=fail)
274 452913ed Iustin Pop
275 cec9845c Michael Hanselmann
276 9738ca94 Iustin Pop
def TestClusterModifyBe():
277 9738ca94 Iustin Pop
  """gnt-cluster modify -B"""
278 2f4b4f78 Iustin Pop
  for fail, cmd in [
279 8ccbbe4b Guido Trotter
    # max/min mem
280 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "maxmem=256"]),
281 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 256$'"]),
282 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "minmem=256"]),
283 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 256$'"]),
284 8ccbbe4b Guido Trotter
    (True, ["gnt-cluster", "modify", "-B", "maxmem=a"]),
285 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 256$'"]),
286 8ccbbe4b Guido Trotter
    (True, ["gnt-cluster", "modify", "-B", "minmem=a"]),
287 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 256$'"]),
288 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "maxmem=128,minmem=128"]),
289 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 128$'"]),
290 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 128$'"]),
291 9738ca94 Iustin Pop
    # vcpus
292 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "vcpus=4"]),
293 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *vcpus: 4$'"]),
294 21bf2e2e Andrea Spadaccini
    (True, ["gnt-cluster", "modify", "-B", "vcpus=a"]),
295 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "vcpus=1"]),
296 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *vcpus: 1$'"]),
297 9738ca94 Iustin Pop
    # auto_balance
298 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "auto_balance=False"]),
299 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *auto_balance: False$'"]),
300 21bf2e2e Andrea Spadaccini
    (True, ["gnt-cluster", "modify", "-B", "auto_balance=1"]),
301 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "auto_balance=True"]),
302 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *auto_balance: True$'"]),
303 9738ca94 Iustin Pop
    ]:
304 2f4b4f78 Iustin Pop
    AssertCommand(cmd, fail=fail)
305 9738ca94 Iustin Pop
306 5abecc1c Iustin Pop
  # redo the original-requested BE parameters, if any
307 5abecc1c Iustin Pop
  bep = qa_config.get("backend-parameters", "")
308 5abecc1c Iustin Pop
  if bep:
309 5abecc1c Iustin Pop
    AssertCommand(["gnt-cluster", "modify", "-B", bep])
310 9738ca94 Iustin Pop
311 21bf2e2e Andrea Spadaccini
312 cec9845c Michael Hanselmann
def TestClusterInfo():
313 cec9845c Michael Hanselmann
  """gnt-cluster info"""
314 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "info"])
315 283f9d4c Michael Hanselmann
316 283f9d4c Michael Hanselmann
317 3e8b5a9c Iustin Pop
def TestClusterRedistConf():
318 3e8b5a9c Iustin Pop
  """gnt-cluster redist-conf"""
319 3e8b5a9c Iustin Pop
  AssertCommand(["gnt-cluster", "redist-conf"])
320 3e8b5a9c Iustin Pop
321 3e8b5a9c Iustin Pop
322 283f9d4c Michael Hanselmann
def TestClusterGetmaster():
323 283f9d4c Michael Hanselmann
  """gnt-cluster getmaster"""
324 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "getmaster"])
325 283f9d4c Michael Hanselmann
326 283f9d4c Michael Hanselmann
327 283f9d4c Michael Hanselmann
def TestClusterVersion():
328 283f9d4c Michael Hanselmann
  """gnt-cluster version"""
329 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "version"])
330 cec9845c Michael Hanselmann
331 cec9845c Michael Hanselmann
332 6d4a1656 Michael Hanselmann
def TestClusterRenewCrypto():
333 6d4a1656 Michael Hanselmann
  """gnt-cluster renew-crypto"""
334 6d4a1656 Michael Hanselmann
  master = qa_config.GetMasterNode()
335 6d4a1656 Michael Hanselmann
336 6d4a1656 Michael Hanselmann
  # Conflicting options
337 6d4a1656 Michael Hanselmann
  cmd = ["gnt-cluster", "renew-crypto", "--force",
338 3db3eb2a Michael Hanselmann
         "--new-cluster-certificate", "--new-confd-hmac-key"]
339 3db3eb2a Michael Hanselmann
  conflicting = [
340 3db3eb2a Michael Hanselmann
    ["--new-rapi-certificate", "--rapi-certificate=/dev/null"],
341 3db3eb2a Michael Hanselmann
    ["--new-cluster-domain-secret", "--cluster-domain-secret=/dev/null"],
342 3db3eb2a Michael Hanselmann
    ]
343 3db3eb2a Michael Hanselmann
  for i in conflicting:
344 21bf2e2e Andrea Spadaccini
    AssertCommand(cmd + i, fail=True)
345 6d4a1656 Michael Hanselmann
346 6d4a1656 Michael Hanselmann
  # Invalid RAPI certificate
347 6d4a1656 Michael Hanselmann
  cmd = ["gnt-cluster", "renew-crypto", "--force",
348 6d4a1656 Michael Hanselmann
         "--rapi-certificate=/dev/null"]
349 2f4b4f78 Iustin Pop
  AssertCommand(cmd, fail=True)
350 6d4a1656 Michael Hanselmann
351 502f5236 Michael Hanselmann
  rapi_cert_backup = qa_utils.BackupFile(master["primary"],
352 502f5236 Michael Hanselmann
                                         constants.RAPI_CERT_FILE)
353 502f5236 Michael Hanselmann
  try:
354 502f5236 Michael Hanselmann
    # Custom RAPI certificate
355 502f5236 Michael Hanselmann
    fh = tempfile.NamedTemporaryFile()
356 6d4a1656 Michael Hanselmann
357 502f5236 Michael Hanselmann
    # Ensure certificate doesn't cause "gnt-cluster verify" to complain
358 502f5236 Michael Hanselmann
    validity = constants.SSL_CERT_EXPIRATION_WARN * 3
359 6d4a1656 Michael Hanselmann
360 5e26633b Michael Hanselmann
    utils.GenerateSelfSignedSslCert(fh.name, validity=validity)
361 6d4a1656 Michael Hanselmann
362 502f5236 Michael Hanselmann
    tmpcert = qa_utils.UploadFile(master["primary"], fh.name)
363 502f5236 Michael Hanselmann
    try:
364 2f4b4f78 Iustin Pop
      AssertCommand(["gnt-cluster", "renew-crypto", "--force",
365 2f4b4f78 Iustin Pop
                     "--rapi-certificate=%s" % tmpcert])
366 502f5236 Michael Hanselmann
    finally:
367 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", tmpcert])
368 502f5236 Michael Hanselmann
369 5e26633b Michael Hanselmann
    # Custom cluster domain secret
370 5e26633b Michael Hanselmann
    cds_fh = tempfile.NamedTemporaryFile()
371 5e26633b Michael Hanselmann
    cds_fh.write(utils.GenerateSecret())
372 5e26633b Michael Hanselmann
    cds_fh.write("\n")
373 5e26633b Michael Hanselmann
    cds_fh.flush()
374 5e26633b Michael Hanselmann
375 5e26633b Michael Hanselmann
    tmpcds = qa_utils.UploadFile(master["primary"], cds_fh.name)
376 5e26633b Michael Hanselmann
    try:
377 2f4b4f78 Iustin Pop
      AssertCommand(["gnt-cluster", "renew-crypto", "--force",
378 2f4b4f78 Iustin Pop
                     "--cluster-domain-secret=%s" % tmpcds])
379 5e26633b Michael Hanselmann
    finally:
380 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", tmpcds])
381 5e26633b Michael Hanselmann
382 502f5236 Michael Hanselmann
    # Normal case
383 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-cluster", "renew-crypto", "--force",
384 2f4b4f78 Iustin Pop
                   "--new-cluster-certificate", "--new-confd-hmac-key",
385 2f4b4f78 Iustin Pop
                   "--new-rapi-certificate", "--new-cluster-domain-secret"])
386 3db3eb2a Michael Hanselmann
387 502f5236 Michael Hanselmann
    # Restore RAPI certificate
388 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-cluster", "renew-crypto", "--force",
389 2f4b4f78 Iustin Pop
                   "--rapi-certificate=%s" % rapi_cert_backup])
390 3db3eb2a Michael Hanselmann
  finally:
391 2f4b4f78 Iustin Pop
    AssertCommand(["rm", "-f", rapi_cert_backup])
392 3db3eb2a Michael Hanselmann
393 6d4a1656 Michael Hanselmann
394 cec9845c Michael Hanselmann
def TestClusterBurnin():
395 cec9845c Michael Hanselmann
  """Burnin"""
396 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
397 cec9845c Michael Hanselmann
398 d0c8c01d Iustin Pop
  options = qa_config.get("options", {})
399 d0c8c01d Iustin Pop
  disk_template = options.get("burnin-disk-template", "drbd")
400 d0c8c01d Iustin Pop
  parallel = options.get("burnin-in-parallel", False)
401 d0c8c01d Iustin Pop
  check_inst = options.get("burnin-check-instances", False)
402 d0c8c01d Iustin Pop
  do_rename = options.get("burnin-rename", "")
403 d0c8c01d Iustin Pop
  do_reboot = options.get("burnin-reboot", True)
404 1d103c02 Iustin Pop
  reboot_types = options.get("reboot-types", constants.REBOOT_TYPES)
405 23103544 Michael Hanselmann
406 cec9845c Michael Hanselmann
  # Get as many instances as we need
407 cec9845c Michael Hanselmann
  instances = []
408 cec9845c Michael Hanselmann
  try:
409 23103544 Michael Hanselmann
    try:
410 d0c8c01d Iustin Pop
      num = qa_config.get("options", {}).get("burnin-instances", 1)
411 f1501b3f Michael Hanselmann
      for _ in range(0, num):
412 23103544 Michael Hanselmann
        instances.append(qa_config.AcquireInstance())
413 23103544 Michael Hanselmann
    except qa_error.OutOfInstancesError:
414 23103544 Michael Hanselmann
      print "Not enough instances, continuing anyway."
415 cec9845c Michael Hanselmann
416 23103544 Michael Hanselmann
    if len(instances) < 1:
417 23103544 Michael Hanselmann
      raise qa_error.Error("Burnin needs at least one instance")
418 cec9845c Michael Hanselmann
419 d0c8c01d Iustin Pop
    script = qa_utils.UploadFile(master["primary"], "../tools/burnin")
420 cec9845c Michael Hanselmann
    try:
421 23103544 Michael Hanselmann
      # Run burnin
422 cec9845c Michael Hanselmann
      cmd = [script,
423 d0c8c01d Iustin Pop
             "--os=%s" % qa_config.get("os"),
424 d0c8c01d Iustin Pop
             "--disk-size=%s" % ",".join(qa_config.get("disk")),
425 d0c8c01d Iustin Pop
             "--disk-growth=%s" % ",".join(qa_config.get("disk-growth")),
426 d0c8c01d Iustin Pop
             "--disk-template=%s" % disk_template]
427 0b0a150a Iustin Pop
      if parallel:
428 d0c8c01d Iustin Pop
        cmd.append("--parallel")
429 d0c8c01d Iustin Pop
        cmd.append("--early-release")
430 0b0a150a Iustin Pop
      if check_inst:
431 d0c8c01d Iustin Pop
        cmd.append("--http-check")
432 4dc76b24 Iustin Pop
      if do_rename:
433 d0c8c01d Iustin Pop
        cmd.append("--rename=%s" % do_rename)
434 58598264 Iustin Pop
      if not do_reboot:
435 d0c8c01d Iustin Pop
        cmd.append("--no-reboot")
436 1d103c02 Iustin Pop
      else:
437 d0c8c01d Iustin Pop
        cmd.append("--reboot-types=%s" % ",".join(reboot_types))
438 d0c8c01d Iustin Pop
      cmd += [inst["name"] for inst in instances]
439 2f4b4f78 Iustin Pop
      AssertCommand(cmd)
440 cec9845c Michael Hanselmann
    finally:
441 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", script])
442 2f4b4f78 Iustin Pop
443 cec9845c Michael Hanselmann
  finally:
444 cec9845c Michael Hanselmann
    for inst in instances:
445 cec9845c Michael Hanselmann
      qa_config.ReleaseInstance(inst)
446 cec9845c Michael Hanselmann
447 cec9845c Michael Hanselmann
448 cec9845c Michael Hanselmann
def TestClusterMasterFailover():
449 c28502b1 Iustin Pop
  """gnt-cluster master-failover"""
450 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
451 cec9845c Michael Hanselmann
  failovermaster = qa_config.AcquireNode(exclude=master)
452 cec9845c Michael Hanselmann
453 2f4b4f78 Iustin Pop
  cmd = ["gnt-cluster", "master-failover"]
454 2f4b4f78 Iustin Pop
  try:
455 2f4b4f78 Iustin Pop
    AssertCommand(cmd, node=failovermaster)
456 ff699aa9 Michael Hanselmann
    # Back to original master node
457 2f4b4f78 Iustin Pop
    AssertCommand(cmd, node=master)
458 cec9845c Michael Hanselmann
  finally:
459 cec9845c Michael Hanselmann
    qa_config.ReleaseNode(failovermaster)
460 cec9845c Michael Hanselmann
461 cec9845c Michael Hanselmann
462 ff699aa9 Michael Hanselmann
def TestClusterMasterFailoverWithDrainedQueue():
463 ff699aa9 Michael Hanselmann
  """gnt-cluster master-failover with drained queue"""
464 ff699aa9 Michael Hanselmann
  drain_check = ["test", "-f", constants.JOB_QUEUE_DRAIN_FILE]
465 ff699aa9 Michael Hanselmann
466 ff699aa9 Michael Hanselmann
  master = qa_config.GetMasterNode()
467 ff699aa9 Michael Hanselmann
  failovermaster = qa_config.AcquireNode(exclude=master)
468 ff699aa9 Michael Hanselmann
469 ff699aa9 Michael Hanselmann
  # Ensure queue is not drained
470 ff699aa9 Michael Hanselmann
  for node in [master, failovermaster]:
471 ff699aa9 Michael Hanselmann
    AssertCommand(drain_check, node=node, fail=True)
472 ff699aa9 Michael Hanselmann
473 ff699aa9 Michael Hanselmann
  # Drain queue on failover master
474 ff699aa9 Michael Hanselmann
  AssertCommand(["touch", constants.JOB_QUEUE_DRAIN_FILE], node=failovermaster)
475 ff699aa9 Michael Hanselmann
476 ff699aa9 Michael Hanselmann
  cmd = ["gnt-cluster", "master-failover"]
477 ff699aa9 Michael Hanselmann
  try:
478 ff699aa9 Michael Hanselmann
    AssertCommand(drain_check, node=failovermaster)
479 ff699aa9 Michael Hanselmann
    AssertCommand(cmd, node=failovermaster)
480 ff699aa9 Michael Hanselmann
    AssertCommand(drain_check, fail=True)
481 ff699aa9 Michael Hanselmann
    AssertCommand(drain_check, node=failovermaster, fail=True)
482 ff699aa9 Michael Hanselmann
483 ff699aa9 Michael Hanselmann
    # Back to original master node
484 ff699aa9 Michael Hanselmann
    AssertCommand(cmd, node=master)
485 ff699aa9 Michael Hanselmann
  finally:
486 ff699aa9 Michael Hanselmann
    qa_config.ReleaseNode(failovermaster)
487 ff699aa9 Michael Hanselmann
488 ff699aa9 Michael Hanselmann
  AssertCommand(drain_check, fail=True)
489 ff699aa9 Michael Hanselmann
  AssertCommand(drain_check, node=failovermaster, fail=True)
490 ff699aa9 Michael Hanselmann
491 ff699aa9 Michael Hanselmann
492 cec9845c Michael Hanselmann
def TestClusterCopyfile():
493 cec9845c Michael Hanselmann
  """gnt-cluster copyfile"""
494 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
495 cec9845c Michael Hanselmann
496 24818e8f Michael Hanselmann
  uniqueid = utils.NewUUID()
497 830da270 Michael Hanselmann
498 cec9845c Michael Hanselmann
  # Create temporary file
499 cec9845c Michael Hanselmann
  f = tempfile.NamedTemporaryFile()
500 830da270 Michael Hanselmann
  f.write(uniqueid)
501 cec9845c Michael Hanselmann
  f.flush()
502 cec9845c Michael Hanselmann
  f.seek(0)
503 cec9845c Michael Hanselmann
504 cec9845c Michael Hanselmann
  # Upload file to master node
505 d0c8c01d Iustin Pop
  testname = qa_utils.UploadFile(master["primary"], f.name)
506 cec9845c Michael Hanselmann
  try:
507 cec9845c Michael Hanselmann
    # Copy file to all nodes
508 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-cluster", "copyfile", testname])
509 830da270 Michael Hanselmann
    _CheckFileOnAllNodes(testname, uniqueid)
510 cec9845c Michael Hanselmann
  finally:
511 830da270 Michael Hanselmann
    _RemoveFileFromAllNodes(testname)
512 830da270 Michael Hanselmann
513 830da270 Michael Hanselmann
514 830da270 Michael Hanselmann
def TestClusterCommand():
515 830da270 Michael Hanselmann
  """gnt-cluster command"""
516 24818e8f Michael Hanselmann
  uniqueid = utils.NewUUID()
517 24818e8f Michael Hanselmann
  rfile = "/tmp/gnt%s" % utils.NewUUID()
518 d0c8c01d Iustin Pop
  rcmd = utils.ShellQuoteArgs(["echo", "-n", uniqueid])
519 d0c8c01d Iustin Pop
  cmd = utils.ShellQuoteArgs(["gnt-cluster", "command",
520 830da270 Michael Hanselmann
                              "%s >%s" % (rcmd, rfile)])
521 830da270 Michael Hanselmann
522 830da270 Michael Hanselmann
  try:
523 2f4b4f78 Iustin Pop
    AssertCommand(cmd)
524 830da270 Michael Hanselmann
    _CheckFileOnAllNodes(rfile, uniqueid)
525 830da270 Michael Hanselmann
  finally:
526 830da270 Michael Hanselmann
    _RemoveFileFromAllNodes(rfile)
527 cec9845c Michael Hanselmann
528 cec9845c Michael Hanselmann
529 cec9845c Michael Hanselmann
def TestClusterDestroy():
530 cec9845c Michael Hanselmann
  """gnt-cluster destroy"""
531 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "destroy", "--yes-do-it"])
532 65a884ef Iustin Pop
533 65a884ef Iustin Pop
534 65a884ef Iustin Pop
def TestClusterRepairDiskSizes():
535 65a884ef Iustin Pop
  """gnt-cluster repair-disk-sizes"""
536 65a884ef Iustin Pop
  AssertCommand(["gnt-cluster", "repair-disk-sizes"])