Statistics
| Branch: | Tag: | Revision:

root / qa / qa_cluster.py @ a25f44a4

History | View | Annotate | Download (42.5 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 e4889779 Thomas Thrainer
import qa_daemon
37 cec9845c Michael Hanselmann
import qa_utils
38 cec9845c Michael Hanselmann
import qa_error
39 462f0faa Helga Velroyen
import qa_instance
40 cec9845c Michael Hanselmann
41 66d1f035 René Nussbaumer
from qa_utils import AssertEqual, AssertCommand, GetCommandOutput
42 cec9845c Michael Hanselmann
43 cec9845c Michael Hanselmann
44 23610ff8 Bernardo Dal Seno
# Prefix for LVM volumes created by QA code during tests
45 23610ff8 Bernardo Dal Seno
_QA_LV_PREFIX = "qa-"
46 23610ff8 Bernardo Dal Seno
47 c2a0947d Iustin Pop
#: cluster verify command
48 c2a0947d Iustin Pop
_CLUSTER_VERIFY = ["gnt-cluster", "verify"]
49 c2a0947d Iustin Pop
50 21bf2e2e Andrea Spadaccini
51 830da270 Michael Hanselmann
def _RemoveFileFromAllNodes(filename):
52 830da270 Michael Hanselmann
  """Removes a file from all nodes.
53 830da270 Michael Hanselmann

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

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

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

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

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

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

450 b24b52d9 Helga Velroyen
  @type undesired_disk_templates: list of string
451 b24b52d9 Helga Velroyen
  @param undesired_disk_templates: a list of disk templates that we want to
452 b24b52d9 Helga Velroyen
      exclude when drawing one disk template from the list of enabled
453 b24b52d9 Helga Velroyen
      disk templates
454 b24b52d9 Helga Velroyen
  @type enabled_disk_templates: list of string
455 b24b52d9 Helga Velroyen
  @param enabled_disk_templates: list of enabled disk templates (in QA)
456 b24b52d9 Helga Velroyen

457 b24b52d9 Helga Velroyen
  """
458 b24b52d9 Helga Velroyen
  desired_templates = list(set(enabled_disk_templates)
459 b24b52d9 Helga Velroyen
                                - set(undesired_disk_templates))
460 b24b52d9 Helga Velroyen
  if desired_templates:
461 b24b52d9 Helga Velroyen
    template = desired_templates[0]
462 b24b52d9 Helga Velroyen
  else:
463 b24b52d9 Helga Velroyen
    # If no desired disk template is available for QA, choose 'diskless' and
464 b24b52d9 Helga Velroyen
    # hope for the best.
465 b24b52d9 Helga Velroyen
    template = constants.ST_DISKLESS
466 b24b52d9 Helga Velroyen
467 b24b52d9 Helga Velroyen
  return template
468 b24b52d9 Helga Velroyen
469 b24b52d9 Helga Velroyen
470 b24b52d9 Helga Velroyen
def TestClusterModifyFileBasedStorageDir(
471 b24b52d9 Helga Velroyen
    file_disk_template, dir_config_key, default_dir, option_name):
472 b24b52d9 Helga Velroyen
  """Tests gnt-cluster modify wrt to file-based directory options.
473 b24b52d9 Helga Velroyen

474 b24b52d9 Helga Velroyen
  @type file_disk_template: string
475 b24b52d9 Helga Velroyen
  @param file_disk_template: file-based disk template
476 b24b52d9 Helga Velroyen
  @type dir_config_key: string
477 b24b52d9 Helga Velroyen
  @param dir_config_key: key for the QA config to retrieve the default
478 b24b52d9 Helga Velroyen
     directory value
479 b24b52d9 Helga Velroyen
  @type default_dir: string
480 b24b52d9 Helga Velroyen
  @param default_dir: default directory, if the QA config does not specify
481 b24b52d9 Helga Velroyen
     it
482 b24b52d9 Helga Velroyen
  @type option_name: string
483 b24b52d9 Helga Velroyen
  @param option_name: name of the option of 'gnt-cluster modify' to
484 b24b52d9 Helga Velroyen
     change the directory
485 b24b52d9 Helga Velroyen

486 b24b52d9 Helga Velroyen
  """
487 b24b52d9 Helga Velroyen
  enabled_disk_templates = qa_config.GetEnabledDiskTemplates()
488 b24b52d9 Helga Velroyen
  assert file_disk_template in [constants.DT_FILE, constants.DT_SHARED_FILE]
489 b24b52d9 Helga Velroyen
  if not qa_config.IsTemplateSupported(file_disk_template):
490 b24b52d9 Helga Velroyen
    return
491 b24b52d9 Helga Velroyen
492 b24b52d9 Helga Velroyen
  # Get some non-file-based disk template to disable file storage
493 b24b52d9 Helga Velroyen
  other_disk_template = _GetOtherEnabledDiskTemplate(
494 b24b52d9 Helga Velroyen
      utils.storage.GetDiskTemplatesOfStorageType(constants.ST_FILE),
495 b24b52d9 Helga Velroyen
      enabled_disk_templates)
496 b24b52d9 Helga Velroyen
497 b24b52d9 Helga Velroyen
  file_storage_dir = qa_config.get(dir_config_key, default_dir)
498 b24b52d9 Helga Velroyen
  invalid_file_storage_dir = "/boot/"
499 b24b52d9 Helga Velroyen
500 b24b52d9 Helga Velroyen
  for fail, cmd in [
501 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "modify",
502 b24b52d9 Helga Velroyen
            "--enabled-disk-templates=%s" % file_disk_template]),
503 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "modify",
504 b24b52d9 Helga Velroyen
            "--%s=%s" % (option_name, file_storage_dir)]),
505 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "modify",
506 b24b52d9 Helga Velroyen
            "--%s=%s" % (option_name, invalid_file_storage_dir)]),
507 b24b52d9 Helga Velroyen
    # file storage dir is set to an inacceptable path, thus verify
508 b24b52d9 Helga Velroyen
    # should fail
509 b24b52d9 Helga Velroyen
    (True, ["gnt-cluster", "verify"]),
510 b24b52d9 Helga Velroyen
    # unsetting the storage dir while file storage is enabled
511 b24b52d9 Helga Velroyen
    # should fail
512 b24b52d9 Helga Velroyen
    (True, ["gnt-cluster", "modify",
513 b24b52d9 Helga Velroyen
            "--%s=" % option_name]),
514 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "modify",
515 b24b52d9 Helga Velroyen
            "--%s=%s" % (option_name, file_storage_dir)]),
516 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "modify",
517 b24b52d9 Helga Velroyen
            "--enabled-disk-templates=%s" % other_disk_template]),
518 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "modify",
519 b24b52d9 Helga Velroyen
            "--%s=%s" % (option_name, invalid_file_storage_dir)]),
520 b24b52d9 Helga Velroyen
    # file storage is set to an inacceptable path, but file storage
521 b24b52d9 Helga Velroyen
    # is disabled, thus verify should not fail
522 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "verify"]),
523 b24b52d9 Helga Velroyen
    # unsetting the file storage dir while file storage is not enabled
524 b24b52d9 Helga Velroyen
    # should be fine
525 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "modify",
526 b24b52d9 Helga Velroyen
            "--%s=" % option_name]),
527 b24b52d9 Helga Velroyen
    # resetting everything to sane values
528 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "modify",
529 b24b52d9 Helga Velroyen
            "--%s=%s" % (option_name, file_storage_dir),
530 b24b52d9 Helga Velroyen
            "--enabled-disk-templates=%s" % ",".join(enabled_disk_templates)])
531 b24b52d9 Helga Velroyen
    ]:
532 b24b52d9 Helga Velroyen
    AssertCommand(cmd, fail=fail)
533 b24b52d9 Helga Velroyen
534 b24b52d9 Helga Velroyen
535 b24b52d9 Helga Velroyen
def TestClusterModifyFileStorageDir():
536 b24b52d9 Helga Velroyen
  """gnt-cluster modify --file-storage-dir=..."""
537 b24b52d9 Helga Velroyen
  TestClusterModifyFileBasedStorageDir(
538 b24b52d9 Helga Velroyen
      constants.DT_FILE, "default-file-storage-dir",
539 b24b52d9 Helga Velroyen
      pathutils.DEFAULT_FILE_STORAGE_DIR,
540 b24b52d9 Helga Velroyen
      "file-storage-dir")
