Statistics
| Branch: | Tag: | Revision:

root / qa / qa_cluster.py @ e0e44476

History | View | Annotate | Download (41.7 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 e0e44476 Michele Tartara
             "--enabled-disk-templates=%s" % file_disk_template,
503 e0e44476 Michele Tartara
             "--ipolicy-disk-templates=%s" % file_disk_template]),
504 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "modify",
505 e0e44476 Michele Tartara
             "--%s=%s" % (option_name, file_storage_dir)]),
506 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "modify",
507 e0e44476 Michele Tartara
             "--%s=%s" % (option_name, invalid_file_storage_dir)]),
508 b24b52d9 Helga Velroyen
    # file storage dir is set to an inacceptable path, thus verify
509 b24b52d9 Helga Velroyen
    # should fail
510 b24b52d9 Helga Velroyen
    (True, ["gnt-cluster", "verify"]),
511 b24b52d9 Helga Velroyen
    # unsetting the storage dir while file storage is enabled
512 b24b52d9 Helga Velroyen
    # should fail
513 b24b52d9 Helga Velroyen
    (True, ["gnt-cluster", "modify",
514 b24b52d9 Helga Velroyen
            "--%s=" % option_name]),
515 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "modify",
516 e0e44476 Michele Tartara
             "--%s=%s" % (option_name, file_storage_dir)]),
517 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "modify",
518 e0e44476 Michele Tartara
             "--enabled-disk-templates=%s" % other_disk_template,
519 e0e44476 Michele Tartara
             "--ipolicy-disk-templates=%s" % other_disk_template]),
520 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "modify",
521 e0e44476 Michele Tartara
             "--%s=%s" % (option_name, invalid_file_storage_dir)]),
522 b24b52d9 Helga Velroyen
    # file storage is set to an inacceptable path, but file storage
523 b24b52d9 Helga Velroyen
    # is disabled, thus verify should not fail
524 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "verify"]),
525 b24b52d9 Helga Velroyen
    # unsetting the file storage dir while file storage is not enabled
526 b24b52d9 Helga Velroyen
    # should be fine
527 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "modify",
528 e0e44476 Michele Tartara
             "--%s=" % option_name]),
529 b24b52d9 Helga Velroyen
    # resetting everything to sane values
530 b24b52d9 Helga Velroyen
    (False, ["gnt-cluster", "modify",
531 e0e44476 Michele Tartara
             "--%s=%s" % (option_name, file_storage_dir),
532 e0e44476 Michele Tartara
             "--enabled-disk-templates=%s" % ",".join(enabled_disk_templates),
533 e0e44476 Michele Tartara
             "--ipolicy-disk-templates=%s" % ",".join(enabled_disk_templates)])
534 b24b52d9 Helga Velroyen
    ]:
535 b24b52d9 Helga Velroyen
    AssertCommand(cmd, fail=fail)
536 b24b52d9 Helga Velroyen
537 b24b52d9 Helga Velroyen
538 b24b52d9 Helga Velroyen
def TestClusterModifyFileStorageDir():
539 b24b52d9 Helga Velroyen
  """gnt-cluster modify --file-storage-dir=..."""
540 b24b52d9 Helga Velroyen
  TestClusterModifyFileBasedStorageDir(
541 b24b52d9 Helga Velroyen
      constants.DT_FILE, "default-file-storage-dir",
542 b24b52d9 Helga Velroyen
      pathutils.DEFAULT_FILE_STORAGE_DIR,
543 b24b52d9 Helga Velroyen
      "file-storage-dir")
544 b24b52d9 Helga Velroyen
545 b24b52d9 Helga Velroyen
546 b24b52d9 Helga Velroyen
def TestClusterModifySharedFileStorageDir():
547 b24b52d9 Helga Velroyen
  """gnt-cluster modify --shared-file-storage-dir=..."""
548 b24b52d9 Helga Velroyen
  TestClusterModifyFileBasedStorageDir(
549 b24b52d9 Helga Velroyen
      constants.DT_SHARED_FILE, "default-shared-file-storage-dir",
550 b24b52d9 Helga Velroyen
      pathutils.DEFAULT_SHARED_FILE_STORAGE_DIR,
551 b24b52d9 Helga Velroyen
      "shared-file-storage-dir")
552 b24b52d9 Helga Velroyen
553 b24b52d9 Helga Velroyen
554 2dae8d64 Helga Velroyen
def TestClusterModifyDiskTemplates():
555 2dae8d64 Helga Velroyen
  """gnt-cluster modify --enabled-disk-templates=..."""
556 462f0faa Helga Velroyen
  enabled_disk_templates = qa_config.GetEnabledDiskTemplates()
557 2dae8d64 Helga Velroyen
  default_disk_template = qa_config.GetDefaultDiskTemplate()
558 462f0faa Helga Velroyen
559 462f0faa Helga Velroyen
  _TestClusterModifyDiskTemplatesArguments(default_disk_template,
560 462f0faa Helga Velroyen
                                           enabled_disk_templates)
561 912737ba Helga Velroyen
  _TestClusterModifyDiskTemplatesVgName(enabled_disk_templates)
