blob: cd7cb2d526e7f3802354a0442a8d7f7d58f75923 [file] [log] [blame]
# 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)