Statistics
| Branch: | Tag: | Revision:

root / qa / qa_cluster.py @ 876cbf2a

History | View | Annotate | Download (42.3 kB)

1 c68d1f43 Michael Hanselmann
#
2 c68d1f43 Michael Hanselmann
#
3 c68d1f43 Michael Hanselmann
4 587f8ff6 Bernardo Dal Seno
# Copyright (C) 2007, 2010, 2011, 2012, 2013 Google Inc.
5 cec9845c Michael Hanselmann
#
6 cec9845c Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 cec9845c Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 cec9845c Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 cec9845c Michael Hanselmann
# (at your option) any later version.
10 cec9845c Michael Hanselmann
#
11 cec9845c Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 cec9845c Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 cec9845c Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 cec9845c Michael Hanselmann
# General Public License for more details.
15 cec9845c Michael Hanselmann
#
16 cec9845c Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 cec9845c Michael Hanselmann
# along with this program; if not, write to the Free Software
18 cec9845c Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 cec9845c Michael Hanselmann
# 02110-1301, USA.
20 cec9845c Michael Hanselmann
21 cec9845c Michael Hanselmann
22 cec9845c Michael Hanselmann
"""Cluster related QA tests.
23 cec9845c Michael Hanselmann

24 cec9845c Michael Hanselmann
"""
25 cec9845c Michael Hanselmann
26 587f8ff6 Bernardo Dal Seno
import re
27 cec9845c Michael Hanselmann
import tempfile
28 49ceab21 Michael Hanselmann
import os.path
29 cec9845c Michael Hanselmann
30 b8669a69 Jose A. Lopes
from ganeti import _constants
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_error
39 462f0faa Helga Velroyen
import qa_instance
40 6d96ede4 Hrvoje Ribicic
import qa_logging
41 6d96ede4 Hrvoje Ribicic
import qa_utils
42 cec9845c Michael Hanselmann
43 66d1f035 René Nussbaumer
from qa_utils import AssertEqual, AssertCommand, GetCommandOutput
44 cec9845c Michael Hanselmann
45 cec9845c Michael Hanselmann
46 23610ff8 Bernardo Dal Seno
# Prefix for LVM volumes created by QA code during tests
47 23610ff8 Bernardo Dal Seno
_QA_LV_PREFIX = "qa-"
48 23610ff8 Bernardo Dal Seno
49 c2a0947d Iustin Pop
#: cluster verify command
50 c2a0947d Iustin Pop
_CLUSTER_VERIFY = ["gnt-cluster", "verify"]
51 c2a0947d Iustin Pop
52 21bf2e2e Andrea Spadaccini
53 830da270 Michael Hanselmann
def _RemoveFileFromAllNodes(filename):
54 830da270 Michael Hanselmann
  """Removes a file from all nodes.
55 830da270 Michael Hanselmann

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

822 b3f3aa3d Bernardo Dal Seno
  @rtype: tuple
823 b3f3aa3d Bernardo Dal Seno
  @return: (policy, specs), where:
824 b3f3aa3d Bernardo Dal Seno
      - policy is a dictionary of the policy values, instance specs excluded
825 7c8ae421 Bernardo Dal Seno
      - specs is a dictionary containing only the specs, using the internal
826 7c8ae421 Bernardo Dal Seno
        format (see L{constants.IPOLICY_DEFAULTS} for an example)
827 b3f3aa3d Bernardo Dal Seno

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

906 ec996117 Bernardo Dal Seno
  At most one of new_specs or diff_specs can be specified.
907 ec996117 Bernardo Dal Seno

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

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

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

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

1237 50ef6a41 Bernardo Dal Seno
  @type newvalue: bool
1238 50ef6a41 Bernardo Dal Seno
  @param newvalue: New value of exclusive_storage
1239 50ef6a41 Bernardo Dal Seno
  @rtype: bool
1240 50ef6a41 Bernardo Dal Seno
  @return: The old value of exclusive_storage
1241 50ef6a41 Bernardo Dal Seno

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

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