You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
4.1 KiB
118 lines
4.1 KiB
# Copyright 2020 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.
|
|
|
|
from autotest_lib.client.common_lib import error
|
|
from chromite.lib import retry_util
|
|
|
|
|
|
_VPD_BASE_CMD = 'vpd -i %s %s %s'
|
|
_RW = 'RW_VPD'
|
|
_RO = 'RO_VPD'
|
|
|
|
|
|
def _check_partition(partition):
|
|
"""
|
|
Used to validate input string in other functions.
|
|
|
|
@param partition: If this is not 'RO_VPD' or 'RW_VPD', raise a ValueError.
|
|
|
|
"""
|
|
if partition not in [_RW, _RO]:
|
|
raise ValueError("partition should be 'RW_VPD' or 'RO_VPD'")
|
|
|
|
|
|
def dump_vpd_log(host, force=True, retries=3):
|
|
"""
|
|
Applies changes to the VPD settings by flushing them to the VPD cache and
|
|
output files.
|
|
|
|
@param host: Host to run the command on.
|
|
@param force: True to pass in the --force parameter to forcefully dump
|
|
the log. False to omit it.
|
|
@param retries: Number of times to try rerunning the command in case of
|
|
error.
|
|
|
|
"""
|
|
vpd_dump_cmd = 'dump_vpd_log%s' % (' --force' if force else '')
|
|
retry_util.RetryException(error.AutoservRunError, retries, host.run,
|
|
vpd_dump_cmd)
|
|
|
|
|
|
def vpd_get(host, key, partition='RW_VPD', retries=3):
|
|
"""
|
|
Gets the VPD value associated with the input key.
|
|
|
|
@param host: Host to run the command on.
|
|
@param key: Key of the desired VPD value.
|
|
@param partition: Which partition to access. 'RO_VPD' or 'RW_VPD'.
|
|
@param retries: Number of times to try rerunning the command in case of
|
|
error.
|
|
|
|
"""
|
|
_check_partition(partition)
|
|
get_cmd = _VPD_BASE_CMD % (partition, '-g', key)
|
|
try:
|
|
return retry_util.RetryException(error.AutoservRunError, retries,
|
|
host.run, get_cmd).stdout
|
|
except error.AutoservRunError as e:
|
|
if 'was not found' in str(e.result_obj.stderr):
|
|
return None
|
|
else:
|
|
raise e
|
|
|
|
|
|
def vpd_set(host, vpd_dict, partition='RW_VPD', dump=False, force_dump=False,
|
|
retries=3):
|
|
"""
|
|
Sets the given key/value pairs in the specified VPD partition.
|
|
|
|
@param host: Host to run the command on.
|
|
@param vpd_dict: Dictionary containing the VPD key/value pairs to set.
|
|
Dictionary keys should be the VPD key strings, and values
|
|
should be the desired values to write.
|
|
@param partition: Which partition to access. 'RO_VPD' or 'RW_VPD'.
|
|
@param dump: If True, also run dump_vpd_log command after setting the
|
|
vpd values.
|
|
@param force_dump: Whether or not to forcefully dump the vpd log.
|
|
@param retries: Number of times to try rerunning the command in case of
|
|
error.
|
|
|
|
"""
|
|
_check_partition(partition)
|
|
for vpd_key in vpd_dict:
|
|
set_cmd = _VPD_BASE_CMD % (partition, '-s',
|
|
(vpd_key + '=' + str(vpd_dict[vpd_key])))
|
|
retry_util.RetryException(error.AutoservRunError, retries,
|
|
host.run, set_cmd).stdout
|
|
|
|
if dump:
|
|
dump_vpd_log(host, force=force_dump, retries=retries)
|
|
|
|
|
|
def vpd_delete(host, key, partition='RW_VPD', dump=False, force_dump=False,
|
|
retries=3):
|
|
"""
|
|
Deletes the specified key from the specified VPD partition.
|
|
|
|
@param host: Host to run the command on.
|
|
@param key: The VPD value to delete.
|
|
@param partition: Which partition to access. 'RO_VPD' or 'RW_VPD'.
|
|
@param dump: If True, also run dump_vpd_log command after deleting the
|
|
vpd value.
|
|
@param force_dump: Whether or not to forcefully dump the vpd log.
|
|
@param retries: Number of times to try rerunning the command in case of
|
|
error.
|
|
|
|
"""
|
|
_check_partition(partition)
|
|
if not vpd_get(host, key, partition=partition, retries=retries):
|
|
return
|
|
|
|
del_cmd = _VPD_BASE_CMD % (partition, '-d', key)
|
|
retry_util.RetryException(error.AutoservRunError, retries, host.run,
|
|
del_cmd).stdout
|
|
|
|
if dump:
|
|
dump_vpd_log(host, force=force_dump, retries=retries)
|