From 7220b08ce59d578536e7cd1e329b1cd4f7c60528 Mon Sep 17 00:00:00 2001 From: Tomas Hrnciar Date: Jan 14 2020 14:16:07 +0000 Subject: backend: call call_copr_repo if initial createrepo failed Fixes: #1192 --- diff --git a/backend/backend/daemons/build_dispatcher.py b/backend/backend/daemons/build_dispatcher.py index a6937fe..9dfc7bf 100644 --- a/backend/backend/daemons/build_dispatcher.py +++ b/backend/backend/daemons/build_dispatcher.py @@ -10,7 +10,7 @@ from setproctitle import setproctitle from backend.frontend import FrontendClient -from ..helpers import get_redis_logger +from ..helpers import get_redis_logger, call_copr_repo from ..exceptions import (DispatchBuildError, NoVmAvailable, FrontendClientException) from ..job import BuildJob @@ -141,6 +141,19 @@ class BuildDispatcher(multiprocessing.Process): worker.start() return worker + def assure_repodata_exist(self, job): + repodata = os.path.join(job.destdir, job.chroot, "repodata/repomd.xml") + if not os.path.exists(repodata) and job.chroot != "srpm-builds": + self.log.error("Executing 'copr-repo' tool for %s job, because copr_base repo is not available yet.", job) + if not call_copr_repo(os.path.join(job.destdir, job.chroot), timeout=60): + job.status = BuildStatus.FAILURE + build = job.to_dict() + self.log.error("Build %s failed", build) + data = {"builds": [build]} + try: + self.frontend_client.update(data) + except: + pass def run(self): """ Executes build dispatching process. @@ -186,10 +199,7 @@ class BuildDispatcher(multiprocessing.Process): self.log.debug("Skipped job %s, cached", job) continue - repodata = os.path.join(job.destdir, job.chroot, "repodata/repomd.xml") - if not os.path.exists(repodata) and job.chroot != "srpm-builds": - self.log.debug("Skipping job %s because copr_base repo is not available yet", job) - continue + self.assure_repodata_exist(job) # ... and if the task is new to us, # allocate new vm and run full build diff --git a/backend/backend/helpers.py b/backend/backend/helpers.py index 99194e6..6aff272 100644 --- a/backend/backend/helpers.py +++ b/backend/backend/helpers.py @@ -549,7 +549,7 @@ def format_filename(name, version, release, epoch, arch, zero_epoch=False): return "{}-{}-{}.{}".format(name, version, release, arch) -def call_copr_repo(directory, devel=False, add=None, delete=None): +def call_copr_repo(directory, devel=False, add=None, delete=None, timeout=None): """ Execute 'copr-repo' tool, and return True if the command succeeded. """ @@ -566,7 +566,10 @@ def call_copr_repo(directory, devel=False, add=None, delete=None): if devel: cmd += ['--devel'] - return not subprocess.call(cmd) + try: + return not subprocess.call(cmd, timeout=timeout) + except subprocess.TimeoutExpired: + return False def build_target_dir(build_id, package_name=None): build_id = int(build_id) diff --git a/backend/tests/test_action.py b/backend/tests/test_action.py index 4eddc09..3c10fc5 100644 --- a/backend/tests/test_action.py +++ b/backend/tests/test_action.py @@ -760,7 +760,7 @@ class TestAction(object): for chroot in ['fedora-20-x86_64', 'epel-6-i386']: cmd = ['copr-repo', os.path.join(self.test_project_dir, chroot)] - exp_call = mock.call(cmd) + exp_call = mock.call(cmd, timeout=None) assert exp_call in mc_sp_call.call_args_list assert len(mc_sp_call.call_args_list) == 2