Statistics
| Branch: | Tag: | Revision:

root / qa / qa_node.py @ a07ae57f

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 b337aeb4 Petr Pudlak
def NodeAdd(node, readd=False, group=None):
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 b337aeb4 Petr Pudlak
  if group is not None:
50 b337aeb4 Petr Pudlak
    cmd.extend(["--node-group", group])
51 aecba21e Michael Hanselmann
  cmd.append(node.primary)
52 2f4b4f78 Iustin Pop
53 2f4b4f78 Iustin Pop
  AssertCommand(cmd)
54 cec9845c Michael Hanselmann
55 dbdb0594 Michael Hanselmann
  if readd:
56 dbdb0594 Michael Hanselmann
    assert node.added
57 dbdb0594 Michael Hanselmann
  else:
58 dbdb0594 Michael Hanselmann
    node.MarkAdded()
59 cec9845c Michael Hanselmann
60 cec9845c Michael Hanselmann
61 b337aeb4 Petr Pudlak
def NodeRemove(node):
62 aecba21e Michael Hanselmann
  AssertCommand(["gnt-node", "remove", node.primary])
63 dbdb0594 Michael Hanselmann
  node.MarkRemoved()
64 cec9845c Michael Hanselmann
65 cec9845c Michael Hanselmann
66 c7e54e1d Agata Murawska
def MakeNodeOffline(node, value):
67 c7e54e1d Agata Murawska
  """gnt-node modify --offline=value"""
68 c7e54e1d Agata Murawska
  # value in ["yes", "no"]
69 aecba21e Michael Hanselmann
  AssertCommand(["gnt-node", "modify", "--offline", value, node.primary])
70 c7e54e1d Agata Murawska
71 c7e54e1d Agata Murawska
72 cec9845c Michael Hanselmann
def TestNodeAddAll():
73 cec9845c Michael Hanselmann
  """Adding all nodes to cluster."""
74 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
75 d0c8c01d Iustin Pop
  for node in qa_config.get("nodes"):
76 cec9845c Michael Hanselmann
    if node != master:
77 b337aeb4 Petr Pudlak
      NodeAdd(node, readd=False)
78 cec9845c Michael Hanselmann
79 cec9845c Michael Hanselmann
80 8e671b7c Iustin Pop
def MarkNodeAddedAll():
81 8e671b7c Iustin Pop
  """Mark all nodes as added.
82 8e671b7c Iustin Pop

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

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

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