Statistics
| Branch: | Tag: | Revision:

root / qa / qa_node.py @ 2e5eb96a

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 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 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 c832b6c8 René Nussbaumer
    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 a1de4b18 René Nussbaumer
    _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
319 a0724772 René Nussbaumer
    # Those commands should fail as they expect no data regardless of exit 0
320 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "on", node_name], fail=True)
321 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)
322 a1de4b18 René Nussbaumer
323 abb24834 René Nussbaumer
    try:
324 c832b6c8 René Nussbaumer
      AssertCommand(["gnt-node", "power", "-f", "off", node_name], fail=True)
325 ac63b093 Michael Hanselmann
      _AssertOobCall(verify_path, "power-off %s" % full_node_name)
326 abb24834 René Nussbaumer
    finally:
327 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "-O", "no", node_name])
328 a1de4b18 René Nussbaumer
329 c832b6c8 René Nussbaumer
    AssertCommand(["gnt-node", "power", "-f", "cycle", node_name], fail=True)
330 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)
331 a1de4b18 René Nussbaumer
332 a1de4b18 René Nussbaumer
    # Data, exit 1 (all should fail)
333 a1de4b18 René Nussbaumer
    _UpdateOobFile(exit_code_path, "1")
334 a1de4b18 René Nussbaumer
335 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "on", node_name], fail=True)
336 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)
337 a1de4b18 René Nussbaumer
338 abb24834 René Nussbaumer
    try:
339 c832b6c8 René Nussbaumer
      AssertCommand(["gnt-node", "power", "-f", "off", node_name], fail=True)
340 ac63b093 Michael Hanselmann
      _AssertOobCall(verify_path, "power-off %s" % full_node_name)
341 abb24834 René Nussbaumer
    finally:
342 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "-O", "no", node_name])
343 a1de4b18 René Nussbaumer
344 c832b6c8 René Nussbaumer
    AssertCommand(["gnt-node", "power", "-f", "cycle", node_name], fail=True)
345 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)
346 a1de4b18 René Nussbaumer
347 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "status", node_name],
348 a1de4b18 René Nussbaumer
                  fail=True)
349 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)
350 a1de4b18 René Nussbaumer
351 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health", node_name],
352 a0724772 René Nussbaumer
                  fail=True)
353 a0724772 René Nussbaumer
    _AssertOobCall(verify_path, "health %s" % full_node_name)
354 a0724772 René Nussbaumer
355 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health"], fail=True)
356 a0724772 René Nussbaumer
357 a1de4b18 René Nussbaumer
    # No data, exit 1 (all should fail)
358 a1de4b18 René Nussbaumer
    _UpdateOobFile(data_path, "")
359 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "on", node_name], fail=True)
360 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)
361 a1de4b18 René Nussbaumer
362 abb24834 René Nussbaumer
    try:
363 c832b6c8 René Nussbaumer
      AssertCommand(["gnt-node", "power", "-f", "off", node_name], fail=True)
364 ac63b093 Michael Hanselmann
      _AssertOobCall(verify_path, "power-off %s" % full_node_name)
365 abb24834 René Nussbaumer
    finally:
366 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "-O", "no", node_name])
367 a1de4b18 René Nussbaumer
368 c832b6c8 René Nussbaumer
    AssertCommand(["gnt-node", "power", "-f", "cycle", node_name], fail=True)
369 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)
370 a1de4b18 René Nussbaumer
371 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "status", node_name],
372 a1de4b18 René Nussbaumer
                  fail=True)
373 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)
374 a1de4b18 René Nussbaumer
375 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health", node_name],
376 a0724772 René Nussbaumer
                  fail=True)
377 a0724772 René Nussbaumer
    _AssertOobCall(verify_path, "health %s" % full_node_name)
378 a0724772 René Nussbaumer
379 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health"], fail=True)
380 a0724772 René Nussbaumer
381 a1de4b18 René Nussbaumer
    # Different OOB script for node
382 a1de4b18 René Nussbaumer
    verify_path2 = qa_utils.UploadData(master["primary"], "")
383 a1de4b18 René Nussbaumer
    oob_script = ("#!/bin/sh\n"
384 a1de4b18 René Nussbaumer
                  "echo \"$@\" > %s\n") % verify_path2
385 a1de4b18 René Nussbaumer
    oob_path2 = qa_utils.UploadData(master["primary"], oob_script, mode=0700)
386 a1de4b18 René Nussbaumer
387 a1de4b18 René Nussbaumer
    try:
388 a1de4b18 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "--node-parameters",
389 abb24834 René Nussbaumer
                     "oob_program=%s" % oob_path2, node_name])
390 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "power", "on", node_name])
391 ac63b093 Michael Hanselmann
      _AssertOobCall(verify_path2, "power-on %s" % full_node_name)
392 a1de4b18 René Nussbaumer
    finally:
393 a1de4b18 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "--node-parameters",
394 abb24834 René Nussbaumer
                     "oob_program=default", node_name])
395 a1de4b18 René Nussbaumer
      AssertCommand(["rm", "-f", oob_path2, verify_path2])
396 a1de4b18 René Nussbaumer
  finally:
397 a1de4b18 René Nussbaumer
    AssertCommand(["gnt-cluster", "modify", "--node-parameters",
398 8abc36f1 René Nussbaumer
                   "oob_program="])
399 a1de4b18 René Nussbaumer
    AssertCommand(["rm", "-f", oob_path, verify_path, data_path,
400 a1de4b18 René Nussbaumer
                   exit_code_path])
401 a1de4b18 René Nussbaumer
402 a1de4b18 René Nussbaumer
403 288d6440 Michael Hanselmann
def TestNodeList():
404 288d6440 Michael Hanselmann
  """gnt-node list"""
405 288d6440 Michael Hanselmann
  qa_utils.GenericQueryTest("gnt-node", query.NODE_FIELDS.keys())
406 2214cf14 Michael Hanselmann
407 2214cf14 Michael Hanselmann
408 2214cf14 Michael Hanselmann
def TestNodeListFields():
409 2214cf14 Michael Hanselmann
  """gnt-node list-fields"""
410 2214cf14 Michael Hanselmann
  qa_utils.GenericQueryFieldsTest("gnt-node", query.NODE_FIELDS.keys())