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:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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__":
|
||||
|
||||
Reference in New Issue
Block a user