562 462f0faa Helga Velroyen
563 462f0faa Helga Velroyen
  _RestoreEnabledDiskTemplates()
564 462f0faa Helga Velroyen
  nodes = qa_config.AcquireManyNodes(2)
565 462f0faa Helga Velroyen
566 462f0faa Helga Velroyen
  instance_template = enabled_disk_templates[0]
567 462f0faa Helga Velroyen
  instance = qa_instance.CreateInstanceByDiskTemplate(nodes, instance_template)
568 462f0faa Helga Velroyen
569 462f0faa Helga Velroyen
  _TestClusterModifyUnusedDiskTemplate(instance_template)
570 462f0faa Helga Velroyen
  _TestClusterModifyUsedDiskTemplate(instance_template,
571 462f0faa Helga Velroyen
                                     enabled_disk_templates)
572 462f0faa Helga Velroyen
573 462f0faa Helga Velroyen
  qa_instance.TestInstanceRemove(instance)
574 462f0faa Helga Velroyen
  _RestoreEnabledDiskTemplates()
575 462f0faa Helga Velroyen
576 462f0faa Helga Velroyen
577 462f0faa Helga Velroyen
def _RestoreEnabledDiskTemplates():
578 462f0faa Helga Velroyen
  """Sets the list of enabled disk templates back to the list of enabled disk
579 462f0faa Helga Velroyen
     templates from the QA configuration. This can be used to make sure that
580 462f0faa Helga Velroyen
     the tests that modify the list of disk templates do not interfere with
581 462f0faa Helga Velroyen
     other tests.
582 462f0faa Helga Velroyen

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

603 462f0faa Helga Velroyen
  """
604 912737ba Helga Velroyen
  _RestoreEnabledDiskTemplates()
605 462f0faa Helga Velroyen
606 2dae8d64 Helga Velroyen
  # bogus templates
607 dacd8ba4 Helga Velroyen
  AssertCommand(["gnt-cluster", "modify",
608 2dae8d64 Helga Velroyen
                 "--enabled-disk-templates=pinkbunny"],
609 dacd8ba4 Helga Velroyen
                fail=True)
610 462f0faa Helga Velroyen
611 dacd8ba4 Helga Velroyen
  # duplicate entries do no harm
612 dacd8ba4 Helga Velroyen
  AssertCommand(
613 dacd8ba4 Helga Velroyen
    ["gnt-cluster", "modify",
614 2dae8d64 Helga Velroyen
     "--enabled-disk-templates=%s,%s" %
615 eb161df2 Helga Velroyen
      (default_disk_template, default_disk_template),
616 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % default_disk_template],
617 dacd8ba4 Helga Velroyen
    fail=False)
618 462f0faa Helga Velroyen
619 912737ba Helga Velroyen
  if constants.DT_DRBD8 in enabled_disk_templates:
620 0c2cfb97 Thomas Thrainer
    # interaction with --drbd-usermode-helper option
621 0c2cfb97 Thomas Thrainer
    drbd_usermode_helper = qa_config.get("drbd-usermode-helper", None)
622 0c2cfb97 Thomas Thrainer
    if not drbd_usermode_helper:
623 0c2cfb97 Thomas Thrainer
      drbd_usermode_helper = "/bin/true"
624 0c2cfb97 Thomas Thrainer
    # specifying a helper when drbd gets disabled is ok. Note that drbd still
625 0c2cfb97 Thomas Thrainer
    # has to be installed on the nodes in this case
626 0c2cfb97 Thomas Thrainer
    AssertCommand(["gnt-cluster", "modify",
627 0c2cfb97 Thomas Thrainer
                   "--drbd-usermode-helper=%s" % drbd_usermode_helper,
628 eb161df2 Helga Velroyen
                   "--enabled-disk-templates=%s" % constants.DT_DISKLESS,
629 eb161df2 Helga Velroyen
                   "--ipolicy-disk-templates=%s" % constants.DT_DISKLESS],
630 0c2cfb97 Thomas Thrainer
                   fail=False)
631 0c2cfb97 Thomas Thrainer
    # specifying a helper when drbd is re-enabled
632 912737ba Helga Velroyen
    AssertCommand(["gnt-cluster", "modify",
633 912737ba Helga Velroyen
                   "--drbd-usermode-helper=%s" % drbd_usermode_helper,
634 912737ba Helga Velroyen
                   "--enabled-disk-templates=%s" %
635 eb161df2 Helga Velroyen
                     ",".join(enabled_disk_templates),
636 eb161df2 Helga Velroyen
                   "--ipolicy-disk-templates=%s" %
637 912737ba Helga Velroyen
                     ",".join(enabled_disk_templates)],
638 912737ba Helga Velroyen
                  fail=False)
639 912737ba Helga Velroyen
640 912737ba Helga Velroyen
641 912737ba Helga Velroyen
def _TestClusterModifyDiskTemplatesVgName(enabled_disk_templates):
642 912737ba Helga Velroyen
  """Tests argument handling of 'gnt-cluster modify' with respect to
643 912737ba Helga Velroyen
     the parameter '--enabled-disk-templates' and '--vg-name'. This test is
644 912737ba Helga Velroyen
     independent of instances.
645 912737ba Helga Velroyen

646 912737ba Helga Velroyen
  """
