Statistics
| Branch: | Tag: | Revision:

root / qa / qa_cluster.py @ 74b25887

History | View | Annotate | Download (34.3 kB)

1 c68d1f43 Michael Hanselmann
#
2 c68d1f43 Michael Hanselmann
#
3 c68d1f43 Michael Hanselmann
4 587f8ff6 Bernardo Dal Seno
# Copyright (C) 2007, 2010, 2011, 2012, 2013 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 587f8ff6 Bernardo Dal Seno
import re
27 cec9845c Michael Hanselmann
import tempfile
28 49ceab21 Michael Hanselmann
import os.path
29 cec9845c Michael Hanselmann
30 6d4a1656 Michael Hanselmann
from ganeti import constants
31 66d1f035 René Nussbaumer
from ganeti import compat
32 cec9845c Michael Hanselmann
from ganeti import utils
33 304d9f02 Michael Hanselmann
from ganeti import pathutils
34 cec9845c Michael Hanselmann
35 cec9845c Michael Hanselmann
import qa_config
36 cec9845c Michael Hanselmann
import qa_utils
37 cec9845c Michael Hanselmann
import qa_error
38 462f0faa Helga Velroyen
import qa_instance
39 cec9845c Michael Hanselmann
40 66d1f035 René Nussbaumer
from qa_utils import AssertEqual, AssertCommand, GetCommandOutput
41 cec9845c Michael Hanselmann
42 cec9845c Michael Hanselmann
43 23610ff8 Bernardo Dal Seno
# Prefix for LVM volumes created by QA code during tests
44 23610ff8 Bernardo Dal Seno
_QA_LV_PREFIX = "qa-"
45 23610ff8 Bernardo Dal Seno
46 c2a0947d Iustin Pop
#: cluster verify command
47 c2a0947d Iustin Pop
_CLUSTER_VERIFY = ["gnt-cluster", "verify"]
48 c2a0947d Iustin Pop
49 21bf2e2e Andrea Spadaccini
50 830da270 Michael Hanselmann
def _RemoveFileFromAllNodes(filename):
51 830da270 Michael Hanselmann
  """Removes a file from all nodes.
52 830da270 Michael Hanselmann

53 830da270 Michael Hanselmann
  """
54 2f4b4f78 Iustin Pop
  for node in qa_config.get("nodes"):
55 2f4b4f78 Iustin Pop
    AssertCommand(["rm", "-f", filename], node=node)
56 830da270 Michael Hanselmann
57 830da270 Michael Hanselmann
58 830da270 Michael Hanselmann
def _CheckFileOnAllNodes(filename, content):
59 830da270 Michael Hanselmann
  """Verifies the content of the given file on all nodes.
60 830da270 Michael Hanselmann

61 830da270 Michael Hanselmann
  """
62 830da270 Michael Hanselmann
  cmd = utils.ShellQuoteArgs(["cat", filename])
63 2f4b4f78 Iustin Pop
  for node in qa_config.get("nodes"):
64 aecba21e Michael Hanselmann
    AssertEqual(qa_utils.GetCommandOutput(node.primary, cmd), content)
65 830da270 Michael Hanselmann
66 830da270 Michael Hanselmann
67 0e79564a Bernardo Dal Seno
def _GetClusterField(field_path):
68 0e79564a Bernardo Dal Seno
  """Get the value of a cluster field.
69 17cfeee9 Bernardo Dal Seno

70 0e79564a Bernardo Dal Seno
  @type field_path: list of strings
71 0e79564a Bernardo Dal Seno
  @param field_path: Names of the groups/fields to navigate to get the desired
72 0e79564a Bernardo Dal Seno
      value, e.g. C{["Default node parameters", "oob_program"]}
73 0e79564a Bernardo Dal Seno
  @return: The effective value of the field (the actual type depends on the
74 0e79564a Bernardo Dal Seno
      chosen field)
75 17cfeee9 Bernardo Dal Seno

76 17cfeee9 Bernardo Dal Seno
  """
77 0e79564a Bernardo Dal Seno
  assert isinstance(field_path, list)
78 0e79564a Bernardo Dal Seno
  assert field_path
79 0e79564a Bernardo Dal Seno
  ret = qa_utils.GetObjectInfo(["gnt-cluster", "info"])
80 0e79564a Bernardo Dal Seno
  for key in field_path:
81 0e79564a Bernardo Dal Seno
    ret = ret[key]
82 0e79564a Bernardo Dal Seno
  return ret
83 17cfeee9 Bernardo Dal Seno
84 17cfeee9 Bernardo Dal Seno
85 587f8ff6 Bernardo Dal Seno
# Cluster-verify errors (date, "ERROR", then error code)
86 ab4832d1 Bernardo Dal Seno
_CVERROR_RE = re.compile(r"^[\w\s:]+\s+- (ERROR|WARNING):([A-Z0-9_-]+):")
87 587f8ff6 Bernardo Dal Seno
88 587f8ff6 Bernardo Dal Seno
89 587f8ff6 Bernardo Dal Seno
def _GetCVErrorCodes(cvout):
90 ab4832d1 Bernardo Dal Seno
  errs = set()
91 ab4832d1 Bernardo Dal Seno
  warns = set()
92 587f8ff6 Bernardo Dal Seno
  for l in cvout.splitlines():
93 587f8ff6 Bernardo Dal Seno
    m = _CVERROR_RE.match(l)
94 587f8ff6 Bernardo Dal Seno
    if m:
95 ab4832d1 Bernardo Dal Seno
      etype = m.group(1)
96 ab4832d1 Bernardo Dal Seno
      ecode = m.group(2)
97 ab4832d1 Bernardo Dal Seno
      if etype == "ERROR":
98 ab4832d1 Bernardo Dal Seno
        errs.add(ecode)
99 ab4832d1 Bernardo Dal Seno
      elif etype == "WARNING":
100 ab4832d1 Bernardo Dal Seno
        warns.add(ecode)
101 ab4832d1 Bernardo Dal Seno
  return (errs, warns)
102 587f8ff6 Bernardo Dal Seno
103 587f8ff6 Bernardo Dal Seno
104 ab4832d1 Bernardo Dal Seno
def _CheckVerifyErrors(actual, expected, etype):
105 ab4832d1 Bernardo Dal Seno
  exp_codes = compat.UniqueFrozenset(e for (_, e, _) in expected)
106 ab4832d1 Bernardo Dal Seno
  if not actual.issuperset(exp_codes):
107 ab4832d1 Bernardo Dal Seno
    missing = exp_codes.difference(actual)
108 ab4832d1 Bernardo Dal Seno
    raise qa_error.Error("Cluster-verify didn't return these expected"
109 ab4832d1 Bernardo Dal Seno
                         " %ss: %s" % (etype, utils.CommaJoin(missing)))
110 ab4832d1 Bernardo Dal Seno
111 ab4832d1 Bernardo Dal Seno
112 ab4832d1 Bernardo Dal Seno
def AssertClusterVerify(fail=False, errors=None, warnings=None):
113 587f8ff6 Bernardo Dal Seno
  """Run cluster-verify and check the result
114 587f8ff6 Bernardo Dal Seno

115 587f8ff6 Bernardo Dal Seno
  @type fail: bool
116 587f8ff6 Bernardo Dal Seno
  @param fail: if cluster-verify is expected to fail instead of succeeding
117 587f8ff6 Bernardo Dal Seno
  @type errors: list of tuples
118 587f8ff6 Bernardo Dal Seno
  @param errors: List of CV_XXX errors that are expected; if specified, all the
119 587f8ff6 Bernardo Dal Seno
      errors listed must appear in cluster-verify output. A non-empty value
120 587f8ff6 Bernardo Dal Seno
      implies C{fail=True}.
121 ab4832d1 Bernardo Dal Seno
  @type warnings: list of tuples
122 ab4832d1 Bernardo Dal Seno
  @param warnings: Same as C{errors} but for warnings.
123 587f8ff6 Bernardo Dal Seno

124 587f8ff6 Bernardo Dal Seno
  """
125 587f8ff6 Bernardo Dal Seno
  cvcmd = "gnt-cluster verify"
126 587f8ff6 Bernardo Dal Seno
  mnode = qa_config.GetMasterNode()
127 ab4832d1 Bernardo Dal Seno
  if errors or warnings:
128 aecba21e Michael Hanselmann
    cvout = GetCommandOutput(mnode.primary, cvcmd + " --error-codes",
129 ab4832d1 Bernardo Dal Seno
                             fail=(fail or errors))
130 ab4832d1 Bernardo Dal Seno
    (act_errs, act_warns) = _GetCVErrorCodes(cvout)
131 ab4832d1 Bernardo Dal Seno
    if errors:
132 ab4832d1 Bernardo Dal Seno
      _CheckVerifyErrors(act_errs, errors, "error")
133 ab4832d1 Bernardo Dal Seno
    if warnings:
134 ab4832d1 Bernardo Dal Seno
      _CheckVerifyErrors(act_warns, warnings, "warning")
135 587f8ff6 Bernardo Dal Seno
  else:
136 587f8ff6 Bernardo Dal Seno
    AssertCommand(cvcmd, fail=fail, node=mnode)
137 587f8ff6 Bernardo Dal Seno
138 587f8ff6 Bernardo Dal Seno
139 92cb4940 Andrea Spadaccini
# data for testing failures due to bad keys/values for disk parameters
140 92cb4940 Andrea Spadaccini
_FAIL_PARAMS = ["nonexistent:resync-rate=1",
141 92cb4940 Andrea Spadaccini
                "drbd:nonexistent=1",
142 92cb4940 Andrea Spadaccini
                "drbd:resync-rate=invalid",
143 92cb4940 Andrea Spadaccini
                ]
144 92cb4940 Andrea Spadaccini
145 92cb4940 Andrea Spadaccini
146 92cb4940 Andrea Spadaccini
def TestClusterInitDisk():
147 92cb4940 Andrea Spadaccini
  """gnt-cluster init -D"""
148 92cb4940 Andrea Spadaccini
  name = qa_config.get("name")
149 92cb4940 Andrea Spadaccini
  for param in _FAIL_PARAMS:
150 92cb4940 Andrea Spadaccini
    AssertCommand(["gnt-cluster", "init", "-D", param, name], fail=True)
