diff --git a/backend/btrixcloud/k8s/base_job.py b/backend/btrixcloud/k8s/base_job.py index 72aef4e9..2f5b9310 100644 --- a/backend/btrixcloud/k8s/base_job.py +++ b/backend/btrixcloud/k8s/base_job.py @@ -3,6 +3,7 @@ import os import asyncio import sys +import traceback import yaml @@ -41,7 +42,11 @@ class K8SJobMixin(K8sAPI): data = self.templates.env.get_template(template).render(params) - await create_from_yaml(self.api_client, data, namespace=self.namespace) + try: + await create_from_yaml(self.api_client, data, namespace=self.namespace) + except Exception: + traceback.print_exc() + return async def delete_job_objects(self, selector): """ delete crawl stateful sets, services and pvcs """ diff --git a/backend/btrixcloud/k8s/k8sman.py b/backend/btrixcloud/k8s/k8sman.py index b73c2bec..7fd6f4c8 100644 --- a/backend/btrixcloud/k8s/k8sman.py +++ b/backend/btrixcloud/k8s/k8sman.py @@ -135,7 +135,7 @@ class K8SManager(BaseCrawlManager, K8sAPI): async def delete_profile_browser(self, browserid): """ delete browser job, if it is a profile browser job """ - return await self._handle_completed_job(f"job-{browserid}") + return await self._delete_job(f"job-{browserid}") # ======================================================================== # Internal Methods @@ -148,25 +148,19 @@ class K8SManager(BaseCrawlManager, K8sAPI): """ decode secret data """ return base64.standard_b64decode(secret.data[name]).decode() - async def _handle_completed_job(self, job_name): - """ Handle completed job: delete """ - # until ttl controller is ready - if self.no_delete_jobs: - return - + async def _delete_job(self, name): + """ delete job """ try: - await self._delete_job(job_name) + await self.batch_api.delete_namespaced_job( + name=name, + namespace=self.namespace, + grace_period_seconds=60, + propagation_policy="Foreground", + ) + return True # pylint: disable=bare-except except: - pass - - async def _delete_job(self, name): - await self.batch_api.delete_namespaced_job( - name=name, - namespace=self.namespace, - grace_period_seconds=60, - propagation_policy="Foreground", - ) + return False async def _create_config_map(self, crawlconfig, **kwargs): """ Create Config Map based on CrawlConfig """ diff --git a/backend/btrixcloud/profile_job.py b/backend/btrixcloud/profile_job.py index 8e4a897a..9d8bcea4 100644 --- a/backend/btrixcloud/profile_job.py +++ b/backend/btrixcloud/profile_job.py @@ -33,6 +33,9 @@ class ProfileJob(ABC): self.loop.create_task(self.async_init("profilebrowser.yaml", params)) + print(f"running browser for at least {self.idle_timeout} secs", flush=True) + signal.setitimer(signal.ITIMER_REAL, self.idle_timeout, 0) + async def async_init(self, template, params): """ async init, overridable by subclass """ await self.init_job_objects(template, params) @@ -52,12 +55,12 @@ class ProfileJob(ABC): signal.setitimer(signal.ITIMER_REAL, self.idle_timeout, 0) - def timeout_handler(self): + def exit_handler(self): """ handle SIGTERM """ print("sigterm: shutting down browser...", flush=True) self._do_exit() - def exit_handler(self): + def timeout_handler(self): """ handle SIGALRM """ print("sigalrm: timer expired ending idle browser...", flush=True) self._do_exit()