647 912737ba Helga Velroyen
  if not utils.IsLvmEnabled(enabled_disk_templates):
648 912737ba Helga Velroyen
    # These tests only make sense if lvm is enabled for QA
649 912737ba Helga Velroyen
    return
650 912737ba Helga Velroyen
651 912737ba Helga Velroyen
  # determine an LVM and a non-LVM disk template for the tests
652 b24b52d9 Helga Velroyen
  non_lvm_template = _GetOtherEnabledDiskTemplate(utils.GetLvmDiskTemplates(),
653 b24b52d9 Helga Velroyen
                                                  enabled_disk_templates)
654 912737ba Helga Velroyen
  lvm_template = list(set(enabled_disk_templates)
655 912737ba Helga Velroyen
                      .intersection(set(utils.GetLvmDiskTemplates())))[0]
656 912737ba Helga Velroyen
657 912737ba Helga Velroyen
  vgname = qa_config.get("vg-name", constants.DEFAULT_VG)
658 912737ba Helga Velroyen
659 912737ba Helga Velroyen
  # Clean start: unset volume group name, disable lvm storage
660 912737ba Helga Velroyen
  AssertCommand(
661 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
662 912737ba Helga Velroyen
     "--enabled-disk-templates=%s" % non_lvm_template,
663 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % non_lvm_template,
664 912737ba Helga Velroyen
     "--vg-name="],
665 912737ba Helga Velroyen
    fail=False)
666 912737ba Helga Velroyen
667 912737ba Helga Velroyen
  # Try to enable lvm, when no volume group is given
668 912737ba Helga Velroyen
  AssertCommand(
669 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
670 eb161df2 Helga Velroyen
     "--enabled-disk-templates=%s" % lvm_template,
671 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % lvm_template],
672 912737ba Helga Velroyen
    fail=True)
673 912737ba Helga Velroyen
674 912737ba Helga Velroyen
  # Set volume group, with lvm still disabled: just a warning
675 912737ba Helga Velroyen
  AssertCommand(["gnt-cluster", "modify", "--vg-name=%s" % vgname], fail=False)
676 912737ba Helga Velroyen
677 912737ba Helga Velroyen
  # Try unsetting vg name and enabling lvm at the same time
678 912737ba Helga Velroyen
  AssertCommand(
679 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
680 912737ba Helga Velroyen
     "--enabled-disk-templates=%s" % lvm_template,
681 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % lvm_template,
682 912737ba Helga Velroyen
     "--vg-name="],
683 912737ba Helga Velroyen
    fail=True)
684 912737ba Helga Velroyen
685 912737ba Helga Velroyen
  # Enable lvm with vg name present
686 912737ba Helga Velroyen
  AssertCommand(
687 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
688 eb161df2 Helga Velroyen
     "--enabled-disk-templates=%s" % lvm_template,
689 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % lvm_template],
690 912737ba Helga Velroyen
    fail=False)
691 912737ba Helga Velroyen
692 912737ba Helga Velroyen
  # Try unsetting vg name with lvm still enabled
693 912737ba Helga Velroyen
  AssertCommand(["gnt-cluster", "modify", "--vg-name="], fail=True)
694 912737ba Helga Velroyen
695 912737ba Helga Velroyen
  # Disable lvm with vg name still set
696 912737ba Helga Velroyen
  AssertCommand(
697 eb161df2 Helga Velroyen
    ["gnt-cluster", "modify",
698 eb161df2 Helga Velroyen
     "--enabled-disk-templates=%s" % non_lvm_template,
699 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % non_lvm_template,
700 eb161df2 Helga Velroyen
     ],
701 912737ba Helga Velroyen
    fail=False)
702 912737ba Helga Velroyen
703 912737ba Helga Velroyen
  # Try unsetting vg name with lvm disabled
704 912737ba Helga Velroyen
  AssertCommand(["gnt-cluster", "modify", "--vg-name="], fail=False)
705 912737ba Helga Velroyen
706 912737ba Helga Velroyen
  # Set vg name and enable lvm at the same time
707 912737ba Helga Velroyen
  AssertCommand(
708 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
709 912737ba Helga Velroyen
     "--enabled-disk-templates=%s" % lvm_template,
710 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % lvm_template,
711 912737ba Helga Velroyen
     "--vg-name=%s" % vgname],
712 912737ba Helga Velroyen
    fail=False)
713 912737ba Helga Velroyen
714 912737ba Helga Velroyen
  # Unset vg name and disable lvm at the same time
715 912737ba Helga Velroyen
  AssertCommand(
716 912737ba Helga Velroyen
    ["gnt-cluster", "modify",
717 912737ba Helga Velroyen
     "--enabled-disk-templates=%s" % non_lvm_template,
718 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % non_lvm_template,
719 912737ba Helga Velroyen
     "--vg-name="],
720 912737ba Helga Velroyen
    fail=False)
721 912737ba Helga Velroyen
722 912737ba Helga Velroyen
  _RestoreEnabledDiskTemplates()
