Statistics
| Branch: | Tag: | Revision:

root / qa / qa_node.py @ f14a8b15

History | View | Annotate | Download (14.1 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 620fb907 Michael Hanselmann
  # Test setting secondary IP address
213 620fb907 Michael Hanselmann
  AssertCommand(["gnt-node", "modify", "--secondary-ip=%s" % node["secondary"],
214 620fb907 Michael Hanselmann
                 node["primary"]])
215 620fb907 Michael Hanselmann
216 288d6440 Michael Hanselmann
217 a1de4b18 René Nussbaumer
def _CreateOobScriptStructure():
218 a1de4b18 René Nussbaumer
  """Create a simple OOB handling script and its structure."""
219 a1de4b18 René Nussbaumer
  master = qa_config.GetMasterNode()
220 a1de4b18 René Nussbaumer
221 a1de4b18 René Nussbaumer
  data_path = qa_utils.UploadData(master["primary"], "")
222 a1de4b18 René Nussbaumer
  verify_path = qa_utils.UploadData(master["primary"], "")
223 a1de4b18 René Nussbaumer
  exit_code_path = qa_utils.UploadData(master["primary"], "")
224 a1de4b18 René Nussbaumer
225 a1de4b18 René Nussbaumer
  oob_script = (("#!/bin/bash\n"
226 a1de4b18 René Nussbaumer
                 "echo \"$@\" > %s\n"
227 a1de4b18 René Nussbaumer
                 "cat %s\n"
228 a1de4b18 René Nussbaumer
                 "exit $(< %s)\n") %
229 a1de4b18 René Nussbaumer
                (utils.ShellQuote(verify_path), utils.ShellQuote(data_path),
230 a1de4b18 René Nussbaumer
                 utils.ShellQuote(exit_code_path)))
231 a1de4b18 René Nussbaumer
  oob_path = qa_utils.UploadData(master["primary"], oob_script, mode=0700)
232 a1de4b18 René Nussbaumer
233 a1de4b18 René Nussbaumer
  return [oob_path, verify_path, data_path, exit_code_path]
234 a1de4b18 René Nussbaumer
235 a1de4b18 René Nussbaumer
236 a1de4b18 René Nussbaumer
def _UpdateOobFile(path, data):
237 a1de4b18 René Nussbaumer
  """Updates the data file with data."""
238 a1de4b18 René Nussbaumer
  master = qa_config.GetMasterNode()
239 a1de4b18 René Nussbaumer
  qa_utils.UploadData(master["primary"], data, filename=path)
240 a1de4b18 René Nussbaumer
241 a1de4b18 René Nussbaumer
242 a1de4b18 René Nussbaumer
def _AssertOobCall(verify_path, expected_args):
243 a1de4b18 René Nussbaumer
  """Assert the OOB call was performed with expetected args."""
244 a1de4b18 René Nussbaumer
  master = qa_config.GetMasterNode()
245 a1de4b18 René Nussbaumer
246 a1de4b18 René Nussbaumer
  verify_output_cmd = utils.ShellQuoteArgs(["cat", verify_path])
247 c832b6c8 René Nussbaumer
  output = qa_utils.GetCommandOutput(master["primary"], verify_output_cmd,
248 c832b6c8 René Nussbaumer
                                     tty=False)
249 a1de4b18 René Nussbaumer
250 fb87cbeb Michael Hanselmann
  AssertEqual(expected_args, output.strip())
251 a1de4b18 René Nussbaumer
252 a1de4b18 René Nussbaumer
253 a1de4b18 René Nussbaumer
def TestOutOfBand():
254 a1de4b18 René Nussbaumer
  """gnt-node power"""
255 a1de4b18 René Nussbaumer
  master = qa_config.GetMasterNode()
256 a1de4b18 René Nussbaumer
257 3582eef6 Iustin Pop
  node = qa_config.AcquireNode(exclude=master)
258 ac63b093 Michael Hanselmann
259 efae0fdd René Nussbaumer
  master_name = master["primary"]
260 ac63b093 Michael Hanselmann
  node_name = node["primary"]
261 ac63b093 Michael Hanselmann
  full_node_name = qa_utils.ResolveNodeName(node)
262 abb24834 René Nussbaumer
263 a1de4b18 René Nussbaumer
  (oob_path, verify_path,
264 a1de4b18 René Nussbaumer
   data_path, exit_code_path) = _CreateOobScriptStructure()
265 a1de4b18 René Nussbaumer
266 a1de4b18 René Nussbaumer
  try:
267 a1de4b18 René Nussbaumer
    AssertCommand(["gnt-cluster", "modify", "--node-parameters",
268 a1de4b18 René Nussbaumer
                   "oob_program=%s" % oob_path])
269 a1de4b18 René Nussbaumer
270 a1de4b18 René Nussbaumer
    # No data, exit 0
271 a1de4b18 René Nussbaumer
    _UpdateOobFile(exit_code_path, "0")
272 a1de4b18 René Nussbaumer
273 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "on", node_name])
274 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)
275 a1de4b18 René Nussbaumer
276 c832b6c8 René Nussbaumer
    AssertCommand(["gnt-node", "power", "-f", "off", node_name])
