Statistics
| Branch: | Tag: | Revision:

root / qa / qa_cluster.py @ 4c1a464b

History | View | Annotate | Download (16.7 kB)

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

24 cec9845c Michael Hanselmann
"""
25 cec9845c Michael Hanselmann
26 cec9845c Michael Hanselmann
import tempfile
27 49ceab21 Michael Hanselmann
import os.path
28 cec9845c Michael Hanselmann
29 6d4a1656 Michael Hanselmann
from ganeti import constants
30 66d1f035 René Nussbaumer
from ganeti import compat
31 cec9845c Michael Hanselmann
from ganeti import utils
32 cec9845c Michael Hanselmann
33 cec9845c Michael Hanselmann
import qa_config
34 cec9845c Michael Hanselmann
import qa_utils
35 cec9845c Michael Hanselmann
import qa_error
36 cec9845c Michael Hanselmann
37 66d1f035 René Nussbaumer
from qa_utils import AssertEqual, AssertCommand, GetCommandOutput
38 cec9845c Michael Hanselmann
39 cec9845c Michael Hanselmann
40 c2a0947d Iustin Pop
#: cluster verify command
41 c2a0947d Iustin Pop
_CLUSTER_VERIFY = ["gnt-cluster", "verify"]
42 c2a0947d Iustin Pop
43 21bf2e2e Andrea Spadaccini
44 830da270 Michael Hanselmann
def _RemoveFileFromAllNodes(filename):
45 830da270 Michael Hanselmann
  """Removes a file from all nodes.
46 830da270 Michael Hanselmann

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