723 912737ba Helga Velroyen
724 462f0faa Helga Velroyen
725 462f0faa Helga Velroyen
def _TestClusterModifyUsedDiskTemplate(instance_template,
726 462f0faa Helga Velroyen
                                       enabled_disk_templates):
727 462f0faa Helga Velroyen
  """Tests that disk templates that are currently in use by instances cannot
728 462f0faa Helga Velroyen
     be disabled on the cluster.
729 462f0faa Helga Velroyen

730 462f0faa Helga Velroyen
  """
731 462f0faa Helga Velroyen
  # If the list of enabled disk templates contains only one template
732 462f0faa Helga Velroyen
  # we need to add some other templates, because the list of enabled disk
733 462f0faa Helga Velroyen
  # templates can only be set to a non-empty list.
734 462f0faa Helga Velroyen
  new_disk_templates = list(set(enabled_disk_templates)
735 462f0faa Helga Velroyen
                              - set([instance_template]))
736 462f0faa Helga Velroyen
  if not new_disk_templates:
737 d101b7be Thomas Thrainer
    new_disk_templates = list(set([constants.DT_DISKLESS, constants.DT_BLOCK])
738 462f0faa Helga Velroyen
                                - set([instance_template]))
739 462f0faa Helga Velroyen
  AssertCommand(
740 462f0faa Helga Velroyen
    ["gnt-cluster", "modify",
741 eb161df2 Helga Velroyen
     "--enabled-disk-templates=%s" % ",".join(new_disk_templates),
742 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % ",".join(new_disk_templates)],
743 462f0faa Helga Velroyen
    fail=True)
744 462f0faa Helga Velroyen
745 462f0faa Helga Velroyen
746 462f0faa Helga Velroyen
def _TestClusterModifyUnusedDiskTemplate(instance_template):
747 462f0faa Helga Velroyen
  """Tests that unused disk templates can be disabled safely."""
748 462f0faa Helga Velroyen
  all_disk_templates = constants.DISK_TEMPLATES
749 d101b7be Thomas Thrainer
  if not utils.IsLvmEnabled(qa_config.GetEnabledDiskTemplates()):
750 d101b7be Thomas Thrainer
    all_disk_templates = list(set(all_disk_templates) -
751 d101b7be Thomas Thrainer
                              set(utils.GetLvmDiskTemplates()))
752 d101b7be Thomas Thrainer
753 462f0faa Helga Velroyen
  AssertCommand(
754 462f0faa Helga Velroyen
    ["gnt-cluster", "modify",
755 eb161df2 Helga Velroyen
     "--enabled-disk-templates=%s" % ",".join(all_disk_templates),
756 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % ",".join(all_disk_templates)],
757 462f0faa Helga Velroyen
    fail=False)
758 462f0faa Helga Velroyen
  new_disk_templates = [instance_template]
759 462f0faa Helga Velroyen
  AssertCommand(
760 462f0faa Helga Velroyen
    ["gnt-cluster", "modify",
761 eb161df2 Helga Velroyen
     "--enabled-disk-templates=%s" % ",".join(new_disk_templates),
762 eb161df2 Helga Velroyen
     "--ipolicy-disk-templates=%s" % ",".join(new_disk_templates)],
763 462f0faa Helga Velroyen
    fail=False)
764 dacd8ba4 Helga Velroyen
765 dacd8ba4 Helga Velroyen
766 9738ca94 Iustin Pop
def TestClusterModifyBe():
767 9738ca94 Iustin Pop
  """gnt-cluster modify -B"""
768 2f4b4f78 Iustin Pop
  for fail, cmd in [
769 8ccbbe4b Guido Trotter
    # max/min mem
770 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "maxmem=256"]),
771 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 256$'"]),
772 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "minmem=256"]),
773 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 256$'"]),
774 8ccbbe4b Guido Trotter
    (True, ["gnt-cluster", "modify", "-B", "maxmem=a"]),
775 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 256$'"]),
776 8ccbbe4b Guido Trotter
    (True, ["gnt-cluster", "modify", "-B", "minmem=a"]),
777 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 256$'"]),
778 8ccbbe4b Guido Trotter
    (False, ["gnt-cluster", "modify", "-B", "maxmem=128,minmem=128"]),
779 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *maxmem: 128$'"]),
780 8ccbbe4b Guido Trotter
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *minmem: 128$'"]),
781 9738ca94 Iustin Pop
    # vcpus
782 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "vcpus=4"]),
783 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *vcpus: 4$'"]),
784 21bf2e2e Andrea Spadaccini
    (True, ["gnt-cluster", "modify", "-B", "vcpus=a"]),
785 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "vcpus=1"]),
786 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *vcpus: 1$'"]),
787 9738ca94 Iustin Pop
    # auto_balance
788 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "auto_balance=False"]),
789 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *auto_balance: False$'"]),
790 21bf2e2e Andrea Spadaccini
    (True, ["gnt-cluster", "modify", "-B", "auto_balance=1"]),
791 2f4b4f78 Iustin Pop
    (False, ["gnt-cluster", "modify", "-B", "auto_balance=True"]),