541 b24b52d9 Helga Velroyen
542 b24b52d9 Helga Velroyen
543 b24b52d9 Helga Velroyen
def TestClusterModifySharedFileStorageDir():
544 b24b52d9 Helga Velroyen
  """gnt-cluster modify --shared-file-storage-dir=..."""
545 b24b52d9 Helga Velroyen
  TestClusterModifyFileBasedStorageDir(
546 b24b52d9 Helga Velroyen
      constants.DT_SHARED_FILE, "default-shared-file-storage-dir",
547 b24b52d9 Helga Velroyen
      pathutils.DEFAULT_SHARED_FILE_STORAGE_DIR,
548 b24b52d9 Helga Velroyen
      "shared-file-storage-dir")
549 b24b52d9 Helga Velroyen
550 b24b52d9 Helga Velroyen
551 2dae8d64 Helga Velroyen
def TestClusterModifyDiskTemplates():
552 2dae8d64 Helga Velroyen
  """gnt-cluster modify --enabled-disk-templates=..."""
553 462f0faa Helga Velroyen
  enabled_disk_templates = qa_config.GetEnabledDiskTemplates()
554 2dae8d64 Helga Velroyen
  default_disk_template = qa_config.GetDefaultDiskTemplate()
555 462f0faa Helga Velroyen
556 a25f44a4 Helga Velroyen
  _TestClusterModifyDiskTemplatesArguments(default_disk_template)
557 a25f44a4 Helga Velroyen
  _TestClusterModifyDiskTemplatesDrbdHelper(enabled_disk_templates)
558 912737ba Helga Velroyen
  _TestClusterModifyDiskTemplatesVgName(enabled_disk_templates)
559 462f0faa Helga Velroyen
560 462f0faa Helga Velroyen
  _RestoreEnabledDiskTemplates()
561 462f0faa Helga Velroyen
  nodes = qa_config.AcquireManyNodes(2)
562 462f0faa Helga Velroyen
563 462f0faa Helga Velroyen
  instance_template = enabled_disk_templates[0]
564 462f0faa Helga Velroyen
  instance = qa_instance.CreateInstanceByDiskTemplate(nodes, instance_template)
565 462f0faa Helga Velroyen
566 462f0faa Helga Velroyen
  _TestClusterModifyUnusedDiskTemplate(instance_template)
567 462f0faa Helga Velroyen
  _TestClusterModifyUsedDiskTemplate(instance_template,
568 462f0faa Helga Velroyen
                                     enabled_disk_templates)
569 462f0faa Helga Velroyen
570 462f0faa Helga Velroyen
  qa_instance.TestInstanceRemove(instance)
571 462f0faa Helga Velroyen
  _RestoreEnabledDiskTemplates()
572 462f0faa Helga Velroyen
573 462f0faa Helga Velroyen
574 462f0faa Helga Velroyen
def _RestoreEnabledDiskTemplates():
575 462f0faa Helga Velroyen
  """Sets the list of enabled disk templates back to the list of enabled disk
576 462f0faa Helga Velroyen
     templates from the QA configuration. This can be used to make sure that
577 462f0faa Helga Velroyen
     the tests that modify the list of disk templates do not interfere with
578 462f0faa Helga Velroyen
     other tests.
579 462f0faa Helga Velroyen

580 462f0faa Helga Velroyen
  """
581 eb161df2 Helga Velroyen
  enabled_disk_templates = qa_config.GetEnabledDiskTemplates()
582 eb161df2 Helga Velroyen
  cmd = ["gnt-cluster", "modify",
583 eb161df2 Helga Velroyen
         "--enabled-disk-templates=%s" % ",".join(enabled_disk_templates),
584 eb161df2 Helga Velroyen
         "--ipolicy-disk-templates=%s" % ",".join(enabled_disk_templates),
585 eb161df2 Helga Velroyen
         ]
586 d101b7be Thomas Thrainer
587 d101b7be Thomas Thrainer
  if utils.IsLvmEnabled(qa_config.GetEnabledDiskTemplates()):
588 d101b7be Thomas Thrainer
    vgname = qa_config.get("vg-name", constants.DEFAULT_VG)
589 d101b7be Thomas Thrainer
    cmd.append("--vg-name=%s" % vgname)
590 d101b7be Thomas Thrainer
591 d101b7be Thomas Thrainer
  AssertCommand(cmd, fail=False)
592 462f0faa Helga Velroyen
593 462f0faa Helga Velroyen
594 a25f44a4 Helga Velroyen
def _TestClusterModifyDiskTemplatesDrbdHelper(enabled_disk_templates):
595 a25f44a4 Helga Velroyen
  """Tests argument handling of 'gnt-cluster modify' with respect to
596 a25f44a4 Helga Velroyen
     the parameter '--drbd-usermode-helper'. This test is independent
597 a25f44a4 Helga Velroyen
     of instances.
598 a25f44a4 Helga Velroyen

599 a25f44a4 Helga Velroyen
  """
600 a25f44a4 Helga Velroyen
  _RestoreEnabledDiskTemplates()
601 a25f44a4 Helga Velroyen
602 a25f44a4 Helga Velroyen
  if constants.DT_DRBD8 not in enabled_disk_templates:
603 a25f44a4 Helga Velroyen
    return
604 a25f44a4 Helga Velroyen
  if constants.DT_PLAIN not in enabled_disk_templates:
605 a25f44a4 Helga Velroyen
    return
606 a25f44a4 Helga Velroyen
607 a25f44a4 Helga Velroyen
  drbd_usermode_helper = qa_config.get("drbd-usermode-helper", "/bin/true")
608 a25f44a4 Helga Velroyen
  bogus_usermode_helper = "/tmp/pinkbunny"
609 a25f44a4 Helga Velroyen
  for command, fail in \
610 a25f44a4 Helga Velroyen
      [(["gnt-cluster", "modify",
611 a25f44a4 Helga Velroyen
         "--enabled-disk-templates=%s" % constants.DT_DRBD8,
612 a25f44a4 Helga Velroyen
         "--ipolicy-disk-templates=%s" % constants.DT_DRBD8], False),
613 a25f44a4 Helga Velroyen
       (["gnt-cluster", "modify",
614 a25f44a4 Helga Velroyen
         "--drbd-usermode-helper=%s" % drbd_usermode_helper], False),
615 a25f44a4 Helga Velroyen
       (["gnt-cluster", "modify",
616 a25f44a4 Helga Velroyen
         "--drbd-usermode-helper=%s" % bogus_usermode_helper], True),
617 a25f44a4 Helga Velroyen
       # unsetting helper when DRBD is enabled should not work
618 a25f44a4 Helga Velroyen
       (["gnt-cluster", "modify",
619 a25f44a4 Helga Velroyen
         "--drbd-usermode-helper="], True),
620 a25f44a4 Helga Velroyen
       (["gnt-cluster", "modify",
621 a25f44a4 Helga Velroyen
         "--enabled-disk-templates=%s" % constants.DT_PLAIN,
622 a25f44a4 Helga Velroyen
         "--ipolicy-disk-templates=%s" % constants.DT_PLAIN], False),
623 a25f44a4 Helga Velroyen
       (["gnt-cluster", "modify",
624 a25f44a4 Helga Velroyen
         "--drbd-usermode-helper="], True),
625 a25f44a4 Helga Velroyen
       (["gnt-cluster", "modify",
626 a25f44a4 Helga Velroyen
         "--drbd-usermode-helper=%s" % drbd_usermode_helper], False),
627 a25f44a4 Helga Velroyen
       (["gnt-cluster", "modify",
628 a25f44a4 Helga Velroyen
         "--drbd-usermode-helper=%s" % drbd_usermode_helper,
629 a25f44a4 Helga Velroyen
         "--enabled-disk-templates=%s" % constants.DT_DRBD8,
630 a25f44a4 Helga Velroyen
         "--ipolicy-disk-templates=%s" % constants.DT_DRBD8], False),
631 a25f44a4 Helga Velroyen
       (["gnt-cluster", "modify",
632 a25f44a4 Helga Velroyen
         "--drbd-usermode-helper=",
633 a25f44a4 Helga Velroyen
         "--enabled-disk-templates=%s" % constants.DT_PLAIN,
634 a25f44a4 Helga Velroyen
         "--ipolicy-disk-templates=%s" % constants.DT_PLAIN], False),
635 a25f44a4 Helga Velroyen
       (["gnt-cluster", "modify",
636 a25f44a4 Helga Velroyen
         "--drbd-usermode-helper=%s" % drbd_usermode_helper,
637 a25f44a4 Helga Velroyen
         "--enabled-disk-templates=%s" % constants.DT_DRBD8,
638 a25f44a4 Helga Velroyen
         "--ipolicy-disk-templates=%s" % constants.DT_DRBD8], False),
639 a25f44a4 Helga Velroyen
      ]:
640 a25f44a4 Helga Velroyen
    AssertCommand(command, fail=fail)
641 a25f44a4 Helga Velroyen
  _RestoreEnabledDiskTemplates()
642 a25f44a4 Helga Velroyen
643 a25f44a4 Helga Velroyen
644 a25f44a4 Helga Velroyen
def _TestClusterModifyDiskTemplatesArguments(default_disk_template):
645 462f0faa Helga Velroyen
  """Tests argument handling of 'gnt-cluster modify' with respect to
646 462f0faa Helga Velroyen
     the parameter '--enabled-disk-templates'. This test is independent
647 462f0faa Helga Velroyen
     of instances.
648 462f0faa Helga Velroyen

649 462f0faa Helga Velroyen
  """
650 912737ba Helga Velroyen
  _RestoreEnabledDiskTemplates()
651 462f0faa Helga Velroyen
652 2dae8d64 Helga Velroyen
  # bogus templates
653 dacd8ba4 Helga Velroyen
  AssertCommand(["gnt-cluster", "modify",
654 2dae8d64 Helga Velroyen
                 "--enabled-disk-templates=pinkbunny"],
655 dacd8ba4 Helga Velroyen
                fail=True)
656 462f0faa Helga Velroyen
657 dacd8ba4 Helga Velroyen
  # duplicate entries do no harm
658 dacd8ba4 Helga Velroyen
  AssertCommand(
659 dacd8ba4 Helga Velroyen
    ["gnt-cluster", "modify",
660 2dae8d64 Helga Velroyen
     "--enabled-disk-templates=%s,%s" %
661 eb161df2 Helga Velroyen
      (default_disk_template, default_disk_template),
662 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % default_disk_template],
663 dacd8ba4 Helga Velroyen
    fail=False)
664 462f0faa Helga Velroyen
665 912737ba Helga Velroyen
666 912737ba Helga Velroyen
def _TestClusterModifyDiskTemplatesVgName(enabled_disk_templates):
667 912737ba Helga Velroyen
  """Tests argument handling of 'gnt-cluster modify' with respect to
668 912737ba Helga Velroyen
     the parameter '--enabled-disk-templates' and '--vg-name'. This test is
669 912737ba Helga Velroyen
     independent of instances.
670 912737ba Helga Velroyen

671 912737ba Helga Velroyen
  """
672 912737ba Helga Velroyen
  if not utils.IsLvmEnabled(enabled_disk_templates):
673 912737ba Helga Velroyen
    # These tests only make sense if lvm is enabled for QA
674 912737ba Helga Velroyen
    return
675 912737ba Helga Velroyen
676 912737ba Helga Velroyen
  # determine an LVM and a non-LVM disk template for the tests
677 b24b52d9 Helga Velroyen
  non_lvm_template = _GetOtherEnabledDiskTemplate(utils.GetLvmDiskTemplates(),
678 b24b52d9 Helga Velroyen
                                                  enabled_disk_templates)
679 912737ba Helga Velroyen
  lvm_template = list(set(enabled_disk_templates)
680 912737ba Helga Velroyen
                      .intersection(set(utils.GetLvmDiskTemplates())))[0]
681 912737ba Helga Velroyen
682 912737ba Helga Velroyen
  vgname = qa_config.get("vg-name", constants.DEFAULT_VG)
683 912737ba Helga Velroyen
684 912737ba Helga Velroyen
  # Clean start: unset volume group name, disable lvm storage
685 912737ba Helga Velroyen
  AssertCommand(
686 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
687 912737ba Helga Velroyen
     "--enabled-disk-templates=%s" % non_lvm_template,
688 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % non_lvm_template,
689 912737ba Helga Velroyen
     "--vg-name="],
690 912737ba Helga Velroyen
    fail=False)
691 912737ba Helga Velroyen
692 912737ba Helga Velroyen
  # Try to enable lvm, when no volume group is given
693 912737ba Helga Velroyen
  AssertCommand(
694 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
695 eb161df2 Helga Velroyen
     "--enabled-disk-templates=%s" % lvm_template,
696 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % lvm_template],
697 912737ba Helga Velroyen
    fail=True)
698 912737ba Helga Velroyen
699 912737ba Helga Velroyen
  # Set volume group, with lvm still disabled: just a warning
700 912737ba Helga Velroyen
  AssertCommand(["gnt-cluster", "modify", "--vg-name=%s" % vgname], fail=False)
701 912737ba Helga Velroyen
702 912737ba Helga Velroyen
  # Try unsetting vg name and enabling lvm at the same time
703 912737ba Helga Velroyen
  AssertCommand(
704 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
705 912737ba Helga Velroyen
     "--enabled-disk-templates=%s" % lvm_template,
706 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % lvm_template,
707 912737ba Helga Velroyen
     "--vg-name="],
708 912737ba Helga Velroyen
    fail=True)
709 912737ba Helga Velroyen
710 912737ba Helga Velroyen
  # Enable lvm with vg name present
711 912737ba Helga Velroyen
  AssertCommand(
712 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
713 eb161df2 Helga Velroyen
     "--enabled-disk-templates=%s" % lvm_template,
714 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % lvm_template],
715 912737ba Helga Velroyen
    fail=False)
716 912737ba Helga Velroyen
717 912737ba Helga Velroyen
  # Try unsetting vg name with lvm still enabled
718 912737ba Helga Velroyen
  AssertCommand(["gnt-cluster", "modify", "--vg-name="], fail=True)
719 912737ba Helga Velroyen
720 912737ba Helga Velroyen
  # Disable lvm with vg name still set
721 912737ba Helga Velroyen
  AssertCommand(
722 eb161df2 Helga Velroyen
    ["gnt-cluster", "modify",
723 eb161df2 Helga Velroyen
     "--enabled-disk-templates=%s" % non_lvm_template,
724 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % non_lvm_template,
725 eb161df2 Helga Velroyen
     ],
726 912737ba Helga Velroyen
    fail=False)
727 912737ba Helga Velroyen
728 912737ba Helga Velroyen
  # Try unsetting vg name with lvm disabled
729 912737ba Helga Velroyen
  AssertCommand(["gnt-cluster", "modify", "--vg-name="], fail=False)
730 912737ba Helga Velroyen
731 912737ba Helga Velroyen
  # Set vg name and enable lvm at the same time
732 912737ba Helga Velroyen
  AssertCommand(
733 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
734 912737ba Helga Velroyen
     "--enabled-disk-templates=%s" % lvm_template,
735 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % lvm_template,
736 912737ba Helga Velroyen
     "--vg-name=%s" % vgname],
737 912737ba Helga Velroyen
    fail=False)
738 912737ba Helga Velroyen
739 912737ba Helga Velroyen
  # Unset vg name and disable lvm at the same time
740 912737ba Helga Velroyen
  AssertCommand(
741 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
742 912737ba Helga Velroyen
     "--enabled-disk-templates=%s" % non_lvm_template,
743 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % non_lvm_template,
744 912737ba Helga Velroyen
     "--vg-name="],
745 912737ba Helga Velroyen
    fail=False)
746 912737ba Helga Velroyen
747 912737ba Helga Velroyen
  _RestoreEnabledDiskTemplates()
748 912737ba Helga Velroyen
749 462f0faa Helga Velroyen
750 462f0faa Helga Velroyen
def _TestClusterModifyUsedDiskTemplate(instance_template,
751 462f0faa Helga Velroyen
                                       enabled_disk_templates):
752 462f0faa Helga Velroyen
  """Tests that disk templates that are currently in use by instances cannot
753 462f0faa Helga Velroyen
     be disabled on the cluster.
754 462f0faa Helga Velroyen

755 462f0faa Helga Velroyen
  """
756 462f0faa Helga Velroyen
  # If the list of enabled disk templates contains only one template
757 462f0faa Helga Velroyen
  # we need to add some other templates, because the list of enabled disk
758 462f0faa Helga Velroyen
  # templates can only be set to a non-empty list.