151 92cb4940 Andrea Spadaccini
152 92cb4940 Andrea Spadaccini
153 725ec2f1 René Nussbaumer
def TestClusterInit(rapi_user, rapi_secret):
154 cec9845c Michael Hanselmann
  """gnt-cluster init"""
155 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
156 cec9845c Michael Hanselmann
157 734fd6b4 Michael Hanselmann
  rapi_users_path = qa_utils.MakeNodePath(master, pathutils.RAPI_USERS_FILE)
158 734fd6b4 Michael Hanselmann
  rapi_dir = os.path.dirname(rapi_users_path)
159 49ceab21 Michael Hanselmann
160 725ec2f1 René Nussbaumer
  # First create the RAPI credentials
161 a62d1901 Michael Hanselmann
  fh = tempfile.NamedTemporaryFile()
162 a62d1901 Michael Hanselmann
  try:
163 a62d1901 Michael Hanselmann
    fh.write("%s %s write\n" % (rapi_user, rapi_secret))
164 a62d1901 Michael Hanselmann
    fh.flush()
165 a62d1901 Michael Hanselmann
166 aecba21e Michael Hanselmann
    tmpru = qa_utils.UploadFile(master.primary, fh.name)
167 a62d1901 Michael Hanselmann
    try:
168 49ceab21 Michael Hanselmann
      AssertCommand(["mkdir", "-p", rapi_dir])
169 734fd6b4 Michael Hanselmann
      AssertCommand(["mv", tmpru, rapi_users_path])
170 a62d1901 Michael Hanselmann
    finally:
171 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", tmpru])
172 a62d1901 Michael Hanselmann
  finally:
173 a62d1901 Michael Hanselmann
    fh.close()
174 a62d1901 Michael Hanselmann
175 a62d1901 Michael Hanselmann
  # Initialize cluster
176 e7b6183b Michael Hanselmann
  cmd = [
177 e7b6183b Michael Hanselmann
    "gnt-cluster", "init",
178 e7b6183b Michael Hanselmann
    "--primary-ip-version=%d" % qa_config.get("primary_ip_version", 4),
179 59c1d41e Michael Hanselmann
    "--enabled-hypervisors=%s" % ",".join(qa_config.GetEnabledHypervisors()),
180 2dae8d64 Helga Velroyen
    "--enabled-disk-templates=%s" %
181 2dae8d64 Helga Velroyen
      ",".join(qa_config.GetEnabledDiskTemplates())
182 e7b6183b Michael Hanselmann
    ]
183 20286f7c René Nussbaumer
184 20286f7c René Nussbaumer
  for spec_type in ("mem-size", "disk-size", "disk-count", "cpu-count",
185 20286f7c René Nussbaumer
                    "nic-count"):
186 20286f7c René Nussbaumer
    for spec_val in ("min", "max", "std"):
187 20286f7c René Nussbaumer
      spec = qa_config.get("ispec_%s_%s" %
188 3601d488 Michael Hanselmann
                           (spec_type.replace("-", "_"), spec_val), None)
189 00650761 Michael Hanselmann
      if spec is not None:
190 20286f7c René Nussbaumer
        cmd.append("--specs-%s=%s=%d" % (spec_type, spec_val, spec))
191 9486f6ae Manuel Franceschini
192 aecba21e Michael Hanselmann
  if master.secondary:
193 aecba21e Michael Hanselmann
    cmd.append("--secondary-ip=%s" % master.secondary)
194 cec9845c Michael Hanselmann
195 912737ba Helga Velroyen
  if utils.IsLvmEnabled(qa_config.GetEnabledDiskTemplates()):
196 912737ba Helga Velroyen
    vgname = qa_config.get("vg-name", constants.DEFAULT_VG)
197 912737ba Helga Velroyen
    if vgname:
198 912737ba Helga Velroyen
      cmd.append("--vg-name=%s" % vgname)
199 912737ba Helga Velroyen
    else:
200 912737ba Helga Velroyen
      raise qa_error.Error("Please specify a volume group if you enable"
201 912737ba Helga Velroyen
                           " lvm-based disk templates in the QA.")
202 23610ff8 Bernardo Dal Seno
203 3601d488 Michael Hanselmann
  master_netdev = qa_config.get("master-netdev", None)
204 3601d488 Michael Hanselmann
  if master_netdev:
205 3601d488 Michael Hanselmann
    cmd.append("--master-netdev=%s" % master_netdev)
206 3601d488 Michael Hanselmann
207 3601d488 Michael Hanselmann
  nicparams = qa_config.get("default-nicparams", None)
208 3601d488 Michael Hanselmann
  if nicparams:
209 3601d488 Michael Hanselmann
    cmd.append("--nic-parameters=%s" %
210 3601d488 Michael Hanselmann
               ",".join(utils.FormatKeyValue(nicparams)))
211 cec9845c Michael Hanselmann
212 6a0f22e1 Bernardo Dal Seno
  # Cluster value of the exclusive-storage node parameter
213 6a0f22e1 Bernardo Dal Seno
  e_s = qa_config.get("exclusive-storage")
214 6a0f22e1 Bernardo Dal Seno
  if e_s is not None:
215 6a0f22e1 Bernardo Dal Seno
    cmd.extend(["--node-parameters", "exclusive_storage=%s" % e_s])
216 6a0f22e1 Bernardo Dal Seno
  else:
217 6a0f22e1 Bernardo Dal Seno
    e_s = False
218 6a0f22e1 Bernardo Dal Seno
  qa_config.SetExclusiveStorage(e_s)
219 6a0f22e1 Bernardo Dal Seno
220 becf9d5c Michael Hanselmann
  extra_args = qa_config.get("cluster-init-args")
221 becf9d5c Michael Hanselmann
  if extra_args:
222 becf9d5c Michael Hanselmann
    cmd.extend(extra_args)
223 becf9d5c Michael Hanselmann
224 13d2e231 Andrea Spadaccini
  cmd.append(qa_config.get("name"))
225 becf9d5c Michael Hanselmann
226 2f4b4f78 Iustin Pop
  AssertCommand(cmd)
227 cec9845c Michael Hanselmann
228 5abecc1c Iustin Pop
  cmd = ["gnt-cluster", "modify"]
229 13d2e231 Andrea Spadaccini
230 5abecc1c Iustin Pop
  # hypervisor parameter modifications
231 5abecc1c Iustin Pop
  hvp = qa_config.get("hypervisor-parameters", {})
232 5abecc1c Iustin Pop
  for k, v in hvp.items():
233 5abecc1c Iustin Pop
    cmd.extend(["-H", "%s:%s" % (k, v)])
234 5abecc1c Iustin Pop
  # backend parameter modifications
235 5abecc1c Iustin Pop
  bep = qa_config.get("backend-parameters", "")
236 5abecc1c Iustin Pop
  if bep:
237 5abecc1c Iustin Pop
    cmd.extend(["-B", bep])
238 5abecc1c Iustin Pop
239 5abecc1c Iustin Pop
  if len(cmd) > 2:
240 5abecc1c Iustin Pop
    AssertCommand(cmd)
241 5abecc1c Iustin Pop
242 5abecc1c Iustin Pop
  # OS parameters
243 5abecc1c Iustin Pop
  osp = qa_config.get("os-parameters", {})
244 5abecc1c Iustin Pop
  for k, v in osp.items():
245 5abecc1c Iustin Pop
    AssertCommand(["gnt-os", "modify", "-O", v, k])
246 5abecc1c Iustin Pop
247 5abecc1c Iustin Pop
  # OS hypervisor parameters
248 5abecc1c Iustin Pop
  os_hvp = qa_config.get("os-hvp", {})
249 5abecc1c Iustin Pop
  for os_name in os_hvp:
250 5abecc1c Iustin Pop
    for hv, hvp in os_hvp[os_name].items():
251 5abecc1c Iustin Pop
      AssertCommand(["gnt-os", "modify", "-H", "%s:%s" % (hv, hvp), os_name])
252 5abecc1c Iustin Pop
253 cec9845c Michael Hanselmann
254 caea3b32 Iustin Pop
def TestClusterRename():
255 caea3b32 Iustin Pop
  """gnt-cluster rename"""
256 d0c8c01d Iustin Pop
  cmd = ["gnt-cluster", "rename", "-f"]
257 caea3b32 Iustin Pop
258 d0c8c01d Iustin Pop
  original_name = qa_config.get("name")
259 d0c8c01d Iustin Pop
  rename_target = qa_config.get("rename", None)
260 caea3b32 Iustin Pop
  if rename_target is None:
261 caea3b32 Iustin Pop
    print qa_utils.FormatError('"rename" entry is missing')
262 caea3b32 Iustin Pop
    return
263 caea3b32 Iustin Pop
264 2f4b4f78 Iustin Pop
  for data in [
265 2f4b4f78 Iustin Pop
    cmd + [rename_target],
266 c2a0947d Iustin Pop
    _CLUSTER_VERIFY,
267 2f4b4f78 Iustin Pop
    cmd + [original_name],
268 c2a0947d Iustin Pop
    _CLUSTER_VERIFY,
269 2f4b4f78 Iustin Pop
    ]:
270 2f4b4f78 Iustin Pop
    AssertCommand(data)
271 caea3b32 Iustin Pop
272 caea3b32 Iustin Pop
273 69df9d2b Iustin Pop
def TestClusterOob():
274 69df9d2b Iustin Pop
  """out-of-band framework"""
275 f55312bd René Nussbaumer
  oob_path_exists = "/tmp/ganeti-qa-oob-does-exist-%s" % utils.NewUUID()
276 f55312bd René Nussbaumer
277 c2a0947d Iustin Pop
  AssertCommand(_CLUSTER_VERIFY)
278 f55312bd René Nussbaumer
  AssertCommand(["gnt-cluster", "modify", "--node-parameters",
279 f55312bd René Nussbaumer
                 "oob_program=/tmp/ganeti-qa-oob-does-not-exist-%s" %
280 f55312bd René Nussbaumer
                 utils.NewUUID()])
281 f55312bd René Nussbaumer
282 c2a0947d Iustin Pop
  AssertCommand(_CLUSTER_VERIFY, fail=True)
283 f55312bd René Nussbaumer
284 69df9d2b Iustin Pop
  AssertCommand(["touch", oob_path_exists])
285 69df9d2b Iustin Pop
  AssertCommand(["chmod", "0400", oob_path_exists])
