Statistics
| Branch: | Tag: | Revision:

root / qa / qa_node.py @ b780c231

History | View | Annotate | Download (16.1 kB)

1 c68d1f43 Michael Hanselmann
#
2 c68d1f43 Michael Hanselmann
#
3 c68d1f43 Michael Hanselmann
4 3c87d614 Iustin Pop
# Copyright (C) 2007, 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 3582eef6 Iustin Pop
"""Node-related QA tests.
23 3582eef6 Iustin Pop

24 3582eef6 Iustin Pop
"""
25 3582eef6 Iustin Pop
26 cec9845c Michael Hanselmann
from ganeti import utils
27 8e1db003 Michael Hanselmann
from ganeti import constants
28 288d6440 Michael Hanselmann
from ganeti import query
29 a1de4b18 René Nussbaumer
from ganeti import serializer
30 cec9845c Michael Hanselmann
31 cec9845c Michael Hanselmann
import qa_config
32 cec9845c Michael Hanselmann
import qa_error
33 4b62db14 Michael Hanselmann
import qa_utils
34 cec9845c Michael Hanselmann
35 fb87cbeb Michael Hanselmann
from qa_utils import AssertCommand, AssertEqual
36 cec9845c Michael Hanselmann
37 cec9845c Michael Hanselmann
38 e7c6e02b Michael Hanselmann
def _NodeAdd(node, readd=False):
39 dbdb0594 Michael Hanselmann
  if not readd and node.added:
40 aecba21e Michael Hanselmann
    raise qa_error.Error("Node %s already in cluster" % node.primary)
41 dbdb0594 Michael Hanselmann
  elif readd and not node.added:
42 aecba21e Michael Hanselmann
    raise qa_error.Error("Node %s not yet in cluster" % node.primary)
43 d0c8c01d Iustin Pop
44 d0c8c01d Iustin Pop
  cmd = ["gnt-node", "add", "--no-ssh-key-check"]
45 aecba21e Michael Hanselmann
  if node.secondary:
46 aecba21e Michael Hanselmann
    cmd.append("--secondary-ip=%s" % node.secondary)
47 e7c6e02b Michael Hanselmann
  if readd:
48 d0c8c01d Iustin Pop
    cmd.append("--readd")
49 aecba21e Michael Hanselmann
  cmd.append(node.primary)
50 2f4b4f78 Iustin Pop
51 2f4b4f78 Iustin Pop
  AssertCommand(cmd)
52 cec9845c Michael Hanselmann
53 dbdb0594 Michael Hanselmann
  if readd:
54 dbdb0594 Michael Hanselmann
    assert node.added
55 dbdb0594 Michael Hanselmann
  else:
56 dbdb0594 Michael Hanselmann
    node.MarkAdded()
57 cec9845c Michael Hanselmann
58 cec9845c Michael Hanselmann
59 cec9845c Michael Hanselmann
def _NodeRemove(node):
60 aecba21e Michael Hanselmann
  AssertCommand(["gnt-node", "remove", node.primary])
61 dbdb0594 Michael Hanselmann
  node.MarkRemoved()
62 cec9845c Michael Hanselmann
63 cec9845c Michael Hanselmann
64 c7e54e1d Agata Murawska
def MakeNodeOffline(node, value):
65 c7e54e1d Agata Murawska
  """gnt-node modify --offline=value"""
66 c7e54e1d Agata Murawska
  # value in ["yes", "no"]
67 aecba21e Michael Hanselmann
  AssertCommand(["gnt-node", "modify", "--offline", value, node.primary])
68 c7e54e1d Agata Murawska
69 c7e54e1d Agata Murawska
70 cec9845c Michael Hanselmann
def TestNodeAddAll():
71 cec9845c Michael Hanselmann
  """Adding all nodes to cluster."""
72 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
73 d0c8c01d Iustin Pop
  for node in qa_config.get("nodes"):
74 cec9845c Michael Hanselmann
    if node != master:
75 e7c6e02b Michael Hanselmann
      _NodeAdd(node, readd=False)
