Statistics
| Branch: | Tag: | Revision:

root / qa / qa_cluster.py @ 78453739

History | View | Annotate | Download (17 kB)

1 c68d1f43 Michael Hanselmann
#
2 c68d1f43 Michael Hanselmann
#
3 c68d1f43 Michael Hanselmann
4 1e7acc3b Iustin Pop
# Copyright (C) 2007, 2010, 2011, 2012 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 304d9f02 Michael Hanselmann
from ganeti import pathutils
33 cec9845c Michael Hanselmann
34 cec9845c Michael Hanselmann
import qa_config
35 cec9845c Michael Hanselmann
import qa_utils
36 cec9845c Michael Hanselmann
import qa_error
37 cec9845c Michael Hanselmann
38 66d1f035 René Nussbaumer
from qa_utils import AssertEqual, AssertCommand, GetCommandOutput
39 cec9845c Michael Hanselmann
40 cec9845c Michael Hanselmann
41 c2a0947d Iustin Pop
#: cluster verify command
42 c2a0947d Iustin Pop
_CLUSTER_VERIFY = ["gnt-cluster", "verify"]
43 c2a0947d Iustin Pop
44 21bf2e2e Andrea Spadaccini
45 830da270 Michael Hanselmann
def _RemoveFileFromAllNodes(filename):
46 830da270 Michael Hanselmann
  """Removes a file from all nodes.
47 830da270 Michael Hanselmann

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

56 830da270 Michael Hanselmann
  """
57 830da270 Michael Hanselmann
  cmd = utils.ShellQuoteArgs(["cat", filename])
58 2f4b4f78 Iustin Pop
  for node in qa_config.get("nodes"):
59 2f4b4f78 Iustin Pop
    AssertEqual(qa_utils.GetCommandOutput(node["primary"], cmd), content)
60 830da270 Michael Hanselmann
61 830da270 Michael Hanselmann
62 92cb4940 Andrea Spadaccini
# data for testing failures due to bad keys/values for disk parameters
63 92cb4940 Andrea Spadaccini
_FAIL_PARAMS = ["nonexistent:resync-rate=1",
64 92cb4940 Andrea Spadaccini
                "drbd:nonexistent=1",
65 92cb4940 Andrea Spadaccini
                "drbd:resync-rate=invalid",
66 92cb4940 Andrea Spadaccini
                ]
67 92cb4940 Andrea Spadaccini
68 92cb4940 Andrea Spadaccini
69 92cb4940 Andrea Spadaccini
def TestClusterInitDisk():
70 92cb4940 Andrea Spadaccini
  """gnt-cluster init -D"""
71 92cb4940 Andrea Spadaccini
  name = qa_config.get("name")
72 92cb4940 Andrea Spadaccini
  for param in _FAIL_PARAMS:
73 92cb4940 Andrea Spadaccini
    AssertCommand(["gnt-cluster", "init", "-D", param, name], fail=True)
74 92cb4940 Andrea Spadaccini
75 92cb4940 Andrea Spadaccini
76 725ec2f1 René Nussbaumer
def TestClusterInit(rapi_user, rapi_secret):
77 cec9845c Michael Hanselmann
  """gnt-cluster init"""
78 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
79 cec9845c Michael Hanselmann
80 304d9f02 Michael Hanselmann
  rapi_dir = os.path.dirname(pathutils.RAPI_USERS_FILE)
81 49ceab21 Michael Hanselmann
82 725ec2f1 René Nussbaumer
  # First create the RAPI credentials
83 a62d1901 Michael Hanselmann
  fh = tempfile.NamedTemporaryFile()
84 a62d1901 Michael Hanselmann
  try:
85 a62d1901 Michael Hanselmann
    fh.write("%s %s write\n" % (rapi_user, rapi_secret))
86 a62d1901 Michael Hanselmann
    fh.flush()
87 a62d1901 Michael Hanselmann
88 a62d1901 Michael Hanselmann
    tmpru = qa_utils.UploadFile(master["primary"], fh.name)
89 a62d1901 Michael Hanselmann
    try:
90 49ceab21 Michael Hanselmann
      AssertCommand(["mkdir", "-p", rapi_dir])
91 304d9f02 Michael Hanselmann
      AssertCommand(["mv", tmpru, pathutils.RAPI_USERS_FILE])
92 a62d1901 Michael Hanselmann
    finally:
93 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", tmpru])
94 a62d1901 Michael Hanselmann
  finally:
95 a62d1901 Michael Hanselmann
    fh.close()
96 a62d1901 Michael Hanselmann
97 a62d1901 Michael Hanselmann
  # Initialize cluster
98 e7b6183b Michael Hanselmann
  cmd = [
99 e7b6183b Michael Hanselmann
    "gnt-cluster", "init",
100 e7b6183b Michael Hanselmann
    "--primary-ip-version=%d" % qa_config.get("primary_ip_version", 4),
101 59c1d41e Michael Hanselmann
    "--enabled-hypervisors=%s" % ",".join(qa_config.GetEnabledHypervisors()),
102 e7b6183b Michael Hanselmann
    ]
103 20286f7c René Nussbaumer
104 20286f7c René Nussbaumer
  for spec_type in ("mem-size", "disk-size", "disk-count", "cpu-count",
105 20286f7c René Nussbaumer
                    "nic-count"):
106 20286f7c René Nussbaumer
    for spec_val in ("min", "max", "std"):
107 20286f7c René Nussbaumer
      spec = qa_config.get("ispec_%s_%s" %
108 20286f7c René Nussbaumer
                           (spec_type.replace('-', '_'), spec_val), None)
109 20286f7c René Nussbaumer
      if spec:
110 20286f7c René Nussbaumer
        cmd.append("--specs-%s=%s=%d" % (spec_type, spec_val, spec))
111 9486f6ae Manuel Franceschini
112 d0c8c01d Iustin Pop
  if master.get("secondary", None):
113 d0c8c01d Iustin Pop
    cmd.append("--secondary-ip=%s" % master["secondary"])
114 cec9845c Michael Hanselmann
115 d0c8c01d Iustin Pop
  bridge = qa_config.get("bridge", None)
116 cec9845c Michael Hanselmann
  if bridge:
117 d0c8c01d Iustin Pop
    cmd.append("--master-netdev=%s" % bridge)
118 cec9845c Michael Hanselmann
119 13d2e231 Andrea Spadaccini
  cmd.append(qa_config.get("name"))
120 2f4b4f78 Iustin Pop
  AssertCommand(cmd)
121 cec9845c Michael Hanselmann
122 5abecc1c Iustin Pop
  cmd = ["gnt-cluster", "modify"]
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 58ea8d17 Michael Hanselmann
                                   "gnt-node list --verbose --no-headers -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 58ea8d17 Michael Hanselmann
                                   "gnt-instance list --no-headers -o status")
224 3e0ed18c René Nussbaumer
  # ERROR_down because the instance is stopped but not recorded as such
225 3e0ed18c René Nussbaumer
  AssertEqual(compat.all(status == "ERROR_down"
226 66d1f035 René Nussbaumer
                         for status in result_output.splitlines()), True)
227 66d1f035 René Nussbaumer
228 66d1f035 René Nussbaumer
  # Now start everything again
229 66d1f035 René Nussbaumer
  AssertCommand(["gnt-cluster", "epo", "--on", "-f", "--all"])
230 66d1f035 René Nussbaumer
231 66d1f035 René Nussbaumer
  # All instances should have been started now
232 66d1f035 René Nussbaumer
  result_output = GetCommandOutput(master["primary"],
233 58ea8d17 Michael Hanselmann
                                   "gnt-instance list --no-headers -o status")
234 66d1f035 René Nussbaumer
  AssertEqual(compat.all(status == "running"
235 66d1f035 René Nussbaumer
                         for status in result_output.splitlines()), True)
236 66d1f035 René Nussbaumer
237 66d1f035 René Nussbaumer
238 69df9d2b Iustin Pop
def TestClusterVerify():
239 69df9d2b Iustin Pop
  """gnt-cluster verify"""
240 c2a0947d Iustin Pop
  AssertCommand(_CLUSTER_VERIFY)
241 c6953b6e Iustin Pop
  AssertCommand(["gnt-cluster", "verify-disks"])
242 cec9845c Michael Hanselmann
243 1377433b Michael Hanselmann
244 1377433b Michael Hanselmann
def TestJobqueue():
245 1377433b Michael Hanselmann
  """gnt-debug test-jobqueue"""
246 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-debug", "test-jobqueue"])
247 1377433b Michael Hanselmann
248 1377433b Michael Hanselmann
249 5a85b99e Michael Hanselmann
def TestDelay(node):
250 5a85b99e Michael Hanselmann
  """gnt-debug delay"""
251 5a85b99e Michael Hanselmann
  AssertCommand(["gnt-debug", "delay", "1"])
252 5a85b99e Michael Hanselmann
  AssertCommand(["gnt-debug", "delay", "--no-master", "1"])
253 5a85b99e Michael Hanselmann
  AssertCommand(["gnt-debug", "delay", "--no-master",
254 5a85b99e Michael Hanselmann
                 "-n", node["primary"], "1"])
255 5a85b99e Michael Hanselmann
256 5a85b99e Michael Hanselmann
257 452913ed Iustin Pop
def TestClusterReservedLvs():
258 452913ed Iustin Pop
  """gnt-cluster reserved lvs"""
259 2f4b4f78 Iustin Pop
  for fail, cmd in [
260 c2a0947d Iustin Pop
    (False, _CLUSTER_VERIFY),
261 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "--reserved-lvs", ""]),
262 2f4b4f78 Iustin Pop
    (False, ["lvcreate", "-L1G", "-nqa-test", "xenvg"]),
263 21bf2e2e Andrea Spadaccini
    (True, _CLUSTER_VERIFY),
264 84d7e26b Dmitry Chernyak
    (False, ["gnt-cluster", "modify", "--reserved-lvs",
265 84d7e26b Dmitry Chernyak
             "xenvg/qa-test,.*/other-test"]),
266 c2a0947d Iustin Pop
    (False, _CLUSTER_VERIFY),
267 84d7e26b Dmitry Chernyak
    (False, ["gnt-cluster", "modify", "--reserved-lvs", ".*/qa-.*"]),
268 c2a0947d Iustin Pop
    (False, _CLUSTER_VERIFY),
269 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "--reserved-lvs", ""]),
270 21bf2e2e Andrea Spadaccini
    (True, _CLUSTER_VERIFY),
271 2f4b4f78 Iustin Pop
    (False, ["lvremove", "-f", "xenvg/qa-test"]),
272 c2a0947d Iustin Pop
    (False, _CLUSTER_VERIFY),
273 452913ed Iustin Pop
    ]:
274 2f4b4f78 Iustin Pop
    AssertCommand(cmd, fail=fail)
275 452913ed Iustin Pop
276 cec9845c Michael Hanselmann
277 1e7acc3b Iustin Pop
def TestClusterModifyEmpty():
278 1e7acc3b Iustin Pop
  """gnt-cluster modify"""
279 1e7acc3b Iustin Pop
  AssertCommand(["gnt-cluster", "modify"], fail=True)
280 1e7acc3b Iustin Pop
281 1e7acc3b Iustin Pop
282 92cb4940 Andrea Spadaccini
def TestClusterModifyDisk():
283 92cb4940 Andrea Spadaccini
  """gnt-cluster modify -D"""
284 92cb4940 Andrea Spadaccini
  for param in _FAIL_PARAMS:
285 92cb4940 Andrea Spadaccini
    AssertCommand(["gnt-cluster", "modify", "-D", param], fail=True)
286 92cb4940 Andrea Spadaccini
287 92cb4940 Andrea Spadaccini
288 9738ca94 Iustin Pop
def TestClusterModifyBe():
289 9738ca94 Iustin Pop
  """gnt-cluster modify -B"""
290 2f4b4f78 Iustin Pop
  for fail, cmd in [
291 8ccbbe4b Guido Trotter
    # max/min mem
292 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "maxmem=256"]),
293 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 256$'"]),
294 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "minmem=256"]),
295 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 256$'"]),
296 8ccbbe4b Guido Trotter
    (True, ["gnt-cluster", "modify", "-B", "maxmem=a"]),
297 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 256$'"]),
298 8ccbbe4b Guido Trotter
    (True, ["gnt-cluster", "modify", "-B", "minmem=a"]),
299 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 256$'"]),
300 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "maxmem=128,minmem=128"]),
301 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 128$'"]),
302 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 128$'"]),
303 9738ca94 Iustin Pop
    # vcpus
304 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "vcpus=4"]),
305 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *vcpus: 4$'"]),
306 21bf2e2e Andrea Spadaccini
    (True, ["gnt-cluster", "modify", "-B", "vcpus=a"]),
307 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "vcpus=1"]),
308 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *vcpus: 1$'"]),
309 9738ca94 Iustin Pop
    # auto_balance
310 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "auto_balance=False"]),
311 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *auto_balance: False$'"]),
312 21bf2e2e Andrea Spadaccini
    (True, ["gnt-cluster", "modify", "-B", "auto_balance=1"]),
313 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "auto_balance=True"]),
314 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *auto_balance: True$'"]),
315 9738ca94 Iustin Pop
    ]:
316 2f4b4f78 Iustin Pop
    AssertCommand(cmd, fail=fail)
317 9738ca94 Iustin Pop
318 5abecc1c Iustin Pop
  # redo the original-requested BE parameters, if any
319 5abecc1c Iustin Pop
  bep = qa_config.get("backend-parameters", "")
320 5abecc1c Iustin Pop
  if bep:
321 5abecc1c Iustin Pop
    AssertCommand(["gnt-cluster", "modify", "-B", bep])
322 9738ca94 Iustin Pop
323 21bf2e2e Andrea Spadaccini
324 cec9845c Michael Hanselmann
def TestClusterInfo():
325 cec9845c Michael Hanselmann
  """gnt-cluster info"""
326 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "info"])
327 283f9d4c Michael Hanselmann
328 283f9d4c Michael Hanselmann
329 3e8b5a9c Iustin Pop
def TestClusterRedistConf():
330 3e8b5a9c Iustin Pop
  """gnt-cluster redist-conf"""
331 3e8b5a9c Iustin Pop
  AssertCommand(["gnt-cluster", "redist-conf"])
332 3e8b5a9c Iustin Pop
333 3e8b5a9c Iustin Pop
334 283f9d4c Michael Hanselmann
def TestClusterGetmaster():
335 283f9d4c Michael Hanselmann
  """gnt-cluster getmaster"""
336 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "getmaster"])
337 283f9d4c Michael Hanselmann
338 283f9d4c Michael Hanselmann
339 283f9d4c Michael Hanselmann
def TestClusterVersion():
340 283f9d4c Michael Hanselmann
  """gnt-cluster version"""
341 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "version"])
342 cec9845c Michael Hanselmann
343 cec9845c Michael Hanselmann
344 6d4a1656 Michael Hanselmann
def TestClusterRenewCrypto():
345 6d4a1656 Michael Hanselmann
  """gnt-cluster renew-crypto"""
346 6d4a1656 Michael Hanselmann
  master = qa_config.GetMasterNode()
347 6d4a1656 Michael Hanselmann
348 6d4a1656 Michael Hanselmann
  # Conflicting options
