~vila/ubuntu-test-cases/retry-apt-get-update

« back to all changes in this revision

Viewing changes to scripts/device_info.py

  • Committer: Leo Arias
  • Date: 2014-11-10 19:28:56 UTC
  • mfrom: (345 touch)
  • mto: This revision was merged to the branch mainline in revision 352.
  • Revision ID: leo.arias@canonical.com-20141110192856-rgpksx9n9j0b39yl
Merged with the touch branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
 
 
3
import logging
 
4
import re
 
5
import subprocess
 
6
import time
 
7
 
 
8
from ncd_usb import set_relay
 
9
 
 
10
log = logging.getLogger()
 
11
logging.basicConfig(level=logging.INFO)
 
12
 
 
13
 
 
14
class DeviceError(Exception):
 
15
    pass
 
16
 
 
17
 
 
18
class TouchDevice(object):
 
19
    def __init__(self, devtype, serial, relay_url=None, bank=None,
 
20
                 power_pin=None, volume_down_pin=None, volume_up_pin=None):
 
21
        self.devtype = devtype
 
22
        self.serial = serial
 
23
        self.relay_url = relay_url
 
24
        self.bank = bank
 
25
        self.power_pin = power_pin
 
26
        self.volume_down_pin = volume_down_pin
 
27
        self.volume_up_pin = volume_up_pin
 
28
 
 
29
    def get_serial(self):
 
30
        return self.serial
 
31
 
 
32
    def get_state(self):
 
33
        """
 
34
        Check adb and fastboot to determine the state a device is in.
 
35
        Possible return values are:
 
36
            device, recovery, unknown, bootloader, disconnected
 
37
        """
 
38
        pattern = "{}\t(.+)\n".format(self.serial)
 
39
        adb_devices = subprocess.check_output(['adb', 'devices'])
 
40
        found = re.search(pattern, adb_devices)
 
41
        if not found:
 
42
            #Otherwise, check fastboot
 
43
            fastboot_devices = subprocess.check_output(['fastboot', 'devices'])
 
44
            found = re.search(pattern, fastboot_devices)
 
45
        if found:
 
46
            state = found.group(1)
 
47
            return state
 
48
        else:
 
49
            return 'disconnected'
 
50
 
 
51
    def check_adb_shell(self):
 
52
        # Run a quick command in adb to see if the device is responding
 
53
        # subprocess will handle raising an exception if anything
 
54
        # goes wrong
 
55
        subprocess.check_call(['timeout', '10', 'adb', '-s',
 
56
                               self.serial, 'shell', 'pwd'])
 
57
 
 
58
    def reimage_from_fastboot(self):
 
59
        #Starting from fastboot mode, put a known-good image on the device
 
60
        log.info("Flashing the last stable image")
 
61
        subprocess.check_output(['ubuntu-device-flash', 'touch', '--serial',
 
62
                                 self.serial, '--channel',
 
63
                                 'ubuntu-touch/stable', '--bootstrap',
 
64
                                 '--developer-mode',
 
65
                                 '--password', '0000'])
 
66
        return self.wait_for_device(600)
 
67
 
 
68
    def wait_for_fastboot(self, timeout=120):
 
69
        if timeout > 10:
 
70
            wait = 10
 
71
        else:
 
72
            wait = timeout
 
73
        waited = 0
 
74
        while waited < timeout:
 
75
            state = self.get_state()
 
76
            if state == 'fastboot':
 
77
                return 0
 
78
            time.sleep(wait)
 
79
            waited += wait
 
80
        else:
 
81
            state = self.get_state()
 
82
            if state == 'fastboot':
 
83
                return 0
 
84
            log.error("Timed out waiting for fastboot. Recover device "
 
85
                      "manually")
 
86
            raise DeviceError("Device in state: {0}, still not available "
 
87
                              "after {1} seconds".format(state, timeout))
 
88
 
 
89
    def wait_for_device(self, timeout=120):
 
90
        # Wait for the device to come up to a good/booted state
 
91
        log.info("Waiting for the device to become available")
 
92
        try:
 
93
            subprocess.check_call(['timeout', str(timeout), 'adb', '-s',
 
94
                                  self.serial, 'wait-for-device'])
 
95
        except:
 
96
            log.error("Timed out waiting for device.")
 
97
            raise
 
98
        dev_state = self.get_state()
 
99
        if dev_state != 'device':
 
100
            log.error("Device in state: {0}, still not available after "
 
101
                      "{1} seconds".format(dev_state, timeout))
 
102
            raise DeviceError("Timed out waiting for device to respond after "
 
103
                              "{1} seconds".format(dev_state, timeout))
 
104
        else:
 
105
            log.info("Device is now available")
 
106
            return 0
 
107
 
 
108
    def force_bootloader(self):
 
109
        bootloader_func = getattr(
 
110
            self, '_{}_to_bootloader'.format(self.devtype))
 
111
        if bootloader_func and callable(bootloader_func):
 
