Statistics
| Branch: | Tag: | Revision:

root / qa / qa_cluster.py @ 5d9d1aff

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

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

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

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

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

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

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

457 b24b52d9 Helga Velroyen
  @type undesired_disk_templates: list of string
458 b24b52d9 Helga Velroyen
  @param undesired_disk_templates: a list of disk templates that we want to
459 b24b52d9 Helga Velroyen
      exclude when drawing one disk template from the list of enabled
460 b24b52d9 Helga Velroyen
      disk templates
461 b24b52d9 Helga Velroyen
  @type enabled_disk_templates: list of string
462 b24b52d9 Helga Velroyen
  @param enabled_disk_templates: list of enabled disk templates (in QA)
463 b24b52d9 Helga Velroyen

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

481 b24b52d9 Helga Velroyen
  @type file_disk_template: string
482 b24b52d9 Helga Velroyen
  @param file_disk_template: file-based disk template
483 b24b52d9 Helga Velroyen
  @type dir_config_key: string
484 b24b52d9 Helga Velroyen
  @param dir_config_key: key for the QA config to retrieve the default
485 b24b52d9 Helga Velroyen
     directory value
486 b24b52d9 Helga Velroyen
  @type default_dir: string
487 b24b52d9 Helga Velroyen
  @param default_dir: default directory, if the QA config does not specify
488 b24b52d9 Helga Velroyen
     it
489 b24b52d9 Helga Velroyen
  @type option_name: string
490 b24b52d9 Helga Velroyen
  @param option_name: name of the option of 'gnt-cluster modify' to
491 b24b52d9 Helga Velroyen
     change the directory
492 b24b52d9 Helga Velroyen

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

590 462f0faa Helga Velroyen
  """
591 eb161df2 Helga Velroyen
  enabled_disk_templates = qa_config.GetEnabledDiskTemplates()
592 eb161df2 Helga Velroyen
  cmd = ["gnt-cluster", "modify",
593 eb161df2 Helga Velroyen
         "--enabled-disk-templates=%s" % ",".join(enabled_disk_templates),
594 eb161df2 Helga Velroyen
         "--ipolicy-disk-templates=%s" % ",".join(enabled_disk_templates),
595 eb161df2 Helga Velroyen
         ]
596 d101b7be Thomas Thrainer
597 d101b7be Thomas Thrainer
  if utils.IsLvmEnabled(qa_config.GetEnabledDiskTemplates()):
598 d101b7be Thomas Thrainer
    vgname = qa_config.get("vg-name", constants.DEFAULT_VG)
599 d101b7be Thomas Thrainer
    cmd.append("--vg-name=%s" % vgname)
600 d101b7be Thomas Thrainer
601 d101b7be Thomas Thrainer
  AssertCommand(cmd, fail=False)
602 462f0faa Helga Velroyen
603 462f0faa Helga Velroyen
604 a25f44a4 Helga Velroyen
def _TestClusterModifyDiskTemplatesDrbdHelper(enabled_disk_templates):
605 a25f44a4 Helga Velroyen
  """Tests argument handling of 'gnt-cluster modify' with respect to
606 a25f44a4 Helga Velroyen
     the parameter '--drbd-usermode-helper'. This test is independent
607 a25f44a4 Helga Velroyen
     of instances.
608 a25f44a4 Helga Velroyen

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

659 462f0faa Helga Velroyen
  """
660 912737ba Helga Velroyen
  _RestoreEnabledDiskTemplates()
661 462f0faa Helga Velroyen
662 2dae8d64 Helga Velroyen
  # bogus templates
663 dacd8ba4 Helga Velroyen
  AssertCommand(["gnt-cluster", "modify",
664 2dae8d64 Helga Velroyen
                 "--enabled-disk-templates=pinkbunny"],
665 dacd8ba4 Helga Velroyen
                fail=True)
666 462f0faa Helga Velroyen
667 dacd8ba4 Helga Velroyen
  # duplicate entries do no harm
668 dacd8ba4 Helga Velroyen
  AssertCommand(
669 dacd8ba4 Helga Velroyen
    ["gnt-cluster", "modify",
670 2dae8d64 Helga Velroyen
     "--enabled-disk-templates=%s,%s" %
671 eb161df2 Helga Velroyen
      (default_disk_template, default_disk_template),
672 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % default_disk_template],
673 dacd8ba4 Helga Velroyen
    fail=False)
674 462f0faa Helga Velroyen
675 912737ba Helga Velroyen
676 912737ba Helga Velroyen
def _TestClusterModifyDiskTemplatesVgName(enabled_disk_templates):
677 912737ba Helga Velroyen
  """Tests argument handling of 'gnt-cluster modify' with respect to
678 912737ba Helga Velroyen
     the parameter '--enabled-disk-templates' and '--vg-name'. This test is
679 912737ba Helga Velroyen
     independent of instances.
680 912737ba Helga Velroyen

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

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

840 b3f3aa3d Bernardo Dal Seno
  @rtype: tuple
841 b3f3aa3d Bernardo Dal Seno
  @return: (policy, specs), where:
842 b3f3aa3d Bernardo Dal Seno
      - policy is a dictionary of the policy values, instance specs excluded
843 7c8ae421 Bernardo Dal Seno
      - specs is a dictionary containing only the specs, using the internal
844 7c8ae421 Bernardo Dal Seno
        format (see L{constants.IPOLICY_DEFAULTS} for an example)