792 2f4b4f78 Iustin Pop
    (False, ["sh", "-c", "gnt-cluster info|grep '^ *auto_balance: True$'"]),
793 9738ca94 Iustin Pop
    ]:
794 2f4b4f78 Iustin Pop
    AssertCommand(cmd, fail=fail)
795 9738ca94 Iustin Pop
796 5abecc1c Iustin Pop
  # redo the original-requested BE parameters, if any
797 5abecc1c Iustin Pop
  bep = qa_config.get("backend-parameters", "")
798 5abecc1c Iustin Pop
  if bep:
799 5abecc1c Iustin Pop
    AssertCommand(["gnt-cluster", "modify", "-B", bep])
800 9738ca94 Iustin Pop
801 21bf2e2e Andrea Spadaccini
802 b3f3aa3d Bernardo Dal Seno
def _GetClusterIPolicy():
803 b3f3aa3d Bernardo Dal Seno
  """Return the run-time values of the cluster-level instance policy.
804 b3f3aa3d Bernardo Dal Seno

805 b3f3aa3d Bernardo Dal Seno
  @rtype: tuple
806 b3f3aa3d Bernardo Dal Seno
  @return: (policy, specs), where:
807 b3f3aa3d Bernardo Dal Seno
      - policy is a dictionary of the policy values, instance specs excluded
808 7c8ae421 Bernardo Dal Seno
      - specs is a dictionary containing only the specs, using the internal
809 7c8ae421 Bernardo Dal Seno
        format (see L{constants.IPOLICY_DEFAULTS} for an example)
810 b3f3aa3d Bernardo Dal Seno

811 b3f3aa3d Bernardo Dal Seno
  """
812 0e79564a Bernardo Dal Seno
  info = qa_utils.GetObjectInfo(["gnt-cluster", "info"])
813 0e79564a Bernardo Dal Seno
  policy = info["Instance policy - limits for instances"]
814 63e08b25 Bernardo Dal Seno
  (ret_policy, ret_specs) = qa_utils.ParseIPolicy(policy)
815 0e79564a Bernardo Dal Seno
816 b3f3aa3d Bernardo Dal Seno
  # Sanity checks
817 7c8ae421 Bernardo Dal Seno
  assert "minmax" in ret_specs and "std" in ret_specs
818 7c8ae421 Bernardo Dal Seno
  assert len(ret_specs["minmax"]) > 0
819 0e79564a Bernardo Dal Seno
  assert len(ret_policy) > 0
820 0e79564a Bernardo Dal Seno
  return (ret_policy, ret_specs)
821 b3f3aa3d Bernardo Dal Seno
822 b3f3aa3d Bernardo Dal Seno
823 b3f3aa3d Bernardo Dal Seno
def TestClusterModifyIPolicy():
824 b3f3aa3d Bernardo Dal Seno
  """gnt-cluster modify --ipolicy-*"""
825 b3f3aa3d Bernardo Dal Seno
  basecmd = ["gnt-cluster", "modify"]
826 b3f3aa3d Bernardo Dal Seno
  (old_policy, old_specs) = _GetClusterIPolicy()
827 b3f3aa3d Bernardo Dal Seno
  for par in ["vcpu-ratio", "spindle-ratio"]:
828 b3f3aa3d Bernardo Dal Seno
    curr_val = float(old_policy[par])
829 b3f3aa3d Bernardo Dal Seno
    test_values = [
830 b3f3aa3d Bernardo Dal Seno
      (True, 1.0),
831 b3f3aa3d Bernardo Dal Seno
      (True, 1.5),
832 b3f3aa3d Bernardo Dal Seno
      (True, 2),
833 b3f3aa3d Bernardo Dal Seno
      (False, "a"),
834 b3f3aa3d Bernardo Dal Seno
      # Restore the old value
835 b3f3aa3d Bernardo Dal Seno
      (True, curr_val),
836 b3f3aa3d Bernardo Dal Seno
      ]
837 b3f3aa3d Bernardo Dal Seno
    for (good, val) in test_values:
838 b3f3aa3d Bernardo Dal Seno
      cmd = basecmd + ["--ipolicy-%s=%s" % (par, val)]
839 b3f3aa3d Bernardo Dal Seno
      AssertCommand(cmd, fail=not good)
840 b3f3aa3d Bernardo Dal Seno
      if good:
841 b3f3aa3d Bernardo Dal Seno
        curr_val = val
842 b3f3aa3d Bernardo Dal Seno
      # Check the affected parameter
843 b3f3aa3d Bernardo Dal Seno
      (eff_policy, eff_specs) = _GetClusterIPolicy()
844 b3f3aa3d Bernardo Dal Seno
      AssertEqual(float(eff_policy[par]), curr_val)
845 b3f3aa3d Bernardo Dal Seno
      # Check everything else
846 b3f3aa3d Bernardo Dal Seno
      AssertEqual(eff_specs, old_specs)
847 b3f3aa3d Bernardo Dal Seno
      for p in eff_policy.keys():
848 b3f3aa3d Bernardo Dal Seno
        if p == par:
849 b3f3aa3d Bernardo Dal Seno
          continue