759 462f0faa Helga Velroyen
  new_disk_templates = list(set(enabled_disk_templates)
760 462f0faa Helga Velroyen
                              - set([instance_template]))
761 462f0faa Helga Velroyen
  if not new_disk_templates:
762 d101b7be Thomas Thrainer
    new_disk_templates = list(set([constants.DT_DISKLESS, constants.DT_BLOCK])
763 462f0faa Helga Velroyen
                                - set([instance_template]))
764 462f0faa Helga Velroyen
  AssertCommand(
765 462f0faa Helga Velroyen
    ["gnt-cluster", "modify",
766 eb161df2 Helga Velroyen
     "--enabled-disk-templates=%s" % ",".join(new_disk_templates),
767 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % ",".join(new_disk_templates)],
768 462f0faa Helga Velroyen
    fail=True)
769 462f0faa Helga Velroyen
770 462f0faa Helga Velroyen
771 462f0faa Helga Velroyen
def _TestClusterModifyUnusedDiskTemplate(instance_template):
772 462f0faa Helga Velroyen
  """Tests that unused disk templates can be disabled safely."""
773 462f0faa Helga Velroyen
  all_disk_templates = constants.DISK_TEMPLATES
774 d101b7be Thomas Thrainer
  if not utils.IsLvmEnabled(qa_config.GetEnabledDiskTemplates()):
775 d101b7be Thomas Thrainer
    all_disk_templates = list(set(all_disk_templates) -
776 d101b7be Thomas Thrainer
                              set(utils.GetLvmDiskTemplates()))
777 d101b7be Thomas Thrainer
778 462f0faa Helga Velroyen
  AssertCommand(
779 462f0faa Helga Velroyen
    ["gnt-cluster", "modify",
780 eb161df2 Helga Velroyen
     "--enabled-disk-templates=%s" % ",".join(all_disk_templates),
781 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % ",".join(all_disk_templates)],
782 462f0faa Helga Velroyen
    fail=False)
783 462f0faa Helga Velroyen
  new_disk_templates = [instance_template]
784 462f0faa Helga Velroyen
  AssertCommand(
785 462f0faa Helga Velroyen
    ["gnt-cluster", "modify",
786 eb161df2 Helga Velroyen
     "--enabled-disk-templates=%s" % ",".join(new_disk_templates),
787 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % ",".join(new_disk_templates)],
788 462f0faa Helga Velroyen
    fail=False)
789 dacd8ba4 Helga Velroyen
790 dacd8ba4 Helga Velroyen
791 9738ca94 Iustin Pop
def TestClusterModifyBe():
792 9738ca94 Iustin Pop
  """gnt-cluster modify -B"""
793 2f4b4f78 Iustin Pop
  for fail, cmd in [
794 8ccbbe4b Guido Trotter
    # max/min mem
795 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "maxmem=256"]),
796 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 256$'"]),
797 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "minmem=256"]),
798 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 256$'"]),
799 8ccbbe4b Guido Trotter
    (True, ["gnt-cluster", "modify", "-B", "maxmem=a"]),
800 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 256$'"]),
801 8ccbbe4b Guido Trotter
    (True, ["gnt-cluster", "modify", "-B", "minmem=a"]),
802 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 256$'"]),
803 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "maxmem=128,minmem=128"]),
804 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 128$'"]),
805 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 128$'"]),
806 9738ca94 Iustin Pop
    # vcpus
807 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "vcpus=4"]),
808 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *vcpus: 4$'"]),
809 21bf2e2e Andrea Spadaccini
    (True, ["gnt-cluster", "modify", "-B", "vcpus=a"]),
810 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "vcpus=1"]),
811 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *vcpus: 1$'"]),
812 9738ca94 Iustin Pop
    # auto_balance
813 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "auto_balance=False"]),
814 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *auto_balance: False$'"]),
815 21bf2e2e Andrea Spadaccini
    (True, ["gnt-cluster", "modify", "-B", "auto_balance=1"]),
816 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "auto_balance=True"]),
817 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *auto_balance: True$'"]),
818 9738ca94 Iustin Pop
    ]:
819 2f4b4f78 Iustin Pop
    AssertCommand(cmd, fail=fail)
820 9738ca94 Iustin Pop
821 5abecc1c Iustin Pop
  # redo the original-requested BE parameters, if any
822 5abecc1c Iustin Pop
  bep = qa_config.get("backend-parameters", "")
823 5abecc1c Iustin Pop
  if bep:
824 5abecc1c Iustin Pop
    AssertCommand(["gnt-cluster", "modify", "-B", bep])
825 9738ca94 Iustin Pop
826 21bf2e2e Andrea Spadaccini
827 b3f3aa3d Bernardo Dal Seno
def _GetClusterIPolicy():
828 b3f3aa3d Bernardo Dal Seno
  """Return the run-time values of the cluster-level instance policy.
829 b3f3aa3d Bernardo Dal Seno

830 b3f3aa3d Bernardo Dal Seno
  @rtype: tuple
831 b3f3aa3d Bernardo Dal Seno
  @return: (policy, specs), where:
832 b3f3aa3d Bernardo Dal Seno
      - policy is a dictionary of the policy values, instance specs excluded
833 7c8ae421 Bernardo Dal Seno
      - specs is a dictionary containing only the specs, using the internal
834 7c8ae421 Bernardo Dal Seno
        format (see L{constants.IPOLICY_DEFAULTS} for an example)
835 b3f3aa3d Bernardo Dal Seno

836 b3f3aa3d Bernardo Dal Seno
  """
837 0e79564a Bernardo Dal Seno
  info = qa_utils.GetObjectInfo(["gnt-cluster", "info"])
838 0e79564a Bernardo Dal Seno
  policy = info["Instance policy - limits for instances"]
839 63e08b25 Bernardo Dal Seno
  (ret_policy, ret_specs) = qa_utils.ParseIPolicy(policy)
840 0e79564a Bernardo Dal Seno
841 b3f3aa3d Bernardo Dal Seno
  # Sanity checks
842 7c8ae421 Bernardo Dal Seno
  assert "minmax" in ret_specs and "std" in ret_specs
843 7c8ae421 Bernardo Dal Seno
  assert len(ret_specs["minmax"]) > 0
844 0e79564a Bernardo Dal Seno
  assert len(ret_policy) > 0
845 0e79564a Bernardo Dal Seno
  return (ret_policy, ret_specs)
846 b3f3aa3d Bernardo Dal Seno
847 b3f3aa3d Bernardo Dal Seno
848 b3f3aa3d Bernardo Dal Seno
def TestClusterModifyIPolicy():
849 b3f3aa3d Bernardo Dal Seno
  """gnt-cluster modify --ipolicy-*"""
850 b3f3aa3d Bernardo Dal Seno
  basecmd = ["gnt-cluster", "modify"]
851 b3f3aa3d Bernardo Dal Seno
  (old_policy, old_specs) = _GetClusterIPolicy()
852 b3f3aa3d Bernardo Dal Seno
  for par in ["vcpu-ratio", "spindle-ratio"]:
853 b3f3aa3d Bernardo Dal Seno
    curr_val = float(old_policy[par])
854 b3f3aa3d Bernardo Dal Seno
    test_values = [
855 b3f3aa3d Bernardo Dal Seno
      (True, 1.0),
856 b3f3aa3d Bernardo Dal Seno
      (True, 1.5),
857 b3f3aa3d Bernardo Dal Seno
      (True, 2),
858 b3f3aa3d Bernardo Dal Seno
      (False, "a"),
859 b3f3aa3d Bernardo Dal Seno
      # Restore the old value
860 b3f3aa3d Bernardo Dal Seno
      (True, curr_val),
861 b3f3aa3d Bernardo Dal Seno
      ]
862 b3f3aa3d Bernardo Dal Seno
    for (good, val) in test_values:
863 b3f3aa3d Bernardo Dal Seno
      cmd = basecmd + ["--ipolicy-%s=%s" % (par, val)]
864 b3f3aa3d Bernardo Dal Seno
      AssertCommand(cmd, fail=not good)
865 b3f3aa3d Bernardo Dal Seno
      if good:
866 b3f3aa3d Bernardo Dal Seno
        curr_val = val
867 b3f3aa3d Bernardo Dal Seno
      # Check the affected parameter
868 b3f3aa3d Bernardo Dal Seno
      (eff_policy, eff_specs) = _GetClusterIPolicy()
869 b3f3aa3d Bernardo Dal Seno
      AssertEqual(float(eff_policy[par]), curr_val)