76 cec9845c Michael Hanselmann
77 cec9845c Michael Hanselmann
78 8e671b7c Iustin Pop
def MarkNodeAddedAll():
79 8e671b7c Iustin Pop
  """Mark all nodes as added.
80 8e671b7c Iustin Pop

81 8e671b7c Iustin Pop
  This is useful if we don't create the cluster ourselves (in qa).
82 8e671b7c Iustin Pop

83 8e671b7c Iustin Pop
  """
84 8e671b7c Iustin Pop
  master = qa_config.GetMasterNode()
85 d0c8c01d Iustin Pop
  for node in qa_config.get("nodes"):
86 8e671b7c Iustin Pop
    if node != master:
87 dbdb0594 Michael Hanselmann
      node.MarkAdded()
88 8e671b7c Iustin Pop
89 8e671b7c Iustin Pop
90 cec9845c Michael Hanselmann
def TestNodeRemoveAll():
91 cec9845c Michael Hanselmann
  """Removing all nodes from cluster."""
92 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
93 d0c8c01d Iustin Pop
  for node in qa_config.get("nodes"):
94 cec9845c Michael Hanselmann
    if node != master:
95 cec9845c Michael Hanselmann
      _NodeRemove(node)
96 cec9845c Michael Hanselmann
97 cec9845c Michael Hanselmann
98 e7c6e02b Michael Hanselmann
def TestNodeReadd(node):
99 e7c6e02b Michael Hanselmann
  """gnt-node add --readd"""
100 e7c6e02b Michael Hanselmann
  _NodeAdd(node, readd=True)
101 e7c6e02b Michael Hanselmann
102 e7c6e02b Michael Hanselmann
103 cec9845c Michael Hanselmann
def TestNodeInfo():
104 cec9845c Michael Hanselmann
  """gnt-node info"""
105 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-node", "info"])
106 cec9845c Michael Hanselmann
107 cec9845c Michael Hanselmann
108 cec9845c Michael Hanselmann
def TestNodeVolumes():
109 cec9845c Michael Hanselmann
  """gnt-node volumes"""
110 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-node", "volumes"])
111 4b62db14 Michael Hanselmann
112 4b62db14 Michael Hanselmann
113 8e1db003 Michael Hanselmann
def TestNodeStorage():
114 8e1db003 Michael Hanselmann
  """gnt-node storage"""
115 8e1db003 Michael Hanselmann
  master = qa_config.GetMasterNode()
116 b780c231 Helga Velroyen
  enabled_disk_templates = qa_config.GetEnabledDiskTemplates()
117 8e1db003 Michael Hanselmann
118 33c730a2 Helga Velroyen
  # FIXME: test all storage_types in constants.VALID_STORAGE_TYPES
119 33c730a2 Helga Velroyen
  # as soon as they are implemented.
120 33c730a2 Helga Velroyen
  for storage_type in [constants.ST_FILE, constants.ST_LVM_VG,
121 33c730a2 Helga Velroyen
                       constants.ST_LVM_PV]:
122 3c87d614 Iustin Pop
123 3c87d614 Iustin Pop
    cmd = ["gnt-node", "list-storage", "--storage-type", storage_type]
124 3c87d614 Iustin Pop
125 3c87d614 Iustin Pop
    # Skip file storage if not enabled, otherwise QA will fail; we
126 3c87d614 Iustin Pop
    # just test for basic failure, but otherwise skip the rest of the
127 3c87d614 Iustin Pop
    # tests
128 b780c231 Helga Velroyen
    if storage_type == constants.ST_FILE and not \
129 b780c231 Helga Velroyen
        ((constants.DT_FILE in enabled_disk_templates) or
130 b780c231 Helga Velroyen
         (constants.DT_SHARED_FILE in enabled_disk_templates)):
131 3c87d614 Iustin Pop
      AssertCommand(cmd, fail=True)
132 3c87d614 Iustin Pop
      continue
133 3c87d614 Iustin Pop
134 8e1db003 Michael Hanselmann
    # Test simple list
135 3c87d614 Iustin Pop
    AssertCommand(cmd)
136 8e1db003 Michael Hanselmann
137 8e1db003 Michael Hanselmann
    # Test all storage fields
138 8e1db003 Michael Hanselmann
    cmd = ["gnt-node", "list-storage", "--storage-type", storage_type,
139 8e1db003 Michael Hanselmann
           "--output=%s" % ",".join(list(constants.VALID_STORAGE_FIELDS) +
140 8e1db003 Michael Hanselmann
                                    [constants.SF_NODE, constants.SF_TYPE])]
