194 lines
7.9 KiB
Python
194 lines
7.9 KiB
Python
|
|
# Lint as: python3
|
||
|
|
# Copyright 2022 The Chromium OS Authors. All rights reserved.
|
||
|
|
# Use of this source code is governed by a BSD-style license that can be
|
||
|
|
# found in the LICENSE file.
|
||
|
|
|
||
|
|
import logging
|
||
|
|
|
||
|
|
from autotest_lib.client.common_lib import error
|
||
|
|
from autotest_lib.client.common_lib.cros import kernel_utils
|
||
|
|
from autotest_lib.server.cros.minios import minios_test
|
||
|
|
|
||
|
|
|
||
|
|
class autoupdate_MiniOS(minios_test.MiniOsTest):
|
||
|
|
"""Tests MiniOS update. """
|
||
|
|
|
||
|
|
version = 1
|
||
|
|
|
||
|
|
_EXCLUSION_PREFS_DIR = "exclusion"
|
||
|
|
_MINIOS_PREFS_DIR = "minios"
|
||
|
|
|
||
|
|
def initialize(self, host=None):
|
||
|
|
"""
|
||
|
|
Clear test related prefs on the DUT before starting the test.
|
||
|
|
|
||
|
|
"""
|
||
|
|
super(autoupdate_MiniOS, self).initialize(host=host)
|
||
|
|
self._remove_minios_update_prefs()
|
||
|
|
|
||
|
|
def cleanup(self):
|
||
|
|
super(autoupdate_MiniOS, self).cleanup()
|
||
|
|
self._save_extra_update_engine_logs(number_of_logs=2)
|
||
|
|
self._remove_minios_update_prefs()
|
||
|
|
|
||
|
|
def _remove_minios_update_prefs(self):
|
||
|
|
for pref in ((self._EXCLUSION_PREFS_DIR, True),
|
||
|
|
(self._MINIOS_PREFS_DIR, True)):
|
||
|
|
self._remove_update_engine_pref(pref=pref[0], is_dir=pref[1])
|
||
|
|
|
||
|
|
def _setup_minios_update(self, has_update, with_exclusion=False):
|
||
|
|
# Get payload URL for the MiniOS update.
|
||
|
|
# We'll always need a full payload for MiniOS update.
|
||
|
|
payload_url = self.get_payload_for_nebraska(
|
||
|
|
job_repo_url=self._job_repo_url,
|
||
|
|
full_payload=True,
|
||
|
|
payload_type=self._PAYLOAD_TYPE.MINIOS,
|
||
|
|
public_bucket=self._running_at_desk)
|
||
|
|
self._payload_urls.append(payload_url)
|
||
|
|
|
||
|
|
# Test that MiniOS payload can be excluded by creating a pref file.
|
||
|
|
# This simulates that the update engine tries to exclude MiniOS payload
|
||
|
|
# after getting certain types of MiniOS update failure.
|
||
|
|
if with_exclusion:
|
||
|
|
self._create_update_engine_pref(
|
||
|
|
pref_name=self._get_exclusion_name(payload_url),
|
||
|
|
sub_dir=self._EXCLUSION_PREFS_DIR)
|
||
|
|
|
||
|
|
# MiniOS booting to be verified.
|
||
|
|
if has_update:
|
||
|
|
self._verifications.append(self._boot_minios)
|
||
|
|
|
||
|
|
def _setup_cros_update(self, has_update):
|
||
|
|
if has_update:
|
||
|
|
# Get payload URL for the platform (OS) update.
|
||
|
|
self._payload_urls.append(
|
||
|
|
self.get_payload_for_nebraska(
|
||
|
|
job_repo_url=self._job_repo_url,
|
||
|
|
full_payload=self._full_payload,
|
||
|
|
public_bucket=self._running_at_desk))
|
||
|
|
|
||
|
|
# Platform (OS) update to be verified.
|
||
|
|
self._verifications.append(lambda: self._verify_cros_update(
|
||
|
|
updated=has_update))
|
||
|
|
|
||
|
|
def _setup_dlc_update(self):
|
||
|
|
# Payload URLs for sample-dlc, a test DLC package.
|
||
|
|
# We'll always need a full payload for DLC installation,
|
||
|
|
# and optionally a delta payload if required by the test.
|
||
|
|
self._payload_urls.append(
|
||
|
|
self.get_payload_for_nebraska(
|
||
|
|
job_repo_url=self._job_repo_url,
|
||
|
|
full_payload=True,
|
||
|
|
payload_type=self._PAYLOAD_TYPE.DLC,
|
||
|
|
public_bucket=self._running_at_desk))
|
||
|
|
if not self._full_payload:
|
||
|
|
self._payload_urls.append(
|
||
|
|
self.get_payload_for_nebraska(
|
||
|
|
job_repo_url=self._job_repo_url,
|
||
|
|
full_payload=False,
|
||
|
|
payload_type=self._PAYLOAD_TYPE.DLC,
|
||
|
|
public_bucket=self._running_at_desk))
|
||
|
|
|
||
|
|
# DLC update to be verified.
|
||
|
|
self._verifications.append(self._verify_dlc_update)
|
||
|
|
|
||
|
|
def _verify_cros_update(self, updated):
|
||
|
|
if updated:
|
||
|
|
# Verify the platform (OS) update completed successfully.
|
||
|
|
kernel_utils.verify_boot_expectations(self._inactive_cros,
|
||
|
|
host=self._host)
|
||
|
|
rootfs_hostlog, _ = self._create_hostlog_files()
|
||
|
|
self.verify_update_events(self._FORCED_UPDATE, rootfs_hostlog)
|
||
|
|
else:
|
||
|
|
# Verify the Platform (OS) boot expectation unchanged.
|
||
|
|
kernel_utils.verify_boot_expectations(self._active_cros,
|
||
|
|
host=self._host)
|
||
|
|
|
||
|
|
def _verify_dlc_update(self):
|
||
|
|
# Verify the DLC update completed successfully.
|
||
|
|
dlc_rootfs_hostlog, _ = self._create_dlc_hostlog_files()
|
||
|
|
logging.info('Checking DLC update events')
|
||
|
|
self.verify_update_events(
|
||
|
|
self._FORCED_UPDATE,
|
||
|
|
dlc_rootfs_hostlog[self._dlc_util._SAMPLE_DLC_ID])
|
||
|
|
# Verify the DLC was successfully installed.
|
||
|
|
self._dlc_util.remove_preloaded(self._dlc_util._SAMPLE_DLC_ID)
|
||
|
|
self._dlc_util.install(self._dlc_util._SAMPLE_DLC_ID,
|
||
|
|
omaha_url='fake_url')
|
||
|
|
if not self._dlc_util.is_installed(self._dlc_util._SAMPLE_DLC_ID):
|
||
|
|
raise error.TestFail('Test DLC was not installed.')
|
||
|
|
|
||
|
|
def run_once(self,
|
||
|
|
full_payload=True,
|
||
|
|
job_repo_url=None,
|
||
|
|
with_os=False,
|
||
|
|
with_dlc=False,
|
||
|
|
with_exclusion=False,
|
||
|
|
running_at_desk=False):
|
||
|
|
"""
|
||
|
|
Tests that we can successfully update MiniOS along with the OS.
|
||
|
|
|
||
|
|
@param full_payload: True for full OS and DLC payloads. False for delta.
|
||
|
|
@param job_repo_url: This is used to figure out the current build and
|
||
|
|
the devserver to use. The test will read this
|
||
|
|
from a host argument when run in the lab.
|
||
|
|
@param with_os: True for MiniOS update along with Platform (OS)
|
||
|
|
update. False for MiniOS only update.
|
||
|
|
@param with_dlc: True for MiniOS update with Platform (OS) and DLC.
|
||
|
|
False for turning off DLC update.
|
||
|
|
@param with_exclusion: True for excluding MiniOS payload.
|
||
|
|
@param running_at_desk: Indicates test is run locally from a
|
||
|
|
workstation.
|
||
|
|
|
||
|
|
"""
|
||
|
|
self._full_payload = full_payload
|
||
|
|
self._job_repo_url = job_repo_url
|
||
|
|
self._running_at_desk = running_at_desk
|
||
|
|
|
||
|
|
if not with_os and with_dlc:
|
||
|
|
logging.info("DLC only updates with the platform (OS), "
|
||
|
|
"automatically set with_os to True.")
|
||
|
|
with_os = True
|
||
|
|
|
||
|
|
# Record DUT state before the update.
|
||
|
|
self._active_cros, self._inactive_cros \
|
||
|
|
= kernel_utils.get_kernel_state(self._host)
|
||
|
|
active_minios, inactive_minios \
|
||
|
|
= kernel_utils.get_minios_priority(self._host)
|
||
|
|
|
||
|
|
minios_update = with_os and not with_exclusion
|
||
|
|
# MiniOS update to be verified.
|
||
|
|
self._verifications = [
|
||
|
|
lambda: kernel_utils.verify_minios_priority_after_update(
|
||
|
|
self._host,
|
||
|
|
expected=inactive_minios
|
||
|
|
if minios_update else active_minios)
|
||
|
|
]
|
||
|
|
|
||
|
|
# Get payload URLs and setup tests.
|
||
|
|
self._payload_urls = []
|
||
|
|
self._setup_cros_update(has_update=with_os)
|
||
|
|
if with_dlc:
|
||
|
|
self._setup_dlc_update()
|
||
|
|
self._setup_minios_update(has_update=minios_update,
|
||
|
|
with_exclusion=with_exclusion)
|
||
|
|
|
||
|
|
# Update MiniOS.
|
||
|
|
if with_dlc:
|
||
|
|
self._run_client_test_and_check_result(
|
||
|
|
'autoupdate_InstallAndUpdateDLC',
|
||
|
|
payload_urls=self._payload_urls,
|
||
|
|
allow_failure=not with_os)
|
||
|
|
else:
|
||
|
|
self._run_client_test_and_check_result(
|
||
|
|
'autoupdate_CannedOmahaUpdate',
|
||
|
|
payload_url=self._payload_urls,
|
||
|
|
allow_failure=not with_os)
|
||
|
|
|
||
|
|
if with_os:
|
||
|
|
self._host.reboot()
|
||
|
|
|
||
|
|
# Verify updates.
|
||
|
|
for verify in self._verifications:
|
||
|
|
verify()
|