Statistics
| Branch: | Tag: | Revision:

root / qa / qa_cluster.py @ 3601d488

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