331
332
# type, however this is left here to prevent PEBKAC.
332
333
raise PowerActionFail("Unknown power_type '%s'" % power_type)
335
def check_power_state(state):
336
if state not in ("on", "off", "unknown"):
337
# This is considered an error.
338
raise PowerActionFail(state)
340
# Capture errors as we go along.
341
exc_info = None, None, None
334
343
# Use increasing waiting times to work around race conditions that could
335
344
# arise when power querying the node.
336
345
for waiting_time in default_waiting_policy:
338
346
# Perform power query.
340
348
power_state = yield deferToThread(
341
perform_power_query, system_id, hostname, power_type, context)
342
if power_state not in ("on", "off", "unknown"):
343
# This is considered an error.
344
raise PowerActionFail(power_state)
345
except PowerActionFail as e:
346
# Hold the error so if failure after retries, we can
349
perform_power_query, system_id, hostname,
351
check_power_state(power_state)
353
# Hold the error; it may be reported later.
354
exc_info = sys.exc_info()
350
355
# Wait before trying again.
351
356
yield pause(waiting_time, clock)
353
yield power_state_update(system_id, power_state)
354
returnValue(power_state)
358
yield power_state_update(system_id, power_state)
359
returnValue(power_state)
356
# Send node is broken, since query failed after the multiple retries.
357
message = "Node could not be queried %s (%s) %s" % (
358
system_id, hostname, error)
361
# Reaching here means that things have gone wrong.
362
assert exc_info != (None, None, None)
363
exc_type, exc_value, exc_trace = exc_info
364
message = "Power state could not be queried: %s" % (exc_value,)
359
365
yield power_query_failure(system_id, hostname, message)
360
raise PowerActionFail(error)
366
raise exc_type, exc_value, exc_trace
363
369
def maaslog_report_success(node, power_state):