850 b3f3aa3d Bernardo Dal Seno
        AssertEqual(eff_policy[p], old_policy[p])
851 b3f3aa3d Bernardo Dal Seno
852 ae3ab08b Helga Velroyen
  # Allowing disk templates via ipolicy requires them to be
853 ae3ab08b Helga Velroyen
  # enabled on the cluster.
854 ae3ab08b Helga Velroyen
  if not (qa_config.IsTemplateSupported(constants.DT_PLAIN)
855 ae3ab08b Helga Velroyen
          and qa_config.IsTemplateSupported(constants.DT_DRBD8)):
856 ae3ab08b Helga Velroyen
    return
857 b3f3aa3d Bernardo Dal Seno
  # Disk templates are treated slightly differently
858 b3f3aa3d Bernardo Dal Seno
  par = "disk-templates"
859 9db0b351 Bernardo Dal Seno
  disp_str = "allowed disk templates"
860 b3f3aa3d Bernardo Dal Seno
  curr_val = old_policy[disp_str]
861 b3f3aa3d Bernardo Dal Seno
  test_values = [
862 b3f3aa3d Bernardo Dal Seno
    (True, constants.DT_PLAIN),
863 b3f3aa3d Bernardo Dal Seno
    (True, "%s,%s" % (constants.DT_PLAIN, constants.DT_DRBD8)),
864 b3f3aa3d Bernardo Dal Seno
    (False, "thisisnotadisktemplate"),
865 b3f3aa3d Bernardo Dal Seno
    (False, ""),
866 b3f3aa3d Bernardo Dal Seno
    # Restore the old value
867 b3f3aa3d Bernardo Dal Seno
    (True, curr_val.replace(" ", "")),
868 b3f3aa3d Bernardo Dal Seno
    ]
869 b3f3aa3d Bernardo Dal Seno
  for (good, val) in test_values:
870 b3f3aa3d Bernardo Dal Seno
    cmd = basecmd + ["--ipolicy-%s=%s" % (par, val)]
871 b3f3aa3d Bernardo Dal Seno
    AssertCommand(cmd, fail=not good)
872 b3f3aa3d Bernardo Dal Seno
    if good:
873 b3f3aa3d Bernardo Dal Seno
      curr_val = val
874 b3f3aa3d Bernardo Dal Seno
    # Check the affected parameter
875 b3f3aa3d Bernardo Dal Seno
    (eff_policy, eff_specs) = _GetClusterIPolicy()
876 b3f3aa3d Bernardo Dal Seno
    AssertEqual(eff_policy[disp_str].replace(" ", ""), curr_val)
877 b3f3aa3d Bernardo Dal Seno
    # Check everything else
878 b3f3aa3d Bernardo Dal Seno
    AssertEqual(eff_specs, old_specs)
879 b3f3aa3d Bernardo Dal Seno
    for p in eff_policy.keys():
880 b3f3aa3d Bernardo Dal Seno
      if p == disp_str:
881 b3f3aa3d Bernardo Dal Seno
        continue
882 b3f3aa3d Bernardo Dal Seno
      AssertEqual(eff_policy[p], old_policy[p])
883 b3f3aa3d Bernardo Dal Seno
884 b3f3aa3d Bernardo Dal Seno
885 ec996117 Bernardo Dal Seno
def TestClusterSetISpecs(new_specs=None, diff_specs=None, fail=False,
886 ec996117 Bernardo Dal Seno
                         old_values=None):
887 b3f3aa3d Bernardo Dal Seno
  """Change instance specs.
888 b3f3aa3d Bernardo Dal Seno

889 ec996117 Bernardo Dal Seno
  At most one of new_specs or diff_specs can be specified.
890 ec996117 Bernardo Dal Seno

891 ec996117 Bernardo Dal Seno
  @type new_specs: dict
892 ec996117 Bernardo Dal Seno
  @param new_specs: new complete specs, in the same format returned by
893 ec996117 Bernardo Dal Seno
      L{_GetClusterIPolicy}
894 ec996117 Bernardo Dal Seno
  @type diff_specs: dict
895 7c8ae421 Bernardo Dal Seno
  @param diff_specs: partial specs, it can be an incomplete specifications, but
896 7c8ae421 Bernardo Dal Seno
      if min/max specs are specified, their number must match the number of the
897 7c8ae421 Bernardo Dal Seno
      existing specs
898 b3f3aa3d Bernardo Dal Seno
  @type fail: bool
899 b3f3aa3d Bernardo Dal Seno
  @param fail: if the change is expected to fail
900 b3f3aa3d Bernardo Dal Seno
  @type old_values: tuple
901 b3f3aa3d Bernardo Dal Seno
  @param old_values: (old_policy, old_specs), as returned by
902 ec996117 Bernardo Dal Seno
      L{_GetClusterIPolicy}
903 b3f3aa3d Bernardo Dal Seno
  @return: same as L{_GetClusterIPolicy}
904 b3f3aa3d Bernardo Dal Seno

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

1124 2df92990 Michael Hanselmann
  """
1125 2df92990 Michael Hanselmann
  return qa_utils.MakeNodePath(node, pathutils.JOB_QUEUE_DRAIN_FILE)
