Statistics
| Branch: | Tag: | Revision:

root / qa / qa_node.py @ 6d3d13ab

History | View | Annotate | Download (14.4 kB)

1 c68d1f43 Michael Hanselmann
#
2 c68d1f43 Michael Hanselmann
#
3 c68d1f43 Michael Hanselmann
4 286b7335 Iustin Pop
# Copyright (C) 2007, 2011, 2012 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 c7e54e1d Agata Murawska
def MakeNodeOffline(node, value):
62 c7e54e1d Agata Murawska
  """gnt-node modify --offline=value"""
63 c7e54e1d Agata Murawska
  # value in ["yes", "no"]
64 c7e54e1d Agata Murawska
  AssertCommand(["gnt-node", "modify", "--offline", value, node["primary"]])
65 c7e54e1d Agata Murawska
66 c7e54e1d Agata Murawska
67 cec9845c Michael Hanselmann
def TestNodeAddAll():
68 cec9845c Michael Hanselmann
  """Adding all nodes to cluster."""
69 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
70 d0c8c01d Iustin Pop
  for node in qa_config.get("nodes"):
71 cec9845c Michael Hanselmann
    if node != master:
72 e7c6e02b Michael Hanselmann
      _NodeAdd(node, readd=False)
73 cec9845c Michael Hanselmann
74 cec9845c Michael Hanselmann
75 8e671b7c Iustin Pop
def MarkNodeAddedAll():
76 8e671b7c Iustin Pop
  """Mark all nodes as added.
77 8e671b7c Iustin Pop

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

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