870 b3f3aa3d Bernardo Dal Seno
      # Check everything else
871 b3f3aa3d Bernardo Dal Seno
      AssertEqual(eff_specs, old_specs)
872 b3f3aa3d Bernardo Dal Seno
      for p in eff_policy.keys():
873 b3f3aa3d Bernardo Dal Seno
        if p == par:
874 b3f3aa3d Bernardo Dal Seno
          continue
875 b3f3aa3d Bernardo Dal Seno
        AssertEqual(eff_policy[p], old_policy[p])
876 b3f3aa3d Bernardo Dal Seno
877 ae3ab08b Helga Velroyen
  # Allowing disk templates via ipolicy requires them to be
878 ae3ab08b Helga Velroyen
  # enabled on the cluster.
879 ae3ab08b Helga Velroyen
  if not (qa_config.IsTemplateSupported(constants.DT_PLAIN)
880 ae3ab08b Helga Velroyen
          and qa_config.IsTemplateSupported(constants.DT_DRBD8)):
881 ae3ab08b Helga Velroyen
    return
882 b3f3aa3d Bernardo Dal Seno
  # Disk templates are treated slightly differently
883 b3f3aa3d Bernardo Dal Seno
  par = "disk-templates"
884 9db0b351 Bernardo Dal Seno
  disp_str = "allowed disk templates"
885 b3f3aa3d Bernardo Dal Seno
  curr_val = old_policy[disp_str]
886 b3f3aa3d Bernardo Dal Seno
  test_values = [
887 b3f3aa3d Bernardo Dal Seno
    (True, constants.DT_PLAIN),
888 b3f3aa3d Bernardo Dal Seno
    (True, "%s,%s" % (constants.DT_PLAIN, constants.DT_DRBD8)),
889 b3f3aa3d Bernardo Dal Seno
    (False, "thisisnotadisktemplate"),
890 b3f3aa3d Bernardo Dal Seno
    (False, ""),
891 b3f3aa3d Bernardo Dal Seno
    # Restore the old value
892 b3f3aa3d Bernardo Dal Seno
    (True, curr_val.replace(" ", "")),
893 b3f3aa3d Bernardo Dal Seno
    ]
894 b3f3aa3d Bernardo Dal Seno
  for (good, val) in test_values:
895 b3f3aa3d Bernardo Dal Seno
    cmd = basecmd + ["--ipolicy-%s=%s" % (par, val)]
896 b3f3aa3d Bernardo Dal Seno
    AssertCommand(cmd, fail=not good)
897 b3f3aa3d Bernardo Dal Seno
    if good:
898 b3f3aa3d Bernardo Dal Seno
      curr_val = val
899 b3f3aa3d Bernardo Dal Seno
    # Check the affected parameter
900 b3f3aa3d Bernardo Dal Seno
    (eff_policy, eff_specs) = _GetClusterIPolicy()
901 b3f3aa3d Bernardo Dal Seno
    AssertEqual(eff_policy[disp_str].replace(" ", ""), curr_val)
902 b3f3aa3d Bernardo Dal Seno
    # Check everything else
903 b3f3aa3d Bernardo Dal Seno
    AssertEqual(eff_specs, old_specs)
904 b3f3aa3d Bernardo Dal Seno
    for p in eff_policy.keys():
905 b3f3aa3d Bernardo Dal Seno
      if p == disp_str:
906 b3f3aa3d Bernardo Dal Seno
        continue
907 b3f3aa3d Bernardo Dal Seno
      AssertEqual(eff_policy[p], old_policy[p])
908 b3f3aa3d Bernardo Dal Seno
909 b3f3aa3d Bernardo Dal Seno
910 ec996117 Bernardo Dal Seno
def TestClusterSetISpecs(new_specs=None, diff_specs=None, fail=False,
911 ec996117 Bernardo Dal Seno
                         old_values=None):
912 b3f3aa3d Bernardo Dal Seno
  """Change instance specs.
913 b3f3aa3d Bernardo Dal Seno

914 ec996117 Bernardo Dal Seno
  At most one of new_specs or diff_specs can be specified.
915 ec996117 Bernardo Dal Seno

916 ec996117 Bernardo Dal Seno
  @type new_specs: dict
917 ec996117 Bernardo Dal Seno
  @param new_specs: new complete specs, in the same format returned by
918 ec996117 Bernardo Dal Seno
      L{_GetClusterIPolicy}
919 ec996117 Bernardo Dal Seno
  @type diff_specs: dict
920 7c8ae421 Bernardo Dal Seno
  @param diff_specs: partial specs, it can be an incomplete specifications, but
921 7c8ae421 Bernardo Dal Seno
      if min/max specs are specified, their number must match the number of the
922 7c8ae421 Bernardo Dal Seno
      existing specs
923 b3f3aa3d Bernardo Dal Seno
  @type fail: bool
924 b3f3aa3d Bernardo Dal Seno
  @param fail: if the change is expected to fail
925 b3f3aa3d Bernardo Dal Seno
  @type old_values: tuple
926 b3f3aa3d Bernardo Dal Seno
  @param old_values: (old_policy, old_specs), as returned by
927 ec996117 Bernardo Dal Seno
      L{_GetClusterIPolicy}
928 b3f3aa3d Bernardo Dal Seno
  @return: same as L{_GetClusterIPolicy}
929 b3f3aa3d Bernardo Dal Seno

930 b3f3aa3d Bernardo Dal Seno
  """
931 63e08b25 Bernardo Dal Seno
  build_cmd = lambda opts: ["gnt-cluster", "modify"] + opts
932 ec996117 Bernardo Dal Seno
  return qa_utils.TestSetISpecs(
933 ec996117 Bernardo Dal Seno
    new_specs=new_specs, diff_specs=diff_specs,
934 ec996117 Bernardo Dal Seno
    get_policy_fn=_GetClusterIPolicy, build_cmd_fn=build_cmd,
935 ec996117 Bernardo Dal Seno
    fail=fail, old_values=old_values)
936 b3f3aa3d Bernardo Dal Seno
937 b3f3aa3d Bernardo Dal Seno
938 b3f3aa3d Bernardo Dal Seno
def TestClusterModifyISpecs():
939 b3f3aa3d Bernardo Dal Seno
  """gnt-cluster modify --specs-*"""
940 cb178a1e Bernardo Dal Seno
  params = ["memory-size", "disk-size", "disk-count", "cpu-count", "nic-count"]
941 b3f3aa3d Bernardo Dal Seno
  (cur_policy, cur_specs) = _GetClusterIPolicy()
942 7c8ae421 Bernardo Dal Seno
  # This test assumes that there is only one min/max bound
943 7c8ae421 Bernardo Dal Seno
  assert len(cur_specs[constants.ISPECS_MINMAX]) == 1
944 b3f3aa3d Bernardo Dal Seno
  for par in params:
945 b3f3aa3d Bernardo Dal Seno
    test_values = [
946 b3f3aa3d Bernardo Dal Seno
      (True, 0, 4, 12),
947 b3f3aa3d Bernardo Dal Seno
      (True, 4, 4, 12),
948 b3f3aa3d Bernardo Dal Seno
      (True, 4, 12, 12),
949 b3f3aa3d Bernardo Dal Seno
      (True, 4, 4, 4),
950 b3f3aa3d Bernardo Dal Seno
      (False, 4, 0, 12),
951 b3f3aa3d Bernardo Dal Seno
      (False, 4, 16, 12),
952 b3f3aa3d Bernardo Dal Seno
      (False, 4, 4, 0),
953 b3f3aa3d Bernardo Dal Seno
      (False, 12, 4, 4),
954 b3f3aa3d Bernardo Dal Seno
      (False, 12, 4, 0),
955 b3f3aa3d Bernardo Dal Seno
      (False, "a", 4, 12),
956 b3f3aa3d Bernardo Dal Seno
      (False, 0, "a", 12),
957 b3f3aa3d Bernardo Dal Seno
      (False, 0, 4, "a"),
958 b3f3aa3d Bernardo Dal Seno
      # This is to restore the old values
959 b3f3aa3d Bernardo Dal Seno
      (True,
960 7c8ae421 Bernardo Dal Seno
       cur_specs[constants.ISPECS_MINMAX][0][constants.ISPECS_MIN][par],
961 7c8ae421 Bernardo Dal Seno
       cur_specs[constants.ISPECS_STD][par],
962 7c8ae421 Bernardo Dal Seno
       cur_specs[constants.ISPECS_MINMAX][0][constants.ISPECS_MAX][par])
963 b3f3aa3d Bernardo Dal Seno
      ]