1126 2df92990 Michael Hanselmann
1127 2df92990 Michael Hanselmann
1128 2df92990 Michael Hanselmann
def _AssertDrainFile(node, **kwargs):
1129 2df92990 Michael Hanselmann
  """Checks for the queue drain file.
1130 2df92990 Michael Hanselmann

1131 2df92990 Michael Hanselmann
  """
1132 2df92990 Michael Hanselmann
  AssertCommand(["test", "-f", _NodeQueueDrainFile(node)], node=node, **kwargs)
1133 2df92990 Michael Hanselmann
1134 2df92990 Michael Hanselmann
1135 ff699aa9 Michael Hanselmann
def TestClusterMasterFailoverWithDrainedQueue():
1136 ff699aa9 Michael Hanselmann
  """gnt-cluster master-failover with drained queue"""
1137 ff699aa9 Michael Hanselmann
  master = qa_config.GetMasterNode()
1138 ff699aa9 Michael Hanselmann
  failovermaster = qa_config.AcquireNode(exclude=master)
1139 ff699aa9 Michael Hanselmann
1140 ff699aa9 Michael Hanselmann
  # Ensure queue is not drained
1141 ff699aa9 Michael Hanselmann
  for node in [master, failovermaster]:
1142 2df92990 Michael Hanselmann
    _AssertDrainFile(node, fail=True)
1143 ff699aa9 Michael Hanselmann
1144 ff699aa9 Michael Hanselmann
  # Drain queue on failover master
1145 2df92990 Michael Hanselmann
  AssertCommand(["touch", _NodeQueueDrainFile(failovermaster)],
1146 2df92990 Michael Hanselmann
                node=failovermaster)
1147 ff699aa9 Michael Hanselmann
1148 ff699aa9 Michael Hanselmann
  cmd = ["gnt-cluster", "master-failover"]
1149 ff699aa9 Michael Hanselmann
  try:
1150 2df92990 Michael Hanselmann
    _AssertDrainFile(failovermaster)
1151 ff699aa9 Michael Hanselmann
    AssertCommand(cmd, node=failovermaster)
1152 2df92990 Michael Hanselmann
    _AssertDrainFile(master, fail=True)
1153 2df92990 Michael Hanselmann
    _AssertDrainFile(failovermaster, fail=True)
1154 ff699aa9 Michael Hanselmann
1155 ff699aa9 Michael Hanselmann
    # Back to original master node
1156 ff699aa9 Michael Hanselmann
    AssertCommand(cmd, node=master)
1157 ff699aa9 Michael Hanselmann
  finally:
1158 565cb4bf Michael Hanselmann
    failovermaster.Release()
1159 ff699aa9 Michael Hanselmann
1160 2df92990 Michael Hanselmann
  # Ensure queue is not drained
1161 2df92990 Michael Hanselmann
  for node in [master, failovermaster]:
1162 2df92990 Michael Hanselmann
    _AssertDrainFile(node, fail=True)
1163 ff699aa9 Michael Hanselmann
1164 ff699aa9 Michael Hanselmann
1165 cec9845c Michael Hanselmann
def TestClusterCopyfile():
1166 cec9845c Michael Hanselmann
  """gnt-cluster copyfile"""
1167 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
1168 cec9845c Michael Hanselmann
1169 24818e8f Michael Hanselmann
  uniqueid = utils.NewUUID()
1170 830da270 Michael Hanselmann
1171 cec9845c Michael Hanselmann
  # Create temporary file
1172 cec9845c Michael Hanselmann
  f = tempfile.NamedTemporaryFile()
1173 830da270 Michael Hanselmann
  f.write(uniqueid)
1174 cec9845c Michael Hanselmann
  f.flush()
1175 cec9845c Michael Hanselmann
  f.seek(0)
1176 cec9845c Michael Hanselmann
1177 cec9845c Michael Hanselmann
  # Upload file to master node
1178 aecba21e Michael Hanselmann
  testname = qa_utils.UploadFile(master.primary, f.name)
1179 cec9845c Michael Hanselmann
  try:
1180 cec9845c Michael Hanselmann
    # Copy file to all nodes
1181 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-cluster", "copyfile", testname])
1182 830da270 Michael Hanselmann
    _CheckFileOnAllNodes(testname, uniqueid)
1183 cec9845c Michael Hanselmann
  finally:
1184 830da270 Michael Hanselmann
    _RemoveFileFromAllNodes(testname)
1185 830da270 Michael Hanselmann
1186 830da270 Michael Hanselmann
1187 830da270 Michael Hanselmann
def TestClusterCommand():
1188 830da270 Michael Hanselmann
  """gnt-cluster command"""
1189 24818e8f Michael Hanselmann
  uniqueid = utils.NewUUID()
1190 24818e8f Michael Hanselmann
  rfile = "/tmp/gnt%s" % utils.NewUUID()
1191 d0c8c01d Iustin Pop
  rcmd = utils.ShellQuoteArgs(["echo", "-n", uniqueid])
