Statistics
| Branch: | Tag: | Revision:

root / qa / qa_node.py @ 54f834df

History | View | Annotate | Download (13.9 kB)

1 c68d1f43 Michael Hanselmann
#
2 c68d1f43 Michael Hanselmann
#
3 c68d1f43 Michael Hanselmann
4 3582eef6 Iustin Pop
# Copyright (C) 2007, 2011 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 d0c8c01d Iustin Pop
  if not readd and node.get("_added", False):
40 d0c8c01d Iustin Pop
    raise qa_error.Error("Node %s already in cluster" % node["primary"])
41 d0c8c01d Iustin Pop
  elif readd and not node.get("_added", False):
42 d0c8c01d Iustin Pop
    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 d0c8c01d Iustin Pop
  if node.get("secondary", None):
46 d0c8c01d Iustin Pop
    cmd.append("--secondary-ip=%s" % node["secondary"])
47 e7c6e02b Michael Hanselmann
  if readd:
48 d0c8c01d Iustin Pop
    cmd.append("--readd")
49 d0c8c01d Iustin Pop
  cmd.append(node["primary"])
50 2f4b4f78 Iustin Pop
51 2f4b4f78 Iustin Pop
  AssertCommand(cmd)
52 cec9845c Michael Hanselmann
53 d0c8c01d Iustin Pop
  node["_added"] = True
54 cec9845c Michael Hanselmann
55 cec9845c Michael Hanselmann
56 cec9845c Michael Hanselmann
def _NodeRemove(node):
57 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-node", "remove", node["primary"]])
58 d0c8c01d Iustin Pop
  node["_added"] = False
59 cec9845c Michael Hanselmann
60 cec9845c Michael Hanselmann
61 cec9845c Michael Hanselmann
def TestNodeAddAll():
62 cec9845c Michael Hanselmann
  """Adding all nodes to cluster."""
63 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
64 d0c8c01d Iustin Pop
  for node in qa_config.get("nodes"):
65 cec9845c Michael Hanselmann
    if node != master:
66 e7c6e02b Michael Hanselmann
      _NodeAdd(node, readd=False)
67 cec9845c Michael Hanselmann
68 cec9845c Michael Hanselmann
69 8e671b7c Iustin Pop
def MarkNodeAddedAll():
70 8e671b7c Iustin Pop
  """Mark all nodes as added.
71 8e671b7c Iustin Pop

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

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