286 69df9d2b Iustin Pop
  AssertCommand(["gnt-cluster", "copyfile", oob_path_exists])
287 f55312bd René Nussbaumer
288 f55312bd René Nussbaumer
  try:
289 f55312bd René Nussbaumer
    AssertCommand(["gnt-cluster", "modify", "--node-parameters",
290 f55312bd René Nussbaumer
                   "oob_program=%s" % oob_path_exists])
291 f55312bd René Nussbaumer
292 c2a0947d Iustin Pop
    AssertCommand(_CLUSTER_VERIFY, fail=True)
293 f55312bd René Nussbaumer
294 69df9d2b Iustin Pop
    AssertCommand(["chmod", "0500", oob_path_exists])
295 69df9d2b Iustin Pop
    AssertCommand(["gnt-cluster", "copyfile", oob_path_exists])
296 f55312bd René Nussbaumer
297 c2a0947d Iustin Pop
    AssertCommand(_CLUSTER_VERIFY)
298 f55312bd René Nussbaumer
  finally:
299 69df9d2b Iustin Pop
    AssertCommand(["gnt-cluster", "command", "rm", oob_path_exists])
300 f55312bd René Nussbaumer
301 f55312bd René Nussbaumer
  AssertCommand(["gnt-cluster", "modify", "--node-parameters",
302 f55312bd René Nussbaumer
                 "oob_program="])
303 69df9d2b Iustin Pop
304 69df9d2b Iustin Pop
305 66d1f035 René Nussbaumer
def TestClusterEpo():
306 66d1f035 René Nussbaumer
  """gnt-cluster epo"""
307 66d1f035 René Nussbaumer
  master = qa_config.GetMasterNode()
308 66d1f035 René Nussbaumer
309 66d1f035 René Nussbaumer
  # Assert that OOB is unavailable for all nodes
310 aecba21e Michael Hanselmann
  result_output = GetCommandOutput(master.primary,
311 58ea8d17 Michael Hanselmann
                                   "gnt-node list --verbose --no-headers -o"
312 66d1f035 René Nussbaumer
                                   " powered")
313 66d1f035 René Nussbaumer
  AssertEqual(compat.all(powered == "(unavail)"
314 66d1f035 René Nussbaumer
                         for powered in result_output.splitlines()), True)
315 66d1f035 René Nussbaumer
316 66d1f035 René Nussbaumer
  # Conflicting
317 66d1f035 René Nussbaumer
  AssertCommand(["gnt-cluster", "epo", "--groups", "--all"], fail=True)
318 66d1f035 René Nussbaumer
  # --all doesn't expect arguments
319 66d1f035 René Nussbaumer
  AssertCommand(["gnt-cluster", "epo", "--all", "some_arg"], fail=True)
320 66d1f035 René Nussbaumer
321 66d1f035 René Nussbaumer
  # Unless --all is given master is not allowed to be in the list
322 aecba21e Michael Hanselmann
  AssertCommand(["gnt-cluster", "epo", "-f", master.primary], fail=True)
323 66d1f035 René Nussbaumer
324 66d1f035 René Nussbaumer
  # This shouldn't fail
325 66d1f035 René Nussbaumer
  AssertCommand(["gnt-cluster", "epo", "-f", "--all"])
326 66d1f035 René Nussbaumer
327 66d1f035 René Nussbaumer
  # All instances should have been stopped now
328 aecba21e Michael Hanselmann
  result_output = GetCommandOutput(master.primary,
329 58ea8d17 Michael Hanselmann
                                   "gnt-instance list --no-headers -o status")
330 3e0ed18c René Nussbaumer
  # ERROR_down because the instance is stopped but not recorded as such
331 3e0ed18c René Nussbaumer
  AssertEqual(compat.all(status == "ERROR_down"
332 66d1f035 René Nussbaumer
                         for status in result_output.splitlines()), True)
333 66d1f035 René Nussbaumer
334 66d1f035 René Nussbaumer
  # Now start everything again
335 66d1f035 René Nussbaumer
  AssertCommand(["gnt-cluster", "epo", "--on", "-f", "--all"])
336 66d1f035 René Nussbaumer
337 66d1f035 René Nussbaumer
  # All instances should have been started now
338 aecba21e Michael Hanselmann
  result_output = GetCommandOutput(master.primary,
339 58ea8d17 Michael Hanselmann
                                   "gnt-instance list --no-headers -o status")
340 66d1f035 René Nussbaumer
  AssertEqual(compat.all(status == "running"
341 66d1f035 René Nussbaumer
                         for status in result_output.splitlines()), True)
342 66d1f035 René Nussbaumer
343 66d1f035 René Nussbaumer
344 69df9d2b Iustin Pop
def TestClusterVerify():
345 69df9d2b Iustin Pop
  """gnt-cluster verify"""
346 c2a0947d Iustin Pop
  AssertCommand(_CLUSTER_VERIFY)
347 c6953b6e Iustin Pop
  AssertCommand(["gnt-cluster", "verify-disks"])
348 cec9845c Michael Hanselmann
349 1377433b Michael Hanselmann
350 1377433b Michael Hanselmann
def TestJobqueue():
351 1377433b Michael Hanselmann
  """gnt-debug test-jobqueue"""
352 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-debug", "test-jobqueue"])
353 1377433b Michael Hanselmann
354 1377433b Michael Hanselmann
355 5a85b99e Michael Hanselmann
def TestDelay(node):
356 5a85b99e Michael Hanselmann
  """gnt-debug delay"""
357 5a85b99e Michael Hanselmann
  AssertCommand(["gnt-debug", "delay", "1"])
358 5a85b99e Michael Hanselmann
  AssertCommand(["gnt-debug", "delay", "--no-master", "1"])
359 5a85b99e Michael Hanselmann
  AssertCommand(["gnt-debug", "delay", "--no-master",
360 aecba21e Michael Hanselmann
                 "-n", node.primary, "1"])
361 5a85b99e Michael Hanselmann
362 5a85b99e Michael Hanselmann
363 452913ed Iustin Pop
def TestClusterReservedLvs():
364 452913ed Iustin Pop
  """gnt-cluster reserved lvs"""
365 23610ff8 Bernardo Dal Seno
  vgname = qa_config.get("vg-name", constants.DEFAULT_VG)
366 23610ff8 Bernardo Dal Seno
  lvname = _QA_LV_PREFIX + "test"
367 23610ff8 Bernardo Dal Seno
  lvfullname = "/".join([vgname, lvname])
368 2f4b4f78 Iustin Pop
  for fail, cmd in [
369 c2a0947d Iustin Pop
    (False, _CLUSTER_VERIFY),
370 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "--reserved-lvs", ""]),
371 23610ff8 Bernardo Dal Seno
    (False, ["lvcreate", "-L1G", "-n", lvname, vgname]),
372 21bf2e2e Andrea Spadaccini
    (True, _CLUSTER_VERIFY),
373 84d7e26b Dmitry Chernyak
    (False, ["gnt-cluster", "modify", "--reserved-lvs",
374 23610ff8 Bernardo Dal Seno
             "%s,.*/other-test" % lvfullname]),
375 c2a0947d Iustin Pop
    (False, _CLUSTER_VERIFY),
376 23610ff8 Bernardo Dal Seno
    (False, ["gnt-cluster", "modify", "--reserved-lvs",
377 23610ff8 Bernardo Dal Seno
             ".*/%s.*" % _QA_LV_PREFIX]),
378 c2a0947d Iustin Pop
    (False, _CLUSTER_VERIFY),
379 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "--reserved-lvs", ""]),
380 21bf2e2e Andrea Spadaccini
    (True, _CLUSTER_VERIFY),
381 23610ff8 Bernardo Dal Seno
    (False, ["lvremove", "-f", lvfullname]),
382 c2a0947d Iustin Pop
    (False, _CLUSTER_VERIFY),
383 452913ed Iustin Pop
    ]:
384 2f4b4f78 Iustin Pop
    AssertCommand(cmd, fail=fail)
385 452913ed Iustin Pop
386 cec9845c Michael Hanselmann
387 1e7acc3b Iustin Pop
def TestClusterModifyEmpty():
388 1e7acc3b Iustin Pop
  """gnt-cluster modify"""
389 1e7acc3b Iustin Pop
  AssertCommand(["gnt-cluster", "modify"], fail=True)
390 1e7acc3b Iustin Pop
391 1e7acc3b Iustin Pop
392 92cb4940 Andrea Spadaccini
def TestClusterModifyDisk():
393 92cb4940 Andrea Spadaccini
  """gnt-cluster modify -D"""
394 92cb4940 Andrea Spadaccini
  for param in _FAIL_PARAMS:
395 92cb4940 Andrea Spadaccini
    AssertCommand(["gnt-cluster", "modify", "-D", param], fail=True)
396 92cb4940 Andrea Spadaccini
397 92cb4940 Andrea Spadaccini
398 2dae8d64 Helga Velroyen
def TestClusterModifyDiskTemplates():
399 2dae8d64 Helga Velroyen
  """gnt-cluster modify --enabled-disk-templates=..."""
400 462f0faa Helga Velroyen
  enabled_disk_templates = qa_config.GetEnabledDiskTemplates()
401 2dae8d64 Helga Velroyen
  default_disk_template = qa_config.GetDefaultDiskTemplate()
402 462f0faa Helga Velroyen
403 462f0faa Helga Velroyen
  _TestClusterModifyDiskTemplatesArguments(default_disk_template,
404 462f0faa Helga Velroyen
                                           enabled_disk_templates)
405 912737ba Helga Velroyen
  _TestClusterModifyDiskTemplatesVgName(enabled_disk_templates)
406 462f0faa Helga Velroyen
407 462f0faa Helga Velroyen
  _RestoreEnabledDiskTemplates()
408 462f0faa Helga Velroyen
  nodes = qa_config.AcquireManyNodes(2)
409 462f0faa Helga Velroyen
410 462f0faa Helga Velroyen
  instance_template = enabled_disk_templates[0]
411 462f0faa Helga Velroyen
  instance = qa_instance.CreateInstanceByDiskTemplate(nodes, instance_template)
412 462f0faa Helga Velroyen
413 462f0faa Helga Velroyen
  _TestClusterModifyUnusedDiskTemplate(instance_template)