141 2f4b4f78 Iustin Pop
    AssertCommand(cmd)
142 8e1db003 Michael Hanselmann
143 8e1db003 Michael Hanselmann
    # Get list of valid storage devices
144 8e1db003 Michael Hanselmann
    cmd = ["gnt-node", "list-storage", "--storage-type", storage_type,
145 8e1db003 Michael Hanselmann
           "--output=node,name,allocatable", "--separator=|",
146 8e1db003 Michael Hanselmann
           "--no-headers"]
147 aecba21e Michael Hanselmann
    output = qa_utils.GetCommandOutput(master.primary,
148 8e1db003 Michael Hanselmann
                                       utils.ShellQuoteArgs(cmd))
149 8e1db003 Michael Hanselmann
150 8e1db003 Michael Hanselmann
    # Test with up to two devices
151 8e1db003 Michael Hanselmann
    testdevcount = 2
152 8e1db003 Michael Hanselmann
153 8e1db003 Michael Hanselmann
    for line in output.splitlines()[:testdevcount]:
154 8e1db003 Michael Hanselmann
      (node_name, st_name, st_allocatable) = line.split("|")
155 8e1db003 Michael Hanselmann
156 8e1db003 Michael Hanselmann
      # Dummy modification without any changes
157 8e1db003 Michael Hanselmann
      cmd = ["gnt-node", "modify-storage", node_name, storage_type, st_name]
158 2f4b4f78 Iustin Pop
      AssertCommand(cmd)
159 8e1db003 Michael Hanselmann
160 8e1db003 Michael Hanselmann
      # Make sure we end up with the same value as before
161 8e1db003 Michael Hanselmann
      if st_allocatable.lower() == "y":
162 8e1db003 Michael Hanselmann
        test_allocatable = ["no", "yes"]
163 8e1db003 Michael Hanselmann
      else:
164 8e1db003 Michael Hanselmann
        test_allocatable = ["yes", "no"]
165 8e1db003 Michael Hanselmann
166 2f4b4f78 Iustin Pop
      fail = (constants.SF_ALLOCATABLE not in
167 2f4b4f78 Iustin Pop
              constants.MODIFIABLE_STORAGE_FIELDS.get(storage_type, []))
168 8e1db003 Michael Hanselmann
169 8e1db003 Michael Hanselmann
      for i in test_allocatable:
170 2f4b4f78 Iustin Pop
        AssertCommand(["gnt-node", "modify-storage", "--allocatable", i,
171 2f4b4f78 Iustin Pop
                       node_name, storage_type, st_name], fail=fail)
172 8e1db003 Michael Hanselmann
173 5ae7cd11 Michael Hanselmann
        # Verify list output
174 5ae7cd11 Michael Hanselmann
        cmd = ["gnt-node", "list-storage", "--storage-type", storage_type,
175 5ae7cd11 Michael Hanselmann
               "--output=name,allocatable", "--separator=|",
176 5ae7cd11 Michael Hanselmann
               "--no-headers", node_name]
177 aecba21e Michael Hanselmann
        listout = qa_utils.GetCommandOutput(master.primary,
178 5ae7cd11 Michael Hanselmann
                                            utils.ShellQuoteArgs(cmd))
179 5ae7cd11 Michael Hanselmann
        for line in listout.splitlines():
180 5ae7cd11 Michael Hanselmann
          (vfy_name, vfy_allocatable) = line.split("|")
181 5ae7cd11 Michael Hanselmann
          if vfy_name == st_name and not fail:
182 5ae7cd11 Michael Hanselmann
            AssertEqual(vfy_allocatable, i[0].upper())
183 5ae7cd11 Michael Hanselmann
          else:
184 5ae7cd11 Michael Hanselmann
            AssertEqual(vfy_allocatable, st_allocatable)
185 5ae7cd11 Michael Hanselmann
186 8e1db003 Michael Hanselmann
      # Test repair functionality
187 2f4b4f78 Iustin Pop
      fail = (constants.SO_FIX_CONSISTENCY not in
188 2f4b4f78 Iustin Pop
              constants.VALID_STORAGE_OPERATIONS.get(storage_type, []))