112
            bootloader_func()
 
113
        else:
 
114
            raise DeviceError("Full recovery not possible with this device")
 
115
 
 
116
    def _krillin_to_bootloader(self):
 
117
        log.info("Forcing the device to enter the bootloader")
 
118
        #Power off the device from any state
 
119
        set_relay(self.relay_url, self.bank, self.power_pin, 1)
 
120
        set_relay(self.relay_url, self.bank, self.volume_down_pin, 1)
 
121
        set_relay(self.relay_url, self.bank, self.volume_up_pin, 1)
 
122
        time.sleep(16)
 
123
        set_relay(self.relay_url, self.bank, self.power_pin, 0)
 
124
        time.sleep(6)
 
125
        set_relay(self.relay_url, self.bank, self.volume_down_pin, 0)
 
126
        set_relay(self.relay_url, self.bank, self.volume_up_pin, 0)
 
127
 
 
128
    def _flo_to_bootloader(self):
 
129
        log.info("Forcing the device to enter the bootloader")
 
130
        #Power off the device from any state
 
131
        set_relay(self.relay_url, self.bank, self.power_pin, 1)
 
132
        time.sleep(12)
 
133
        set_relay(self.relay_url, self.bank, self.power_pin, 0)
 
134
        time.sleep(10)
 
135
        set_relay(self.relay_url, self.bank, self.volume_down_pin, 1)
 
136
        set_relay(self.relay_url, self.bank, self.power_pin, 1)
 
137
        time.sleep(5)
 
138
        set_relay(self.relay_url, self.bank, self.power_pin, 0)
 
139
        time.sleep(1)
 
140
        set_relay(self.relay_url, self.bank, self.volume_down_pin, 0)
 
141
 
 
142
    def _mako_to_bootloader(self):
 
143
        log.info("Forcing the device to enter the bootloader")
 
144
        #Power off the device from any state
 
145
        set_relay(self.relay_url, self.bank, self.power_pin, 1)
 
146
        time.sleep(10)
 
147
        set_relay(self.relay_url, self.bank, self.power_pin, 0)
 
148
        time.sleep(10)
 
149
        #Enter the bootloader
 
150
        set_relay(self.relay_url, self.bank, self.volume_down_pin, 1)
 
151
        set_relay(self.relay_url, self.bank, self.power_pin, 1)
 
152
        time.sleep(5)
 
153
        set_relay(self.relay_url, self.bank, self.volume_down_pin, 0)
 
154
        set_relay(self.relay_url, self.bank, self.power_pin, 0)
 
155
 
 
156
 
 
157
# When looking at the relay webUI for the mapping, we consider all
 
158
# ports and banks to start numbering from 0
 
