diff --git a/tests/checkchromeos.py b/tests/checkchromeos.py index 5108426a..7d9067b7 100644 --- a/tests/checkchromeos.py +++ b/tests/checkchromeos.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- """Check Chrome OS recovery images availability""" -from xml.etree import ElementTree as ET import requests from lib.inputstreamhelper.config import CHROMEOS_RECOVERY_ARM_BNAMES, CHROMEOS_RECOVERY_ARM64_BNAMES, CHROMEOS_RECOVERY_URL @@ -14,37 +13,57 @@ def __init__(self, message): super(OutdatedException, self).__init__(self.message) -def get_devices(): - """Get Chrome OS devices as json object""" - url = 'https://www.chromium.org/chromium-os/developer-library/reference/development/developer-information-for-chrome-os-devices/' - response = requests.get(url, timeout=10) - response.raise_for_status() - html = response.text.split('')[-1].split('
')[0] - html = '' + html + '
' - html = html.replace('&', '&') - html = html.replace('', 'white label') - table = ET.XML(html.encode('utf-8')) - keys = [k.text.strip() for k in table[0]] - devices = [] - for row in table[1:]: - device = {} - for num, value in enumerate(row): - device[keys[num]] = None - if value.text: - device[keys[num]] = value.text.strip() - elif value.find('a') is not None and value.find('a').text is not None: - device[keys[num]] = value.find('a').text.strip() - devices.append(device) - return devices - - def get_arm_devices(): """Get Chrome OS ARM devices as json object""" - devices = get_devices() + serves = get_serves() arm_devices = [] - for device in devices: - if device.get('User ABI').lower() in ('arm', 'aarch64'): - arm_devices.append(device) + + for main, data in serves.items(): + # Collect all candidate boards (top-level + submodels) + candidates = [] + + # Top-level board + if 'brandNameToFormattedDeviceMap' in data: + candidates.append((data.get('fsiMilestoneNumber', 0), data, main.split('-')[-1])) + + # Submodels + for sub_data in (data.get('models') or {}).values(): + if 'brandNameToFormattedDeviceMap' in sub_data: + candidates.append((sub_data.get('fsiMilestoneNumber', 0), sub_data, main)) + + if not candidates: + continue + + # Pick the board with the highest milestone number + _, best, board = max(candidates, key=lambda x: x[0] or 0) + + device_map = best.get('brandNameToFormattedDeviceMap', {}) + push_recoveries = best.get('pushRecoveries', {}) + max_version = int(max(push_recoveries.keys(), default=0)) + first_available = best.get('fsiMilestoneNumber') + eol = best.get('isAue', False) + + serving_stable = best.get('servingStable', {}) + chrome_version = serving_stable.get('chromeVersion') + version = serving_stable.get('version') + + # Build output entries for ARM devices + entry = { + board: { + 'first': first_available, + 'last': max_version, + 'eol': eol, + 'chrome': chrome_version, + 'version': version, + } + } + + # Append only if architecture is ARM + for info in device_map.values(): + arch = info.get('architecture', '').lower() + if arch in {'arm_64', 'arm_32'} and entry not in arm_devices: + arm_devices.append(entry) + return arm_devices @@ -68,13 +87,11 @@ def get_recoveries(): def get_compatibles(): """Get compatible Chrome OS recovery items""" arm_devices = get_arm_devices() - serves = get_serves() recoveries = get_recoveries() compatibles = [] for device in arm_devices: - board = device.get('Board name(s)').lower().replace('_', '-') - served_board = serves.get(board) - if served_board and not served_board.get('isAue'): + board = next(iter(device), None) + if board and not device[board].get('eol'): for recovery in recoveries: r_board = recovery.get('file').split('_')[2] if board == r_board: