Statistics
| Branch: | Tag: | Revision:

root / qa / qa_cluster.py @ 1e7acc3b

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