277 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-off %s" % full_node_name)
278 a1de4b18 René Nussbaumer
279 efae0fdd René Nussbaumer
    # Power off on master without options should fail
280 c832b6c8 René Nussbaumer
    AssertCommand(["gnt-node", "power", "-f", "off", master_name], fail=True)
281 efae0fdd René Nussbaumer
    # With force master it should still fail
282 21bf2e2e Andrea Spadaccini
    AssertCommand(["gnt-node", "power", "-f", "--ignore-status", "off",
283 c832b6c8 René Nussbaumer
                   master_name],
284 efae0fdd René Nussbaumer
                  fail=True)
285 efae0fdd René Nussbaumer
286 abb24834 René Nussbaumer
    # Verify we can't transform back to online when not yet powered on
287 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "modify", "-O", "no", node_name],
288 abb24834 René Nussbaumer
                  fail=True)
289 abb24834 René Nussbaumer
    # Now reset state
290 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "modify", "-O", "no", "--node-powered", "yes",
291 abb24834 René Nussbaumer
                   node_name])
292 abb24834 René Nussbaumer
293 c832b6c8 René Nussbaumer
    AssertCommand(["gnt-node", "power", "-f", "cycle", node_name])
294 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)
295 a1de4b18 René Nussbaumer
296 a0724772 René Nussbaumer
    # Those commands should fail as they expect output which isn't provided yet
297 a0724772 René Nussbaumer
    # But they should have called the oob helper nevermind
298 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "status", node_name],
299 a1de4b18 René Nussbaumer
                  fail=True)
300 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)
301 a1de4b18 René Nussbaumer
302 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health", node_name],
303 a0724772 René Nussbaumer
                  fail=True)
304 a0724772 René Nussbaumer
    _AssertOobCall(verify_path, "health %s" % full_node_name)
305 a0724772 René Nussbaumer
306 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health"], fail=True)
307 a0724772 René Nussbaumer
308 a0724772 René Nussbaumer
    # Correct Data, exit 0
309 21bf2e2e Andrea Spadaccini
    _UpdateOobFile(data_path, serializer.DumpJson({"powered": True}))
310 a1de4b18 René Nussbaumer
311 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "status", node_name])
312 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)
313 a1de4b18 René Nussbaumer
314 a0724772 René Nussbaumer
    _UpdateOobFile(data_path, serializer.DumpJson([["temp", "OK"],
315 a0724772 René Nussbaumer
                                                   ["disk0", "CRITICAL"]]))
316 a0724772 René Nussbaumer
317 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health", node_name])
318 a0724772 René Nussbaumer
    _AssertOobCall(verify_path, "health %s" % full_node_name)
319 a0724772 René Nussbaumer
320 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health"])
321 a0724772 René Nussbaumer
322 a0724772 René Nussbaumer
    # Those commands should fail as they expect no data regardless of exit 0
323 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "on", node_name], fail=True)
324 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)
325 a1de4b18 René Nussbaumer
326 abb24834 René Nussbaumer
    try:
327 c832b6c8 René Nussbaumer
      AssertCommand(["gnt-node", "power", "-f", "off", node_name], fail=True)
328 ac63b093 Michael Hanselmann
      _AssertOobCall(verify_path, "power-off %s" % full_node_name)
329 abb24834 René Nussbaumer
    finally:
330 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "-O", "no", node_name])
331 a1de4b18 René Nussbaumer
332 c832b6c8 René Nussbaumer
    AssertCommand(["gnt-node", "power", "-f", "cycle", node_name], fail=True)
333 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)
334 a1de4b18 René Nussbaumer
335 a1de4b18 René Nussbaumer
    # Data, exit 1 (all should fail)
336 a1de4b18 René Nussbaumer
    _UpdateOobFile(exit_code_path, "1")
337 a1de4b18 René Nussbaumer
338 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "on", node_name], fail=True)
339 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)
340 a1de4b18 René Nussbaumer
341 abb24834 René Nussbaumer
    try:
342 c832b6c8 René Nussbaumer
      AssertCommand(["gnt-node", "power", "-f", "off", node_name], fail=True)
343 ac63b093 Michael Hanselmann
      _AssertOobCall(verify_path, "power-off %s" % full_node_name)
344 abb24834 René Nussbaumer
    finally:
