Statistics
| Branch: | Tag: | Revision:

root / qa / qa_node.py @ 3d8f154f

History | View | Annotate | Download (12.5 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 e7c6e02b Michael Hanselmann
  if not readd and node.get('_added', False):
40 cec9845c Michael Hanselmann
    raise qa_error.Error("Node %s already in cluster" % node['primary'])
41 e7c6e02b Michael Hanselmann
  elif readd and not node.get('_added', False):
42 102b115b Michael Hanselmann
    raise qa_error.Error("Node %s not yet in cluster" % node['primary'])
43 cec9845c Michael Hanselmann
44 338180f5 René Nussbaumer
  cmd = ['gnt-node', 'add', "--no-ssh-key-check"]
45 cec9845c Michael Hanselmann
  if node.get('secondary', None):
46 cec9845c Michael Hanselmann
    cmd.append('--secondary-ip=%s' % node['secondary'])
47 e7c6e02b Michael Hanselmann
  if readd:
48 e7c6e02b Michael Hanselmann
    cmd.append('--readd')
49 cec9845c Michael Hanselmann
  cmd.append(node['primary'])
50 2f4b4f78 Iustin Pop
51 2f4b4f78 Iustin Pop
  AssertCommand(cmd)
52 cec9845c Michael Hanselmann
53 cec9845c Michael Hanselmann
  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 cec9845c Michael Hanselmann
  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 cec9845c Michael Hanselmann
  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 8e671b7c Iustin Pop
  for node in qa_config.get('nodes'):
77 8e671b7c Iustin Pop
    if node != master:
78 8e671b7c 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 cec9845c Michael Hanselmann
  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 a1de4b18 René Nussbaumer
  output = qa_utils.GetCommandOutput(master["primary"], verify_output_cmd)
244 a1de4b18 René Nussbaumer
245 fb87cbeb Michael Hanselmann
  AssertEqual(expected_args, output.strip())
246 a1de4b18 René Nussbaumer
247 a1de4b18 René Nussbaumer
248 a1de4b18 René Nussbaumer
def TestOutOfBand():
249 a1de4b18 René Nussbaumer
  """gnt-node power"""
250 a1de4b18 René Nussbaumer
  master = qa_config.GetMasterNode()
251 a1de4b18 René Nussbaumer
252 3582eef6 Iustin Pop
  node = qa_config.AcquireNode(exclude=master)
253 ac63b093 Michael Hanselmann
254 ac63b093 Michael Hanselmann
  node_name = node["primary"]
255 ac63b093 Michael Hanselmann
  full_node_name = qa_utils.ResolveNodeName(node)
256 abb24834 René Nussbaumer
257 a1de4b18 René Nussbaumer
  (oob_path, verify_path,
258 a1de4b18 René Nussbaumer
   data_path, exit_code_path) = _CreateOobScriptStructure()
259 a1de4b18 René Nussbaumer
260 a1de4b18 René Nussbaumer
  try:
261 a1de4b18 René Nussbaumer
    AssertCommand(["gnt-cluster", "modify", "--node-parameters",
262 a1de4b18 René Nussbaumer
                   "oob_program=%s" % oob_path])
263 a1de4b18 René Nussbaumer
264 a1de4b18 René Nussbaumer
    # No data, exit 0
265 a1de4b18 René Nussbaumer
    _UpdateOobFile(exit_code_path, "0")
266 a1de4b18 René Nussbaumer
267 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "on", node_name])
268 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)
269 a1de4b18 René Nussbaumer
270 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "off", node_name])
271 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-off %s" % full_node_name)
272 a1de4b18 René Nussbaumer
273 abb24834 René Nussbaumer
    # Verify we can't transform back to online when not yet powered on
274 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "modify", "-O", "no", node_name],
275 abb24834 René Nussbaumer
                  fail=True)
276 abb24834 René Nussbaumer
    # Now reset state
277 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "modify", "-O", "no", "--node-powered", "yes",
278 abb24834 René Nussbaumer
                   node_name])
279 abb24834 René Nussbaumer
280 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "cycle", node_name])
281 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)
282 a1de4b18 René Nussbaumer
283 a1de4b18 René Nussbaumer
    # This command should fail as it expects output which isn't provided yet
284 a1de4b18 René Nussbaumer
    # But it should have called the oob helper nevermind
285 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "status", node_name],
286 a1de4b18 René Nussbaumer
                  fail=True)
287 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)
288 a1de4b18 René Nussbaumer
289 a1de4b18 René Nussbaumer
    # Data, exit 0
290 a1de4b18 René Nussbaumer
    _UpdateOobFile(data_path, serializer.DumpJson({ "powered": True }))
291 a1de4b18 René Nussbaumer
292 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "status", node_name])
293 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)
294 a1de4b18 René Nussbaumer
295 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "on", node_name], fail=True)
296 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)
297 a1de4b18 René Nussbaumer
298 abb24834 René Nussbaumer
    try:
