Statistics
| Branch: | Tag: | Revision:

root / qa / qa_node.py @ c632d3a5

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

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