Statistics
| Branch: | Tag: | Revision:

root / qa / qa_node.py @ aa104b5e

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

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