~pwlars/ubuntu-test-cases/auto-offline-devices

« back to all changes in this revision

Viewing changes to scripts/recover.py

  • Committer: Paul Larson
  • Date: 2014-10-01 20:46:18 UTC
  • Revision ID: paul.larson@canonical.com-20141001204618-cwk7krb1hzoarf14
mark devices offline automatically if something goes wrong during recovery

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
 
3
3
import device_info
4
4
import logging
 
5
import os
 
6
import requests
5
7
import subprocess
6
8
import sys
7
9
import time
32
34
                               serial, 'wait-for-device'])
33
35
    except:
34
36
        log.error("Timed out waiting for reboot. Recover device manually")
 
37
        _offline_device()
35
38
        raise
36
39
    dev_state = device_info.get_state(serial)
37
40
    if dev_state != 'device':
 
41
        _offline_device()
38
42
        raise DeviceError("Device in state: {0}, still not available after "
39
43
                          "{1} seconds".format(dev_state, timeout))
40
44
    else:
87
91
    (url, bank, power, volume) = device_info.get_power(device_name)
88
92
    if None in (url, bank, power, volume):
89
93
        #This device does not have information about relays
 
94
        _offline_device()
90
95
        raise DeviceError("Full recovery not possible with this device")
91
96
    _mako_to_bootloader(url, bank, power, volume)
92
97
    serial = device_info.get_serial(device_name)
94
99
    _reimage_from_fastboot(serial)
95
100
 
96
101
 
 
102
def _offline_device():
 
103
    user = os.environ.get('OFFLINE_DEVICE_USER', None)
 
104
    key = os.environ.get('OFFLINE_DEVICE_KEY', None)
 
105
    host = os.environ.get('JENKINS_URL', None)
 
106
    # It's unlikely the node name will be different, but just in case
 
107
    node = os.environ.get('NODE_NAME', None)
 
108
    if not (user and key and host and node):
 
109
        log.info("Unable to mark device offline automatically")
 
110
    url = "{}/computer/{}/toggleOffline".format(host, node)
 
111
    param_data = {'offlineMessage': 'unrecoverable'}
 
112
    response = requests.post(url, params=param_data, auth=(user, key))
 
113
    if response.status_code != 200:
 
114
        log.error("Error marking {} offline".format(node))
 
115
    else:
 
116
        log.info("{} has been marked offline".format(node))
 
117
 
 
118
 
97
119
def recover(device):
98
120
    try:
99
121
        serial = device_info.get_serial(device)
111
133
        #The device is in an unknown state, we need full recovery
112
134
        return _full_recovery(device)
113
135
    #In theory, we should never get here, but....
 
136
    _offline_device()
114
137
    raise DeviceError("Device '{}' is in an unknown state!".format(device))
115
138
 
116
139