Statistics
| Branch: | Tag: | Revision:

root / qa / qa_node.py @ e1a6abf9

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

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