414 462f0faa Helga Velroyen
  _TestClusterModifyUsedDiskTemplate(instance_template,
415 462f0faa Helga Velroyen
                                     enabled_disk_templates)
416 462f0faa Helga Velroyen
417 462f0faa Helga Velroyen
  qa_instance.TestInstanceRemove(instance)
418 462f0faa Helga Velroyen
  _RestoreEnabledDiskTemplates()
419 462f0faa Helga Velroyen
420 462f0faa Helga Velroyen
421 462f0faa Helga Velroyen
def _RestoreEnabledDiskTemplates():
422 462f0faa Helga Velroyen
  """Sets the list of enabled disk templates back to the list of enabled disk
423 462f0faa Helga Velroyen
     templates from the QA configuration. This can be used to make sure that
424 462f0faa Helga Velroyen
     the tests that modify the list of disk templates do not interfere with
425 462f0faa Helga Velroyen
     other tests.
426 462f0faa Helga Velroyen

427 462f0faa Helga Velroyen
  """
428 912737ba Helga Velroyen
  vgname = qa_config.get("vg-name", constants.DEFAULT_VG)
429 dacd8ba4 Helga Velroyen
  AssertCommand(
430 dacd8ba4 Helga Velroyen
    ["gnt-cluster", "modify",
431 912737ba Helga Velroyen
     "--enabled-disk-templates=%s" %
432 912737ba Helga Velroyen
       ",".join(qa_config.GetEnabledDiskTemplates()),
433 912737ba Helga Velroyen
     "--vg-name=%s" % vgname],
434 dacd8ba4 Helga Velroyen
    fail=False)
435 462f0faa Helga Velroyen
436 462f0faa Helga Velroyen
437 462f0faa Helga Velroyen
def _TestClusterModifyDiskTemplatesArguments(default_disk_template,
438 462f0faa Helga Velroyen
                                             enabled_disk_templates):
439 462f0faa Helga Velroyen
  """Tests argument handling of 'gnt-cluster modify' with respect to
440 462f0faa Helga Velroyen
     the parameter '--enabled-disk-templates'. This test is independent
441 462f0faa Helga Velroyen
     of instances.
442 462f0faa Helga Velroyen

443 462f0faa Helga Velroyen
  """
444 912737ba Helga Velroyen
  _RestoreEnabledDiskTemplates()
445 462f0faa Helga Velroyen
446 2dae8d64 Helga Velroyen
  # bogus templates
447 dacd8ba4 Helga Velroyen
  AssertCommand(["gnt-cluster", "modify",
448 2dae8d64 Helga Velroyen
                 "--enabled-disk-templates=pinkbunny"],
449 dacd8ba4 Helga Velroyen
                fail=True)
450 462f0faa Helga Velroyen
451 dacd8ba4 Helga Velroyen
  # duplicate entries do no harm
452 dacd8ba4 Helga Velroyen
  AssertCommand(
453 dacd8ba4 Helga Velroyen
    ["gnt-cluster", "modify",
454 2dae8d64 Helga Velroyen
     "--enabled-disk-templates=%s,%s" %
455 2dae8d64 Helga Velroyen
      (default_disk_template, default_disk_template)],
456 dacd8ba4 Helga Velroyen
    fail=False)
457 462f0faa Helga Velroyen
458 912737ba Helga Velroyen
  # interaction with --drbd-usermode-helper option
459 912737ba Helga Velroyen
  drbd_usermode_helper = qa_config.get("drbd-usermode-helper", None)
460 912737ba Helga Velroyen
  if not drbd_usermode_helper:
461 912737ba Helga Velroyen
    drbd_usermode_helper = "/bin/true"
462 912737ba Helga Velroyen
  # specifying a helper when drbd gets disabled
463 912737ba Helga Velroyen
  AssertCommand(["gnt-cluster", "modify",
464 912737ba Helga Velroyen
                 "--drbd-usermode-helper=%s" % drbd_usermode_helper,
465 912737ba Helga Velroyen
                 "--enabled-disk-templates=%s" % constants.DT_DISKLESS],
466 912737ba Helga Velroyen
                 fail=False)
467 912737ba Helga Velroyen
  if constants.DT_DRBD8 in enabled_disk_templates:
468 912737ba Helga Velroyen
    # specifying a vg name when lvm is enabled
469 912737ba Helga Velroyen
    AssertCommand(["gnt-cluster", "modify",
470 912737ba Helga Velroyen
                   "--drbd-usermode-helper=%s" % drbd_usermode_helper,
471 912737ba Helga Velroyen
                   "--enabled-disk-templates=%s" %
472 912737ba Helga Velroyen
                     ",".join(enabled_disk_templates)],
473 912737ba Helga Velroyen
                  fail=False)
474 912737ba Helga Velroyen
475 912737ba Helga Velroyen
476 912737ba Helga Velroyen
def _TestClusterModifyDiskTemplatesVgName(enabled_disk_templates):
477 912737ba Helga Velroyen
  """Tests argument handling of 'gnt-cluster modify' with respect to
478 912737ba Helga Velroyen
     the parameter '--enabled-disk-templates' and '--vg-name'. This test is
479 912737ba Helga Velroyen
     independent of instances.
480 912737ba Helga Velroyen

481 912737ba Helga Velroyen
  """
482 912737ba Helga Velroyen
  if not utils.IsLvmEnabled(enabled_disk_templates):
483 912737ba Helga Velroyen
    # These tests only make sense if lvm is enabled for QA
484 912737ba Helga Velroyen
    return
485 912737ba Helga Velroyen
486 912737ba Helga Velroyen
  # determine an LVM and a non-LVM disk template for the tests
487 912737ba Helga Velroyen
  non_lvm_templates = list(set(enabled_disk_templates)
488 912737ba Helga Velroyen
                           - set(utils.GetLvmDiskTemplates()))
489 912737ba Helga Velroyen
  lvm_template = list(set(enabled_disk_templates)
490 912737ba Helga Velroyen
                      .intersection(set(utils.GetLvmDiskTemplates())))[0]
491 912737ba Helga Velroyen
  non_lvm_template = None
492 912737ba Helga Velroyen
  if non_lvm_templates:
493 912737ba Helga Velroyen
    non_lvm_template = non_lvm_templates[0]
494 912737ba Helga Velroyen
  else:
495 912737ba Helga Velroyen
    # If no non-lvm disk template is available for QA, choose 'diskless' and
496 912737ba Helga Velroyen
    # hope for the best.
497 912737ba Helga Velroyen
    non_lvm_template = constants.ST_DISKLESS
498 912737ba Helga Velroyen
499 912737ba Helga Velroyen
  vgname = qa_config.get("vg-name", constants.DEFAULT_VG)
500 912737ba Helga Velroyen
501 912737ba Helga Velroyen
  # Clean start: unset volume group name, disable lvm storage
502 912737ba Helga Velroyen
  AssertCommand(
503 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
504 912737ba Helga Velroyen
     "--enabled-disk-templates=%s" % non_lvm_template,
505 912737ba Helga Velroyen
     "--vg-name="],
506 912737ba Helga Velroyen
    fail=False)
507 912737ba Helga Velroyen
508 912737ba Helga Velroyen
  # Try to enable lvm, when no volume group is given
509 912737ba Helga Velroyen
  AssertCommand(
510 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
511 912737ba Helga Velroyen
     "--enabled-disk-templates=%s" % lvm_template],
512 912737ba Helga Velroyen
    fail=True)
513 912737ba Helga Velroyen
514 912737ba Helga Velroyen
  # Set volume group, with lvm still disabled: just a warning
515 912737ba Helga Velroyen
  AssertCommand(["gnt-cluster", "modify", "--vg-name=%s" % vgname], fail=False)
516 912737ba Helga Velroyen
517 912737ba Helga Velroyen
  # Try unsetting vg name and enabling lvm at the same time
518 912737ba Helga Velroyen
  AssertCommand(
519 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
520 912737ba Helga Velroyen
     "--enabled-disk-templates=%s" % lvm_template,
521 912737ba Helga Velroyen
     "--vg-name="],
522 912737ba Helga Velroyen
    fail=True)
523 912737ba Helga Velroyen
524 912737ba Helga Velroyen
  # Enable lvm with vg name present
525 912737ba Helga Velroyen
  AssertCommand(
526 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
527 912737ba Helga Velroyen
     "--enabled-disk-templates=%s" % lvm_template],
528 912737ba Helga Velroyen
    fail=False)
529 912737ba Helga Velroyen
530 912737ba Helga Velroyen
  # Try unsetting vg name with lvm still enabled
531 912737ba Helga Velroyen
  AssertCommand(["gnt-cluster", "modify", "--vg-name="], fail=True)
532 912737ba Helga Velroyen
533 912737ba Helga Velroyen
  # Disable lvm with vg name still set
534 912737ba Helga Velroyen
  AssertCommand(
535 912737ba Helga Velroyen
    ["gnt-cluster", "modify", "--enabled-disk-templates=%s" % non_lvm_template],
536 912737ba Helga Velroyen
    fail=False)
537 912737ba Helga Velroyen
538 912737ba Helga Velroyen
  # Try unsetting vg name with lvm disabled
539 912737ba Helga Velroyen
  AssertCommand(["gnt-cluster", "modify", "--vg-name="], fail=False)
540 912737ba Helga Velroyen
541 912737ba Helga Velroyen
  # Set vg name and enable lvm at the same time
542 912737ba Helga Velroyen
  AssertCommand(
543 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
544 912737ba Helga Velroyen
     "--enabled-disk-templates=%s" % lvm_template,
545 912737ba Helga Velroyen
     "--vg-name=%s" % vgname],
546 912737ba Helga Velroyen
    fail=False)
547 912737ba Helga Velroyen
548 912737ba Helga Velroyen
  # Unset vg name and disable lvm at the same time
549 912737ba Helga Velroyen
  AssertCommand(
550 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
551 912737ba Helga Velroyen
     "--enabled-disk-templates=%s" % non_lvm_template,
552 912737ba Helga Velroyen
     "--vg-name="],
553 912737ba Helga Velroyen
    fail=False)
554 912737ba Helga Velroyen
555 912737ba Helga Velroyen
  _RestoreEnabledDiskTemplates()