299 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "power", "off", node_name], fail=True)
300 ac63b093 Michael Hanselmann
      _AssertOobCall(verify_path, "power-off %s" % full_node_name)
301 abb24834 René Nussbaumer
    finally:
302 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "-O", "no", node_name])
303 a1de4b18 René Nussbaumer
304 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "cycle", node_name], fail=True)
305 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)
306 a1de4b18 René Nussbaumer
307 a1de4b18 René Nussbaumer
    # Data, exit 1 (all should fail)
308 a1de4b18 René Nussbaumer
    _UpdateOobFile(exit_code_path, "1")
309 a1de4b18 René Nussbaumer
310 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "on", node_name], fail=True)
311 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)
312 a1de4b18 René Nussbaumer
313 abb24834 René Nussbaumer
    try:
314 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "power", "off", node_name], fail=True)
315 ac63b093 Michael Hanselmann
      _AssertOobCall(verify_path, "power-off %s" % full_node_name)
316 abb24834 René Nussbaumer
    finally:
317 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "-O", "no", node_name])
318 a1de4b18 René Nussbaumer
319 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "cycle", node_name], fail=True)
320 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)
321 a1de4b18 René Nussbaumer
322 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "status", node_name],
323 a1de4b18 René Nussbaumer
                  fail=True)
324 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)
325 a1de4b18 René Nussbaumer
326 a1de4b18 René Nussbaumer
    # No data, exit 1 (all should fail)
327 a1de4b18 René Nussbaumer
    _UpdateOobFile(data_path, "")
328 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "on", node_name], fail=True)
329 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)
330 a1de4b18 René Nussbaumer
331 abb24834 René Nussbaumer
    try:
332 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "power", "off", node_name], fail=True)
333 ac63b093 Michael Hanselmann
      _AssertOobCall(verify_path, "power-off %s" % full_node_name)
334 abb24834 René Nussbaumer
    finally:
335 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "-O", "no", node_name])
336 a1de4b18 René Nussbaumer
337 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "cycle", node_name], fail=True)
338 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)
339 a1de4b18 René Nussbaumer
340 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "status", node_name],
341 a1de4b18 René Nussbaumer
                  fail=True)
342 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)
343 a1de4b18 René Nussbaumer
344 a1de4b18 René Nussbaumer
    # Different OOB script for node
345 a1de4b18 René Nussbaumer
    verify_path2 = qa_utils.UploadData(master["primary"], "")
346 a1de4b18 René Nussbaumer
    oob_script = ("#!/bin/sh\n"
347 a1de4b18 René Nussbaumer
                  "echo \"$@\" > %s\n") % verify_path2
348 a1de4b18 René Nussbaumer
    oob_path2 = qa_utils.UploadData(master["primary"], oob_script, mode=0700)
349 a1de4b18 René Nussbaumer
350 a1de4b18 René Nussbaumer
    try:
351 a1de4b18 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "--node-parameters",
352 abb24834 René Nussbaumer
                     "oob_program=%s" % oob_path2, node_name])
353 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "power", "on", node_name])
354 ac63b093 Michael Hanselmann
      _AssertOobCall(verify_path2, "power-on %s" % full_node_name)
355 a1de4b18 René Nussbaumer
    finally:
356 a1de4b18 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "--node-parameters",
357 abb24834 René Nussbaumer
                     "oob_program=default", node_name])
358 a1de4b18 René Nussbaumer
      AssertCommand(["rm", "-f", oob_path2, verify_path2])
359 a1de4b18 René Nussbaumer
  finally:
360 a1de4b18 René Nussbaumer
    AssertCommand(["gnt-cluster", "modify", "--node-parameters",
361 8abc36f1 René Nussbaumer
                   "oob_program="])
362 a1de4b18 René Nussbaumer
    AssertCommand(["rm", "-f", oob_path, verify_path, data_path,
363 a1de4b18 René Nussbaumer
                   exit_code_path])
364 a1de4b18 René Nussbaumer
365 a1de4b18 René Nussbaumer
366 288d6440 Michael Hanselmann
def TestNodeList():
367 288d6440 Michael Hanselmann
  """gnt-node list"""
368 288d6440 Michael Hanselmann
  qa_utils.GenericQueryTest("gnt-node", query.NODE_FIELDS.keys())
369 2214cf14 Michael Hanselmann
370 2214cf14 Michael Hanselmann
371 2214cf14 Michael Hanselmann
def TestNodeListFields():
372 2214cf14 Michael Hanselmann
  """gnt-node list-fields"""
373 2214cf14 Michael Hanselmann
  qa_utils.GenericQueryFieldsTest("gnt-node", query.NODE_FIELDS.keys())