diff --git a/composer/agent.py b/composer/agent.py index a2c7faa..eb14346 100644 --- a/composer/agent.py +++ b/composer/agent.py @@ -1,12 +1,12 @@ """Provides setup and the core Composer class functionality to interact with a compose stack""" +from apscheduler.schedulers.background import BackgroundScheduler from git import exc, Repo import logging from os import environ, getenv from pathlib import Path from python_on_whales import DockerClient from python_on_whales.exceptions import DockerException -import schedule import sys handler = logging.StreamHandler(sys.stdout) @@ -82,6 +82,7 @@ class Composer: Attributes: docker: DockerClient instance used to interact with the compose stack services: list of Service objects defined by the stack + scheduler: BackgroundScheduler for updates """ services = [] @@ -110,7 +111,9 @@ class Composer: raise Exception("Failed to authenticate remote!") if self.docker.compose.config(return_json=True)["name"] != "stack": logger.warn(f"Composer stack name is wrong, either make sure it is set manually or keep it store/stack") - self.start_update_job() + self.scheduler = BackgroundScheduler() + self.scheduler.start() + self._update_job = self.start_update_job() self._create_services() self.set_status("up") logger.info("Composer started and services created") @@ -142,6 +145,9 @@ class Composer: """Schedules a recurring update based on the UPDATE environment variable Each update occurs after an interval of UPDATE minutes. If UPDATE does not contain a valid integer in minutes, defaults to 1 minute. + + Returns: + apscheduler.job.Job instance of the scheduled update job """ update_time = getenv("UPDATE", 1) @@ -151,7 +157,7 @@ class Composer: except (AssertionError, ValueError): self.update_time = 1 logging.warn(f"Composer has an invalid UPDATE value of {getenv("UPDATE")}, defaulting to update interval of {self.update_time} minutes") - schedule.every(self.update_time).minutes.do(self.update) + return self.scheduler.add_job(self.update, 'interval', minutes=self.update_time) def set_status(self, status): @@ -190,6 +196,7 @@ class Composer: """Updates the Composer stack based on the remote repo""" + logger.info("Check for new compose stack") current = self.repo.head.commit try: self.repo.remotes.origin.pull('master') @@ -229,15 +236,18 @@ class Service: """Safely removes the service instance""" - if self.update_time is None: + if self._update_task is None: return None - schedule.cancel_job(self._update_task) + self._update_task.remove() def start_update_job(self): """Schedules a recurring update based on the composer.update label Each update occurs after an interval of composer.update minutes. If composer.update does not contain a valid integer in minutes, defaults to the parent Composer's update_time. + + Returns: + apscheduler.job.Job instance of the scheduled job, None if the job was not scheduled """ self.update_time = self.parent.update_time @@ -249,7 +259,7 @@ class Service: self.update_time = self.parent.update_time logging.warn(f"Service {self.name} has an invalid composer.update value of {self.labels['composer.update']}, defaulting to update interval of {self.update_time} minutes") if self.update_time != 0: - return schedule.every(self.update_time).minutes.do(self.update) + return self.parent.scheduler.add_job(self.update, 'interval', minutes=self.update_time) return None def set_status(self, status): diff --git a/composer/connector.py b/composer/connector.py index e69de29..92c6e69 100644 --- a/composer/connector.py +++ b/composer/connector.py @@ -0,0 +1,3 @@ +class Connector: + + def __init__ \ No newline at end of file diff --git a/composer/entrypoint.py b/composer/entrypoint.py index 270a168..ef9aeac 100644 --- a/composer/entrypoint.py +++ b/composer/entrypoint.py @@ -8,5 +8,4 @@ Setup.create_symlink() remote = Setup.create_credential_remote() composer = Composer(remote) while True: - schedule.run_pending() time.sleep(1) \ No newline at end of file diff --git a/composer/requirements.txt b/composer/requirements.txt index bb3c024..1e76204 100644 --- a/composer/requirements.txt +++ b/composer/requirements.txt @@ -1,17 +1,4 @@ -annotated-types==0.7.0 -blinker==1.9.0 -click==8.3.1 +APScheduler==3.11.2 Flask==3.1.2 -gitdb==4.0.12 GitPython==3.1.45 -itsdangerous==2.2.0 -Jinja2==3.1.6 -MarkupSafe==3.0.3 -pydantic==2.12.5 -pydantic_core==2.41.5 -python-on-whales==0.79.0 -schedule==1.2.2 -smmap==5.0.2 -typing-inspection==0.4.2 -typing_extensions==4.15.0 -Werkzeug==3.1.4 +python-on-whales==0.79.0 \ No newline at end of file