556 912737ba Helga Velroyen
557 462f0faa Helga Velroyen
558 462f0faa Helga Velroyen
def _TestClusterModifyUsedDiskTemplate(instance_template,
559 462f0faa Helga Velroyen
                                       enabled_disk_templates):
560 462f0faa Helga Velroyen
  """Tests that disk templates that are currently in use by instances cannot
561 462f0faa Helga Velroyen
     be disabled on the cluster.
562 462f0faa Helga Velroyen

563 462f0faa Helga Velroyen
  """
564 462f0faa Helga Velroyen
  # If the list of enabled disk templates contains only one template
565 462f0faa Helga Velroyen
  # we need to add some other templates, because the list of enabled disk
566 462f0faa Helga Velroyen
  # templates can only be set to a non-empty list.
567 462f0faa Helga Velroyen
  new_disk_templates = list(set(enabled_disk_templates)
568 462f0faa Helga Velroyen
                              - set([instance_template]))
569 462f0faa Helga Velroyen
  if not new_disk_templates:
570 462f0faa Helga Velroyen
    new_disk_templates = list(set(constants.DISK_TEMPLATES)
571 462f0faa Helga Velroyen
                                - set([instance_template]))
572 462f0faa Helga Velroyen
  AssertCommand(
573 462f0faa Helga Velroyen
    ["gnt-cluster", "modify",
574 462f0faa Helga Velroyen
     "--enabled-disk-templates=%s" %
575 462f0faa Helga Velroyen
       ",".join(new_disk_templates)],
576 462f0faa Helga Velroyen
    fail=True)
577 462f0faa Helga Velroyen
578 462f0faa Helga Velroyen
579 462f0faa Helga Velroyen
def _TestClusterModifyUnusedDiskTemplate(instance_template):
580 462f0faa Helga Velroyen
  """Tests that unused disk templates can be disabled safely."""
581 462f0faa Helga Velroyen
  all_disk_templates = constants.DISK_TEMPLATES
582 462f0faa Helga Velroyen
  AssertCommand(
583 462f0faa Helga Velroyen
    ["gnt-cluster", "modify",
584 462f0faa Helga Velroyen
     "--enabled-disk-templates=%s" %
585 462f0faa Helga Velroyen
       ",".join(all_disk_templates)],
586 462f0faa Helga Velroyen
    fail=False)
587 462f0faa Helga Velroyen
  new_disk_templates = [instance_template]
588 462f0faa Helga Velroyen
  AssertCommand(
589 462f0faa Helga Velroyen
    ["gnt-cluster", "modify",
590 462f0faa Helga Velroyen
     "--enabled-disk-templates=%s" %
591 462f0faa Helga Velroyen
       ",".join(new_disk_templates)],
592 462f0faa Helga Velroyen
    fail=False)
593 dacd8ba4 Helga Velroyen
594 dacd8ba4 Helga Velroyen
595 9738ca94 Iustin Pop
def TestClusterModifyBe():
596 9738ca94 Iustin Pop
  """gnt-cluster modify -B"""
597 2f4b4f78 Iustin Pop
  for fail, cmd in [
598 8ccbbe4b Guido Trotter
    # max/min mem
599 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "maxmem=256"]),
600 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 256$'"]),
601 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "minmem=256"]),
602 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 256$'"]),
603 8ccbbe4b Guido Trotter
    (True, ["gnt-cluster", "modify", "-B", "maxmem=a"]),
604 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 256$'"]),
605 8ccbbe4b Guido Trotter
    (True, ["gnt-cluster", "modify", "-B", "minmem=a"]),
606 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 256$'"]),
607 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "maxmem=128,minmem=128"]),
608 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 128$'"]),
609 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 128$'"]),
610 9738ca94 Iustin Pop
    # vcpus
611 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "vcpus=4"]),
612 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *vcpus: 4$'"]),
613 21bf2e2e Andrea Spadaccini
    (True, ["gnt-cluster", "modify", "-B", "vcpus=a"]),
614 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "vcpus=1"]),
615 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *vcpus: 1$'"]),
616 9738ca94 Iustin Pop
    # auto_balance
617 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "auto_balance=False"]),
618 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *auto_balance: False$'"]),
619 21bf2e2e Andrea Spadaccini
    (True, ["gnt-cluster", "modify", "-B", "auto_balance=1"]),
620 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "auto_balance=True"]),
621 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *auto_balance: True$'"]),
622 9738ca94 Iustin Pop
    ]:
623 2f4b4f78 Iustin Pop
    AssertCommand(cmd, fail=fail)
624 9738ca94 Iustin Pop
625 5abecc1c Iustin Pop
  # redo the original-requested BE parameters, if any
626 5abecc1c Iustin Pop
  bep = qa_config.get("backend-parameters", "")
627 5abecc1c Iustin Pop
  if bep:
628 5abecc1c Iustin Pop
    AssertCommand(["gnt-cluster", "modify", "-B", bep])
629 9738ca94 Iustin Pop
630 21bf2e2e Andrea Spadaccini
631 b3f3aa3d Bernardo Dal Seno
def _GetClusterIPolicy():
632 b3f3aa3d Bernardo Dal Seno
  """Return the run-time values of the cluster-level instance policy.
633 b3f3aa3d Bernardo Dal Seno

634 b3f3aa3d Bernardo Dal Seno
  @rtype: tuple
635 b3f3aa3d Bernardo Dal Seno
  @return: (policy, specs), where:
636 b3f3aa3d Bernardo Dal Seno
      - policy is a dictionary of the policy values, instance specs excluded
637 7c8ae421 Bernardo Dal Seno
      - specs is a dictionary containing only the specs, using the internal
638 7c8ae421 Bernardo Dal Seno
        format (see L{constants.IPOLICY_DEFAULTS} for an example)
639 b3f3aa3d Bernardo Dal Seno

640 b3f3aa3d Bernardo Dal Seno
  """
641 0e79564a Bernardo Dal Seno
  info = qa_utils.GetObjectInfo(["gnt-cluster", "info"])
642 0e79564a Bernardo Dal Seno
  policy = info["Instance policy - limits for instances"]
643 63e08b25 Bernardo Dal Seno
  (ret_policy, ret_specs) = qa_utils.ParseIPolicy(policy)
644 0e79564a Bernardo Dal Seno
645 b3f3aa3d Bernardo Dal Seno
  # Sanity checks
646 7c8ae421 Bernardo Dal Seno
  assert "minmax" in ret_specs and "std" in ret_specs
647 7c8ae421 Bernardo Dal Seno
  assert len(ret_specs["minmax"]) > 0
648 0e79564a Bernardo Dal Seno
  assert len(ret_policy) > 0
649 0e79564a Bernardo Dal Seno
  return (ret_policy, ret_specs)
650 b3f3aa3d Bernardo Dal Seno
651 b3f3aa3d Bernardo Dal Seno
652 b3f3aa3d Bernardo Dal Seno
def TestClusterModifyIPolicy():
653 b3f3aa3d Bernardo Dal Seno
  """gnt-cluster modify --ipolicy-*"""
654 b3f3aa3d Bernardo Dal Seno
  basecmd = ["gnt-cluster", "modify"]
655 b3f3aa3d Bernardo Dal Seno
  (old_policy, old_specs) = _GetClusterIPolicy()
656 b3f3aa3d Bernardo Dal Seno
  for par in ["vcpu-ratio", "spindle-ratio"]:
657 b3f3aa3d Bernardo Dal Seno
    curr_val = float(old_policy[par])
658 b3f3aa3d Bernardo Dal Seno
    test_values = [
659 b3f3aa3d Bernardo Dal Seno
      (True, 1.0),
660 b3f3aa3d Bernardo Dal Seno
      (True, 1.5),
661 b3f3aa3d Bernardo Dal Seno
      (True, 2),
662 b3f3aa3d Bernardo Dal Seno
      (False, "a"),
663 b3f3aa3d Bernardo Dal Seno
      # Restore the old value
664 b3f3aa3d Bernardo Dal Seno
      (True, curr_val),
665 b3f3aa3d Bernardo Dal Seno
      ]
666 b3f3aa3d Bernardo Dal Seno
    for (good, val) in test_values:
667 b3f3aa3d Bernardo Dal Seno
      cmd = basecmd + ["--ipolicy-%s=%s" % (par, val)]
668 b3f3aa3d Bernardo Dal Seno
      AssertCommand(cmd, fail=not good)
669 b3f3aa3d Bernardo Dal Seno
      if good:
670 b3f3aa3d Bernardo Dal Seno
        curr_val = val
671 b3f3aa3d Bernardo Dal Seno
      # Check the affected parameter
672 b3f3aa3d Bernardo Dal Seno
      (eff_policy, eff_specs) = _GetClusterIPolicy()
673 b3f3aa3d Bernardo Dal Seno
      AssertEqual(float(eff_policy[par]), curr_val)
674 b3f3aa3d Bernardo Dal Seno
      # Check everything else
675 b3f3aa3d Bernardo Dal Seno
      AssertEqual(eff_specs, old_specs)
676 b3f3aa3d Bernardo Dal Seno
      for p in eff_policy.keys():
677 b3f3aa3d Bernardo Dal Seno
        if p == par:
678 b3f3aa3d Bernardo Dal Seno
          continue
679 b3f3aa3d Bernardo Dal Seno
        AssertEqual(eff_policy[p], old_policy[p])
680 b3f3aa3d Bernardo Dal Seno
681 b3f3aa3d Bernardo Dal Seno
  # Disk templates are treated slightly differently
682 b3f3aa3d Bernardo Dal Seno
  par = "disk-templates"
683 9db0b351 Bernardo Dal Seno
  disp_str = "allowed disk templates"
684 b3f3aa3d Bernardo Dal Seno
  curr_val = old_policy[disp_str]
685 b3f3aa3d Bernardo Dal Seno
  test_values = [
686 b3f3aa3d Bernardo Dal Seno
    (True, constants.DT_PLAIN),
687 b3f3aa3d Bernardo Dal Seno
    (True, "%s,%s" % (constants.DT_PLAIN, constants.DT_DRBD8)),
688 b3f3aa3d Bernardo Dal Seno
    (False, "thisisnotadisktemplate"),
689 b3f3aa3d Bernardo Dal Seno
    (False, ""),
690 b3f3aa3d Bernardo Dal Seno
    # Restore the old value
691 b3f3aa3d Bernardo Dal Seno
    (True, curr_val.replace(" ", "")),
692 b3f3aa3d Bernardo Dal Seno
    ]