964 b3f3aa3d Bernardo Dal Seno
    for (good, mn, st, mx) in test_values:
965 ec996117 Bernardo Dal Seno
      new_vals = {
966 7c8ae421 Bernardo Dal Seno
        constants.ISPECS_MINMAX: [{
967 7c8ae421 Bernardo Dal Seno
          constants.ISPECS_MIN: {par: mn},
968 7c8ae421 Bernardo Dal Seno
          constants.ISPECS_MAX: {par: mx}
969 7c8ae421 Bernardo Dal Seno
          }],
970 7c8ae421 Bernardo Dal Seno
        constants.ISPECS_STD: {par: st}
971 ec996117 Bernardo Dal Seno
        }
972 b3f3aa3d Bernardo Dal Seno
      cur_state = (cur_policy, cur_specs)
973 b3f3aa3d Bernardo Dal Seno
      # We update cur_specs, as we've copied the values to restore already
974 ec996117 Bernardo Dal Seno
      (cur_policy, cur_specs) = TestClusterSetISpecs(
975 ec996117 Bernardo Dal Seno
        diff_specs=new_vals, fail=not good, old_values=cur_state)
976 b3f3aa3d Bernardo Dal Seno
977 b5a93c73 Bernardo Dal Seno
    # Get the ipolicy command
978 b5a93c73 Bernardo Dal Seno
    mnode = qa_config.GetMasterNode()
979 b5a93c73 Bernardo Dal Seno
    initcmd = GetCommandOutput(mnode.primary, "gnt-cluster show-ispecs-cmd")
980 b5a93c73 Bernardo Dal Seno
    modcmd = ["gnt-cluster", "modify"]
981 b5a93c73 Bernardo Dal Seno
    opts = initcmd.split()
982 b5a93c73 Bernardo Dal Seno
    assert opts[0:2] == ["gnt-cluster", "init"]
983 b5a93c73 Bernardo Dal Seno
    for k in range(2, len(opts) - 1):
984 b5a93c73 Bernardo Dal Seno
      if opts[k].startswith("--ipolicy-"):
985 b5a93c73 Bernardo Dal Seno
        assert k + 2 <= len(opts)
986 b5a93c73 Bernardo Dal Seno
        modcmd.extend(opts[k:k + 2])
987 b5a93c73 Bernardo Dal Seno
    # Re-apply the ipolicy (this should be a no-op)
988 b5a93c73 Bernardo Dal Seno
    AssertCommand(modcmd)
989 b5a93c73 Bernardo Dal Seno
    new_initcmd = GetCommandOutput(mnode.primary, "gnt-cluster show-ispecs-cmd")
990 b5a93c73 Bernardo Dal Seno
    AssertEqual(initcmd, new_initcmd)
991 b3f3aa3d Bernardo Dal Seno
992 b3f3aa3d Bernardo Dal Seno
993 cec9845c Michael Hanselmann
def TestClusterInfo():
994 cec9845c Michael Hanselmann
  """gnt-cluster info"""
995 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "info"])
996 283f9d4c Michael Hanselmann
997 283f9d4c Michael Hanselmann
998 3e8b5a9c Iustin Pop
def TestClusterRedistConf():
999 3e8b5a9c Iustin Pop
  """gnt-cluster redist-conf"""
1000 3e8b5a9c Iustin Pop
  AssertCommand(["gnt-cluster", "redist-conf"])
1001 3e8b5a9c Iustin Pop
1002 3e8b5a9c Iustin Pop
1003 283f9d4c Michael Hanselmann
def TestClusterGetmaster():
1004 283f9d4c Michael Hanselmann
  """gnt-cluster getmaster"""
1005 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "getmaster"])
1006 283f9d4c Michael Hanselmann
1007 283f9d4c Michael Hanselmann
1008 283f9d4c Michael Hanselmann
def TestClusterVersion():
1009 283f9d4c Michael Hanselmann
  """gnt-cluster version"""
1010 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "version"])
1011 cec9845c Michael Hanselmann
1012 cec9845c Michael Hanselmann
1013 6d4a1656 Michael Hanselmann
def TestClusterRenewCrypto():
1014 6d4a1656 Michael Hanselmann
  """gnt-cluster renew-crypto"""
1015 6d4a1656 Michael Hanselmann
  master = qa_config.GetMasterNode()
1016 6d4a1656 Michael Hanselmann
1017 6d4a1656 Michael Hanselmann
  # Conflicting options
1018 6d4a1656 Michael Hanselmann
  cmd = ["gnt-cluster", "renew-crypto", "--force",
1019 3db3eb2a Michael Hanselmann
         "--new-cluster-certificate", "--new-confd-hmac-key"]
1020 3db3eb2a Michael Hanselmann
  conflicting = [
1021 3db3eb2a Michael Hanselmann
    ["--new-rapi-certificate", "--rapi-certificate=/dev/null"],
1022 3db3eb2a Michael Hanselmann
    ["--new-cluster-domain-secret", "--cluster-domain-secret=/dev/null"],
1023 3db3eb2a Michael Hanselmann
    ]
1024 3db3eb2a Michael Hanselmann
  for i in conflicting:
1025 21bf2e2e Andrea Spadaccini
    AssertCommand(cmd + i, fail=True)
1026 6d4a1656 Michael Hanselmann
1027 6d4a1656 Michael Hanselmann
  # Invalid RAPI certificate
1028 6d4a1656 Michael Hanselmann
  cmd = ["gnt-cluster", "renew-crypto", "--force",
1029 6d4a1656 Michael Hanselmann
         "--rapi-certificate=/dev/null"]
1030 2f4b4f78 Iustin Pop
  AssertCommand(cmd, fail=True)
1031 6d4a1656 Michael Hanselmann
1032 aecba21e Michael Hanselmann
  rapi_cert_backup = qa_utils.BackupFile(master.primary,
1033 304d9f02 Michael Hanselmann
                                         pathutils.RAPI_CERT_FILE)
1034 502f5236 Michael Hanselmann
  try:
1035 502f5236 Michael Hanselmann
    # Custom RAPI certificate
1036 502f5236 Michael Hanselmann
    fh = tempfile.NamedTemporaryFile()
1037 6d4a1656 Michael Hanselmann
1038 502f5236 Michael Hanselmann
    # Ensure certificate doesn't cause "gnt-cluster verify" to complain
1039 502f5236 Michael Hanselmann
    validity = constants.SSL_CERT_EXPIRATION_WARN * 3
1040 6d4a1656 Michael Hanselmann
1041 5e26633b Michael Hanselmann
    utils.GenerateSelfSignedSslCert(fh.name, validity=validity)
1042 6d4a1656 Michael Hanselmann
1043 aecba21e Michael Hanselmann
    tmpcert = qa_utils.UploadFile(master.primary, fh.name)
1044 502f5236 Michael Hanselmann
    try:
1045 2f4b4f78 Iustin Pop
      AssertCommand(["gnt-cluster", "renew-crypto", "--force",
1046 2f4b4f78 Iustin Pop
                     "--rapi-certificate=%s" % tmpcert])
1047 502f5236 Michael Hanselmann
    finally:
1048 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", tmpcert])
1049 502f5236 Michael Hanselmann
1050 5e26633b Michael Hanselmann
    # Custom cluster domain secret
1051 5e26633b Michael Hanselmann
    cds_fh = tempfile.NamedTemporaryFile()
1052 5e26633b Michael Hanselmann
    cds_fh.write(utils.GenerateSecret())
1053 5e26633b Michael Hanselmann
    cds_fh.write("\n")
1054 5e26633b Michael Hanselmann
    cds_fh.flush()
1055 5e26633b Michael Hanselmann
1056 aecba21e Michael Hanselmann
    tmpcds = qa_utils.UploadFile(master.primary, cds_fh.name)
1057 5e26633b Michael Hanselmann
    try:
1058 2f4b4f78 Iustin Pop
      AssertCommand(["gnt-cluster", "renew-crypto", "--force",
1059 2f4b4f78 Iustin Pop
                     "--cluster-domain-secret=%s" % tmpcds])
1060 5e26633b Michael Hanselmann
    finally:
1061 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", tmpcds])
1062 5e26633b Michael Hanselmann
1063 502f5236 Michael Hanselmann
    # Normal case