1192 d0c8c01d Iustin Pop
  cmd = utils.ShellQuoteArgs(["gnt-cluster", "command",
1193 830da270 Michael Hanselmann
                              "%s >%s" % (rcmd, rfile)])
1194 830da270 Michael Hanselmann
1195 830da270 Michael Hanselmann
  try:
1196 2f4b4f78 Iustin Pop
    AssertCommand(cmd)
1197 830da270 Michael Hanselmann
    _CheckFileOnAllNodes(rfile, uniqueid)
1198 830da270 Michael Hanselmann
  finally:
1199 830da270 Michael Hanselmann
    _RemoveFileFromAllNodes(rfile)
1200 cec9845c Michael Hanselmann
1201 cec9845c Michael Hanselmann
1202 cec9845c Michael Hanselmann
def TestClusterDestroy():
1203 cec9845c Michael Hanselmann
  """gnt-cluster destroy"""
1204 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "destroy", "--yes-do-it"])
1205 65a884ef Iustin Pop
1206 65a884ef Iustin Pop
1207 65a884ef Iustin Pop
def TestClusterRepairDiskSizes():
1208 65a884ef Iustin Pop
  """gnt-cluster repair-disk-sizes"""
1209 65a884ef Iustin Pop
  AssertCommand(["gnt-cluster", "repair-disk-sizes"])
1210 50ef6a41 Bernardo Dal Seno
1211 50ef6a41 Bernardo Dal Seno
1212 50ef6a41 Bernardo Dal Seno
def TestSetExclStorCluster(newvalue):
1213 50ef6a41 Bernardo Dal Seno
  """Set the exclusive_storage node parameter at the cluster level.
1214 50ef6a41 Bernardo Dal Seno

1215 50ef6a41 Bernardo Dal Seno
  @type newvalue: bool
1216 50ef6a41 Bernardo Dal Seno
  @param newvalue: New value of exclusive_storage
1217 50ef6a41 Bernardo Dal Seno
  @rtype: bool
1218 50ef6a41 Bernardo Dal Seno
  @return: The old value of exclusive_storage
1219 50ef6a41 Bernardo Dal Seno

1220 50ef6a41 Bernardo Dal Seno
  """
1221 0e79564a Bernardo Dal Seno
  es_path = ["Default node parameters", "exclusive_storage"]
1222 0e79564a Bernardo Dal Seno
  oldvalue = _GetClusterField(es_path)
1223 50ef6a41 Bernardo Dal Seno
  AssertCommand(["gnt-cluster", "modify", "--node-parameters",
1224 50ef6a41 Bernardo Dal Seno
                 "exclusive_storage=%s" % newvalue])
1225 0e79564a Bernardo Dal Seno
  effvalue = _GetClusterField(es_path)
1226 50ef6a41 Bernardo Dal Seno
  if effvalue != newvalue:
1227 50ef6a41 Bernardo Dal Seno
    raise qa_error.Error("exclusive_storage has the wrong value: %s instead"
1228 50ef6a41 Bernardo Dal Seno
                         " of %s" % (effvalue, newvalue))
1229 6a0f22e1 Bernardo Dal Seno
  qa_config.SetExclusiveStorage(newvalue)
1230 50ef6a41 Bernardo Dal Seno
  return oldvalue
1231 e8b919a1 Bernardo Dal Seno
1232 e8b919a1 Bernardo Dal Seno
1233 21e2734f Bernardo Dal Seno
def TestExclStorSharedPv(node):
1234 21e2734f Bernardo Dal Seno
  """cluster-verify reports LVs that share the same PV with exclusive_storage.
1235 21e2734f Bernardo Dal Seno

1236 21e2734f Bernardo Dal Seno
  """
1237 21e2734f Bernardo Dal Seno
  vgname = qa_config.get("vg-name", constants.DEFAULT_VG)
1238 21e2734f Bernardo Dal Seno
  lvname1 = _QA_LV_PREFIX + "vol1"
1239 21e2734f Bernardo Dal Seno
  lvname2 = _QA_LV_PREFIX + "vol2"
1240 aecba21e Michael Hanselmann
  node_name = node.primary
1241 21e2734f Bernardo Dal Seno
  AssertCommand(["lvcreate", "-L1G", "-n", lvname1, vgname], node=node_name)
1242 21e2734f Bernardo Dal Seno
  AssertClusterVerify(fail=True, errors=[constants.CV_ENODEORPHANLV])
1243 21e2734f Bernardo Dal Seno
  AssertCommand(["lvcreate", "-L1G", "-n", lvname2, vgname], node=node_name)
1244 21e2734f Bernardo Dal Seno
  AssertClusterVerify(fail=True, errors=[constants.CV_ENODELVM,
1245 21e2734f Bernardo Dal Seno
                                         constants.CV_ENODEORPHANLV])
1246 21e2734f Bernardo Dal Seno
  AssertCommand(["lvremove", "-f", "/".join([vgname, lvname1])], node=node_name)
1247 21e2734f Bernardo Dal Seno
  AssertCommand(["lvremove", "-f", "/".join([vgname, lvname2])], node=node_name)
1248 21e2734f Bernardo Dal Seno
  AssertClusterVerify()