693 b3f3aa3d Bernardo Dal Seno
  for (good, val) in test_values:
694 b3f3aa3d Bernardo Dal Seno
    cmd = basecmd + ["--ipolicy-%s=%s" % (par, val)]
695 b3f3aa3d Bernardo Dal Seno
    AssertCommand(cmd, fail=not good)
696 b3f3aa3d Bernardo Dal Seno
    if good:
697 b3f3aa3d Bernardo Dal Seno
      curr_val = val
698 b3f3aa3d Bernardo Dal Seno
    # Check the affected parameter
699 b3f3aa3d Bernardo Dal Seno
    (eff_policy, eff_specs) = _GetClusterIPolicy()
700 b3f3aa3d Bernardo Dal Seno
    AssertEqual(eff_policy[disp_str].replace(" ", ""), curr_val)
701 b3f3aa3d Bernardo Dal Seno
    # Check everything else
702 b3f3aa3d Bernardo Dal Seno
    AssertEqual(eff_specs, old_specs)
703 b3f3aa3d Bernardo Dal Seno
    for p in eff_policy.keys():
704 b3f3aa3d Bernardo Dal Seno
      if p == disp_str:
705 b3f3aa3d Bernardo Dal Seno
        continue
706 b3f3aa3d Bernardo Dal Seno
      AssertEqual(eff_policy[p], old_policy[p])
707 b3f3aa3d Bernardo Dal Seno
708 b3f3aa3d Bernardo Dal Seno
709 ec996117 Bernardo Dal Seno
def TestClusterSetISpecs(new_specs=None, diff_specs=None, fail=False,
710 ec996117 Bernardo Dal Seno
                         old_values=None):
711 b3f3aa3d Bernardo Dal Seno
  """Change instance specs.
712 b3f3aa3d Bernardo Dal Seno

713 ec996117 Bernardo Dal Seno
  At most one of new_specs or diff_specs can be specified.
714 ec996117 Bernardo Dal Seno

715 ec996117 Bernardo Dal Seno
  @type new_specs: dict
716 ec996117 Bernardo Dal Seno
  @param new_specs: new complete specs, in the same format returned by
717 ec996117 Bernardo Dal Seno
      L{_GetClusterIPolicy}
718 ec996117 Bernardo Dal Seno
  @type diff_specs: dict
719 7c8ae421 Bernardo Dal Seno
  @param diff_specs: partial specs, it can be an incomplete specifications, but
720 7c8ae421 Bernardo Dal Seno
      if min/max specs are specified, their number must match the number of the
721 7c8ae421 Bernardo Dal Seno
      existing specs
722 b3f3aa3d Bernardo Dal Seno
  @type fail: bool
723 b3f3aa3d Bernardo Dal Seno
  @param fail: if the change is expected to fail
724 b3f3aa3d Bernardo Dal Seno
  @type old_values: tuple
725 b3f3aa3d Bernardo Dal Seno
  @param old_values: (old_policy, old_specs), as returned by
726 ec996117 Bernardo Dal Seno
      L{_GetClusterIPolicy}
727 b3f3aa3d Bernardo Dal Seno
  @return: same as L{_GetClusterIPolicy}
728 b3f3aa3d Bernardo Dal Seno

729 b3f3aa3d Bernardo Dal Seno
  """
730 63e08b25 Bernardo Dal Seno
  build_cmd = lambda opts: ["gnt-cluster", "modify"] + opts
731 ec996117 Bernardo Dal Seno
  return qa_utils.TestSetISpecs(
732 ec996117 Bernardo Dal Seno
    new_specs=new_specs, diff_specs=diff_specs,
733 ec996117 Bernardo Dal Seno
    get_policy_fn=_GetClusterIPolicy, build_cmd_fn=build_cmd,
734 ec996117 Bernardo Dal Seno
    fail=fail, old_values=old_values)
735 b3f3aa3d Bernardo Dal Seno
736 b3f3aa3d Bernardo Dal Seno
737 b3f3aa3d Bernardo Dal Seno
def TestClusterModifyISpecs():
738 b3f3aa3d Bernardo Dal Seno
  """gnt-cluster modify --specs-*"""
739 cb178a1e Bernardo Dal Seno
  params = ["memory-size", "disk-size", "disk-count", "cpu-count", "nic-count"]
740 b3f3aa3d Bernardo Dal Seno
  (cur_policy, cur_specs) = _GetClusterIPolicy()
741 7c8ae421 Bernardo Dal Seno
  # This test assumes that there is only one min/max bound
742 7c8ae421 Bernardo Dal Seno
  assert len(cur_specs[constants.ISPECS_MINMAX]) == 1
743 b3f3aa3d Bernardo Dal Seno
  for par in params:
744 b3f3aa3d Bernardo Dal Seno
    test_values = [
745 b3f3aa3d Bernardo Dal Seno
      (True, 0, 4, 12),
746 b3f3aa3d Bernardo Dal Seno
      (True, 4, 4, 12),
747 b3f3aa3d Bernardo Dal Seno
      (True, 4, 12, 12),
748 b3f3aa3d Bernardo Dal Seno
      (True, 4, 4, 4),
749 b3f3aa3d Bernardo Dal Seno
      (False, 4, 0, 12),
750 b3f3aa3d Bernardo Dal Seno
      (False, 4, 16, 12),
751 b3f3aa3d Bernardo Dal Seno
      (False, 4, 4, 0),
752 b3f3aa3d Bernardo Dal Seno
      (False, 12, 4, 4),
753 b3f3aa3d Bernardo Dal Seno
      (False, 12, 4, 0),
754 b3f3aa3d Bernardo Dal Seno
      (False, "a", 4, 12),
755 b3f3aa3d Bernardo Dal Seno
      (False, 0, "a", 12),
756 b3f3aa3d Bernardo Dal Seno
      (False, 0, 4, "a"),
757 b3f3aa3d Bernardo Dal Seno
      # This is to restore the old values
758 b3f3aa3d Bernardo Dal Seno
      (True,
759 7c8ae421 Bernardo Dal Seno
       cur_specs[constants.ISPECS_MINMAX][0][constants.ISPECS_MIN][par],
760 7c8ae421 Bernardo Dal Seno
       cur_specs[constants.ISPECS_STD][par],
761 7c8ae421 Bernardo Dal Seno
       cur_specs[constants.ISPECS_MINMAX][0][constants.ISPECS_MAX][par])
762 b3f3aa3d Bernardo Dal Seno
      ]
763 b3f3aa3d Bernardo Dal Seno
    for (good, mn, st, mx) in test_values:
764 ec996117 Bernardo Dal Seno
      new_vals = {
765 7c8ae421 Bernardo Dal Seno
        constants.ISPECS_MINMAX: [{
766 7c8ae421 Bernardo Dal Seno
          constants.ISPECS_MIN: {par: mn},
767 7c8ae421 Bernardo Dal Seno
          constants.ISPECS_MAX: {par: mx}
768 7c8ae421 Bernardo Dal Seno
          }],
769 7c8ae421 Bernardo Dal Seno
        constants.ISPECS_STD: {par: st}
770 ec996117 Bernardo Dal Seno
        }
771 b3f3aa3d Bernardo Dal Seno
      cur_state = (cur_policy, cur_specs)
772 b3f3aa3d Bernardo Dal Seno
      # We update cur_specs, as we've copied the values to restore already
773 ec996117 Bernardo Dal Seno
      (cur_policy, cur_specs) = TestClusterSetISpecs(
774 ec996117 Bernardo Dal Seno
        diff_specs=new_vals, fail=not good, old_values=cur_state)
775 b3f3aa3d Bernardo Dal Seno
776 b5a93c73 Bernardo Dal Seno
    # Get the ipolicy command
777 b5a93c73 Bernardo Dal Seno
    mnode = qa_config.GetMasterNode()
778 b5a93c73 Bernardo Dal Seno
    initcmd = GetCommandOutput(mnode.primary, "gnt-cluster show-ispecs-cmd")
779 b5a93c73 Bernardo Dal Seno
    modcmd = ["gnt-cluster", "modify"]
780 b5a93c73 Bernardo Dal Seno
    opts = initcmd.split()
781 b5a93c73 Bernardo Dal Seno
    assert opts[0:2] == ["gnt-cluster", "init"]
782 b5a93c73 Bernardo Dal Seno
    for k in range(2, len(opts) - 1):
783 b5a93c73 Bernardo Dal Seno
      if opts[k].startswith("--ipolicy-"):
784 b5a93c73 Bernardo Dal Seno
        assert k + 2 <= len(opts)
785 b5a93c73 Bernardo Dal Seno
        modcmd.extend(opts[k:k + 2])
786 b5a93c73 Bernardo Dal Seno
    # Re-apply the ipolicy (this should be a no-op)
787 b5a93c73 Bernardo Dal Seno
    AssertCommand(modcmd)
788 b5a93c73 Bernardo Dal Seno
    new_initcmd = GetCommandOutput(mnode.primary, "gnt-cluster show-ispecs-cmd")
789 b5a93c73 Bernardo Dal Seno
    AssertEqual(initcmd, new_initcmd)
790 b3f3aa3d Bernardo Dal Seno
791 b3f3aa3d Bernardo Dal Seno
792 cec9845c Michael Hanselmann
def TestClusterInfo():
793 cec9845c Michael Hanselmann
  """gnt-cluster info"""
794 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "info"])
795 283f9d4c Michael Hanselmann
796 283f9d4c Michael Hanselmann
797 3e8b5a9c Iustin Pop
def TestClusterRedistConf():
798 3e8b5a9c Iustin Pop
  """gnt-cluster redist-conf"""
799 3e8b5a9c Iustin Pop
  AssertCommand(["gnt-cluster", "redist-conf"])
800 3e8b5a9c Iustin Pop
801 3e8b5a9c Iustin Pop
802 283f9d4c Michael Hanselmann
def TestClusterGetmaster():
803 283f9d4c Michael Hanselmann
  """gnt-cluster getmaster"""
804 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "getmaster"])
805 283f9d4c Michael Hanselmann
806 283f9d4c Michael Hanselmann
807 283f9d4c Michael Hanselmann
def TestClusterVersion():
808 283f9d4c Michael Hanselmann
  """gnt-cluster version"""