189 2f4b4f78 Iustin Pop
      AssertCommand(["gnt-node", "repair-storage", node_name,
190 2f4b4f78 Iustin Pop
                     storage_type, st_name], fail=fail)
191 8e1db003 Michael Hanselmann
192 8e1db003 Michael Hanselmann
193 4b62db14 Michael Hanselmann
def TestNodeFailover(node, node2):
194 4b62db14 Michael Hanselmann
  """gnt-node failover"""
195 d7e49c13 Michael Hanselmann
  if qa_utils.GetNodeInstances(node2, secondaries=False):
196 f4bc1f2c Michael Hanselmann
    raise qa_error.UnusableNodeError("Secondary node has at least one"
197 f4bc1f2c Michael Hanselmann
                                     " primary instance. This test requires"
198 f4bc1f2c Michael Hanselmann
                                     " it to have no primary instances.")
199 4b62db14 Michael Hanselmann
200 4b62db14 Michael Hanselmann
  # Fail over to secondary node
201 aecba21e Michael Hanselmann
  AssertCommand(["gnt-node", "failover", "-f", node.primary])
202 4b62db14 Michael Hanselmann
203 4b62db14 Michael Hanselmann
  # ... and back again.
204 aecba21e Michael Hanselmann
  AssertCommand(["gnt-node", "failover", "-f", node2.primary])
205 4b62db14 Michael Hanselmann
206 4b62db14 Michael Hanselmann
207 52e9bef0 Thomas Thrainer
def TestNodeMigrate(node, node2):
208 52e9bef0 Thomas Thrainer
  """gnt-node migrate"""
209 52e9bef0 Thomas Thrainer
  if qa_utils.GetNodeInstances(node2, secondaries=False):
210 52e9bef0 Thomas Thrainer
    raise qa_error.UnusableNodeError("Secondary node has at least one"
211 52e9bef0 Thomas Thrainer
                                     " primary instance. This test requires"
212 52e9bef0 Thomas Thrainer
                                     " it to have no primary instances.")
213 52e9bef0 Thomas Thrainer
214 52e9bef0 Thomas Thrainer
  # Migrate to secondary node
215 52e9bef0 Thomas Thrainer
  AssertCommand(["gnt-node", "migrate", "-f", node.primary])
216 52e9bef0 Thomas Thrainer
217 52e9bef0 Thomas Thrainer
  # ... and back again.
218 52e9bef0 Thomas Thrainer
  AssertCommand(["gnt-node", "migrate", "-f", node2.primary])
219 52e9bef0 Thomas Thrainer
220 52e9bef0 Thomas Thrainer
221 4b62db14 Michael Hanselmann
def TestNodeEvacuate(node, node2):
222 4b62db14 Michael Hanselmann
  """gnt-node evacuate"""
223 4b62db14 Michael Hanselmann
  node3 = qa_config.AcquireNode(exclude=[node, node2])
224 4b62db14 Michael Hanselmann
  try:
225 d7e49c13 Michael Hanselmann
    if qa_utils.GetNodeInstances(node3, secondaries=True):
226 f4bc1f2c Michael Hanselmann
      raise qa_error.UnusableNodeError("Evacuation node has at least one"
227 f4bc1f2c Michael Hanselmann
                                       " secondary instance. This test requires"
228 f4bc1f2c Michael Hanselmann
                                       " it to have no secondary instances.")
229 4b62db14 Michael Hanselmann
230 4b62db14 Michael Hanselmann
    # Evacuate all secondary instances
231 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-node", "evacuate", "-f",
232 aecba21e Michael Hanselmann
                   "--new-secondary=%s" % node3.primary, node2.primary])
233 4b62db14 Michael Hanselmann
234 4b62db14 Michael Hanselmann
    # ... and back again.
235 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-node", "evacuate", "-f",
236 aecba21e Michael Hanselmann
                   "--new-secondary=%s" % node2.primary, node3.primary])
237 4b62db14 Michael Hanselmann
  finally:
238 565cb4bf Michael Hanselmann
    node3.Release()
239 d0cb68cb Michael Hanselmann
240 d0cb68cb Michael Hanselmann
241 d0cb68cb Michael Hanselmann
def TestNodeModify(node):
242 d0cb68cb Michael Hanselmann
  """gnt-node modify"""
