1#
2# Copyright (C) 2016 Intel Corporation
3#
4# SPDX-License-Identifier: MIT
5#
6
7import os
8import sys
9import signal
10import time
11from collections import defaultdict
12
13from .ssh import OESSHTarget
14from oeqa.utils.qemurunner import QemuRunner
15
16supported_fstypes = ['ext3', 'ext4', 'cpio.gz', 'wic']
17
18class OEQemuTarget(OESSHTarget):
19    def __init__(self, logger, server_ip, timeout=300, user='root',
20            port=None, machine='', rootfs='', kernel='', kvm=False, slirp=False,
21            dump_dir='', dump_host_cmds='', display='', bootlog='',
22            tmpdir='', dir_image='', boottime=60, serial_ports=2,
23            boot_patterns = defaultdict(str), ovmf=False, **kwargs):
24
25        super(OEQemuTarget, self).__init__(logger, None, server_ip, timeout,
26                user, port)
27
28        self.server_ip = server_ip
29        self.server_port = 0
30        self.machine = machine
31        self.rootfs = rootfs
32        self.kernel = kernel
33        self.kvm = kvm
34        self.ovmf = ovmf
35        self.use_slirp = slirp
36        self.boot_patterns = boot_patterns
37
38        self.runner = QemuRunner(machine=machine, rootfs=rootfs, tmpdir=tmpdir,
39                                 deploy_dir_image=dir_image, display=display,
40                                 logfile=bootlog, boottime=boottime,
41                                 use_kvm=kvm, use_slirp=slirp, dump_dir=dump_dir,
42                                 dump_host_cmds=dump_host_cmds, logger=logger,
43                                 serial_ports=serial_ports, boot_patterns = boot_patterns,
44                                 use_ovmf=ovmf)
45
46    def start(self, params=None, extra_bootparams=None, runqemuparams=''):
47        if self.use_slirp and not self.server_ip:
48            self.logger.error("Could not start qemu with slirp without server ip - provide 'TEST_SERVER_IP'")
49            raise RuntimeError("FAILED to start qemu - check the task log and the boot log")
50        if self.runner.start(params, extra_bootparams=extra_bootparams, runqemuparams=runqemuparams):
51            self.ip = self.runner.ip
52            if self.use_slirp:
53                target_ip_port = self.runner.ip.split(':')
54                if len(target_ip_port) == 2:
55                    target_ip = target_ip_port[0]
56                    port = target_ip_port[1]
57                    self.ip = target_ip
58                    self.ssh = self.ssh + ['-p', port]
59                    self.scp = self.scp + ['-P', port]
60                else:
61                    self.logger.error("Could not get host machine port to connect qemu with slirp, ssh will not be "
62                                      "able to connect to qemu with slirp")
63            if self.runner.server_ip:
64                self.server_ip = self.runner.server_ip
65        else:
66            self.stop()
67            raise RuntimeError("FAILED to start qemu - check the task log and the boot log")
68
69    def stop(self):
70        self.runner.stop()
71