From mboxrd@z Thu Jan 1 00:00:00 1970 X-GM-THRID: 7268555392064421888 X-Received: by 2002:a2e:8446:0:b0:2b9:cddc:adeb with SMTP id u6-20020a2e8446000000b002b9cddcadebmr1070004ljh.29.1692342432080; Fri, 18 Aug 2023 00:07:12 -0700 (PDT) X-BeenThere: isar-users@googlegroups.com Received: by 2002:a05:651c:1548:b0:2b9:6182:b0a4 with SMTP id y8-20020a05651c154800b002b96182b0a4ls407788ljp.2.-pod-prod-05-eu; Fri, 18 Aug 2023 00:07:10 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFs/OyLi5+ebB6b+NoUJA2KrDJIsFCsY2ir8jAczPwYF53ENZAKpef+RTVWwIn34usKhuxB X-Received: by 2002:a05:6512:3e28:b0:4f8:7897:55e6 with SMTP id i40-20020a0565123e2800b004f8789755e6mr1385505lfv.45.1692342429888; Fri, 18 Aug 2023 00:07:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1692342429; cv=none; d=google.com; s=arc-20160816; b=IJcsyJpmiYddH423yujOOu1RVAYEeh10uOg8oE20C6Zz597HdrQq8Xe7ahfSuEozBD ZkDuNwHmQXZ5aVUQcb+8sK/Q1iXVnwxcq9SNpS7W/VpcO1NQ+sxGNi3LJkh3B2WFORp7 HCjDusSUnFXhpqxqktWRkdMywl5MHaNFXqfO3QR732MjCq6Ka+oF4wCgupGwKCtWtdxM hOz+qQ1AtTn/7zdFmNQrL5sj9CtASs+9ixzA2Q1QeRgmX3yIK80wn8szTP83SQOP53++ IKRLbTlkjcvxe8z8AghRpucShwxZJPS24RRne+//Gs0V3rfUgf9A+kE208d+SnZuUmUT 866g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from; bh=ZTCD2dQeUkUvFOmkMcgQYHD5+bB09Xf/0c6qYjlrGnM=; fh=swRs1+OhWjovx1IrvOlKBWsdq9manB5qdcuGoHoh5Ak=; b=X3QClzVG7XGWYQTsUwmTIefYHWevRkufUMGcxc8m48+YhcD8RvBvdIfn7Xq02eHec2 FW2P40MoJSvcRw51WWtB8WMxLJtPkMTJVBRjGG09wPf9dWvZb0nbgWRvMOd4W8wb9sK8 0lF3xYCQXEk1TtVBVwxHy5vvXyQhn1V1JO7dNIIsb1P6H2fH9f4IlNQInkE3cCKB+qpF gD4m8At/2fmVpC09uNVLbqfjYOHPzT2hVbTYsMpBszHXxEgzAxV8viKHPsU0Mw+kDMgh 71ZhbAsNs8uWLcFHGz3IbIejrik+12LthoAfv/wqzqfeEWuPt/Sm9TKUWEQZoDS5+Wua P/kA== ARC-Authentication-Results: i=1; gmr-mx.google.com; spf=pass (google.com: domain of ubely@ilbers.de designates 85.214.156.166 as permitted sender) smtp.mailfrom=ubely@ilbers.de Return-Path: Received: from shymkent.ilbers.de (shymkent.ilbers.de. [85.214.156.166]) by gmr-mx.google.com with ESMTPS id c22-20020ac25f76000000b004ff9d6b6cb0si84652lfc.2.2023.08.18.00.07.09 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Fri, 18 Aug 2023 00:07:09 -0700 (PDT) Received-SPF: pass (google.com: domain of ubely@ilbers.de designates 85.214.156.166 as permitted sender) client-ip=85.214.156.166; Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of ubely@ilbers.de designates 85.214.156.166 as permitted sender) smtp.mailfrom=ubely@ilbers.de Received: from baighyz.m.ilbers.de (host-80-81-17-52.static.customer.m-online.net [80.81.17.52]) (authenticated bits=0) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8+deb9u1) with ESMTPSA id 37I7769l024239 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Fri, 18 Aug 2023 09:07:08 +0200 From: Uladzimir Bely To: isar-users@googlegroups.com Subject: [PATCH 5/8] cibuilder.py: Reuse the same qemu machine in ssh-based tests Date: Fri, 18 Aug 2023 09:07:03 +0200 Message-Id: <20230818070706.27913-6-ubely@ilbers.de> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20230818070706.27913-1-ubely@ilbers.de> References: <20230818070706.27913-1-ubely@ilbers.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED autolearn=unavailable autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on shymkent.ilbers.de X-TUID: IV41NBde8qtm Every ssh-based test starts new qemu machine, runs remote command and closes the machine. This patch allows not to close (kill) the machine started by first test and reuse it to run remote commands in the following tests and save some time. Since qemu machine now remains running by default, the last test for this particular machine should care about closing it by passing additonal `stop_vm=True` parameter to `vm_start()` function. Signed-off-by: Uladzimir Bely --- testsuite/cibuilder.py | 75 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 61 insertions(+), 14 deletions(-) diff --git a/testsuite/cibuilder.py b/testsuite/cibuilder.py index c0bfb75c..73c8ee2c 100755 --- a/testsuite/cibuilder.py +++ b/testsuite/cibuilder.py @@ -2,9 +2,11 @@ import logging import os +import pickle import re import select import shutil +import signal import subprocess import time import tempfile @@ -52,6 +54,15 @@ class CIBuilder(Test): for x in output.splitlines() if x != '')) os.environ.update(env) + self.vm_dict = {} + self.vm_dict_file = '%s/vm_dict_file' % self.build_dir + + if os.path.isfile(self.vm_dict_file): + with open(self.vm_dict_file, "rb") as f: + data = f.read() + if data: + self.vm_dict = pickle.loads(data) + def check_init(self): if not hasattr(self, 'build_dir'): self.error("Broken test implementation: need to call init().") @@ -432,17 +443,26 @@ class CIBuilder(Test): return rc - def vm_turn_off(self, p1): - if p1.poll() is None: - p1.kill() - p1.wait() + def vm_dump_dict(self, vm): + f = open(self.vm_dict_file, "wb") + pickle.dump(self.vm_dict, f) + f.close() + - self.log.debug("Stopped VM with pid %s" % (p1.pid)) + def vm_turn_off(self, vm): + pid = self.vm_dict[vm][0] + os.kill(pid, signal.SIGKILL) + + del(self.vm_dict[vm]) + self.vm_dump_dict(vm) + + self.log.debug("Stopped VM with pid %s" % (pid)) def vm_start(self, arch='amd64', distro='buster', enforce_pcbios=False, skip_modulecheck=False, - image='isar-image-base', cmd=None, script=None): + image='isar-image-base', cmd=None, script=None, + stop_vm=False): time_to_wait = self.params.get('time_to_wait', default=DEF_VM_TO_SEC) self.log.info('===================================================') @@ -456,12 +476,36 @@ class CIBuilder(Test): timeout = time.time() + int(time_to_wait) - p1, cmdline, boot_log = self.vm_turn_on(arch, distro, image, enforce_pcbios) + vm = "%s_%s_%s_%d" % (arch, distro, image, enforce_pcbios) + + p1 = None + pid = None + cmdline = "" + boot_log = "" - rc = self.vm_wait_boot(p1, timeout) - if rc != 0: - self.vm_turn_off(p1) - self.fail('Failed to boot qemu machine') + run_qemu = True + + if vm in self.vm_dict: + pid, cmdline, boot_log = self.vm_dict[vm] + + # Check that corresponding process exists + proc = subprocess.run("ps -o cmd= %d" % (pid), shell=True, text=True, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + if cmdline[0] in proc.stdout: + self.log.debug("Found '%s' process with pid '%d', use it" % (cmdline[0], pid)) + run_qemu = False + + if run_qemu: + self.log.debug("No qemu-system process for `%s` found, run new VM" % (vm)) + + p1, cmdline, boot_log = self.vm_turn_on(arch, distro, image, enforce_pcbios) + self.vm_dict[vm] = p1.pid, cmdline, boot_log + self.vm_dump_dict(vm) + + rc = self.vm_wait_boot(p1, timeout) + if rc != 0: + self.vm_turn_off(vm) + self.fail('Failed to boot qemu machine') if cmd is not None or script is not None: user='ci' @@ -474,13 +518,16 @@ class CIBuilder(Test): break rc = self.remote_run(user, host, port, cmd, script, timeout) if rc != 0: - self.vm_turn_off(p1) + if stop_vm: + self.vm_turn_off(vm) self.fail('Failed to run test over ssh') else: bb_output = start_vm.get_bitbake_env(arch, distro, image).decode() rc = self.vm_parse_output(boot_log, bb_output, skip_modulecheck) if rc != 0: - self.vm_turn_off(p1) + if stop_vm: + self.vm_turn_off(vm) self.fail('Failed to parse output') - self.vm_turn_off(p1) + if stop_vm: + self.vm_turn_off(vm) -- 2.20.1