243 c632d3a5 Thomas Thrainer
244 c632d3a5 Thomas Thrainer
  # make sure enough master candidates will be available by disabling the
245 c632d3a5 Thomas Thrainer
  # master candidate role first with --auto-promote
246 c632d3a5 Thomas Thrainer
  AssertCommand(["gnt-node", "modify", "--master-candidate=no",
247 c632d3a5 Thomas Thrainer
                "--auto-promote", node.primary])
248 c632d3a5 Thomas Thrainer
249 c632d3a5 Thomas Thrainer
  # now it's save to force-remove the master candidate role
250 d0cb68cb Michael Hanselmann
  for flag in ["master-candidate", "drained", "offline"]:
251 d0cb68cb Michael Hanselmann
    for value in ["yes", "no"]:
252 2f4b4f78 Iustin Pop
      AssertCommand(["gnt-node", "modify", "--force",
253 aecba21e Michael Hanselmann
                     "--%s=%s" % (flag, value), node.primary])
254 2f4b4f78 Iustin Pop
255 c632d3a5 Thomas Thrainer
  AssertCommand(["gnt-node", "modify", "--master-candidate=yes", node.primary])
256 288d6440 Michael Hanselmann
257 620fb907 Michael Hanselmann
  # Test setting secondary IP address
258 aecba21e Michael Hanselmann
  AssertCommand(["gnt-node", "modify", "--secondary-ip=%s" % node.secondary,
259 aecba21e Michael Hanselmann
                 node.primary])
260 620fb907 Michael Hanselmann
261 288d6440 Michael Hanselmann
262 a1de4b18 René Nussbaumer
def _CreateOobScriptStructure():
263 a1de4b18 René Nussbaumer
  """Create a simple OOB handling script and its structure."""
264 a1de4b18 René Nussbaumer
  master = qa_config.GetMasterNode()
265 a1de4b18 René Nussbaumer
266 aecba21e Michael Hanselmann
  data_path = qa_utils.UploadData(master.primary, "")
267 aecba21e Michael Hanselmann
  verify_path = qa_utils.UploadData(master.primary, "")
268 aecba21e Michael Hanselmann
  exit_code_path = qa_utils.UploadData(master.primary, "")
269 a1de4b18 René Nussbaumer
270 a1de4b18 René Nussbaumer
  oob_script = (("#!/bin/bash\n"
271 a1de4b18 René Nussbaumer
                 "echo \"$@\" > %s\n"
272 a1de4b18 René Nussbaumer
                 "cat %s\n"
273 a1de4b18 René Nussbaumer
                 "exit $(< %s)\n") %
274 a1de4b18 René Nussbaumer
                (utils.ShellQuote(verify_path), utils.ShellQuote(data_path),
275 a1de4b18 René Nussbaumer
                 utils.ShellQuote(exit_code_path)))
276 aecba21e Michael Hanselmann
  oob_path = qa_utils.UploadData(master.primary, oob_script, mode=0700)
277 a1de4b18 René Nussbaumer
278 a1de4b18 René Nussbaumer
  return [oob_path, verify_path, data_path, exit_code_path]
279 a1de4b18 René Nussbaumer
280 a1de4b18 René Nussbaumer
281 a1de4b18 René Nussbaumer
def _UpdateOobFile(path, data):
282 a1de4b18 René Nussbaumer
  """Updates the data file with data."""
283 a1de4b18 René Nussbaumer
  master = qa_config.GetMasterNode()
284 aecba21e Michael Hanselmann
  qa_utils.UploadData(master.primary, data, filename=path)
285 a1de4b18 René Nussbaumer
286 a1de4b18 René Nussbaumer
287 a1de4b18 René Nussbaumer
def _AssertOobCall(verify_path, expected_args):
288 a1de4b18 René Nussbaumer
  """Assert the OOB call was performed with expetected args."""
289 a1de4b18 René Nussbaumer
  master = qa_config.GetMasterNode()
290 a1de4b18 René Nussbaumer
291 a1de4b18 René Nussbaumer
  verify_output_cmd = utils.ShellQuoteArgs(["cat", verify_path])