1064 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-cluster", "renew-crypto", "--force",
1065 2f4b4f78 Iustin Pop
                   "--new-cluster-certificate", "--new-confd-hmac-key",
1066 2f4b4f78 Iustin Pop
                   "--new-rapi-certificate", "--new-cluster-domain-secret"])
1067 3db3eb2a Michael Hanselmann
1068 502f5236 Michael Hanselmann
    # Restore RAPI certificate
1069 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-cluster", "renew-crypto", "--force",
1070 2f4b4f78 Iustin Pop
                   "--rapi-certificate=%s" % rapi_cert_backup])
1071 3db3eb2a Michael Hanselmann
  finally:
1072 2f4b4f78 Iustin Pop
    AssertCommand(["rm", "-f", rapi_cert_backup])
1073 3db3eb2a Michael Hanselmann
1074 6d4a1656 Michael Hanselmann
1075 cec9845c Michael Hanselmann
def TestClusterBurnin():
1076 cec9845c Michael Hanselmann
  """Burnin"""
1077 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
1078 cec9845c Michael Hanselmann
1079 d0c8c01d Iustin Pop
  options = qa_config.get("options", {})
1080 68c8c3df Michael Hanselmann
  disk_template = options.get("burnin-disk-template", constants.DT_DRBD8)
1081 d0c8c01d Iustin Pop
  parallel = options.get("burnin-in-parallel", False)
1082 d0c8c01d Iustin Pop
  check_inst = options.get("burnin-check-instances", False)
1083 d0c8c01d Iustin Pop
  do_rename = options.get("burnin-rename", "")
1084 d0c8c01d Iustin Pop
  do_reboot = options.get("burnin-reboot", True)
1085 1d103c02 Iustin Pop
  reboot_types = options.get("reboot-types", constants.REBOOT_TYPES)
1086 23103544 Michael Hanselmann
1087 cec9845c Michael Hanselmann
  # Get as many instances as we need
1088 cec9845c Michael Hanselmann
  instances = []
1089 cec9845c Michael Hanselmann
  try:
1090 23103544 Michael Hanselmann
    try:
1091 d0c8c01d Iustin Pop
      num = qa_config.get("options", {}).get("burnin-instances", 1)
1092 f1501b3f Michael Hanselmann
      for _ in range(0, num):
1093 23103544 Michael Hanselmann
        instances.append(qa_config.AcquireInstance())
1094 23103544 Michael Hanselmann
    except qa_error.OutOfInstancesError:
1095 23103544 Michael Hanselmann
      print "Not enough instances, continuing anyway."
1096 cec9845c Michael Hanselmann
1097 23103544 Michael Hanselmann
    if len(instances) < 1:
1098 23103544 Michael Hanselmann
      raise qa_error.Error("Burnin needs at least one instance")
1099 cec9845c Michael Hanselmann
1100 aecba21e Michael Hanselmann
    script = qa_utils.UploadFile(master.primary, "../tools/burnin")
1101 cec9845c Michael Hanselmann
    try:
1102 090128b6 Christos Stavrakakis
      disks = qa_config.GetDiskOptions()
1103 23103544 Michael Hanselmann
      # Run burnin
1104 cec9845c Michael Hanselmann
      cmd = [script,
1105 d0c8c01d Iustin Pop
             "--os=%s" % qa_config.get("os"),
1106 f356202a Guido Trotter
             "--minmem-size=%s" % qa_config.get(constants.BE_MINMEM),
1107 f356202a Guido Trotter
             "--maxmem-size=%s" % qa_config.get(constants.BE_MAXMEM),
1108 090128b6 Christos Stavrakakis
             "--disk-size=%s" % ",".join([d.get("size") for d in disks]),
1109 090128b6 Christos Stavrakakis
             "--disk-growth=%s" % ",".join([d.get("growth") for d in disks]),
1110 d0c8c01d Iustin Pop
             "--disk-template=%s" % disk_template]
1111 0b0a150a Iustin Pop
      if parallel:
1112 d0c8c01d Iustin Pop
        cmd.append("--parallel")
1113 d0c8c01d Iustin Pop
        cmd.append("--early-release")
1114 0b0a150a Iustin Pop
      if check_inst:
1115 d0c8c01d Iustin Pop
        cmd.append("--http-check")
1116 4dc76b24 Iustin Pop
      if do_rename:
1117 d0c8c01d Iustin Pop
        cmd.append("--rename=%s" % do_rename)
1118 58598264 Iustin Pop
      if not do_reboot:
1119 d0c8c01d Iustin Pop
        cmd.append("--no-reboot")
1120 1d103c02 Iustin Pop
      else:
1121 d0c8c01d Iustin Pop
        cmd.append("--reboot-types=%s" % ",".join(reboot_types))
1122 b5f33afa Michael Hanselmann
      cmd += [inst.name for inst in instances]
1123 2f4b4f78 Iustin Pop
      AssertCommand(cmd)
1124 cec9845c Michael Hanselmann
    finally:
1125 2f4b4f78 Iustin Pop
      AssertCommand(["rm", "-f", script])
1126 2f4b4f78 Iustin Pop
1127 cec9845c Michael Hanselmann
  finally:
1128 cec9845c Michael Hanselmann
    for inst in instances:
1129 6f88e076 Michael Hanselmann
      inst.Release()
1130 cec9845c Michael Hanselmann
1131 cec9845c Michael Hanselmann
1132 cec9845c Michael Hanselmann
def TestClusterMasterFailover():
1133 c28502b1 Iustin Pop
  """gnt-cluster master-failover"""
1134 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
1135 cec9845c Michael Hanselmann
  failovermaster = qa_config.AcquireNode(exclude=master)
1136 cec9845c Michael Hanselmann
1137 2f4b4f78 Iustin Pop
  cmd = ["gnt-cluster", "master-failover"]
1138 2f4b4f78 Iustin Pop
  try:
1139 2f4b4f78 Iustin Pop
    AssertCommand(cmd, node=failovermaster)
1140 ff699aa9 Michael Hanselmann
    # Back to original master node
1141 2f4b4f78 Iustin Pop
    AssertCommand(cmd, node=master)
1142 cec9845c Michael Hanselmann
  finally:
1143 565cb4bf Michael Hanselmann
    failovermaster.Release()
1144 cec9845c Michael Hanselmann
1145 cec9845c Michael Hanselmann
1146 2df92990 Michael Hanselmann
def _NodeQueueDrainFile(node):
1147 2df92990 Michael Hanselmann
  """Returns path to queue drain file for a node.
1148 2df92990 Michael Hanselmann

1149 2df92990 Michael Hanselmann
  """
1150 2df92990 Michael Hanselmann
  return qa_utils.MakeNodePath(node, pathutils.JOB_QUEUE_DRAIN_FILE)
1151 2df92990 Michael Hanselmann
1152 2df92990 Michael Hanselmann
1153 2df92990 Michael Hanselmann
def _AssertDrainFile(node, **kwargs):
1154 2df92990 Michael Hanselmann
  """Checks for the queue drain file.
1155 2df92990 Michael Hanselmann

1156 2df92990 Michael Hanselmann
  """
1157 2df92990 Michael Hanselmann
  AssertCommand(["test", "-f", _NodeQueueDrainFile(node)], node=node, **kwargs)
1158 2df92990 Michael Hanselmann
1159 2df92990 Michael Hanselmann
1160 ff699aa9 Michael Hanselmann
def TestClusterMasterFailoverWithDrainedQueue():
1161 ff699aa9 Michael Hanselmann
  """gnt-cluster master-failover with drained queue"""
1162 ff699aa9 Michael Hanselmann
  master = qa_config.GetMasterNode()
1163 ff699aa9 Michael Hanselmann
  failovermaster = qa_config.AcquireNode(exclude=master)
1164 ff699aa9 Michael Hanselmann
1165 ff699aa9 Michael Hanselmann
  # Ensure queue is not drained
1166 ff699aa9 Michael Hanselmann
  for node in [master, failovermaster]:
1167 2df92990 Michael Hanselmann
    _AssertDrainFile(node, fail=True)
1168 ff699aa9 Michael Hanselmann
1169 ff699aa9 Michael Hanselmann
  # Drain queue on failover master
1170 2df92990 Michael Hanselmann
  AssertCommand(["touch", _NodeQueueDrainFile(failovermaster)],
1171 2df92990 Michael Hanselmann
                node=failovermaster)
