~allenap/maas/fix-migration-0139-upgrade-from-1.8.1-to-1.9--1.8

« back to all changes in this revision

Viewing changes to src/provisioningserver/rpc/power.py

  • Committer: Gavin Panella
  • Date: 2015-07-15 11:55:03 UTC
  • mto: This revision was merged to the branch mainline in revision 4022.
  • Revision ID: gavin.panella@canonical.com-20150715115503-yed74o3k7ahkipni
Merge r4076 from lp:maas, resolving some tricky conflicts.

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
 
20
20
from datetime import timedelta
21
21
from functools import partial
 
22
import sys
22
23
 
23
24
from provisioningserver.events import (
24
25
    EVENT_TYPES,
331
332
        # type, however this is left here to prevent PEBKAC.
332
333
        raise PowerActionFail("Unknown power_type '%s'" % power_type)
333
334
 
 
335
    def check_power_state(state):
 
336
        if state not in ("on", "off", "unknown"):
 
337
            # This is considered an error.
 
338
            raise PowerActionFail(state)
 
339
 
 
340
    # Capture errors as we go along.
 
341
    exc_info = None, None, None
 
342
 
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:
337
 
        error = None
338
346
        # Perform power query.
339
347
        try:
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
347
 
            # log the reason.
348
 
            error = e
349
 
 
 
349
                perform_power_query, system_id, hostname,
 
350
                power_type, context)
 
351
            check_power_state(power_state)
 
352
        except:
 
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)
352
 
            continue
353
 
        yield power_state_update(system_id, power_state)
354
 
        returnValue(power_state)
 
357
        else:
 
358
            yield power_state_update(system_id, power_state)
 
359
            returnValue(power_state)
355
360
 
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
361
367
 
362
368
 
363
369
def maaslog_report_success(node, power_state):