159
DEVICES = {
 
160
    "krillin-01": TouchDevice("krillin", "JB011018"),
 
161
    "krillin-02": TouchDevice("krillin", "JB010894"),
 
162
    "krillin-03": TouchDevice("krillin", "JB015156",
 
163
                              relay_url="http://ferris.ubuntu-ci",
 
164
                              bank=2, power_pin=0, volume_up_pin=1,
 
165
                              volume_down_pin=2),
 
166
    "krillin-04": TouchDevice("krillin", "JB006885",
 
167
                              relay_url="http://ferris.ubuntu-ci",
 
168
                              bank=1, power_pin=4, volume_up_pin=5,
 
169
                              volume_down_pin=6),
 
170
    "krillin-05": TouchDevice("krillin", "JB015256"),
 
171
    "krillin-06": TouchDevice("krillin", "JW010687"),
 
172
    "krillin-07": TouchDevice("krillin", "JW011999",
 
173
                              relay_url="http://ferris.ubuntu-ci",
 
174
                              bank=2, power_pin=4, volume_up_pin=5,
 
175
                              volume_down_pin=6),
 
176
    "krillin-08": TouchDevice("krillin", "JW013513",
 
177
                              relay_url="http://ferris.ubuntu-ci",
 
178
                              bank=1, power_pin=0, volume_up_pin=1,
 
179
                              volume_down_pin=2),
 
180
    "krillin-09": TouchDevice("krillin", "JW010053",
 
181
                              relay_url="http://ferris.ubuntu-ci",
 
182
                              bank=0, power_pin=4, volume_up_pin=5,
 
183
                              volume_down_pin=6),
 
184
    "krillin-10": TouchDevice("krillin", "JB012976",
 
185
                              relay_url="http://decatur.ubuntu-ci",
 
186
                              bank=2, power_pin=0, volume_up_pin=1,
 
187
                              volume_down_pin=2),
 
188
    "ps-mako-01": TouchDevice("mako", "0090f741e3d141bc"),
 
189
    "ps-mako-02": TouchDevice("mako", "04ccca120acd4dea"),
 
190
    "ps-mako-03": TouchDevice("mako", "04cb53b598546534"),
 
191
    "ps-mako-04": TouchDevice("mako", "04cbcc545f5328a5"),
 
192
    "mako-01": TouchDevice("mako", "01aa3d7a5dcba4a2"),
 
193
    "mako-02": TouchDevice("mako", "01ade38b552014d4"),
 
194
    "mako-03": TouchDevice("mako", "04c6714ed7c863f2"),
 
195
    "mako-04": TouchDevice("mako", "04df89cf0f9d0933",
 
196
                           relay_url="http://qa-relay-control.ubuntu-ci",
 
197
                           bank=1, power_pin=4, volume_down_pin=5),
 
198
    "mako-05": TouchDevice("mako", "01b22f82dc5cec63",
 
199
                           relay_url="http://decatur.ubuntu-ci",
 
200
                           bank=0, power_pin=0, volume_down_pin=1),
 
201
    "mako-06": TouchDevice("mako", "04ed70928fdc13ba",
 
202
                           relay_url="http://decatur.ubuntu-ci",
 
203
                           bank=0, power_pin=2, volume_down_pin=3),
 
204
    "mako-07": TouchDevice("mako", "01e2f64788556934",
 
205
                           relay_url="http://decatur.ubuntu-ci",
 
206
                           bank=0, power_pin=4, volume_down_pin=5),
 
207
    "mako-08": TouchDevice("mako", "04ea16a163930769",
 
208
                           relay_url="http://decatur.ubuntu-ci",
 
209
                           bank=0, power_pin=6, volume_down_pin=7),
 
210
    "mako-09": TouchDevice("mako", "04fda12ea08fe3c7"),
 
211
    "mako-10": TouchDevice("mako", "01ce848e48dfa6a2"),
 
212
    "mako-11": TouchDevice("mako", "04ed727c929709ba"),
 
213
    #If looking at the LAB wiki page, subtract 1 from the bank and pin numbers
 
214
    #from what it says on the wiki (our numbers start at 0)
 
215
    "mako-12": TouchDevice("mako", "00693fd555c9186a",
 
216
                           relay_url="http://qa-relay-control.ubuntu-ci",
 
217
                           bank=0, power_pin=1, volume_down_pin=2),
 
218
    "mako-13": TouchDevice("mako", "0084e99c5315731b",
 
219
                           relay_url="http://qa-relay-control.ubuntu-ci",
 
220
                           bank=0, power_pin=3, volume_down_pin=4),
 
221
    "mako-14": TouchDevice("mako", "007c6d84d348838e",
 
222
                           relay_url="http://qa-relay-control.ubuntu-ci",
 
223
                           bank=0, power_pin=5, volume_down_pin=6),
 
224
    "mako-15": TouchDevice("mako", "00763b4a61ce0f87",
 
225
                           relay_url="http://qa-relay-control.ubuntu-ci",
 
226
                           bank=1, power_pin=0, volume_down_pin=1),
 
227
    "mako-16": TouchDevice("mako", "017121eacf5282c4",
 
228
                           relay_url="http://qa-relay-control.ubuntu-ci",
 
229
                           bank=1, power_pin=2, volume_down_pin=3),
 
230
    #mako-17 has a broken screen but should work, on ashes
 
231
    "mako-17": TouchDevice("mako", "04e0d2f6d3cab77d"),
 
232
    "mako-18": TouchDevice("mako", "027b981a4c1110dd",
 
233
                           relay_url="http://decatur.ubuntu-ci",
 
234
                           bank=1, power_pin=0, volume_down_pin=1),
 
235
    "mako-19": TouchDevice("mako", "021c8cdfd5d38602"),
 
236
    "mako-20": TouchDevice("mako", "05083705e0d29402",
 
237
                           relay_url="http://decatur.ubuntu-ci",
 
238
                           bank=1, power_pin=2, volume_down_pin=3),
 
239
    "ps-manta-01": TouchDevice("manta", "R32D203DDZR"),
 
240
    "manta-01": TouchDevice("manta", "R32D102RPZL"),
 
241
    "manta-02": TouchDevice("manta", "R32D102RPPK"),
 
242
    "manta-03": TouchDevice("manta", "R32D200N4YH"),
 
243
    "manta-05": TouchDevice("manta", "R32D203DMBY"),  # Out of lab for now
 
244
    "flo-01": TouchDevice("flo", "09f306dc"),
 
245
    "flo-02": TouchDevice("flo", "08dbee36"),
 
246
    "flo-03": TouchDevice("flo", "09d55fa8"),
 
247
    "flo-04": TouchDevice("flo", "09e68682"),
 
248
    "flo-05": TouchDevice("flo", "0a22f7cf",
 
249
                          relay_url="http://ferris.ubuntu-ci",
 
250
                          bank=0, power_pin=0, volume_down_pin=2),
 
251
    "flo-06": TouchDevice("flo", "08f09bb0"),
 
252
}
 
253
 
 
254
 
 
255
def get_device(name):
 
256
    # This raises KeyError if we don't have any record of that device
 
257
    return DEVICES[name]