349 6d4a1656 Michael Hanselmann
  cmd = ["gnt-cluster", "renew-crypto", "--force",
350 3db3eb2a Michael Hanselmann
         "--new-cluster-certificate", "--new-confd-hmac-key"]
351 3db3eb2a Michael Hanselmann
  conflicting = [
352 3db3eb2a Michael Hanselmann
    ["--new-rapi-certificate", "--rapi-certificate=/dev/null"],
353 3db3eb2a Michael Hanselmann
    ["--new-cluster-domain-secret", "--cluster-domain-secret=/dev/null"],
354 3db3eb2a Michael Hanselmann
    ]
355 3db3eb2a Michael Hanselmann
  for i in conflicting:
356 21bf2e2e Andrea Spadaccini
    AssertCommand(cmd + i, fail=True)
357 6d4a1656 Michael Hanselmann
358 6d4a1656 Michael Hanselmann
  # Invalid RAPI certificate
359 6d4a1656 Michael Hanselmann
  cmd = ["gnt-cluster", "renew-crypto", "--force",
360 6d4a1656 Michael Hanselmann
         "--rapi-certificate=/dev/null"]
361 2f4b4f78 Iustin Pop
  AssertCommand(cmd, fail=True)
362 6d4a1656 Michael Hanselmann
363 502f5236 Michael Hanselmann
  rapi_cert_backup = qa_utils.BackupFile(master["primary"],
364 304d9f02 Michael Hanselmann
                                         pathutils.RAPI_CERT_FILE)
365 502f5236 Michael Hanselmann
  try:
366 502f5236 Michael Hanselmann
    # Custom RAPI certificate
367 502f5236 Michael Hanselmann
    fh = tempfile.NamedTemporaryFile()
368 6d4a1656 Michael Hanselmann
369 502f5236 Michael Hanselmann
    # Ensure certificate doesn't cause "gnt-cluster verify" to complain
370 502f5236 Michael Hanselmann
    validity = constants.SSL_CERT_EXPIRATION_WARN * 3
371 6d4a1656 Michael Hanselmann
372 5e26633b Michael Hanselmann
    utils.GenerateSelfSignedSslCert(fh.name, validity=validity)
373 6d4a1656 Michael Hanselmann
374 502f5236 Michael Hanselmann
    tmpcert = qa_utils.UploadFile(master["primary"], fh.name)
375 502f5236 Michael Hanselmann
    try:
376 2f4b4f78 Iustin Pop
      AssertCommand(["gnt-cluster", "renew-crypto", "--force",
377 2f4b4f78 Iustin Pop
                     "--rapi-certificate=%s" % tmpcert])
378 502f5236 Michael Hanselmann
    finally:
379 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", tmpcert])
380 502f5236 Michael Hanselmann
381 5e26633b Michael Hanselmann
    # Custom cluster domain secret
382 5e26633b Michael Hanselmann
    cds_fh = tempfile.NamedTemporaryFile()
383 5e26633b Michael Hanselmann
    cds_fh.write(utils.GenerateSecret())
384 5e26633b Michael Hanselmann
    cds_fh.write("\n")
385 5e26633b Michael Hanselmann
    cds_fh.flush()
386 5e26633b Michael Hanselmann
387 5e26633b Michael Hanselmann
    tmpcds = qa_utils.UploadFile(master["primary"], cds_fh.name)
388 5e26633b Michael Hanselmann
    try:
389 2f4b4f78 Iustin Pop
      AssertCommand(["gnt-cluster", "renew-crypto", "--force",
390 2f4b4f78 Iustin Pop
                     "--cluster-domain-secret=%s" % tmpcds])
391 5e26633b Michael Hanselmann
    finally:
392 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", tmpcds])
393 5e26633b Michael Hanselmann
394 502f5236 Michael Hanselmann
    # Normal case