1172 ff699aa9 Michael Hanselmann
1173 ff699aa9 Michael Hanselmann
  cmd = ["gnt-cluster", "master-failover"]
1174 ff699aa9 Michael Hanselmann
  try:
1175 2df92990 Michael Hanselmann
    _AssertDrainFile(failovermaster)
1176 ff699aa9 Michael Hanselmann
    AssertCommand(cmd, node=failovermaster)
1177 2df92990 Michael Hanselmann
    _AssertDrainFile(master, fail=True)
1178 2df92990 Michael Hanselmann
    _AssertDrainFile(failovermaster, fail=True)
1179 ff699aa9 Michael Hanselmann
1180 ff699aa9 Michael Hanselmann
    # Back to original master node
1181 ff699aa9 Michael Hanselmann
    AssertCommand(cmd, node=master)
1182 ff699aa9 Michael Hanselmann
  finally:
1183 565cb4bf Michael Hanselmann
    failovermaster.Release()
1184 ff699aa9 Michael Hanselmann
1185 2df92990 Michael Hanselmann
  # Ensure queue is not drained
1186 2df92990 Michael Hanselmann
  for node in [master, failovermaster]:
1187 2df92990 Michael Hanselmann
    _AssertDrainFile(node, fail=True)
1188 ff699aa9 Michael Hanselmann
1189 ff699aa9 Michael Hanselmann
1190 cec9845c Michael Hanselmann
def TestClusterCopyfile():
1191 cec9845c Michael Hanselmann
  """gnt-cluster copyfile"""
1192 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
1193 cec9845c Michael Hanselmann
1194 24818e8f Michael Hanselmann
  uniqueid = utils.NewUUID()
1195 830da270 Michael Hanselmann
1196 cec9845c Michael Hanselmann
  # Create temporary file
1197 cec9845c Michael Hanselmann
  f = tempfile.NamedTemporaryFile()
1198 830da270 Michael Hanselmann
  f.write(uniqueid)
1199 cec9845c Michael Hanselmann
  f.flush()
1200 cec9845c Michael Hanselmann
  f.seek(0)
1201 cec9845c Michael Hanselmann
1202 cec9845c Michael Hanselmann
  # Upload file to master node
1203 aecba21e Michael Hanselmann
  testname = qa_utils.UploadFile(master.primary, f.name)
1204 cec9845c Michael Hanselmann
  try:
1205 cec9845c Michael Hanselmann
    # Copy file to all nodes
1206 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-cluster", "copyfile", testname])
1207 830da270 Michael Hanselmann
    _CheckFileOnAllNodes(testname, uniqueid)
1208 cec9845c Michael Hanselmann
  finally:
1209 830da270 Michael Hanselmann
    _RemoveFileFromAllNodes(testname)
1210 830da270 Michael Hanselmann
1211 830da270 Michael Hanselmann
1212 830da270 Michael Hanselmann
def TestClusterCommand():
1213 830da270 Michael Hanselmann
  """gnt-cluster command"""
1214 24818e8f Michael Hanselmann
  uniqueid = utils.NewUUID()
1215 24818e8f Michael Hanselmann
  rfile = "/tmp/gnt%s" % utils.NewUUID()
1216 d0c8c01d Iustin Pop
  rcmd = utils.ShellQuoteArgs(["echo", "-n", uniqueid])
1217 d0c8c01d Iustin Pop
  cmd = utils.ShellQuoteArgs(["gnt-cluster", "command",
1218 830da270 Michael Hanselmann
                              "%s >%s" % (rcmd, rfile)])
1219 830da270 Michael Hanselmann
1220 830da270 Michael Hanselmann
  try:
1221 2f4b4f78 Iustin Pop
    AssertCommand(cmd)
1222 830da270 Michael Hanselmann
    _CheckFileOnAllNodes(rfile, uniqueid)
1223 830da270 Michael Hanselmann
  finally:
1224 830da270 Michael Hanselmann
    _RemoveFileFromAllNodes(rfile)
1225 cec9845c Michael Hanselmann
1226 cec9845c Michael Hanselmann
1227 cec9845c Michael Hanselmann
def TestClusterDestroy():
1228 cec9845c Michael Hanselmann
  """gnt-cluster destroy"""
1229 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "destroy", "--yes-do-it"])
1230 65a884ef Iustin Pop
1231 65a884ef Iustin Pop
1232 65a884ef Iustin Pop
def TestClusterRepairDiskSizes():
1233 65a884ef Iustin Pop
  """gnt-cluster repair-disk-sizes"""
1234 65a884ef Iustin Pop
  AssertCommand(["gnt-cluster", "repair-disk-sizes"])
1235 50ef6a41 Bernardo Dal Seno
1236 50ef6a41 Bernardo Dal Seno
1237 50ef6a41 Bernardo Dal Seno
def TestSetExclStorCluster(newvalue):
1238 50ef6a41 Bernardo Dal Seno
  """Set the exclusive_storage node parameter at the cluster level.
1239 50ef6a41 Bernardo Dal Seno

1240 50ef6a41 Bernardo Dal Seno
  @type newvalue: bool
1241 50ef6a41 Bernardo Dal Seno
  @param newvalue: New value of exclusive_storage
1242 50ef6a41 Bernardo Dal Seno
  @rtype: bool
1243 50ef6a41 Bernardo Dal Seno
  @return: The old value of exclusive_storage
1244 50ef6a41 Bernardo Dal Seno

1245 50ef6a41 Bernardo Dal Seno
  """
1246 0e79564a Bernardo Dal Seno
  es_path = ["Default node parameters", "exclusive_storage"]
1247 0e79564a Bernardo Dal Seno
  oldvalue = _GetClusterField(es_path)
1248 50ef6a41 Bernardo Dal Seno
  AssertCommand(["gnt-cluster", "modify", "--node-parameters",
1249 50ef6a41 Bernardo Dal Seno
                 "exclusive_storage=%s" % newvalue])
1250 0e79564a Bernardo Dal Seno
  effvalue = _GetClusterField(es_path)
1251 50ef6a41 Bernardo Dal Seno
  if effvalue != newvalue:
1252 50ef6a41 Bernardo Dal Seno
    raise qa_error.Error("exclusive_storage has the wrong value: %s instead"
1253 50ef6a41 Bernardo Dal Seno
                         " of %s" % (effvalue, newvalue))
1254 6a0f22e1 Bernardo Dal Seno
  qa_config.SetExclusiveStorage(newvalue)
1255 50ef6a41 Bernardo Dal Seno
  return oldvalue
1256 e8b919a1 Bernardo Dal Seno
1257 e8b919a1 Bernardo Dal Seno
1258 21e2734f Bernardo Dal Seno
def TestExclStorSharedPv(node):
1259 21e2734f Bernardo Dal Seno
  """cluster-verify reports LVs that share the same PV with exclusive_storage.
1260 21e2734f Bernardo Dal Seno

1261 21e2734f Bernardo Dal Seno
  """
1262 21e2734f Bernardo Dal Seno
  vgname = qa_config.get("vg-name", constants.DEFAULT_VG)
1263 21e2734f Bernardo Dal Seno
  lvname1 = _QA_LV_PREFIX + "vol1"
1264 21e2734f Bernardo Dal Seno
  lvname2 = _QA_LV_PREFIX + "vol2"
1265 aecba21e Michael Hanselmann
  node_name = node.primary
1266 21e2734f Bernardo Dal Seno
  AssertCommand(["lvcreate", "-L1G", "-n", lvname1, vgname], node=node_name)
1267 21e2734f Bernardo Dal Seno
  AssertClusterVerify(fail=True, errors=[constants.CV_ENODEORPHANLV])
1268 21e2734f Bernardo Dal Seno
  AssertCommand(["lvcreate", "-L1G", "-n", lvname2, vgname], node=node_name)
1269 21e2734f Bernardo Dal Seno
  AssertClusterVerify(fail=True, errors=[constants.CV_ENODELVM,
1270 21e2734f Bernardo Dal Seno
                                         constants.CV_ENODEORPHANLV])
1271 21e2734f Bernardo Dal Seno
  AssertCommand(["lvremove", "-f", "/".join([vgname, lvname1])], node=node_name)
1272 21e2734f Bernardo Dal Seno
  AssertCommand(["lvremove", "-f", "/".join([vgname, lvname2])], node=node_name)
1273 21e2734f Bernardo Dal Seno
  AssertClusterVerify()