845 b3f3aa3d Bernardo Dal Seno

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

924 ec996117 Bernardo Dal Seno
  At most one of new_specs or diff_specs can be specified.
925 ec996117 Bernardo Dal Seno

926 ec996117 Bernardo Dal Seno
  @type new_specs: dict
927 ec996117 Bernardo Dal Seno
  @param new_specs: new complete specs, in the same format returned by
928 ec996117 Bernardo Dal Seno
      L{_GetClusterIPolicy}
929 ec996117 Bernardo Dal Seno
  @type diff_specs: dict
930 7c8ae421 Bernardo Dal Seno
  @param diff_specs: partial specs, it can be an incomplete specifications, but
931 7c8ae421 Bernardo Dal Seno
      if min/max specs are specified, their number must match the number of the
932 7c8ae421 Bernardo Dal Seno
      existing specs
933 b3f3aa3d Bernardo Dal Seno
  @type fail: bool
934 b3f3aa3d Bernardo Dal Seno
  @param fail: if the change is expected to fail
935 b3f3aa3d Bernardo Dal Seno
  @type old_values: tuple
936 b3f3aa3d Bernardo Dal Seno
  @param old_values: (old_policy, old_specs), as returned by
937 ec996117 Bernardo Dal Seno
      L{_GetClusterIPolicy}
938 b3f3aa3d Bernardo Dal Seno
  @return: same as L{_GetClusterIPolicy}
939 b3f3aa3d Bernardo Dal Seno

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

1161 2df92990 Michael Hanselmann
  """
1162 2df92990 Michael Hanselmann
  return qa_utils.MakeNodePath(node, pathutils.JOB_QUEUE_DRAIN_FILE)
1163 2df92990 Michael Hanselmann
1164 2df92990 Michael Hanselmann
1165 2df92990 Michael Hanselmann
def _AssertDrainFile(node, **kwargs):
1166 2df92990 Michael Hanselmann
  """Checks for the queue drain file.
1167 2df92990 Michael Hanselmann

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

1252 50ef6a41 Bernardo Dal Seno
  @type newvalue: bool
1253 50ef6a41 Bernardo Dal Seno
  @param newvalue: New value of exclusive_storage
1254 50ef6a41 Bernardo Dal Seno
  @rtype: bool
1255 50ef6a41 Bernardo Dal Seno
  @return: The old value of exclusive_storage
1256 50ef6a41 Bernardo Dal Seno

1257 50ef6a41 Bernardo Dal Seno
  """
1258 0e79564a Bernardo Dal Seno
  es_path = ["Default node parameters", "exclusive_storage"]
1259 0e79564a Bernardo Dal Seno
  oldvalue = _GetClusterField(es_path)
1260 50ef6a41 Bernardo Dal Seno
  AssertCommand(["gnt-cluster", "modify", "--node-parameters",
1261 50ef6a41 Bernardo Dal Seno
                 "exclusive_storage=%s" % newvalue])
1262 0e79564a Bernardo Dal Seno
  effvalue = _GetClusterField(es_path)
1263 50ef6a41 Bernardo Dal Seno
  if effvalue != newvalue:
1264 50ef6a41 Bernardo Dal Seno
    raise qa_error.Error("exclusive_storage has the wrong value: %s instead"
1265 50ef6a41 Bernardo Dal Seno
                         " of %s" % (effvalue, newvalue))
1266 6a0f22e1 Bernardo Dal Seno
  qa_config.SetExclusiveStorage(newvalue)
1267 50ef6a41 Bernardo Dal Seno
  return oldvalue
1268 e8b919a1 Bernardo Dal Seno
1269 e8b919a1 Bernardo Dal Seno
1270 21e2734f Bernardo Dal Seno
def TestExclStorSharedPv(node):
1271 21e2734f Bernardo Dal Seno
  """cluster-verify reports LVs that share the same PV with exclusive_storage.
1272 21e2734f Bernardo Dal Seno

1273 21e2734f Bernardo Dal Seno
  """
1274 21e2734f Bernardo Dal Seno
  vgname = qa_config.get("vg-name", constants.DEFAULT_VG)
1275 21e2734f Bernardo Dal Seno
  lvname1 = _QA_LV_PREFIX + "vol1"
1276 21e2734f Bernardo Dal Seno
  lvname2 = _QA_LV_PREFIX + "vol2"
1277 aecba21e Michael Hanselmann
  node_name = node.primary
1278 21e2734f Bernardo Dal Seno
  AssertCommand(["lvcreate", "-L1G", "-n", lvname1, vgname], node=node_name)
1279 21e2734f Bernardo Dal Seno
  AssertClusterVerify(fail=True, errors=[constants.CV_ENODEORPHANLV])
1280 21e2734f Bernardo Dal Seno
  AssertCommand(["lvcreate", "-L1G", "-n", lvname2, vgname], node=node_name)
1281 21e2734f Bernardo Dal Seno
  AssertClusterVerify(fail=True, errors=[constants.CV_ENODELVM,
1282 21e2734f Bernardo Dal Seno
                                         constants.CV_ENODEORPHANLV])
1283 21e2734f Bernardo Dal Seno
  AssertCommand(["lvremove", "-f", "/".join([vgname, lvname1])], node=node_name)
1284 21e2734f Bernardo Dal Seno
  AssertCommand(["lvremove", "-f", "/".join([vgname, lvname2])], node=node_name)
1285 21e2734f Bernardo Dal Seno
  AssertClusterVerify()