395 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-cluster", "renew-crypto", "--force",
396 2f4b4f78 Iustin Pop
                   "--new-cluster-certificate", "--new-confd-hmac-key",
397 2f4b4f78 Iustin Pop
                   "--new-rapi-certificate", "--new-cluster-domain-secret"])
398 3db3eb2a Michael Hanselmann
399 502f5236 Michael Hanselmann
    # Restore RAPI certificate
400 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-cluster", "renew-crypto", "--force",
401 2f4b4f78 Iustin Pop
                   "--rapi-certificate=%s" % rapi_cert_backup])
402 3db3eb2a Michael Hanselmann
  finally:
403 2f4b4f78 Iustin Pop
    AssertCommand(["rm", "-f", rapi_cert_backup])
404 3db3eb2a Michael Hanselmann
405 6d4a1656 Michael Hanselmann
406 cec9845c Michael Hanselmann
def TestClusterBurnin():
407 cec9845c Michael Hanselmann
  """Burnin"""
408 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
409 cec9845c Michael Hanselmann
410 d0c8c01d Iustin Pop
  options = qa_config.get("options", {})
411 d0c8c01d Iustin Pop
  disk_template = options.get("burnin-disk-template", "drbd")
412 d0c8c01d Iustin Pop
  parallel = options.get("burnin-in-parallel", False)
413 d0c8c01d Iustin Pop
  check_inst = options.get("burnin-check-instances", False)
414 d0c8c01d Iustin Pop
  do_rename = options.get("burnin-rename", "")
415 d0c8c01d Iustin Pop
  do_reboot = options.get("burnin-reboot", True)
416 1d103c02 Iustin Pop
  reboot_types = options.get("reboot-types", constants.REBOOT_TYPES)
417 23103544 Michael Hanselmann
418 cec9845c Michael Hanselmann
  # Get as many instances as we need
419 cec9845c Michael Hanselmann
  instances = []
420 cec9845c Michael Hanselmann
  try:
421 23103544 Michael Hanselmann
    try:
422 d0c8c01d Iustin Pop
      num = qa_config.get("options", {}).get("burnin-instances", 1)
423 f1501b3f Michael Hanselmann
      for _ in range(0, num):
424 23103544 Michael Hanselmann
        instances.append(qa_config.AcquireInstance())
425 23103544 Michael Hanselmann
    except qa_error.OutOfInstancesError:
426 23103544 Michael Hanselmann
      print "Not enough instances, continuing anyway."
427 cec9845c Michael Hanselmann
428 23103544 Michael Hanselmann
    if len(instances) < 1:
429 23103544 Michael Hanselmann
      raise qa_error.Error("Burnin needs at least one instance")
430 cec9845c Michael Hanselmann
431 d0c8c01d Iustin Pop
    script = qa_utils.UploadFile(master["primary"], "../tools/burnin")
432 cec9845c Michael Hanselmann
    try:
433 23103544 Michael Hanselmann
      # Run burnin
434 cec9845c Michael Hanselmann
      cmd = [script,
435 d0c8c01d Iustin Pop
             "--os=%s" % qa_config.get("os"),
436 f356202a Guido Trotter
             "--minmem-size=%s" % qa_config.get(constants.BE_MINMEM),
437 f356202a Guido Trotter
             "--maxmem-size=%s" % qa_config.get(constants.BE_MAXMEM),
438 d0c8c01d Iustin Pop
             "--disk-size=%s" % ",".join(qa_config.get("disk")),
439 d0c8c01d Iustin Pop
             "--disk-growth=%s" % ",".join(qa_config.get("disk-growth")),
440 d0c8c01d Iustin Pop
             "--disk-template=%s" % disk_template]
441 0b0a150a Iustin Pop
      if parallel:
442 d0c8c01d Iustin Pop
        cmd.append("--parallel")
443 d0c8c01d Iustin Pop
        cmd.append("--early-release")
444 0b0a150a Iustin Pop
      if check_inst:
445 d0c8c01d Iustin Pop
        cmd.append("--http-check")
446 4dc76b24 Iustin Pop
      if do_rename:
447 d0c8c01d Iustin Pop
        cmd.append("--rename=%s" % do_rename)
448 58598264 Iustin Pop
      if not do_reboot:
449 d0c8c01d Iustin Pop
        cmd.append("--no-reboot")
450 1d103c02 Iustin Pop
      else:
451 d0c8c01d Iustin Pop
        cmd.append("--reboot-types=%s" % ",".join(reboot_types))
452 d0c8c01d Iustin Pop
      cmd += [inst["name"] for inst in instances]
453 2f4b4f78 Iustin Pop
      AssertCommand(cmd)
454 cec9845c Michael Hanselmann
    finally:
455 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", script])
456 2f4b4f78 Iustin Pop
457 cec9845c Michael Hanselmann
  finally:
458 cec9845c Michael Hanselmann
    for inst in instances:
459 cec9845c Michael Hanselmann
      qa_config.ReleaseInstance(inst)
460 cec9845c Michael Hanselmann
461 cec9845c Michael Hanselmann
462 cec9845c Michael Hanselmann
def TestClusterMasterFailover():
463 c28502b1 Iustin Pop
  """gnt-cluster master-failover"""
464 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
465 cec9845c Michael Hanselmann
  failovermaster = qa_config.AcquireNode(exclude=master)
466 cec9845c Michael Hanselmann
467 2f4b4f78 Iustin Pop
  cmd = ["gnt-cluster", "master-failover"]
468 2f4b4f78 Iustin Pop
  try:
469 2f4b4f78 Iustin Pop
    AssertCommand(cmd, node=failovermaster)
470 ff699aa9 Michael Hanselmann
    # Back to original master node
471 2f4b4f78 Iustin Pop
    AssertCommand(cmd, node=master)
472 cec9845c Michael Hanselmann
  finally:
473 cec9845c Michael Hanselmann
    qa_config.ReleaseNode(failovermaster)
474 cec9845c Michael Hanselmann
475 cec9845c Michael Hanselmann
476 ff699aa9 Michael Hanselmann
def TestClusterMasterFailoverWithDrainedQueue():
477 ff699aa9 Michael Hanselmann
  """gnt-cluster master-failover with drained queue"""
478 304d9f02 Michael Hanselmann
  drain_check = ["test", "-f", pathutils.JOB_QUEUE_DRAIN_FILE]
479 ff699aa9 Michael Hanselmann
480 ff699aa9 Michael Hanselmann
  master = qa_config.GetMasterNode()
481 ff699aa9 Michael Hanselmann
  failovermaster = qa_config.AcquireNode(exclude=master)
482 ff699aa9 Michael Hanselmann
483 ff699aa9 Michael Hanselmann
  # Ensure queue is not drained
484 ff699aa9 Michael Hanselmann
  for node in [master, failovermaster]:
485 ff699aa9 Michael Hanselmann
    AssertCommand(drain_check, node=node, fail=True)
486 ff699aa9 Michael Hanselmann
487 ff699aa9 Michael Hanselmann
  # Drain queue on failover master
488 304d9f02 Michael Hanselmann
  AssertCommand(["touch", pathutils.JOB_QUEUE_DRAIN_FILE], node=failovermaster)
489 ff699aa9 Michael Hanselmann
490 ff699aa9 Michael Hanselmann
  cmd = ["gnt-cluster", "master-failover"]
491 ff699aa9 Michael Hanselmann
  try:
492 ff699aa9 Michael Hanselmann
    AssertCommand(drain_check, node=failovermaster)
493 ff699aa9 Michael Hanselmann
    AssertCommand(cmd, node=failovermaster)
494 ff699aa9 Michael Hanselmann
    AssertCommand(drain_check, fail=True)
495 ff699aa9 Michael Hanselmann
    AssertCommand(drain_check, node=failovermaster, fail=True)
