1
0
mirror of https://git.yoctoproject.org/meta-arm synced 2026-01-12 03:10:15 +00:00

runfvp: make fvp runner to hold the config

At the moment the config is load and pass to FVPRunner.

Change the ownership to FVPRunner.

Signed-off-by: Clément Péron <peron.clem@gmail.com>
Signed-off-by: Jon Mason <jon.mason@arm.com>
This commit is contained in:
Clément Péron
2023-05-17 12:09:11 +02:00
committed by Jon Mason
parent 316e02c0f1
commit 272359be5d
4 changed files with 52 additions and 36 deletions

View File

@@ -6,7 +6,7 @@ import shutil
import sys
from .terminal import terminals
from .conffile import load
def cli_from_config(config, terminal_choice):
cli = []
@@ -83,14 +83,18 @@ class FVPRunner:
self._fvp_process = None
self._telnets = []
self._pexpects = []
self._config = None
def start(self, config, extra_args=[], terminal_choice="none", stdout=subprocess.PIPE):
cli = cli_from_config(config, terminal_choice)
def start(self, fvpconf, extra_args=[], terminal_choice="none", stdout=subprocess.PIPE):
self._logger.debug(f"Loading {fvpconf}")
self._config = load(fvpconf)
cli = cli_from_config(self._config, terminal_choice)
cli += extra_args
# Pass through environment variables needed for GUI applications, such
# as xterm, to work.
env = config['env']
env = self._config['env']
for name in ('DISPLAY', 'PATH', 'WAYLAND_DISPLAY', 'XAUTHORITY'):
if name in os.environ:
env[name] = os.environ[name]
@@ -140,6 +144,9 @@ class FVPRunner:
def wait(self, timeout):
self._fvp_process.wait(timeout)
def getConfig(self):
return self._config
@property
def stdout(self):
return self._fvp_process.stdout

View File

@@ -3,7 +3,7 @@ import pexpect
import os
from oeqa.core.target.ssh import OESSHTarget
from fvp import conffile, runner
from fvp import runner
class OEFVPSSHTarget(OESSHTarget):
@@ -19,7 +19,6 @@ class OEFVPSSHTarget(OESSHTarget):
basename = pathlib.Path(rootfs)
basename = basename.name.replace("".join(basename.suffixes), "")
self.fvpconf = image_dir / (basename + ".fvpconf")
self.config = conffile.load(self.fvpconf)
self.bootlog = bootlog
if not self.fvpconf.exists():
@@ -31,7 +30,7 @@ class OEFVPSSHTarget(OESSHTarget):
def start(self, **kwargs):
self.fvp_log = self._create_logfile("fvp")
self.fvp = runner.FVPRunner(self.logger)
self.fvp.start(self.config, stdout=self.fvp_log)
self.fvp.start(self.fvpconf, stdout=self.fvp_log)
self.logger.debug(f"Started FVP PID {self.fvp.pid()}")
self._after_start()
@@ -72,8 +71,9 @@ class OEFVPTarget(OEFVPSSHTarget):
def _after_start(self):
with open(self.fvp_log.name, 'rb') as logfile:
parser = runner.ConsolePortParser(logfile)
self.logger.debug(f"Awaiting console on terminal {self.config['consoles']['default']}")
port = parser.parse_port(self.config['consoles']['default'])
config = self.fvp.getConfig()
self.logger.debug(f"Awaiting console on terminal {config['consoles']['default']}")
port = parser.parse_port(config['consoles']['default'])
console = self.fvp.create_pexpect(port)
try:
console.expect("login\\:", timeout=self.boot_timeout)
@@ -105,7 +105,8 @@ class OEFVPSerialTarget(OEFVPSSHTarget):
def _after_start(self):
with open(self.fvp_log.name, 'rb') as logfile:
parser = runner.ConsolePortParser(logfile)
for name, console in self.config["consoles"].items():
config = self.fvp.getConfig()
for name, console in config["consoles"].items():
logfile = self._create_logfile(name)
self.logger.info(f'Creating terminal {name} on {console}')
port = parser.parse_port(console)

View File

@@ -1,5 +1,6 @@
import asyncio
import os
import json
import pathlib
import subprocess
import tempfile
@@ -88,16 +89,20 @@ class RunnerTests(OESelftestTestCase):
from fvp import runner
with self.create_mock() as m:
fvp = runner.FVPRunner(self.logger)
fvp.start({
"fvp-bindir": "/usr/bin",
"exe": "FVP_Binary",
"parameters": {'foo': 'bar'},
"data": ['data1'],
"applications": {'a1': 'file'},
"terminals": {},
"args": ['--extra-arg'],
"env": {"FOO": "BAR"}
})
config = {"fvp-bindir": "/usr/bin",
"exe": "FVP_Binary",
"parameters": {'foo': 'bar'},
"data": ['data1'],
"applications": {'a1': 'file'},
"terminals": {},
"args": ['--extra-arg'],
"env": {"FOO": "BAR"}
}
with tempfile.NamedTemporaryFile('w') as fvpconf:
json.dump(config, fvpconf)
fvpconf.flush()
fvp.start(fvpconf.name)
m.assert_called_once_with(['/usr/bin/FVP_Binary',
'--parameter', 'foo=bar',
@@ -114,16 +119,20 @@ class RunnerTests(OESelftestTestCase):
from fvp import runner
with self.create_mock() as m:
fvp = runner.FVPRunner(self.logger)
fvp.start({
"fvp-bindir": "/usr/bin",
"exe": "FVP_Binary",
"parameters": {},
"data": [],
"applications": {},
"terminals": {},
"args": [],
"env": {"FOO": "BAR"}
})
config = {"fvp-bindir": "/usr/bin",
"exe": "FVP_Binary",
"parameters": {},
"data": [],
"applications": {},
"terminals": {},
"args": [],
"env": {"FOO": "BAR"}
}
with tempfile.NamedTemporaryFile('w') as fvpconf:
json.dump(config, fvpconf)
fvpconf.flush()
fvp.start(fvpconf.name)
m.assert_called_once_with(['/usr/bin/FVP_Binary'],
stdin=unittest.mock.ANY,

View File

@@ -14,7 +14,7 @@ logger = logging.getLogger("RunFVP")
libdir = pathlib.Path(__file__).parents[1] / "meta-arm" / "lib"
sys.path.insert(0, str(libdir))
from fvp import terminal, runner, conffile
from fvp import terminal, runner
def parse_args(arguments):
import argparse
@@ -49,12 +49,13 @@ def parse_args(arguments):
logger.debug(f"FVP arguments: {fvp_args}")
return args, fvp_args
def start_fvp(args, config, extra_args):
def start_fvp(args, fvpconf, extra_args):
fvp = runner.FVPRunner(logger)
try:
fvp.start(config, extra_args, args.terminals)
fvp.start(fvpconf, extra_args, args.terminals)
if args.console:
config = fvp.getConfig()
expected_terminal = config["consoles"].get("default")
if expected_terminal is None:
logger.error("--console used but FVP_CONSOLE not set in machine configuration")
@@ -87,9 +88,7 @@ def runfvp(cli_args):
config_file = args.config
else:
config_file = conffile.find(args.config)
logger.debug(f"Loading {config_file}")
config = conffile.load(config_file)
start_fvp(args, config, extra_args)
start_fvp(args, config_file, extra_args)
if __name__ == "__main__":