Statistics
| Branch: | Tag: | Revision:

root / qa / qa_cluster.py @ 9d7b1e53

History | View | Annotate | Download (15.2 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 830da270 Michael Hanselmann
def _RemoveFileFromAllNodes(filename):
44 830da270 Michael Hanselmann
  """Removes a file from all nodes.
45 830da270 Michael Hanselmann

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

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