809 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "version"])
810 cec9845c Michael Hanselmann
811 cec9845c Michael Hanselmann
812 6d4a1656 Michael Hanselmann
def TestClusterRenewCrypto():
813 6d4a1656 Michael Hanselmann
  """gnt-cluster renew-crypto"""
814 6d4a1656 Michael Hanselmann
  master = qa_config.GetMasterNode()
815 6d4a1656 Michael Hanselmann
816 6d4a1656 Michael Hanselmann
  # Conflicting options
817 6d4a1656 Michael Hanselmann
  cmd = ["gnt-cluster", "renew-crypto", "--force",
818 3db3eb2a Michael Hanselmann
         "--new-cluster-certificate", "--new-confd-hmac-key"]
819 3db3eb2a Michael Hanselmann
  conflicting = [
820 3db3eb2a Michael Hanselmann
    ["--new-rapi-certificate", "--rapi-certificate=/dev/null"],
821 3db3eb2a Michael Hanselmann
    ["--new-cluster-domain-secret", "--cluster-domain-secret=/dev/null"],
822 3db3eb2a Michael Hanselmann
    ]
823 3db3eb2a Michael Hanselmann
  for i in conflicting:
824 21bf2e2e Andrea Spadaccini
    AssertCommand(cmd + i, fail=True)
825 6d4a1656 Michael Hanselmann
826 6d4a1656 Michael Hanselmann
  # Invalid RAPI certificate
827 6d4a1656 Michael Hanselmann
  cmd = ["gnt-cluster", "renew-crypto", "--force",
828 6d4a1656 Michael Hanselmann
         "--rapi-certificate=/dev/null"]
829 2f4b4f78 Iustin Pop
  AssertCommand(cmd, fail=True)
830 6d4a1656 Michael Hanselmann
831 aecba21e Michael Hanselmann
  rapi_cert_backup = qa_utils.BackupFile(master.primary,
832 304d9f02 Michael Hanselmann
                                         pathutils.RAPI_CERT_FILE)
833 502f5236 Michael Hanselmann
  try:
834 502f5236 Michael Hanselmann
    # Custom RAPI certificate
835 502f5236 Michael Hanselmann
    fh = tempfile.NamedTemporaryFile()
836 6d4a1656 Michael Hanselmann
837 502f5236 Michael Hanselmann
    # Ensure certificate doesn't cause "gnt-cluster verify" to complain
838 502f5236 Michael Hanselmann
    validity = constants.SSL_CERT_EXPIRATION_WARN * 3
839 6d4a1656 Michael Hanselmann
840 5e26633b Michael Hanselmann
    utils.GenerateSelfSignedSslCert(fh.name, validity=validity)
841 6d4a1656 Michael Hanselmann
842 aecba21e Michael Hanselmann
    tmpcert = qa_utils.UploadFile(master.primary, fh.name)
843 502f5236 Michael Hanselmann
    try:
844 2f4b4f78 Iustin Pop
      AssertCommand(["gnt-cluster", "renew-crypto", "--force",
845 2f4b4f78 Iustin Pop
                     "--rapi-certificate=%s" % tmpcert])
846 502f5236 Michael Hanselmann
    finally:
847 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", tmpcert])
848 502f5236 Michael Hanselmann
849 5e26633b Michael Hanselmann
    # Custom cluster domain secret
850 5e26633b Michael Hanselmann
    cds_fh = tempfile.NamedTemporaryFile()
851 5e26633b Michael Hanselmann
    cds_fh.write(utils.GenerateSecret())
852 5e26633b Michael Hanselmann
    cds_fh.write("\n")
853 5e26633b Michael Hanselmann
    cds_fh.flush()
854 5e26633b Michael Hanselmann
855 aecba21e Michael Hanselmann
    tmpcds = qa_utils.UploadFile(master.primary, cds_fh.name)
856 5e26633b Michael Hanselmann
    try:
857 2f4b4f78 Iustin Pop
      AssertCommand(["gnt-cluster", "renew-crypto", "--force",
858 2f4b4f78 Iustin Pop
                     "--cluster-domain-secret=%s" % tmpcds])
859 5e26633b Michael Hanselmann
    finally:
860 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", tmpcds])
861 5e26633b Michael Hanselmann
862 502f5236 Michael Hanselmann
    # Normal case
863 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-cluster", "renew-crypto", "--force",
864 2f4b4f78 Iustin Pop
                   "--new-cluster-certificate", "--new-confd-hmac-key",
865 2f4b4f78 Iustin Pop
                   "--new-rapi-certificate", "--new-cluster-domain-secret"])
866 3db3eb2a Michael Hanselmann
867 502f5236 Michael Hanselmann
    # Restore RAPI certificate
868 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-cluster", "renew-crypto", "--force",
869 2f4b4f78 Iustin Pop
                   "--rapi-certificate=%s" % rapi_cert_backup])
870 3db3eb2a Michael Hanselmann
  finally:
871 2f4b4f78 Iustin Pop
    AssertCommand(["rm", "-f", rapi_cert_backup])
872 3db3eb2a Michael Hanselmann
873 6d4a1656 Michael Hanselmann
874 cec9845c Michael Hanselmann
def TestClusterBurnin():
875 cec9845c Michael Hanselmann
  """Burnin"""
876 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
877 cec9845c Michael Hanselmann
878 d0c8c01d Iustin Pop
  options = qa_config.get("options", {})
879 68c8c3df Michael Hanselmann
  disk_template = options.get("burnin-disk-template", constants.DT_DRBD8)
880 d0c8c01d Iustin Pop
  parallel = options.get("burnin-in-parallel", False)
881 d0c8c01d Iustin Pop
  check_inst = options.get("burnin-check-instances", False)
882 d0c8c01d Iustin Pop
  do_rename = options.get("burnin-rename", "")
883 d0c8c01d Iustin Pop
  do_reboot = options.get("burnin-reboot", True)
884 1d103c02 Iustin Pop
  reboot_types = options.get("reboot-types", constants.REBOOT_TYPES)
885 23103544 Michael Hanselmann
886 cec9845c Michael Hanselmann
  # Get as many instances as we need
887 cec9845c Michael Hanselmann
  instances = []
888 cec9845c Michael Hanselmann
  try:
889 23103544 Michael Hanselmann
    try:
890 d0c8c01d Iustin Pop
      num = qa_config.get("options", {}).get("burnin-instances", 1)
891 f1501b3f Michael Hanselmann
      for _ in range(0, num):
892 23103544 Michael Hanselmann
        instances.append(qa_config.AcquireInstance())
893 23103544 Michael Hanselmann
    except qa_error.OutOfInstancesError:
894 23103544 Michael Hanselmann
      print "Not enough instances, continuing anyway."
895 cec9845c Michael Hanselmann
896 23103544 Michael Hanselmann
    if len(instances) < 1:
897 23103544 Michael Hanselmann
      raise qa_error.Error("Burnin needs at least one instance")
898 cec9845c Michael Hanselmann
899 aecba21e Michael Hanselmann
    script = qa_utils.UploadFile(master.primary, "../tools/burnin")
900 cec9845c Michael Hanselmann
    try:
901 090128b6 Christos Stavrakakis
      disks = qa_config.GetDiskOptions()
902 23103544 Michael Hanselmann
      # Run burnin
903 cec9845c Michael Hanselmann
      cmd = [script,
904 d0c8c01d Iustin Pop
             "--os=%s" % qa_config.get("os"),
905 f356202a Guido Trotter
             "--minmem-size=%s" % qa_config.get(constants.BE_MINMEM),
906 f356202a Guido Trotter
             "--maxmem-size=%s" % qa_config.get(constants.BE_MAXMEM),
907 090128b6 Christos Stavrakakis
             "--disk-size=%s" % ",".join([d.get("size") for d in disks]),
908 090128b6 Christos Stavrakakis
             "--disk-growth=%s" % ",".join([d.get("growth") for d in disks]),
909 d0c8c01d Iustin Pop
             "--disk-template=%s" % disk_template]
910 0b0a150a Iustin Pop
      if parallel:
911 d0c8c01d Iustin Pop
        cmd.append("--parallel")
912 d0c8c01d Iustin Pop
        cmd.append("--early-release")
913 0b0a150a Iustin Pop
      if check_inst:
914 d0c8c01d Iustin Pop
        cmd.append("--http-check")
915 4dc76b24 Iustin Pop
      if do_rename:
916 d0c8c01d Iustin Pop
        cmd.append("--rename=%s" % do_rename)
917 58598264 Iustin Pop
      if not do_reboot:
918 d0c8c01d Iustin Pop
        cmd.append("--no-reboot")
919 1d103c02 Iustin Pop
      else:
920 d0c8c01d Iustin Pop
        cmd.append("--reboot-types=%s" % ",".join(reboot_types))
921 b5f33afa Michael Hanselmann
      cmd += [inst.name for inst in instances]
922 2f4b4f78 Iustin Pop
      AssertCommand(cmd)
923 cec9845c Michael Hanselmann
    finally:
924 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", script])
925 2f4b4f78 Iustin Pop
926 cec9845c Michael Hanselmann
  finally:
927 cec9845c Michael Hanselmann
    for inst in instances:
928 6f88e076 Michael Hanselmann
      inst.Release()
929 cec9845c Michael Hanselmann
930 cec9845c Michael Hanselmann
931 cec9845c Michael Hanselmann
def TestClusterMasterFailover():
932 c28502b1 Iustin Pop
  """gnt-cluster master-failover"""
933 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
934 cec9845c Michael Hanselmann
  failovermaster = qa_config.AcquireNode(exclude=master)
935 cec9845c Michael Hanselmann
936 2f4b4f78 Iustin Pop
  cmd = ["gnt-cluster", "master-failover"]
937 2f4b4f78 Iustin Pop
  try:
938 2f4b4f78 Iustin Pop
    AssertCommand(cmd, node=failovermaster)
939 ff699aa9 Michael Hanselmann
    # Back to original master node
940 2f4b4f78 Iustin Pop
    AssertCommand(cmd, node=master)
941 cec9845c Michael Hanselmann
  finally:
942 565cb4bf Michael Hanselmann
    failovermaster.Release()