345 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "-O", "no", node_name])
346 a1de4b18 René Nussbaumer
347 c832b6c8 René Nussbaumer
    AssertCommand(["gnt-node", "power", "-f", "cycle", node_name], fail=True)
348 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)
349 a1de4b18 René Nussbaumer
350 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "status", node_name],
351 a1de4b18 René Nussbaumer
                  fail=True)
352 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)
353 a1de4b18 René Nussbaumer
354 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health", node_name],
355 a0724772 René Nussbaumer
                  fail=True)
356 a0724772 René Nussbaumer
    _AssertOobCall(verify_path, "health %s" % full_node_name)
357 a0724772 René Nussbaumer
358 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health"], fail=True)
359 a0724772 René Nussbaumer
360 a1de4b18 René Nussbaumer
    # No data, exit 1 (all should fail)
361 a1de4b18 René Nussbaumer
    _UpdateOobFile(data_path, "")
362 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "on", node_name], fail=True)
363 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)
364 a1de4b18 René Nussbaumer
365 abb24834 René Nussbaumer
    try:
366 c832b6c8 René Nussbaumer
      AssertCommand(["gnt-node", "power", "-f", "off", node_name], fail=True)
367 ac63b093 Michael Hanselmann
      _AssertOobCall(verify_path, "power-off %s" % full_node_name)
368 abb24834 René Nussbaumer
    finally:
369 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "-O", "no", node_name])
370 a1de4b18 René Nussbaumer
371 c832b6c8 René Nussbaumer
    AssertCommand(["gnt-node", "power", "-f", "cycle", node_name], fail=True)
372 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)
373 a1de4b18 René Nussbaumer
374 abb24834 René Nussbaumer
    AssertCommand(["gnt-node", "power", "status", node_name],
375 a1de4b18 René Nussbaumer
                  fail=True)
376 ac63b093 Michael Hanselmann
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)
377 a1de4b18 René Nussbaumer
378 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health", node_name],
379 a0724772 René Nussbaumer
                  fail=True)
380 a0724772 René Nussbaumer
    _AssertOobCall(verify_path, "health %s" % full_node_name)
381 a0724772 René Nussbaumer
382 a0724772 René Nussbaumer
    AssertCommand(["gnt-node", "health"], fail=True)
383 a0724772 René Nussbaumer
384 a1de4b18 René Nussbaumer
    # Different OOB script for node
385 a1de4b18 René Nussbaumer
    verify_path2 = qa_utils.UploadData(master["primary"], "")
386 a1de4b18 René Nussbaumer
    oob_script = ("#!/bin/sh\n"
387 a1de4b18 René Nussbaumer
                  "echo \"$@\" > %s\n") % verify_path2
388 a1de4b18 René Nussbaumer
    oob_path2 = qa_utils.UploadData(master["primary"], oob_script, mode=0700)
389 a1de4b18 René Nussbaumer
390 a1de4b18 René Nussbaumer
    try:
391 a1de4b18 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "--node-parameters",
392 abb24834 René Nussbaumer
                     "oob_program=%s" % oob_path2, node_name])
393 abb24834 René Nussbaumer
      AssertCommand(["gnt-node", "power", "on", node_name])
394 ac63b093 Michael Hanselmann
      _AssertOobCall(verify_path2, "power-on %s" % full_node_name)
395 a1de4b18 René Nussbaumer
    finally:
396 a1de4b18 René Nussbaumer
      AssertCommand(["gnt-node", "modify", "--node-parameters",
397 abb24834 René Nussbaumer
                     "oob_program=default", node_name])
398 a1de4b18 René Nussbaumer
      AssertCommand(["rm", "-f", oob_path2, verify_path2])
399 a1de4b18 René Nussbaumer
  finally:
400 a1de4b18 René Nussbaumer
    AssertCommand(["gnt-cluster", "modify", "--node-parameters",
401 8abc36f1 René Nussbaumer
                   "oob_program="])
402 a1de4b18 René Nussbaumer
    AssertCommand(["rm", "-f", oob_path, verify_path, data_path,
403 a1de4b18 René Nussbaumer
                   exit_code_path])
404 a1de4b18 René Nussbaumer
405 a1de4b18 René Nussbaumer
406 288d6440 Michael Hanselmann
def TestNodeList():
407 288d6440 Michael Hanselmann
  """gnt-node list"""
408 288d6440 Michael Hanselmann
  qa_utils.GenericQueryTest("gnt-node", query.NODE_FIELDS.keys())
409 2214cf14 Michael Hanselmann
410 2214cf14 Michael Hanselmann
411 2214cf14 Michael Hanselmann
def TestNodeListFields():
412 2214cf14 Michael Hanselmann
  """gnt-node list-fields"""
413 2214cf14 Michael Hanselmann
  qa_utils.GenericQueryFieldsTest("gnt-node", query.NODE_FIELDS.keys())