55 830da270 Michael Hanselmann
  """
56 830da270 Michael Hanselmann
  cmd = utils.ShellQuoteArgs(["cat", filename])
57 2f4b4f78 Iustin Pop
  for node in qa_config.get("nodes"):
58 2f4b4f78 Iustin Pop
    AssertEqual(qa_utils.GetCommandOutput(node["primary"], cmd), content)
59 830da270 Michael Hanselmann
60 830da270 Michael Hanselmann
61 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 66d1f035 René Nussbaumer
                                   "gnt-node list --verbose --no-header -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 66d1f035 René Nussbaumer
                                   "gnt-instance list --no-header -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 66d1f035 René Nussbaumer
                                   "gnt-instance list --no-header -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 92cb4940 Andrea Spadaccini
def TestClusterModifyDisk():
280 92cb4940 Andrea Spadaccini
  """gnt-cluster modify -D"""
281 92cb4940 Andrea Spadaccini
  for param in _FAIL_PARAMS:
282 92cb4940 Andrea Spadaccini
    AssertCommand(["gnt-cluster", "modify", "-D", param], fail=True)
283 92cb4940 Andrea Spadaccini
284 92cb4940 Andrea Spadaccini
285 9738ca94 Iustin Pop
def TestClusterModifyBe():
286 9738ca94 Iustin Pop
  """gnt-cluster modify -B"""
287 2f4b4f78 Iustin Pop
  for fail, cmd in [
288 8ccbbe4b Guido Trotter
    # max/min mem
289 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "maxmem=256"]),
290 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 256$'"]),
291 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "minmem=256"]),
292 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 256$'"]),
293 8ccbbe4b Guido Trotter
    (True, ["gnt-cluster", "modify", "-B", "maxmem=a"]),
294 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 256$'"]),
295 8ccbbe4b Guido Trotter
    (True, ["gnt-cluster", "modify", "-B", "minmem=a"]),
296 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 256$'"]),
297 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "maxmem=128,minmem=128"]),
298 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 128$'"]),
299 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 128$'"]),
300 9738ca94 Iustin Pop
    # vcpus
301 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "vcpus=4"]),
302 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *vcpus: 4$'"]),
303 21bf2e2e Andrea Spadaccini
    (True, ["gnt-cluster", "modify", "-B", "vcpus=a"]),
304 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "vcpus=1"]),
305 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *vcpus: 1$'"]),
306 9738ca94 Iustin Pop
    # auto_balance
307 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "auto_balance=False"]),
308 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *auto_balance: False$'"]),
309 21bf2e2e Andrea Spadaccini
    (True, ["gnt-cluster", "modify", "-B", "auto_balance=1"]),
310 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "auto_balance=True"]),
311 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *auto_balance: True$'"]),
312 9738ca94 Iustin Pop
    ]:
313 2f4b4f78 Iustin Pop
    AssertCommand(cmd, fail=fail)
314 9738ca94 Iustin Pop
315 5abecc1c Iustin Pop
  # redo the original-requested BE parameters, if any
316 5abecc1c Iustin Pop
  bep = qa_config.get("backend-parameters", "")
317 5abecc1c Iustin Pop
  if bep:
318 5abecc1c Iustin Pop
    AssertCommand(["gnt-cluster", "modify", "-B", bep])
319 9738ca94 Iustin Pop
320 21bf2e2e Andrea Spadaccini
321 cec9845c Michael Hanselmann
def TestClusterInfo():
322 cec9845c Michael Hanselmann
  """gnt-cluster info"""
323 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "info"])
324 283f9d4c Michael Hanselmann
325 283f9d4c Michael Hanselmann
326 3e8b5a9c Iustin Pop
def TestClusterRedistConf():
327 3e8b5a9c Iustin Pop
  """gnt-cluster redist-conf"""
328 3e8b5a9c Iustin Pop
  AssertCommand(["gnt-cluster", "redist-conf"])
329 3e8b5a9c Iustin Pop
330 3e8b5a9c Iustin Pop
331 283f9d4c Michael Hanselmann
def TestClusterGetmaster():
332 283f9d4c Michael Hanselmann
  """gnt-cluster getmaster"""
333 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "getmaster"])
334 283f9d4c Michael Hanselmann
335 283f9d4c Michael Hanselmann
336 283f9d4c Michael Hanselmann
def TestClusterVersion():
337 283f9d4c Michael Hanselmann
  """gnt-cluster version"""
338 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "version"])
339 cec9845c Michael Hanselmann
340 cec9845c Michael Hanselmann
341 6d4a1656 Michael Hanselmann
def TestClusterRenewCrypto():
342 6d4a1656 Michael Hanselmann
  """gnt-cluster renew-crypto"""
343 6d4a1656 Michael Hanselmann
  master = qa_config.GetMasterNode()
344 6d4a1656 Michael Hanselmann
345 6d4a1656 Michael Hanselmann
  # Conflicting options
346 6d4a1656 Michael Hanselmann
  cmd = ["gnt-cluster", "renew-crypto", "--force",
347 3db3eb2a Michael Hanselmann
         "--new-cluster-certificate", "--new-confd-hmac-key"]
348 3db3eb2a Michael Hanselmann
  conflicting = [
349 3db3eb2a Michael Hanselmann
    ["--new-rapi-certificate", "--rapi-certificate=/dev/null"],
350 3db3eb2a Michael Hanselmann
    ["--new-cluster-domain-secret", "--cluster-domain-secret=/dev/null"],
351 3db3eb2a Michael Hanselmann
    ]
352 3db3eb2a Michael Hanselmann
  for i in conflicting:
353 21bf2e2e Andrea Spadaccini
    AssertCommand(cmd + i, fail=True)
354 6d4a1656 Michael Hanselmann
355 6d4a1656 Michael Hanselmann
  # Invalid RAPI certificate
356 6d4a1656 Michael Hanselmann
  cmd = ["gnt-cluster", "renew-crypto", "--force",
357 6d4a1656 Michael Hanselmann
         "--rapi-certificate=/dev/null"]
358 2f4b4f78 Iustin Pop
  AssertCommand(cmd, fail=True)
359 6d4a1656 Michael Hanselmann
360 502f5236 Michael Hanselmann
  rapi_cert_backup = qa_utils.BackupFile(master["primary"],
361 502f5236 Michael Hanselmann
                                         constants.RAPI_CERT_FILE)
362 502f5236 Michael Hanselmann
  try:
363 502f5236 Michael Hanselmann
    # Custom RAPI certificate
364 502f5236 Michael Hanselmann
    fh = tempfile.NamedTemporaryFile()
365 6d4a1656 Michael Hanselmann
366 502f5236 Michael Hanselmann
    # Ensure certificate doesn't cause "gnt-cluster verify" to complain
367 502f5236 Michael Hanselmann
    validity = constants.SSL_CERT_EXPIRATION_WARN * 3
368 6d4a1656 Michael Hanselmann
369 5e26633b Michael Hanselmann
    utils.GenerateSelfSignedSslCert(fh.name, validity=validity)
370 6d4a1656 Michael Hanselmann
371 502f5236 Michael Hanselmann
    tmpcert = qa_utils.UploadFile(master["primary"], fh.name)
372 502f5236 Michael Hanselmann
    try:
373 2f4b4f78 Iustin Pop
      AssertCommand(["gnt-cluster", "renew-crypto", "--force",
374 2f4b4f78 Iustin Pop
                     "--rapi-certificate=%s" % tmpcert])
375 502f5236 Michael Hanselmann
    finally:
376 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", tmpcert])
377 502f5236 Michael Hanselmann
378 5e26633b Michael Hanselmann
    # Custom cluster domain secret
379 5e26633b Michael Hanselmann
    cds_fh = tempfile.NamedTemporaryFile()
380 5e26633b Michael Hanselmann
    cds_fh.write(utils.GenerateSecret())
381 5e26633b Michael Hanselmann
    cds_fh.write("\n")
382 5e26633b Michael Hanselmann
    cds_fh.flush()
383 5e26633b Michael Hanselmann
384 5e26633b Michael Hanselmann
    tmpcds = qa_utils.UploadFile(master["primary"], cds_fh.name)
385 5e26633b Michael Hanselmann
    try:
386 2f4b4f78 Iustin Pop
      AssertCommand(["gnt-cluster", "renew-crypto", "--force",
387 2f4b4f78 Iustin Pop
                     "--cluster-domain-secret=%s" % tmpcds])
388 5e26633b Michael Hanselmann
    finally:
389 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", tmpcds])
390 5e26633b Michael Hanselmann
391 502f5236 Michael Hanselmann
    # Normal case
392 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-cluster", "renew-crypto", "--force",
393 2f4b4f78 Iustin Pop
                   "--new-cluster-certificate", "--new-confd-hmac-key",
394 2f4b4f78 Iustin Pop
                   "--new-rapi-certificate", "--new-cluster-domain-secret"])
395 3db3eb2a Michael Hanselmann
396 502f5236 Michael Hanselmann
    # Restore RAPI certificate
397 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-cluster", "renew-crypto", "--force",
398 2f4b4f78 Iustin Pop
                   "--rapi-certificate=%s" % rapi_cert_backup])
399 3db3eb2a Michael Hanselmann
  finally:
400 2f4b4f78 Iustin Pop
    AssertCommand(["rm", "-f", rapi_cert_backup])
401 3db3eb2a Michael Hanselmann
402 6d4a1656 Michael Hanselmann
403 cec9845c Michael Hanselmann
def TestClusterBurnin():
404 cec9845c Michael Hanselmann
  """Burnin"""
405 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
406 cec9845c Michael Hanselmann
407 d0c8c01d Iustin Pop
  options = qa_config.get("options", {})
408 d0c8c01d Iustin Pop
  disk_template = options.get("burnin-disk-template", "drbd")
409 d0c8c01d Iustin Pop
  parallel = options.get("burnin-in-parallel", False)
410 d0c8c01d Iustin Pop
  check_inst = options.get("burnin-check-instances", False)
411 d0c8c01d Iustin Pop
  do_rename = options.get("burnin-rename", "")
412 d0c8c01d Iustin Pop
  do_reboot = options.get("burnin-reboot", True)
413 1d103c02 Iustin Pop
  reboot_types = options.get("reboot-types", constants.REBOOT_TYPES)
414 23103544 Michael Hanselmann
415 cec9845c Michael Hanselmann
  # Get as many instances as we need
416 cec9845c Michael Hanselmann
  instances = []
417 cec9845c Michael Hanselmann
  try:
418 23103544 Michael Hanselmann
    try:
419 d0c8c01d Iustin Pop
      num = qa_config.get("options", {}).get("burnin-instances", 1)
420 f1501b3f Michael Hanselmann
      for _ in range(0, num):
421 23103544 Michael Hanselmann
        instances.append(qa_config.AcquireInstance())
422 23103544 Michael Hanselmann
    except qa_error.OutOfInstancesError:
423 23103544 Michael Hanselmann
      print "Not enough instances, continuing anyway."
424 cec9845c Michael Hanselmann
425 23103544 Michael Hanselmann
    if len(instances) < 1:
426 23103544 Michael Hanselmann
      raise qa_error.Error("Burnin needs at least one instance")
427 cec9845c Michael Hanselmann
428 d0c8c01d Iustin Pop
    script = qa_utils.UploadFile(master["primary"], "../tools/burnin")
429 cec9845c Michael Hanselmann
    try:
430 23103544 Michael Hanselmann
      # Run burnin
431 cec9845c Michael Hanselmann
      cmd = [script,
432 d0c8c01d Iustin Pop
             "--os=%s" % qa_config.get("os"),
433 d0c8c01d Iustin Pop
             "--disk-size=%s" % ",".join(qa_config.get("disk")),
434 d0c8c01d Iustin Pop
             "--disk-growth=%s" % ",".join(qa_config.get("disk-growth")),
435 d0c8c01d Iustin Pop
             "--disk-template=%s" % disk_template]
436 0b0a150a Iustin Pop
      if parallel:
437 d0c8c01d Iustin Pop
        cmd.append("--parallel")
438 d0c8c01d Iustin Pop
        cmd.append("--early-release")
439 0b0a150a Iustin Pop
      if check_inst:
440 d0c8c01d Iustin Pop
        cmd.append("--http-check")
441 4dc76b24 Iustin Pop
      if do_rename:
442 d0c8c01d Iustin Pop
        cmd.append("--rename=%s" % do_rename)
443 58598264 Iustin Pop
      if not do_reboot:
444 d0c8c01d Iustin Pop
        cmd.append("--no-reboot")
445 1d103c02 Iustin Pop
      else:
446 d0c8c01d Iustin Pop
        cmd.append("--reboot-types=%s" % ",".join(reboot_types))
447 d0c8c01d Iustin Pop
      cmd += [inst["name"] for inst in instances]
448 2f4b4f78 Iustin Pop
      AssertCommand(cmd)
449 cec9845c Michael Hanselmann
    finally:
450 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", script])
451 2f4b4f78 Iustin Pop
452 cec9845c Michael Hanselmann
  finally:
453 cec9845c Michael Hanselmann
    for inst in instances:
454 cec9845c Michael Hanselmann
      qa_config.ReleaseInstance(inst)
455 cec9845c Michael Hanselmann
456 cec9845c Michael Hanselmann
457 cec9845c Michael Hanselmann
def TestClusterMasterFailover():
458 c28502b1 Iustin Pop
  """gnt-cluster master-failover"""
459 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
460 cec9845c Michael Hanselmann
  failovermaster = qa_config.AcquireNode(exclude=master)
461 cec9845c Michael Hanselmann
462 2f4b4f78 Iustin Pop
  cmd = ["gnt-cluster", "master-failover"]
463 2f4b4f78 Iustin Pop
  try:
464 2f4b4f78 Iustin Pop
    AssertCommand(cmd, node=failovermaster)
465 ff699aa9 Michael Hanselmann
    # Back to original master node
466 2f4b4f78 Iustin Pop
    AssertCommand(cmd, node=master)
467 cec9845c Michael Hanselmann
  finally:
468 cec9845c Michael Hanselmann
    qa_config.ReleaseNode(failovermaster)
469 cec9845c Michael Hanselmann
470 cec9845c Michael Hanselmann
471 ff699aa9 Michael Hanselmann
def TestClusterMasterFailoverWithDrainedQueue():
472 ff699aa9 Michael Hanselmann
  """gnt-cluster master-failover with drained queue"""
473 ff699aa9 Michael Hanselmann
  drain_check = ["test", "-f", constants.JOB_QUEUE_DRAIN_FILE]
474 ff699aa9 Michael Hanselmann
475 ff699aa9 Michael Hanselmann
  master = qa_config.GetMasterNode()
476 ff699aa9 Michael Hanselmann
  failovermaster = qa_config.AcquireNode(exclude=master)
477 ff699aa9 Michael Hanselmann
478 ff699aa9 Michael Hanselmann
  # Ensure queue is not drained
479 ff699aa9 Michael Hanselmann
  for node in [master, failovermaster]:
480 ff699aa9 Michael Hanselmann
    AssertCommand(drain_check, node=node, fail=True)
481 ff699aa9 Michael Hanselmann
482 ff699aa9 Michael Hanselmann
  # Drain queue on failover master
483 ff699aa9 Michael Hanselmann
  AssertCommand(["touch", constants.JOB_QUEUE_DRAIN_FILE], node=failovermaster)
484 ff699aa9 Michael Hanselmann
485 ff699aa9 Michael Hanselmann
  cmd = ["gnt-cluster", "master-failover"]
486 ff699aa9 Michael Hanselmann
  try:
487 ff699aa9 Michael Hanselmann
    AssertCommand(drain_check, node=failovermaster)
488 ff699aa9 Michael Hanselmann
    AssertCommand(cmd, node=failovermaster)
489 ff699aa9 Michael Hanselmann
    AssertCommand(drain_check, fail=True)
490 ff699aa9 Michael Hanselmann
    AssertCommand(drain_check, node=failovermaster, fail=True)
491 ff699aa9 Michael Hanselmann
492 ff699aa9 Michael Hanselmann
    # Back to original master node
493 ff699aa9 Michael Hanselmann
    AssertCommand(cmd, node=master)
494 ff699aa9 Michael Hanselmann
  finally:
495 ff699aa9 Michael Hanselmann
    qa_config.ReleaseNode(failovermaster)
496 ff699aa9 Michael Hanselmann
497 ff699aa9 Michael Hanselmann
  AssertCommand(drain_check, fail=True)
498 ff699aa9 Michael Hanselmann
  AssertCommand(drain_check, node=failovermaster, fail=True)
499 ff699aa9 Michael Hanselmann
500 ff699aa9 Michael Hanselmann
501 cec9845c Michael Hanselmann
def TestClusterCopyfile():
502 cec9845c Michael Hanselmann
  """gnt-cluster copyfile"""
503 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
504 cec9845c Michael Hanselmann
505 24818e8f Michael Hanselmann
  uniqueid = utils.NewUUID()
506 830da270 Michael Hanselmann
507 cec9845c Michael Hanselmann
  # Create temporary file
508 cec9845c Michael Hanselmann
  f = tempfile.NamedTemporaryFile()
509 830da270 Michael Hanselmann
  f.write(uniqueid)
510 cec9845c Michael Hanselmann
  f.flush()
511 cec9845c Michael Hanselmann
  f.seek(0)
512 cec9845c Michael Hanselmann
513 cec9845c Michael Hanselmann
  # Upload file to master node
514 d0c8c01d Iustin Pop
  testname = qa_utils.UploadFile(master["primary"], f.name)
515 cec9845c Michael Hanselmann
  try:
516 cec9845c Michael Hanselmann
    # Copy file to all nodes
517 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-cluster", "copyfile", testname])
518 830da270 Michael Hanselmann
    _CheckFileOnAllNodes(testname, uniqueid)
519 cec9845c Michael Hanselmann
  finally:
520 830da270 Michael Hanselmann
    _RemoveFileFromAllNodes(testname)
521 830da270 Michael Hanselmann
522 830da270 Michael Hanselmann
523 830da270 Michael Hanselmann
def TestClusterCommand():
524 830da270 Michael Hanselmann
  """gnt-cluster command"""
525 24818e8f Michael Hanselmann
  uniqueid = utils.NewUUID()
526 24818e8f Michael Hanselmann
  rfile = "/tmp/gnt%s" % utils.NewUUID()
527 d0c8c01d Iustin Pop
  rcmd = utils.ShellQuoteArgs(["echo", "-n", uniqueid])
528 d0c8c01d Iustin Pop
  cmd = utils.ShellQuoteArgs(["gnt-cluster", "command",
529 830da270 Michael Hanselmann
                              "%s >%s" % (rcmd, rfile)])
530 830da270 Michael Hanselmann
531 830da270 Michael Hanselmann
  try:
532 2f4b4f78 Iustin Pop
    AssertCommand(cmd)
533 830da270 Michael Hanselmann
    _CheckFileOnAllNodes(rfile, uniqueid)
534 830da270 Michael Hanselmann
  finally:
535 830da270 Michael Hanselmann
    _RemoveFileFromAllNodes(rfile)
536 cec9845c Michael Hanselmann
537 cec9845c Michael Hanselmann
538 cec9845c Michael Hanselmann
def TestClusterDestroy():
539 cec9845c Michael Hanselmann
  """gnt-cluster destroy"""
540 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "destroy", "--yes-do-it"])
541 65a884ef Iustin Pop
542 65a884ef Iustin Pop
543 65a884ef Iustin Pop
def TestClusterRepairDiskSizes():
544 65a884ef Iustin Pop
  """gnt-cluster repair-disk-sizes"""
545 65a884ef Iustin Pop
  AssertCommand(["gnt-cluster", "repair-disk-sizes"])