292 aecba21e Michael Hanselmann
  output = qa_utils.GetCommandOutput(master.primary, verify_output_cmd,
293 c832b6c8 René Nussbaumer
                                     tty=False)
294 a1de4b18 René Nussbaumer
295 fb87cbeb Michael Hanselmann
  AssertEqual(expected_args, output.strip())
296 a1de4b18 René Nussbaumer
297 a1de4b18 René Nussbaumer
298 a1de4b18 René Nussbaumer
def TestOutOfBand():
299 a1de4b18 René Nussbaumer
  """gnt-node power"""
300 a1de4b18 René Nussbaumer
  master = qa_config.GetMasterNode()
301 a1de4b18 René Nussbaumer
302 3582eef6 Iustin Pop
  node = qa_config.AcquireNode(exclude=master)
303 ac63b093 Michael Hanselmann
304 aecba21e Michael Hanselmann
  master_name = master.primary
305 aecba21e Michael Hanselmann
  node_name = node.primary
306 ac63b093 Michael Hanselmann
  full_node_name = qa_utils.ResolveNodeName(node)
307 abb24834 René Nussbaumer
308 a1de4b18 René Nussbaumer
  (oob_path, verify_path,
309 a1de4b18 René Nussbaumer
   data_path, exit_code_path) = _CreateOobScriptStructure()
310 a1de4b18 René Nussbaumer
311 a1de4b18 René Nussbaumer
  try:
312 a1de4b18 René Nussbaumer
    AssertCommand(["gnt-cluster", "modify", "--node-parameters",
313 a1de4b18 René Nussbaumer
                   "oob_program=%s" % oob_path])
314 a1de4b18 René Nussbaumer
315 a1de4b18 René Nussbaumer
    # No data, exit 0
316 a1de4b18 René Nussbaumer
    _UpdateOobFile(exit_code_path, "0")
317 a1de4b18 René Nussbaumer
318 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "on", node_name])
319 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)
320 a1de4b18 René Nussbaumer
321 c832b6c8 René Nussbaumer
    AssertCommand(["gnt-node", "power", "-f", "off", node_name])
322 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-off %s" % full_node_name)
323 a1de4b18 René Nussbaumer
324 efae0fdd René Nussbaumer
    # Power off on master without options should fail
325 c832b6c8 René Nussbaumer
    AssertCommand(["gnt-node", "power", "-f", "off", master_name], fail=True)
326 efae0fdd René Nussbaumer
    # With force master it should still fail
327 21bf2e2e Andrea Spadaccini
    AssertCommand(["gnt-node", "power", "-f", "--ignore-status", "off",
328 c832b6c8 René Nussbaumer
                   master_name],
329 efae0fdd René Nussbaumer
                  fail=True)
330 efae0fdd René Nussbaumer
331 abb24834 René Nussbaumer
    # Verify we can't transform back to online when not yet powered on
332 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "modify", "-O", "no", node_name],
333 abb24834 René Nussbaumer
                  fail=True)
334 abb24834 René Nussbaumer
    # Now reset state
335 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "modify", "-O", "no", "--node-powered", "yes",
336 abb24834 René Nussbaumer
                   node_name])
337 abb24834 René Nussbaumer
338 c832b6c8 René Nussbaumer
    AssertCommand(["gnt-node", "power", "-f", "cycle", node_name])
339 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)
340 a1de4b18 René Nussbaumer
341 a0724772 René Nussbaumer
    # Those commands should fail as they expect output which isn't provided yet
342 a0724772 René Nussbaumer
    # But they should have called the oob helper nevermind
343 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "status", node_name],
344 a1de4b18 René Nussbaumer
                  fail=True)
345 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)
346 a1de4b18 René Nussbaumer
347 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health", node_name],
348 a0724772 René Nussbaumer
                  fail=True)
349 a0724772 René Nussbaumer
    _AssertOobCall(verify_path, "health %s" % full_node_name)
350 a0724772 René Nussbaumer
351 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health"], fail=True)
352 a0724772 René Nussbaumer
353 a0724772 René Nussbaumer
    # Correct Data, exit 0
354 21bf2e2e Andrea Spadaccini
    _UpdateOobFile(data_path, serializer.DumpJson({"powered": True}))
