Statistics
| Branch: | Tag: | Revision:

root / qa / qa_node.py @ 55cc0a44

History | View | Annotate | Download (12 kB)

1 c68d1f43 Michael Hanselmann
#
2 c68d1f43 Michael Hanselmann
#
3 c68d1f43 Michael Hanselmann
4 cec9845c Michael Hanselmann
# Copyright (C) 2007 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
from ganeti import utils
23 8e1db003 Michael Hanselmann
from ganeti import constants
24 288d6440 Michael Hanselmann
from ganeti import query
25 a1de4b18 René Nussbaumer
from ganeti import serializer
26 cec9845c Michael Hanselmann
27 cec9845c Michael Hanselmann
import qa_config
28 cec9845c Michael Hanselmann
import qa_error
29 4b62db14 Michael Hanselmann
import qa_utils
30 cec9845c Michael Hanselmann
31 2f4b4f78 Iustin Pop
from qa_utils import AssertCommand
32 cec9845c Michael Hanselmann
33 cec9845c Michael Hanselmann
34 e7c6e02b Michael Hanselmann
def _NodeAdd(node, readd=False):
35 e7c6e02b Michael Hanselmann
  if not readd and node.get('_added', False):
36 cec9845c Michael Hanselmann
    raise qa_error.Error("Node %s already in cluster" % node['primary'])
37 e7c6e02b Michael Hanselmann
  elif readd and not node.get('_added', False):
38 102b115b Michael Hanselmann
    raise qa_error.Error("Node %s not yet in cluster" % node['primary'])
39 cec9845c Michael Hanselmann
40 338180f5 René Nussbaumer
  cmd = ['gnt-node', 'add', "--no-ssh-key-check"]
41 cec9845c Michael Hanselmann
  if node.get('secondary', None):
42 cec9845c Michael Hanselmann
    cmd.append('--secondary-ip=%s' % node['secondary'])
43 e7c6e02b Michael Hanselmann
  if readd:
44 e7c6e02b Michael Hanselmann
    cmd.append('--readd')
45 cec9845c Michael Hanselmann
  cmd.append(node['primary'])
46 2f4b4f78 Iustin Pop
47 2f4b4f78 Iustin Pop
  AssertCommand(cmd)
48 cec9845c Michael Hanselmann
49 cec9845c Michael Hanselmann
  node['_added'] = True
50 cec9845c Michael Hanselmann
51 cec9845c Michael Hanselmann
52 cec9845c Michael Hanselmann
def _NodeRemove(node):
53 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-node", "remove", node["primary"]])
54 cec9845c Michael Hanselmann
  node['_added'] = False
55 cec9845c Michael Hanselmann
56 cec9845c Michael Hanselmann
57 cec9845c Michael Hanselmann
def TestNodeAddAll():
58 cec9845c Michael Hanselmann
  """Adding all nodes to cluster."""
59 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
60 cec9845c Michael Hanselmann
  for node in qa_config.get('nodes'):
61 cec9845c Michael Hanselmann
    if node != master:
62 e7c6e02b Michael Hanselmann
      _NodeAdd(node, readd=False)
63 cec9845c Michael Hanselmann
64 cec9845c Michael Hanselmann
65 8e671b7c Iustin Pop
def MarkNodeAddedAll():
66 8e671b7c Iustin Pop
  """Mark all nodes as added.
67 8e671b7c Iustin Pop

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

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