From a6b3a5e5901d15513abbf262220e68003ae9a873 Mon Sep 17 00:00:00 2001 From: Houkime <> Date: Fri, 12 May 2023 11:07:55 +0000 Subject: [PATCH] feature(backups): deny adding a backup job if another one is already queued --- selfprivacy_api/backup/jobs.py | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/selfprivacy_api/backup/jobs.py b/selfprivacy_api/backup/jobs.py index a90c4bd..ebc2ea0 100644 --- a/selfprivacy_api/backup/jobs.py +++ b/selfprivacy_api/backup/jobs.py @@ -1,14 +1,39 @@ -from typing import Optional +from typing import Optional, List from selfprivacy_api.jobs import Jobs, Job, JobStatus from selfprivacy_api.services.service import Service -def backup_job_type(service: Service): - return f"services.{service.get_id()}.backup" +def job_type_prefix(service: Service) -> str: + return f"services.{service.get_id()}" + + +def backup_job_type(service: Service) -> str: + return f"{job_type_prefix(service)}.backup" + + +def get_jobs_by_service(service: Service) -> List[Job]: + result = [] + for job in Jobs.get_jobs(): + if job.type_id.startswith(job_type_prefix(service)) and job.status in [ + JobStatus.CREATED, + JobStatus.RUNNING, + ]: + result.append(job) + return result + + +def is_something_queued_for(service: Service) -> bool: + return len(get_jobs_by_service(service)) != 0 def add_backup_job(service: Service) -> Job: + if is_something_queued_for(service): + message = ( + f"Cannot start a backup of {service.get_id()}, another operation is queued: " + + get_jobs_by_service(service)[0].type_id + ) + raise ValueError(message) display_name = service.get_display_name() job = Jobs.add( type_id=backup_job_type(service),