355 a1de4b18 René Nussbaumer
356 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "status", node_name])
357 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)
358 a1de4b18 René Nussbaumer
359 a0724772 René Nussbaumer
    _UpdateOobFile(data_path, serializer.DumpJson([["temp", "OK"],
360 a0724772 René Nussbaumer
                                                   ["disk0", "CRITICAL"]]))
361 a0724772 René Nussbaumer
362 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health", node_name])
363 a0724772 René Nussbaumer
    _AssertOobCall(verify_path, "health %s" % full_node_name)
364 a0724772 René Nussbaumer
365 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health"])
366 a0724772 René Nussbaumer
367 a0724772 René Nussbaumer
    # Those commands should fail as they expect no data regardless of exit 0
368 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "on", node_name], fail=True)
369 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)
370 a1de4b18 René Nussbaumer
371 abb24834 René Nussbaumer
    try:
372 c832b6c8 René Nussbaumer
      AssertCommand(["gnt-node", "power", "-f", "off", node_name], fail=True)
373 ac63b093 Michael Hanselmann
      _AssertOobCall(verify_path, "power-off %s" % full_node_name)
374 abb24834 René Nussbaumer
    finally:
375 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "-O", "no", node_name])
376 a1de4b18 René Nussbaumer
377 c832b6c8 René Nussbaumer
    AssertCommand(["gnt-node", "power", "-f", "cycle", node_name], fail=True)
378 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)
379 a1de4b18 René Nussbaumer
380 a1de4b18 René Nussbaumer
    # Data, exit 1 (all should fail)
381 a1de4b18 René Nussbaumer
    _UpdateOobFile(exit_code_path, "1")
382 a1de4b18 René Nussbaumer
383 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "on", node_name], fail=True)
384 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)
385 a1de4b18 René Nussbaumer
386 abb24834 René Nussbaumer
    try:
387 c832b6c8 René Nussbaumer
      AssertCommand(["gnt-node", "power", "-f", "off", node_name], fail=True)
388 ac63b093 Michael Hanselmann
      _AssertOobCall(verify_path, "power-off %s" % full_node_name)
389 abb24834 René Nussbaumer
    finally:
390 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "-O", "no", node_name])
391 a1de4b18 René Nussbaumer
392 c832b6c8 René Nussbaumer
    AssertCommand(["gnt-node", "power", "-f", "cycle", node_name], fail=True)
393 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)
394 a1de4b18 René Nussbaumer
395 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "status", node_name],
396 a1de4b18 René Nussbaumer
                  fail=True)
397 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)
398 a1de4b18 René Nussbaumer
399 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health", node_name],
400 a0724772 René Nussbaumer
                  fail=True)
401 a0724772 René Nussbaumer
    _AssertOobCall(verify_path, "health %s" % full_node_name)
402 a0724772 René Nussbaumer
403 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health"], fail=True)
404 a0724772 René Nussbaumer
405 a1de4b18 René Nussbaumer
    # No data, exit 1 (all should fail)
406 a1de4b18 René Nussbaumer
    _UpdateOobFile(data_path, "")
407 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "on", node_name], fail=True)
408 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)
409 a1de4b18 René Nussbaumer
410 abb24834 René Nussbaumer
    try:
411 c832b6c8 René Nussbaumer
      AssertCommand(["gnt-node", "power", "-f", "off", node_name], fail=True)
412 ac63b093 Michael Hanselmann
      _AssertOobCall(verify_path, "power-off %s" % full_node_name)
413 abb24834 René Nussbaumer
    finally:
414 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "-O", "no", node_name])
415 a1de4b18 René Nussbaumer
416 c832b6c8 René Nussbaumer
    AssertCommand(["gnt-node", "power", "-f", "cycle", node_name], fail=True)
417 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)
418 a1de4b18 René Nussbaumer
419 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "status", node_name],
420 a1de4b18 René Nussbaumer
                  fail=True)
421 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)
422 a1de4b18 René Nussbaumer
423 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health", node_name],
424 a0724772 René Nussbaumer
                  fail=True)
425 a0724772 René Nussbaumer
    _AssertOobCall(verify_path, "health %s" % full_node_name)
426 a0724772 René Nussbaumer
427 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health"], fail=True)
428 a0724772 René Nussbaumer
429 a1de4b18 René Nussbaumer
    # Different OOB script for node
430 aecba21e Michael Hanselmann
    verify_path2 = qa_utils.UploadData(master.primary, "")
431 a1de4b18 René Nussbaumer
    oob_script = ("#!/bin/sh\n"
432 a1de4b18 René Nussbaumer
                  "echo \"$@\" > %s\n") % verify_path2
433 aecba21e Michael Hanselmann
    oob_path2 = qa_utils.UploadData(master.primary, oob_script, mode=0700)
434 a1de4b18 René Nussbaumer
435 a1de4b18 René Nussbaumer
    try:
436 a1de4b18 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "--node-parameters",
437 abb24834 René Nussbaumer
                     "oob_program=%s" % oob_path2, node_name])
438 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "power", "on", node_name])
439 ac63b093 Michael Hanselmann
      _AssertOobCall(verify_path2, "power-on %s" % full_node_name)
440 a1de4b18 René Nussbaumer
    finally:
441 a1de4b18 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "--node-parameters",
442 abb24834 René Nussbaumer
                     "oob_program=default", node_name])
443 a1de4b18 René Nussbaumer
      AssertCommand(["rm", "-f", oob_path2, verify_path2])
444 a1de4b18 René Nussbaumer
  finally:
445 a1de4b18 René Nussbaumer
    AssertCommand(["gnt-cluster", "modify", "--node-parameters",
446 8abc36f1 René Nussbaumer
                   "oob_program="])
447 a1de4b18 René Nussbaumer
    AssertCommand(["rm", "-f", oob_path, verify_path, data_path,
448 a1de4b18 René Nussbaumer
                   exit_code_path])
449 a1de4b18 René Nussbaumer
450 a1de4b18 René Nussbaumer
451 288d6440 Michael Hanselmann
def TestNodeList():
452 288d6440 Michael Hanselmann
  """gnt-node list"""
453 288d6440 Michael Hanselmann
  qa_utils.GenericQueryTest("gnt-node", query.NODE_FIELDS.keys())
454 2214cf14 Michael Hanselmann
455 2214cf14 Michael Hanselmann
456 2214cf14 Michael Hanselmann
def TestNodeListFields():
457 2214cf14 Michael Hanselmann
  """gnt-node list-fields"""
458 2214cf14 Michael Hanselmann
  qa_utils.GenericQueryFieldsTest("gnt-node", query.NODE_FIELDS.keys())
459 286b7335 Iustin Pop
460 286b7335 Iustin Pop
461 286b7335 Iustin Pop
def TestNodeListDrbd(node):
462 286b7335 Iustin Pop
  """gnt-node list-drbd"""
463 aecba21e Michael Hanselmann
  AssertCommand(["gnt-node", "list-drbd", node.primary])
464 250a9404 Bernardo Dal Seno
465 250a9404 Bernardo Dal Seno
466 250a9404 Bernardo Dal Seno
def _BuildSetESCmd(action, value, node_name):
467 250a9404 Bernardo Dal Seno
  cmd = ["gnt-node"]
468 250a9404 Bernardo Dal Seno
  if action == "add":
469 250a9404 Bernardo Dal Seno
    cmd.extend(["add", "--readd"])
470 250a9404 Bernardo Dal Seno
  else:
471 250a9404 Bernardo Dal Seno
    cmd.append("modify")
472 250a9404 Bernardo Dal Seno
  cmd.extend(["--node-parameters", "exclusive_storage=%s" % value, node_name])
473 250a9404 Bernardo Dal Seno
  return cmd
474 250a9404 Bernardo Dal Seno
475 250a9404 Bernardo Dal Seno
476 250a9404 Bernardo Dal Seno
def TestExclStorSingleNode(node):
477 250a9404 Bernardo Dal Seno
  """gnt-node add/modify cannot change the exclusive_storage flag.
478 250a9404 Bernardo Dal Seno

479 250a9404 Bernardo Dal Seno
  """
480 250a9404 Bernardo Dal Seno
  for action in ["add", "modify"]:
481 250a9404 Bernardo Dal Seno
    for value in (True, False, "default"):
482 3c296f56 Michael Hanselmann
      AssertCommand(_BuildSetESCmd(action, value, node.primary), fail=True)