Statistics
| Branch: | Tag: | Revision:

root / qa / qa_cluster.py @ 5a85b99e

History | View | Annotate | Download (15.4 kB)

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

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

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

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