496 ff699aa9 Michael Hanselmann
497 ff699aa9 Michael Hanselmann
    # Back to original master node
498 ff699aa9 Michael Hanselmann
    AssertCommand(cmd, node=master)
499 ff699aa9 Michael Hanselmann
  finally:
500 ff699aa9 Michael Hanselmann
    qa_config.ReleaseNode(failovermaster)
501 ff699aa9 Michael Hanselmann
502 ff699aa9 Michael Hanselmann
  AssertCommand(drain_check, fail=True)
503 ff699aa9 Michael Hanselmann
  AssertCommand(drain_check, node=failovermaster, fail=True)
504 ff699aa9 Michael Hanselmann
505 ff699aa9 Michael Hanselmann
506 cec9845c Michael Hanselmann
def TestClusterCopyfile():
507 cec9845c Michael Hanselmann
  """gnt-cluster copyfile"""
508 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
509 cec9845c Michael Hanselmann
510 24818e8f Michael Hanselmann
  uniqueid = utils.NewUUID()
511 830da270 Michael Hanselmann
512 cec9845c Michael Hanselmann
  # Create temporary file
513 cec9845c Michael Hanselmann
  f = tempfile.NamedTemporaryFile()
514 830da270 Michael Hanselmann
  f.write(uniqueid)
515 cec9845c Michael Hanselmann
  f.flush()
516 cec9845c Michael Hanselmann
  f.seek(0)
517 cec9845c Michael Hanselmann
518 cec9845c Michael Hanselmann
  # Upload file to master node
519 d0c8c01d Iustin Pop
  testname = qa_utils.UploadFile(master["primary"], f.name)
520 cec9845c Michael Hanselmann
  try:
521 cec9845c Michael Hanselmann
    # Copy file to all nodes
522 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-cluster", "copyfile", testname])
523 830da270 Michael Hanselmann
    _CheckFileOnAllNodes(testname, uniqueid)
524 cec9845c Michael Hanselmann
  finally:
525 830da270 Michael Hanselmann
    _RemoveFileFromAllNodes(testname)
526 830da270 Michael Hanselmann
527 830da270 Michael Hanselmann
528 830da270 Michael Hanselmann
def TestClusterCommand():
529 830da270 Michael Hanselmann
  """gnt-cluster command"""
530 24818e8f Michael Hanselmann
  uniqueid = utils.NewUUID()
531 24818e8f Michael Hanselmann
  rfile = "/tmp/gnt%s" % utils.NewUUID()
532 d0c8c01d Iustin Pop
  rcmd = utils.ShellQuoteArgs(["echo", "-n", uniqueid])
533 d0c8c01d Iustin Pop
  cmd = utils.ShellQuoteArgs(["gnt-cluster", "command",
534 830da270 Michael Hanselmann
                              "%s >%s" % (rcmd, rfile)])
535 830da270 Michael Hanselmann
536 830da270 Michael Hanselmann
  try:
537 2f4b4f78 Iustin Pop
    AssertCommand(cmd)
538 830da270 Michael Hanselmann
    _CheckFileOnAllNodes(rfile, uniqueid)
539 830da270 Michael Hanselmann
  finally:
540 830da270 Michael Hanselmann
    _RemoveFileFromAllNodes(rfile)
541 cec9845c Michael Hanselmann
542 cec9845c Michael Hanselmann
543 cec9845c Michael Hanselmann
def TestClusterDestroy():
544 cec9845c Michael Hanselmann
  """gnt-cluster destroy"""
545 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "destroy", "--yes-do-it"])
546 65a884ef Iustin Pop
547 65a884ef Iustin Pop
548 65a884ef Iustin Pop
def TestClusterRepairDiskSizes():
549 65a884ef Iustin Pop
  """gnt-cluster repair-disk-sizes"""
550 65a884ef Iustin Pop
  AssertCommand(["gnt-cluster", "repair-disk-sizes"])