Commit 25859894 authored by Matt Hart's avatar Matt Hart Committed by Rémi Duraffort

Better detect errors in the bootloader

- Unify the bootloader interrupt action for all bootloaders to use
- Check for error messages throughout bootloader interaction
- Be reasonably confident that failures after bootloader commands, are kernel

Change-Id: Ib8413baf5667dec4d487a9ca40f9b222be3c0b19
parent 324615d7
......@@ -156,6 +156,7 @@ class AutoLoginAction(Action):
def validate(self): # pylint: disable=too-many-branches
super(AutoLoginAction, self).validate()
# Skip auto login if the configuration is not found
self.method = self.parameters['method']
params = self.parameters.get('auto_login', None)
if params:
if not isinstance(params, dict):
......@@ -224,6 +225,20 @@ class AutoLoginAction(Action):
def run(self, connection, max_end_time, args=None):
# Prompts commonly include # - when logging such strings,
# use lazy logging or the string will not be quoted correctly.
self.params = self.job.device['actions']['boot']['methods'][self.method]['parameters']
self.kernel_start_message = self.job.device.get_constant('kernel-start-message')
connection.prompt_str = [self.kernel_start_message]
if self.params.get('boot_message', None):
self.logger.warning("boot_message is being deprecated in favour of kernel-start-message in constants")
connection.prompt_str = [self.params.get('boot_message')]
error_messages = self.job.device.get_constant('error-messages', prefix=self.method, missing_ok=True)
if error_messages:
connection.prompt_str = connection.prompt_str + error_messages
res = self.wait(connection)
if res != 0:
raise InfrastructureError('matched a bootloader error message')
def check_prompt_characters(chk_prompt):
if not any([True for c in DISTINCTIVE_PROMPT_CHARACTERS if c in chk_prompt]):
self.logger.warning(self.check_prompt_characters_warning, chk_prompt)
......@@ -562,6 +577,58 @@ class OverlayUnpack(Action):
return connection
class BootloaderInterruptAction(Action):
"""
Support for interrupting the bootloader.
"""
def __init__(self):
super(BootloaderInterruptAction, self).__init__()
self.name = "bootloader-interrupt"
self.description = "interrupt bootloader"
self.summary = "interrupt bootloader to get an interactive shell"
def validate(self):
super(BootloaderInterruptAction, self).validate()
uboot_fastboot = True if self.parameters.get('to', "") == 'fastboot' and self.job.device.get('fastboot_via_uboot', False) else False
if uboot_fastboot:
self.method = 'u-boot'
else:
self.method = self.parameters['method']
self.params = self.job.device['actions']['boot']['methods'][self.method]['parameters']
if self.job.device.connect_command is '':
self.errors = "Unable to connect to device %s"
device_methods = self.job.device['actions']['boot']['methods']
if self.parameters.get('method', '') == 'grub-efi' and 'grub-efi' in device_methods:
self.method = 'grub-efi'
if 'bootloader_prompt' not in self.params:
self.errors = "Missing bootloader prompt for device"
self.bootloader_prompt = self.params['bootloader_prompt']
self.interrupt_prompt = self.params.get('interrupt_prompt', self.job.device.get_constant('interrupt-prompt', prefix=self.method))
# interrupt_char can actually be a sequence of ASCII characters - sendline does not care.
self.interrupt_char = None
if self.method != 'ipxe':
# ipxe only need interrupt_ctrl_list, not a single char.
self.interrupt_char = self.params.get('interrupt_char', self.job.device.get_constant('interrupt-character', prefix=self.method))
# vendor u-boot builds may require one or more control characters
self.interrupt_control_chars = self.params.get('interrupt_ctrl_list', self.job.device.get_constant('interrupt_ctrl_list', prefix=self.method, missing_ok=True))
def run(self, connection, max_end_time, args=None):
if not connection:
raise LAVABug("%s started without a connection already in use" % self.name)
connection = super(BootloaderInterruptAction, self).run(connection, max_end_time, args)
connection.prompt_str = [self.interrupt_prompt, self.bootloader_prompt]
res = self.wait(connection)
if res == 0:
if self.interrupt_control_chars:
for char in self.interrupt_control_chars:
connection.sendcontrol(char)
else:
connection.sendline(self.interrupt_char)
else:
self.set_namespace_data(action='interrupt', label='interrupt', key='at_bootloader_prompt', value=True)
return connection
class BootloaderCommandsAction(Action):
"""
Send the boot commands to the bootloader
......@@ -588,34 +655,28 @@ class BootloaderCommandsAction(Action):
self.errors = "%s started without a connection already in use" % self.name
connection = super(BootloaderCommandsAction, self).run(connection, max_end_time, args)
connection.raw_connection.linesep = self.line_separator()
connection.prompt_str = self.params['bootloader_prompt']
self.logger.debug("Changing prompt to start interaction: %s", connection.prompt_str)
self.wait(connection)
connection.prompt_str = [self.params['bootloader_prompt']]
at_bootloader_prompt = self.get_namespace_data(action='interrupt', label='interrupt', key='at_bootloader_prompt')
if not at_bootloader_prompt:
self.wait(connection, max_end_time)
i = 1
commands = self.get_namespace_data(action='bootloader-overlay', label=self.method, key='commands')
error_messages = self.job.device.get_constant('error-messages', prefix=self.method, missing_ok=True)
final_message = self.job.device.get_constant('final-message', prefix=self.method, missing_ok=True)
if error_messages:
connection.prompt_str = connection.prompt_str + error_messages
for line in commands:
connection.sendline(line, delay=self.character_delay)
if i != (len(commands)):
self.wait(connection)
res = self.wait(connection, max_end_time)
if res != 0:
raise InfrastructureError('matched a bootloader error message')
i += 1
if final_message:
connection.prompt_str = final_message
self.wait(connection, max_end_time)
self.set_namespace_data(action='shared', label='shared', key='connection', value=connection)
# allow for auto_login
if self.parameters.get('prompts', None):
connection.prompt_str = [
self.params.get('boot_message',
self.job.device.get_constant('boot-message'))]
connection.prompt_str.extend(
self.job.device.get_constant('cpu-reset-messages'))
self.logger.debug("Changing prompt to boot_message %s",
connection.prompt_str)
index = self.wait(connection)
if connection.prompt_str[index] in self.job.device.get_constant('cpu-reset-messages'):
self.logger.error("Bootloader reset detected: Bootloader "
"failed to load the required file into "
"memory correctly so the bootloader reset "
"the CPU.")
raise InfrastructureError("Bootloader reset detected")
return connection
......@@ -35,6 +35,7 @@ from lava_dispatcher.actions.boot import (
BootloaderSecondaryMedia,
BootloaderCommandsAction,
OverlayUnpack,
BootloaderInterruptAction
)
from lava_dispatcher.actions.boot.uefi_menu import (
UEFIMenuInterrupt,
......@@ -195,7 +196,7 @@ class GrubMainAction(BootAction):
if parameters['method'] == 'grub-efi':
self.internal_pipeline.add_action(UEFIMenuInterrupt())
self.internal_pipeline.add_action(GrubMenuSelector())
self.internal_pipeline.add_action(BootloaderInterrupt())
self.internal_pipeline.add_action(BootloaderInterruptAction())
self.internal_pipeline.add_action(BootloaderCommandsAction())
if self.has_prompts(parameters):
self.internal_pipeline.add_action(AutoLoginAction())
......@@ -216,42 +217,6 @@ class GrubMainAction(BootAction):
return connection
class BootloaderInterrupt(Action):
"""
Support for interrupting the bootloader.
"""
def __init__(self):
super(BootloaderInterrupt, self).__init__()
self.name = "bootloader-interrupt"
self.description = "interrupt bootloader"
self.summary = "interrupt bootloader to get a prompt"
self.type = "grub"
def validate(self):
super(BootloaderInterrupt, self).validate()
if self.job.device.connect_command is '':
self.errors = "Unable to connect to device"
device_methods = self.job.device['actions']['boot']['methods']
if self.parameters['method'] == 'grub-efi' and 'grub-efi' in device_methods:
self.type = 'grub-efi'
if 'bootloader_prompt' not in device_methods[self.type]['parameters']:
self.errors = "[%s] Missing bootloader prompt for device" % self.name
def run(self, connection, max_end_time, args=None):
if not connection:
raise LAVABug("%s started without a connection already in use" % self.name)
connection = super(BootloaderInterrupt, self).run(connection, max_end_time, args)
device_methods = self.job.device['actions']['boot']['methods']
interrupt_prompt = device_methods[self.type]['parameters'].get('interrupt_prompt', self.job.device.get_constant('grub-autoboot-prompt'))
# interrupt_char can actually be a sequence of ASCII characters - sendline does not care.
interrupt_char = device_methods[self.type]['parameters'].get('interrupt_char', self.job.device.get_constant('grub-interrupt-character'))
# device is to be put into a reset state, either by issuing 'reboot' or power-cycle
connection.prompt_str = interrupt_prompt
self.wait(connection)
connection.raw_connection.send(interrupt_char)
return connection
class GrubMenuSelector(UefiMenuSelector): # pylint: disable=too-many-instance-attributes
def __init__(self):
......
......@@ -33,6 +33,7 @@ from lava_dispatcher.actions.boot import (
BootloaderCommandOverlay,
BootloaderCommandsAction,
OverlayUnpack,
BootloaderInterruptAction
)
from lava_dispatcher.actions.boot.environment import ExportDeviceEnvironment
from lava_dispatcher.shell import ExpectShellSession
......@@ -105,7 +106,7 @@ class BootloaderRetry(BootAction):
self.internal_pipeline = Pipeline(parent=self, job=self.job, parameters=parameters)
# establish a new connection before trying the reset
self.internal_pipeline.add_action(ResetDevice())
self.internal_pipeline.add_action(BootloaderInterrupt())
self.internal_pipeline.add_action(BootloaderInterruptAction())
# need to look for Hit any key to stop autoboot
self.internal_pipeline.add_action(BootloaderCommandsAction())
if self.has_prompts(parameters):
......@@ -131,34 +132,3 @@ class BootloaderRetry(BootAction):
connection = super(BootloaderRetry, self).run(connection, max_end_time, args)
self.set_namespace_data(action='shared', label='shared', key='connection', value=connection)
return connection
class BootloaderInterrupt(Action):
"""
Support for interrupting the bootloader.
"""
def __init__(self):
super(BootloaderInterrupt, self).__init__()
self.name = "bootloader-interrupt"
self.description = "interrupt bootloader"
self.summary = "interrupt bootloader to get a prompt"
self.type = "ipxe"
def validate(self):
super(BootloaderInterrupt, self).validate()
if self.job.device.connect_command is '':
self.errors = "Unable to connect to device"
device_methods = self.job.device['actions']['boot']['methods']
if 'bootloader_prompt' not in device_methods[self.type]['parameters']:
self.errors = "Missing bootloader prompt for device"
def run(self, connection, max_end_time, args=None):
if not connection:
raise LAVABug("%s started without a connection already in use" % self.name)
connection = super(BootloaderInterrupt, self).run(connection, max_end_time, args)
self.logger.debug("Changing prompt to '%s'", IPXE_BOOT_PROMPT)
# device is to be put into a reset state, either by issuing 'reboot' or power-cycle
connection.prompt_str = IPXE_BOOT_PROMPT
self.wait(connection)
connection.sendcontrol("b")
return connection
......@@ -35,6 +35,7 @@ from lava_dispatcher.actions.boot import (
BootloaderCommandsAction,
BootloaderSecondaryMedia,
OverlayUnpack,
BootloaderInterruptAction
)
from lava_dispatcher.actions.boot.environment import ExportDeviceEnvironment
from lava_dispatcher.shell import ExpectShellSession
......@@ -113,7 +114,7 @@ class UBootRetry(BootAction):
self.internal_pipeline = Pipeline(parent=self, job=self.job, parameters=parameters)
# establish a new connection before trying the reset
self.internal_pipeline.add_action(ResetDevice())
self.internal_pipeline.add_action(UBootInterrupt())
self.internal_pipeline.add_action(BootloaderInterruptAction())
self.internal_pipeline.add_action(BootloaderCommandsAction())
if self.has_prompts(parameters):
self.internal_pipeline.add_action(AutoLoginAction())
......@@ -138,46 +139,6 @@ class UBootRetry(BootAction):
return connection
class UBootInterrupt(Action):
"""
Support for interrupting the bootloader.
"""
def __init__(self):
super(UBootInterrupt, self).__init__()
self.name = "u-boot-interrupt"
self.description = "interrupt u-boot"
self.summary = "interrupt u-boot to get a prompt"
def validate(self):
super(UBootInterrupt, self).validate()
if self.job.device.connect_command is '':
self.errors = "Unable to connect to device %s"
device_methods = self.job.device['actions']['boot']['methods']
if 'bootloader_prompt' not in device_methods['u-boot']['parameters']:
self.errors = "Missing bootloader prompt for device"
def run(self, connection, max_end_time, args=None):
if not connection:
raise LAVABug("%s started without a connection already in use" % self.name)
connection = super(UBootInterrupt, self).run(connection, max_end_time, args)
device_methods = self.job.device['actions']['boot']['methods']
# device is to be put into a reset state, either by issuing 'reboot' or power-cycle
interrupt_prompt = device_methods['u-boot']['parameters'].get('interrupt_prompt', self.job.device.get_constant('uboot-autoboot-prompt'))
# interrupt_char can actually be a sequence of ASCII characters - sendline does not care.
interrupt_char = device_methods['u-boot']['parameters'].get('interrupt_char', self.job.device.get_constant('uboot-interrupt-character'))
# vendor u-boot builds may require one or more control characters
interrupt_control_chars = device_methods['u-boot']['parameters'].get('interrupt_ctrl_list', [])
self.logger.debug("Changing prompt to '%s'", interrupt_prompt)
connection.prompt_str = interrupt_prompt
self.wait(connection)
if interrupt_control_chars:
for char in interrupt_control_chars:
connection.sendcontrol(char)
else:
connection.sendline(interrupt_char)
return connection
class UBootSecondaryMedia(BootloaderSecondaryMedia):
"""
Idempotent action which sets the static data only used when this is a boot of secondary media
......@@ -241,7 +202,7 @@ class UBootEnterFastbootAction(BootAction):
# establish a new connection before trying the reset
self.internal_pipeline.add_action(ResetDevice())
# need to look for Hit any key to stop autoboot
self.internal_pipeline.add_action(UBootInterrupt())
self.internal_pipeline.add_action(BootloaderInterruptAction())
self.internal_pipeline.add_action(ConnectLxc())
def validate(self):
......
......@@ -84,10 +84,19 @@ class PipelineDevice(dict):
return value['connect']
return ''
def get_constant(self, const):
def get_constant(self, const, prefix=None, missing_ok=False):
if 'constants' not in self:
raise ConfigurationError("constants section not present in the device config.")
if prefix:
if not self['constants'].get(prefix, {}).get(const, {}):
if missing_ok:
return None
raise ConfigurationError("Constant %s,%s does not exist in the device config 'constants' section." % (prefix, const))
else:
return self['constants'][prefix][const]
if const not in self['constants']:
if missing_ok:
return None
raise ConfigurationError("Constant %s does not exist in the device config 'constants' section." % const)
return self['constants'][const]
......
......@@ -47,13 +47,18 @@ protocols:
constants:
shutdown-message: "The system is going down for reboot NOW"
boot-message: "Booting Linux"
cpu-reset-messages:
- "Resetting CPU"
- "Must RESET board to recover"
kernel-start-message: 'Linux version [0-9]'
default-shell-prompt: "lava-test: # "
uboot-autoboot-prompt: "Hit any key to stop autoboot"
uboot-interrupt-character: " "
u-boot:
interrupt-prompt: "Hit any key to stop autoboot"
interrupt-character: " "
final-message: '{{ uboot_final_message | default("Starting kernel") }}'
error-messages:
- 'Resetting CPU'
- 'Must RESET board to recover'
- 'TIMEOUT'
- 'Retry count exceeded'
- 'ERROR: The remote end did not respond in time.'
actions:
deploy:
......
......@@ -33,13 +33,18 @@ commands:
constants:
shutdown-message: "The system is going down for reboot NOW"
boot-message: "Booting Linux"
cpu-reset-messages:
- "Resetting CPU"
- "Must RESET board to recover"
kernel-start-message: 'Linux version [0-9]'
default-shell-prompt: "lava-test: # "
uboot-autoboot-prompt: "Hit any key to stop autoboot"
uboot-interrupt-character: " "
u-boot:
interrupt-prompt: "Hit any key to stop autoboot"
interrupt-character: " "
final-message: '{{ uboot_final_message | default("Starting kernel") }}'
error-messages:
- 'Resetting CPU'
- 'Must RESET board to recover'
- 'TIMEOUT'
- 'Retry count exceeded'
- 'ERROR: The remote end did not respond in time.'
actions:
deploy:
......
......@@ -15,13 +15,14 @@ character_delays:
constants:
shutdown-message: "The system is going down for reboot NOW"
boot-message: "Booting Linux"
cpu-reset-messages:
- "Resetting CPU"
- "Must RESET board to recover"
kernel-start-message: "Linux version [0-9]"
default-shell-prompt: "lava-test: # "
uboot-autoboot-prompt: "Hit any key to stop autoboot"
uboot-interrupt-character: " "
grub:
interrupt-prompt: "Press enter to boot the selected OS"
interrupt-character: "c"
grub-efi:
interrupt-prompt: "Press enter to boot the selected OS"
interrupt-character: "c"
actions:
deploy:
......
......@@ -24,13 +24,11 @@ flash_cmds_order: ['update', 'ptable', 'partition', 'hyp', 'modem', 'rpm',
constants:
shutdown-message: "The system is going down for reboot NOW"
boot-message: "Booting Linux"
cpu-reset-messages:
- "Resetting CPU"
- "Must RESET board to recover"
kernel-start-message: "Linux version [0-9]"
default-shell-prompt: "lava-test: # "
uboot-autoboot-prompt: "Hit any key to stop autoboot"
uboot-interrupt-character: " "
grub-efi:
interrupt-prompt: "Press enter to boot the selected OS"
interrupt-character: "c"
actions:
deploy:
......
......@@ -2,36 +2,29 @@
character_delays:
boot: 10
constants:
# OS shutdown message
# Override: set as the shutdown-message parameter of an Action.
# SHUTDOWN_MESSAGE
shutdown-message: 'The system is going down for reboot NOW'
# OS shutdown message
# Override: set as the shutdown-message parameter of an Action.
# SHUTDOWN_MESSAGE
shutdown-message: 'The system is going down for reboot NOW'
# Kernel starting message
# BOOT_MESSAGE
boot-message: 'Booting Linux'
# Kernel starting message
# BOOT_MESSAGE
boot-message: 'Booting Linux'
# CPU reset message
# CPU_RESET_MESSAGE
cpu-reset-messages:
- 'Resetting CPU'
- 'Must RESET board to recover'
# CPU reset message
# CPU_RESET_MESSAGE
cpu-reset-messages:
- 'Resetting CPU'
- 'Must RESET board to recover'
# Default shell prompt for AutoLogin
# DEFAULT_SHELL_PROMPT
default-shell-prompt: 'lava-test: # '
# Default shell prompt for AutoLogin
# DEFAULT_SHELL_PROMPT
default-shell-prompt: 'lava-test: # '
# u-boot auto boot prompt
# UBOOT_AUTOBOOT_PROMPT
uboot-autoboot-prompt: 'Hit any key to stop autoboot'
# u-boot interrupt character
# UBOOT_INTERRUPT_CHARACTER = ' '
uboot-interrupt-character: ' '
# GRUB_BOOT_PROMPT
grub-autoboot-prompt: 'Press enter to boot the selected OS'
grub-interrupt-character: 'c'
# GRUB_BOOT_PROMPT
grub:
interrupt-prompt: "Press enter to boot the selected OS"
interrupt-character: "c"
commands:
connections:
......
......@@ -33,13 +33,18 @@ parameters:
constants:
shutdown-message: "The system is going down for reboot NOW"
boot-message: "Booting Linux"
cpu-reset-messages:
- "Resetting CPU"
- "Must RESET board to recover"
kernel-start-message: 'Linux version [0-9]'
default-shell-prompt: "lava-test: # "
uboot-autoboot-prompt: "Hit any key to stop autoboot"
uboot-interrupt-character: " "
u-boot:
interrupt-prompt: "Hit any key to stop autoboot"
interrupt-character: " "
final-message: '{{ uboot_final_message | default("Starting kernel") }}'
error-messages:
- 'Resetting CPU'
- 'Must RESET board to recover'
- 'TIMEOUT'
- 'Retry count exceeded'
- 'ERROR: The remote end did not respond in time.'
actions:
deploy:
......
......@@ -10,13 +10,8 @@ available_architectures:
constants:
shutdown-message: "The system is going down for reboot NOW"
boot-message: "Booting Linux"
cpu-reset-messages:
- "Resetting CPU"
- "Must RESET board to recover"
kernel-start-message: "Linux version [0-9]"
default-shell-prompt: "lava-test: # "
uboot-autoboot-prompt: "Hit any key to stop autoboot"
uboot-interrupt-character: " "
actions:
deploy:
......
......@@ -10,13 +10,8 @@ available_architectures:
constants:
shutdown-message: "The system is going down for reboot NOW"
boot-message: "Booting Linux"
cpu-reset-messages:
- "Resetting CPU"
- "Must RESET board to recover"
kernel-start-message: "Linux version [0-9]"
default-shell-prompt: "lava-test: # "
uboot-autoboot-prompt: "Hit any key to stop autoboot"
uboot-interrupt-character: " "
actions:
deploy:
......
......@@ -8,13 +8,8 @@ available_architectures:
constants:
shutdown-message: "The system is going down for reboot NOW"
boot-message: "Booting Linux"
cpu-reset-messages:
- "Resetting CPU"
- "Must RESET board to recover"
kernel-start-message: "Linux version [0-9]"
default-shell-prompt: "lava-test: # "
uboot-autoboot-prompt: "Hit any key to stop autoboot"
uboot-interrupt-character: " "
actions:
boot:
......
......@@ -15,13 +15,11 @@ character_delays:
constants:
shutdown-message: "The system is going down for reboot NOW"
boot-message: "Booting Linux"
cpu-reset-messages:
- "Resetting CPU"
- "Must RESET board to recover"
kernel-start-message: "Linux version [0-9]"
default-shell-prompt: "lava-test: # "
uboot-autoboot-prompt: "Hit any key to stop autoboot"
uboot-interrupt-character: " "
grub-efi:
interrupt-prompt: "Press enter to boot the selected OS"
interrupt-character: "c"
actions:
deploy:
......
character_delays:
boot: 10
constants:
# OS shutdown message
# Override: set as the shutdown-message parameter of an Action.
# SHUTDOWN_MESSAGE
shutdown-message: 'The system is going down for reboot NOW'
# Kernel starting message
# BOOT_MESSAGE
boot-message: 'Booting Linux'
# CPU reset message
# CPU_RESET_MESSAGE
cpu-reset-messages:
- 'Resetting CPU'
- 'Must RESET board to recover'
# Default shell prompt for AutoLogin
# DEFAULT_SHELL_PROMPT
default-shell-prompt: 'lava-test: # '
# u-boot auto boot prompt
# UBOOT_AUTOBOOT_PROMPT
uboot-autoboot-prompt: 'Hit any key to stop autoboot'
# u-boot interrupt character
# UBOOT_INTERRUPT_CHARACTER = ' '
uboot-interrupt-character: ' '
# GRUB_BOOT_PROMPT
grub-autoboot-prompt: 'Press enter to boot the selected OS'
grub-interrupt-character: 'c'
shutdown-message: "The system is going down for reboot NOW"
kernel-start-message: "Linux version [0-9]"
default-shell-prompt: "lava-test: # "
grub-efi:
interrupt-prompt: "Press enter to boot the selected OS"
interrupt-character: "c"
commands:
connections:
......
......@@ -14,14 +14,12 @@ character_delays:
boot: 10
constants:
shutdown-message: "The system is going down for reboot NOW"
boot-message: "Booting Linux"
cpu-reset-messages:
- "Resetting CPU"
- "Must RESET board to recover"
default-shell-prompt: "lava-test: # "
uboot-autoboot-prompt: "Hit any key to stop autoboot"
uboot-interrupt-character: " "
shutdown-message: "The system is going down for reboot NOW"
kernel-start-message: "Linux version [0-9]"
default-shell-prompt: "lava-test: # "
grub-efi:
interrupt-prompt: "Press enter to boot the selected OS"
interrupt-character: "c"
actions:
deploy:
......
......@@ -9,36 +9,19 @@ commands:
power_on: ['/usr/local/lab-scripts/snmp_pdu_control --hostname pdu14 --command on --port 5 --delay 20', '/usr/local/lab-scripts/eth008_control -a 10.0.9.2 -r 3 -s onoff']
device_type: x15
constants:
# OS shutdown message
# Override: set as the shutdown-message parameter of an Action.
# SHUTDOWN_MESSAGE
shutdown-message: 'The system is going down for reboot NOW'
# Kernel starting message
# BOOT_MESSAGE
boot-message: 'Booting Linux'
# CPU reset message
# CPU_RESET_MESSAGE
cpu-reset-messages:
- "Resetting CPU"
- "Must RESET board to recover"
# Default shell prompt for AutoLogin
# DEFAULT_SHELL_PROMPT
default-shell-prompt: 'lava-test: # '
# u-boot auto boot prompt
# UBOOT_AUTOBOOT_PROMPT
uboot-autoboot-prompt: 'Hit any key to stop autoboot'
# u-boot interrupt character
# UBOOT_INTERRUPT_CHARACTER = ' '
uboot-interrupt-character: ' '