943 cec9845c Michael Hanselmann
944 cec9845c Michael Hanselmann
945 2df92990 Michael Hanselmann
def _NodeQueueDrainFile(node):
946 2df92990 Michael Hanselmann
  """Returns path to queue drain file for a node.
947 2df92990 Michael Hanselmann

948 2df92990 Michael Hanselmann
  """
949 2df92990 Michael Hanselmann
  return qa_utils.MakeNodePath(node, pathutils.JOB_QUEUE_DRAIN_FILE)
950 2df92990 Michael Hanselmann
951 2df92990 Michael Hanselmann
952 2df92990 Michael Hanselmann
def _AssertDrainFile(node, **kwargs):
953 2df92990 Michael Hanselmann
  """Checks for the queue drain file.
954 2df92990 Michael Hanselmann

955 2df92990 Michael Hanselmann
  """
956 2df92990 Michael Hanselmann
  AssertCommand(["test", "-f", _NodeQueueDrainFile(node)], node=node, **kwargs)
957 2df92990 Michael Hanselmann
958 2df92990 Michael Hanselmann
959 ff699aa9 Michael Hanselmann
def TestClusterMasterFailoverWithDrainedQueue():
960 ff699aa9 Michael Hanselmann
  """gnt-cluster master-failover with drained queue"""
961 ff699aa9 Michael Hanselmann
  master = qa_config.GetMasterNode()
962 ff699aa9 Michael Hanselmann
  failovermaster = qa_config.AcquireNode(exclude=master)
963 ff699aa9 Michael Hanselmann
964 ff699aa9 Michael Hanselmann
  # Ensure queue is not drained
965 ff699aa9 Michael Hanselmann
  for node in [master, failovermaster]:
966 2df92990 Michael Hanselmann
    _AssertDrainFile(node, fail=True)
967 ff699aa9 Michael Hanselmann
968 ff699aa9 Michael Hanselmann
  # Drain queue on failover master
969 2df92990 Michael Hanselmann
  AssertCommand(["touch", _NodeQueueDrainFile(failovermaster)],
970 2df92990 Michael Hanselmann
                node=failovermaster)
971 ff699aa9 Michael Hanselmann
972 ff699aa9 Michael Hanselmann
  cmd = ["gnt-cluster", "master-failover"]
973 ff699aa9 Michael Hanselmann
  try:
974 2df92990 Michael Hanselmann
    _AssertDrainFile(failovermaster)
975 ff699aa9 Michael Hanselmann
    AssertCommand(cmd, node=failovermaster)
976 2df92990 Michael Hanselmann
    _AssertDrainFile(master, fail=True)
977 2df92990 Michael Hanselmann
    _AssertDrainFile(failovermaster, fail=True)
978 ff699aa9 Michael Hanselmann
979 ff699aa9 Michael Hanselmann
    # Back to original master node
980 ff699aa9 Michael Hanselmann
    AssertCommand(cmd, node=master)
981 ff699aa9 Michael Hanselmann
  finally:
982 565cb4bf Michael Hanselmann
    failovermaster.Release()
983 ff699aa9 Michael Hanselmann
984 2df92990 Michael Hanselmann
  # Ensure queue is not drained
985 2df92990 Michael Hanselmann
  for node in [master, failovermaster]:
986 2df92990 Michael Hanselmann
    _AssertDrainFile(node, fail=True)
987 ff699aa9 Michael Hanselmann
988 ff699aa9 Michael Hanselmann
989 cec9845c Michael Hanselmann
def TestClusterCopyfile():
990 cec9845c Michael Hanselmann
  """gnt-cluster copyfile"""
991 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
992 cec9845c Michael Hanselmann
993 24818e8f Michael Hanselmann
  uniqueid = utils.NewUUID()
994 830da270 Michael Hanselmann
995 cec9845c Michael Hanselmann
  # Create temporary file
996 cec9845c Michael Hanselmann
  f = tempfile.NamedTemporaryFile()
997 830da270 Michael Hanselmann
  f.write(uniqueid)
998 cec9845c Michael Hanselmann
  f.flush()
999 cec9845c Michael Hanselmann
  f.seek(0)
1000 cec9845c Michael Hanselmann
1001 cec9845c Michael Hanselmann
  # Upload file to master node
1002 aecba21e Michael Hanselmann
  testname = qa_utils.UploadFile(master.primary, f.name)
1003 cec9845c Michael Hanselmann
  try:
1004 cec9845c Michael Hanselmann
    # Copy file to all nodes
1005 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-cluster", "copyfile", testname])
1006 830da270 Michael Hanselmann
    _CheckFileOnAllNodes(testname, uniqueid)
1007 cec9845c Michael Hanselmann
  finally:
1008 830da270 Michael Hanselmann
    _RemoveFileFromAllNodes(testname)
1009 830da270 Michael Hanselmann
1010 830da270 Michael Hanselmann
1011 830da270 Michael Hanselmann
def TestClusterCommand():
1012 830da270 Michael Hanselmann
  """gnt-cluster command"""
1013 24818e8f Michael Hanselmann
  uniqueid = utils.NewUUID()
1014 24818e8f Michael Hanselmann
  rfile = "/tmp/gnt%s" % utils.NewUUID()
1015 d0c8c01d Iustin Pop
  rcmd = utils.ShellQuoteArgs(["echo", "-n", uniqueid])
1016 d0c8c01d Iustin Pop
  cmd = utils.ShellQuoteArgs(["gnt-cluster", "command",
1017 830da270 Michael Hanselmann
                              "%s >%s" % (rcmd, rfile)])
1018 830da270 Michael Hanselmann
1019 830da270 Michael Hanselmann
  try:
1020 2f4b4f78 Iustin Pop
    AssertCommand(cmd)
1021 830da270 Michael Hanselmann
    _CheckFileOnAllNodes(rfile, uniqueid)
1022 830da270 Michael Hanselmann
  finally:
1023 830da270 Michael Hanselmann
    _RemoveFileFromAllNodes(rfile)
1024 cec9845c Michael Hanselmann
1025 cec9845c Michael Hanselmann
1026 cec9845c Michael Hanselmann
def TestClusterDestroy():
1027 cec9845c Michael Hanselmann
  """gnt-cluster destroy"""
1028 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "destroy", "--yes-do-it"])
1029 65a884ef Iustin Pop
1030 65a884ef Iustin Pop
1031 65a884ef Iustin Pop
def TestClusterRepairDiskSizes():
1032 65a884ef Iustin Pop
  """gnt-cluster repair-disk-sizes"""
1033 65a884ef Iustin Pop
  AssertCommand(["gnt-cluster", "repair-disk-sizes"])
1034 50ef6a41 Bernardo Dal Seno
1035 50ef6a41 Bernardo Dal Seno
1036 50ef6a41 Bernardo Dal Seno
def TestSetExclStorCluster(newvalue):
1037 50ef6a41 Bernardo Dal Seno
  """Set the exclusive_storage node parameter at the cluster level.
1038 50ef6a41 Bernardo Dal Seno

1039 50ef6a41 Bernardo Dal Seno
  @type newvalue: bool
1040 50ef6a41 Bernardo Dal Seno
  @param newvalue: New value of exclusive_storage
1041 50ef6a41 Bernardo Dal Seno
  @rtype: bool
1042 50ef6a41 Bernardo Dal Seno
  @return: The old value of exclusive_storage
1043 50ef6a41 Bernardo Dal Seno

1044 50ef6a41 Bernardo Dal Seno
  """
1045 0e79564a Bernardo Dal Seno
  es_path = ["Default node parameters", "exclusive_storage"]
1046 0e79564a Bernardo Dal Seno
  oldvalue = _GetClusterField(es_path)
1047 50ef6a41 Bernardo Dal Seno
  AssertCommand(["gnt-cluster", "modify", "--node-parameters",
1048 50ef6a41 Bernardo Dal Seno
                 "exclusive_storage=%s" % newvalue])
1049 0e79564a Bernardo Dal Seno
  effvalue = _GetClusterField(es_path)
1050 50ef6a41 Bernardo Dal Seno
  if effvalue != newvalue:
1051 50ef6a41 Bernardo Dal Seno
    raise qa_error.Error("exclusive_storage has the wrong value: %s instead"
1052 50ef6a41 Bernardo Dal Seno
                         " of %s" % (effvalue, newvalue))
1053 6a0f22e1 Bernardo Dal Seno
  qa_config.SetExclusiveStorage(newvalue)
1054 50ef6a41 Bernardo Dal Seno
  return oldvalue
1055 e8b919a1 Bernardo Dal Seno
1056 e8b919a1 Bernardo Dal Seno
1057 21e2734f Bernardo Dal Seno
def TestExclStorSharedPv(node):
1058 21e2734f Bernardo Dal Seno
  """cluster-verify reports LVs that share the same PV with exclusive_storage.
1059 21e2734f Bernardo Dal Seno

1060 21e2734f Bernardo Dal Seno
  """
1061 21e2734f Bernardo Dal Seno
  vgname = qa_config.get("vg-name", constants.DEFAULT_VG)
1062 21e2734f Bernardo Dal Seno
  lvname1 = _QA_LV_PREFIX + "vol1"
1063 21e2734f Bernardo Dal Seno
  lvname2 = _QA_LV_PREFIX + "vol2"
1064 aecba21e Michael Hanselmann
  node_name = node.primary
1065 21e2734f Bernardo Dal Seno
  AssertCommand(["lvcreate", "-L1G", "-n", lvname1, vgname], node=node_name)
1066 21e2734f Bernardo Dal Seno
  AssertClusterVerify(fail=True, errors=[constants.CV_ENODEORPHANLV])
1067 21e2734f Bernardo Dal Seno
  AssertCommand(["lvcreate", "-L1G", "-n", lvname2, vgname], node=node_name)
1068 21e2734f Bernardo Dal Seno
  AssertClusterVerify(fail=True, errors=[constants.CV_ENODELVM,
1069 21e2734f Bernardo Dal Seno
                                         constants.CV_ENODEORPHANLV])
1070 21e2734f Bernardo Dal Seno
  AssertCommand(["lvremove", "-f", "/".join([vgname, lvname1])], node=node_name)
1071 21e2734f Bernardo Dal Seno
  AssertCommand(["lvremove", "-f", "/".join([vgname, lvname2])], node=node_name)
1072 21e2734f Bernardo Dal Seno
  AssertClusterVerify()