22 |
22 |
from ganeti import utils
|
23 |
23 |
from ganeti import constants
|
24 |
24 |
from ganeti import query
|
|
25 |
from ganeti import serializer
|
25 |
26 |
|
26 |
27 |
import qa_config
|
27 |
28 |
import qa_error
|
... | ... | |
192 |
193 |
"--auto-promote", node["primary"]])
|
193 |
194 |
|
194 |
195 |
|
|
196 |
def _CreateOobScriptStructure():
|
|
197 |
"""Create a simple OOB handling script and its structure."""
|
|
198 |
master = qa_config.GetMasterNode()
|
|
199 |
|
|
200 |
data_path = qa_utils.UploadData(master["primary"], "")
|
|
201 |
verify_path = qa_utils.UploadData(master["primary"], "")
|
|
202 |
exit_code_path = qa_utils.UploadData(master["primary"], "")
|
|
203 |
|
|
204 |
oob_script = (("#!/bin/bash\n"
|
|
205 |
"echo \"$@\" > %s\n"
|
|
206 |
"cat %s\n"
|
|
207 |
"exit $(< %s)\n") %
|
|
208 |
(utils.ShellQuote(verify_path), utils.ShellQuote(data_path),
|
|
209 |
utils.ShellQuote(exit_code_path)))
|
|
210 |
oob_path = qa_utils.UploadData(master["primary"], oob_script, mode=0700)
|
|
211 |
|
|
212 |
return [oob_path, verify_path, data_path, exit_code_path]
|
|
213 |
|
|
214 |
|
|
215 |
def _UpdateOobFile(path, data):
|
|
216 |
"""Updates the data file with data."""
|
|
217 |
master = qa_config.GetMasterNode()
|
|
218 |
qa_utils.UploadData(master["primary"], data, filename=path)
|
|
219 |
|
|
220 |
|
|
221 |
def _AssertOobCall(verify_path, expected_args):
|
|
222 |
"""Assert the OOB call was performed with expetected args."""
|
|
223 |
master = qa_config.GetMasterNode()
|
|
224 |
|
|
225 |
verify_output_cmd = utils.ShellQuoteArgs(["cat", verify_path])
|
|
226 |
output = qa_utils.GetCommandOutput(master["primary"], verify_output_cmd)
|
|
227 |
|
|
228 |
qa_utils.AssertEqual(expected_args, output.strip())
|
|
229 |
|
|
230 |
|
|
231 |
def TestOutOfBand():
|
|
232 |
"""gnt-node power"""
|
|
233 |
master = qa_config.GetMasterNode()
|
|
234 |
|
|
235 |
(oob_path, verify_path,
|
|
236 |
data_path, exit_code_path) = _CreateOobScriptStructure()
|
|
237 |
|
|
238 |
try:
|
|
239 |
AssertCommand(["gnt-cluster", "modify", "--node-parameters",
|
|
240 |
"oob_program=%s" % oob_path])
|
|
241 |
|
|
242 |
# No data, exit 0
|
|
243 |
_UpdateOobFile(exit_code_path, "0")
|
|
244 |
|
|
245 |
AssertCommand(["gnt-node", "power", "on", master["primary"]])
|
|
246 |
_AssertOobCall(verify_path, "power-on %s" % master["primary"])
|
|
247 |
|
|
248 |
AssertCommand(["gnt-node", "power", "off", master["primary"]])
|
|
249 |
_AssertOobCall(verify_path, "power-off %s" % master["primary"])
|
|
250 |
|
|
251 |
AssertCommand(["gnt-node", "power", "cycle", master["primary"]])
|
|
252 |
_AssertOobCall(verify_path, "power-cycle %s" % master["primary"])
|
|
253 |
|
|
254 |
# This command should fail as it expects output which isn't provided yet
|
|
255 |
# But it should have called the oob helper nevermind
|
|
256 |
AssertCommand(["gnt-node", "power", "status", master["primary"]],
|
|
257 |
fail=True)
|
|
258 |
_AssertOobCall(verify_path, "power-status %s" % master["primary"])
|
|
259 |
|
|
260 |
# Data, exit 0
|
|
261 |
_UpdateOobFile(data_path, serializer.DumpJson({ "powered": True }))
|
|
262 |
|
|
263 |
AssertCommand(["gnt-node", "power", "status", master["primary"]])
|
|
264 |
_AssertOobCall(verify_path, "power-status %s" % master["primary"])
|
|
265 |
|
|
266 |
AssertCommand(["gnt-node", "power", "on", master["primary"]], fail=True)
|
|
267 |
_AssertOobCall(verify_path, "power-on %s" % master["primary"])
|
|
268 |
|
|
269 |
AssertCommand(["gnt-node", "power", "off", master["primary"]], fail=True)
|
|
270 |
_AssertOobCall(verify_path, "power-off %s" % master["primary"])
|
|
271 |
|
|
272 |
AssertCommand(["gnt-node", "power", "cycle", master["primary"]], fail=True)
|
|
273 |
_AssertOobCall(verify_path, "power-cycle %s" % master["primary"])
|
|
274 |
|
|
275 |
# Data, exit 1 (all should fail)
|
|
276 |
_UpdateOobFile(exit_code_path, "1")
|
|
277 |
|
|
278 |
AssertCommand(["gnt-node", "power", "on", master["primary"]], fail=True)
|
|
279 |
_AssertOobCall(verify_path, "power-on %s" % master["primary"])
|
|
280 |
|
|
281 |
AssertCommand(["gnt-node", "power", "off", master["primary"]], fail=True)
|
|
282 |
_AssertOobCall(verify_path, "power-off %s" % master["primary"])
|
|
283 |
|
|
284 |
AssertCommand(["gnt-node", "power", "cycle", master["primary"]], fail=True)
|
|
285 |
_AssertOobCall(verify_path, "power-cycle %s" % master["primary"])
|
|
286 |
|
|
287 |
AssertCommand(["gnt-node", "power", "status", master["primary"]],
|
|
288 |
fail=True)
|
|
289 |
_AssertOobCall(verify_path, "power-status %s" % master["primary"])
|
|
290 |
|
|
291 |
# No data, exit 1 (all should fail)
|
|
292 |
_UpdateOobFile(data_path, "")
|
|
293 |
AssertCommand(["gnt-node", "power", "on", master["primary"]], fail=True)
|
|
294 |
_AssertOobCall(verify_path, "power-on %s" % master["primary"])
|
|
295 |
|
|
296 |
AssertCommand(["gnt-node", "power", "off", master["primary"]], fail=True)
|
|
297 |
_AssertOobCall(verify_path, "power-off %s" % master["primary"])
|
|
298 |
|
|
299 |
AssertCommand(["gnt-node", "power", "cycle", master["primary"]], fail=True)
|
|
300 |
_AssertOobCall(verify_path, "power-cycle %s" % master["primary"])
|
|
301 |
|
|
302 |
AssertCommand(["gnt-node", "power", "status", master["primary"]],
|
|
303 |
fail=True)
|
|
304 |
_AssertOobCall(verify_path, "power-status %s" % master["primary"])
|
|
305 |
|
|
306 |
# Different OOB script for node
|
|
307 |
verify_path2 = qa_utils.UploadData(master["primary"], "")
|
|
308 |
oob_script = ("#!/bin/sh\n"
|
|
309 |
"echo \"$@\" > %s\n") % verify_path2
|
|
310 |
oob_path2 = qa_utils.UploadData(master["primary"], oob_script, mode=0700)
|
|
311 |
|
|
312 |
try:
|
|
313 |
AssertCommand(["gnt-node", "modify", "--node-parameters",
|
|
314 |
"oob_program=%s" % oob_path2, master["primary"]])
|
|
315 |
AssertCommand(["gnt-node", "power", "on", master["primary"]])
|
|
316 |
_AssertOobCall(verify_path2, "power-on %s" % master["primary"])
|
|
317 |
finally:
|
|
318 |
AssertCommand(["gnt-node", "modify", "--node-parameters",
|
|
319 |
"oob_program=default", master["primary"]])
|
|
320 |
AssertCommand(["rm", "-f", oob_path2, verify_path2])
|
|
321 |
finally:
|
|
322 |
AssertCommand(["gnt-cluster", "modify", "--node-parameters",
|
|
323 |
"oob_program=default"])
|
|
324 |
AssertCommand(["rm", "-f", oob_path, verify_path, data_path,
|
|
325 |
exit_code_path])
|
|
326 |
|
|
327 |
|
195 |
328 |
def TestNodeList():
|
196 |
329 |
"""gnt-node list"""
|
197 |
330 |
qa_utils.GenericQueryTest("gnt-node", query.NODE_FIELDS.keys())
|