Statistics
| Branch: | Tag: | Revision:

root / qa / qa_node.py @ 1a732a74

History | View | Annotate | Download (15.2 kB)

1 c68d1f43 Michael Hanselmann
#
2 c68d1f43 Michael Hanselmann
#
3 c68d1f43 Michael Hanselmann
4 3c87d614 Iustin Pop
# Copyright (C) 2007, 2011, 2012, 2013 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 dbdb0594 Michael Hanselmann
  if not readd and node.added:
40 aecba21e Michael Hanselmann
    raise qa_error.Error("Node %s already in cluster" % node.primary)
41 dbdb0594 Michael Hanselmann
  elif readd and not node.added:
42 aecba21e Michael Hanselmann
    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 aecba21e Michael Hanselmann
  if node.secondary:
46 aecba21e Michael Hanselmann
    cmd.append("--secondary-ip=%s" % node.secondary)
47 e7c6e02b Michael Hanselmann
  if readd:
48 d0c8c01d Iustin Pop
    cmd.append("--readd")
49 aecba21e Michael Hanselmann
  cmd.append(node.primary)
50 2f4b4f78 Iustin Pop
51 2f4b4f78 Iustin Pop
  AssertCommand(cmd)
52 cec9845c Michael Hanselmann
53 dbdb0594 Michael Hanselmann
  if readd:
54 dbdb0594 Michael Hanselmann
    assert node.added
55 dbdb0594 Michael Hanselmann
  else:
56 dbdb0594 Michael Hanselmann
    node.MarkAdded()
57 cec9845c Michael Hanselmann
58 cec9845c Michael Hanselmann
59 cec9845c Michael Hanselmann
def _NodeRemove(node):
60 aecba21e Michael Hanselmann
  AssertCommand(["gnt-node", "remove", node.primary])
61 dbdb0594 Michael Hanselmann
  node.MarkRemoved()
62 cec9845c Michael Hanselmann
63 cec9845c Michael Hanselmann
64 c7e54e1d Agata Murawska
def MakeNodeOffline(node, value):
65 c7e54e1d Agata Murawska
  """gnt-node modify --offline=value"""
66 c7e54e1d Agata Murawska
  # value in ["yes", "no"]
67 aecba21e Michael Hanselmann
  AssertCommand(["gnt-node", "modify", "--offline", value, node.primary])
68 c7e54e1d Agata Murawska
69 c7e54e1d Agata Murawska
70 cec9845c Michael Hanselmann
def TestNodeAddAll():
71 cec9845c Michael Hanselmann
  """Adding all nodes to cluster."""
72 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
73 d0c8c01d Iustin Pop
  for node in qa_config.get("nodes"):
74 cec9845c Michael Hanselmann
    if node != master:
75 e7c6e02b Michael Hanselmann
      _NodeAdd(node, readd=False)
76 cec9845c Michael Hanselmann
77 cec9845c Michael Hanselmann
78 8e671b7c Iustin Pop
def MarkNodeAddedAll():
79 8e671b7c Iustin Pop
  """Mark all nodes as added.
80 8e671b7c Iustin Pop

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

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

456 250a9404 Bernardo Dal Seno
  """
457 250a9404 Bernardo Dal Seno
  for action in ["add", "modify"]:
458 250a9404 Bernardo Dal Seno
    for value in (True, False, "default"):
459 3c296f56 Michael Hanselmann
      AssertCommand(_BuildSetESCmd(action, value, node.primary), fail=True)