From 5c86f4d6fb32904caa8f841e78503610710d2124 Mon Sep 17 00:00:00 2001 From: "Alexie (Boyong) Madolid" Date: Fri, 15 Sep 2023 18:33:12 +0800 Subject: [PATCH] [JSORC]: Sync configuratin via rollout restart --- jaseci_core/jaseci/extens/act_lib/std.py | 5 +++ jaseci_core/jaseci/extens/api/jsorc_api.py | 16 ++++----- jaseci_core/jaseci/extens/svc/kube_svc.py | 38 +++++++++++++++++++++- jaseci_core/jaseci/extens/svc/redis_svc.py | 7 ++-- jaseci_core/jaseci/jsorc/jsorc.py | 28 +++++++++++++++- jaseci_core/jaseci/jsorc/jsorc_utils.py | 12 +++++++ jaseci_core/jaseci/jsorc/memory.py | 2 +- jaseci_core/jaseci/jsorc/redis.py | 8 ++--- 8 files changed, 97 insertions(+), 19 deletions(-) diff --git a/jaseci_core/jaseci/extens/act_lib/std.py b/jaseci_core/jaseci/extens/act_lib/std.py index c4566ec78e..7847f6f4fd 100644 --- a/jaseci_core/jaseci/extens/act_lib/std.py +++ b/jaseci_core/jaseci/extens/act_lib/std.py @@ -229,3 +229,8 @@ def log_activity( activity = elastic.generate_from_meta(meta, log, action) return elastic.doc_activity(activity, query, suffix) + + +@jaseci_action() +def clear_cache(all: bool = True, meta: dict = {}): + meta["h"].clear_cache(all) diff --git a/jaseci_core/jaseci/extens/api/jsorc_api.py b/jaseci_core/jaseci/extens/api/jsorc_api.py index b64c64bbd3..dca1de1ac1 100644 --- a/jaseci_core/jaseci/extens/api/jsorc_api.py +++ b/jaseci_core/jaseci/extens/api/jsorc_api.py @@ -118,16 +118,14 @@ def service_info(self, name: str): """ # will throw exception if not existing - svc = JsOrc.svc(name) + return JsOrc.svc(name).info() - return { - "enabled": svc.enabled, - "automated": svc.automated, - "quiet": svc.quiet, - "state": svc.state.name, - "config": svc.config, - "error": str(svc.error) if svc.error else None, - } + @Interface.admin_api(cli_args=["name"]) + def service_config_set(self, name: str, config: dict): + """ + Set a service config + """ + return JsOrc.svc_conf_set(name, config, self._h) @Interface.admin_api(cli_args=["name"]) def service_refresh(self, name: str): diff --git a/jaseci_core/jaseci/extens/svc/kube_svc.py b/jaseci_core/jaseci/extens/svc/kube_svc.py index be1a1e4363..46965d171b 100644 --- a/jaseci_core/jaseci/extens/svc/kube_svc.py +++ b/jaseci_core/jaseci/extens/svc/kube_svc.py @@ -1,5 +1,5 @@ from base64 import b64decode - +from datetime import datetime from kubernetes import config as kubernetes_config from kubernetes.client import ( ApiClient, @@ -394,3 +394,39 @@ def resolve_manifest( placeholder_resolver(manifest, manifest) return manifest + + def has_replicas(self): + try: + return ( + self.read( + "Deployment", "jaseci", self.namespace, quiet=self.quiet + ).spec.replicas + > 1 + ) + except Exception as e: + self.quiet or logger.error(f"Error checking jaseci replica -- {e}") + + def restart(self): + try: + return self.api.patch_namespaced_deployment( + name="jaseci", + namespace=self.namespace, + body={ + "spec": { + "template": { + "metadata": { + "annotations": { + "kubectl.kubernetes.io/restartedAt": datetime.utcnow().isoformat( + "T" + ) + + "Z" + } + } + } + } + }, + ) + except ApiException as e: + self.quiet or logger.error( + f"Error triggering jaseci rollout restart -- {e}" + ) diff --git a/jaseci_core/jaseci/extens/svc/redis_svc.py b/jaseci_core/jaseci/extens/svc/redis_svc.py index 78805953d9..9a6d42608c 100644 --- a/jaseci_core/jaseci/extens/svc/redis_svc.py +++ b/jaseci_core/jaseci/extens/svc/redis_svc.py @@ -49,9 +49,12 @@ def hkeys(self, name): # CLEANER # ################################################### - def clear(self): + def clear(self, all=True): if self.is_running(): - self.app.flushdb() + if all: + self.app.flushall() + else: + self.app.flushdb() # ---------------- PROXY EVENTS ----------------- # diff --git a/jaseci_core/jaseci/jsorc/jsorc.py b/jaseci_core/jaseci/jsorc/jsorc.py index 5d725aa0b9..83226e9816 100644 --- a/jaseci_core/jaseci/jsorc/jsorc.py +++ b/jaseci_core/jaseci/jsorc/jsorc.py @@ -264,6 +264,32 @@ def svc(cls, service: str, cast: T = None) -> Union[T, cs]: return cls._service_instances[service] + @classmethod + def svc_conf_set( + cls, service: str, config: dict, hook: None, cast: T = None + ) -> Union[T, cs]: + from jaseci.extens.svc.kube_svc import KubeService + + if service not in cls._services: + raise Exception(f"Service {service} is not existing!") + + if cls.db_check(): + instance = cls._services[service][0] + hook = hook or cls.hook(use_proxy=instance["proxy"]) + hook.save_glob(instance["config"], dumps(config)) + hook.commit() + + kube = cls.svc("kube", KubeService) + if kube.is_running() and kube.has_replicas(): + hook.clear_cache(False) + return ( + "Rollout restart commencing..." + if not isinstance(kube.restart(), ApiException) + else "Attempt to rollout restart failed! Please check the logs for further information!" + ) + + return cls.svc_reset(service).info() + @classmethod def svc_reset(cls, service, cast: T = None) -> Union[T, cs]: """ @@ -333,7 +359,7 @@ def decorator(service: T) -> T: target=cls._services, entry={ "type": service, - "config": config or f"{name.upper()}_CONFIG", + "config": (config or f"{name}_CONFIG").upper(), "manifest": manifest, "manifest_type": manifest_type, "priority": priority, diff --git a/jaseci_core/jaseci/jsorc/jsorc_utils.py b/jaseci_core/jaseci/jsorc/jsorc_utils.py index e552b13360..e00b943611 100644 --- a/jaseci_core/jaseci/jsorc/jsorc_utils.py +++ b/jaseci_core/jaseci/jsorc/jsorc_utils.py @@ -284,3 +284,15 @@ def __setstate__(self, ignored): # for build on pickle load self.state = State.FAILED del self + + # ------------------- COMMON -------------------- # + + def info(self): + return { + "enabled": self.enabled, + "automated": self.automated, + "quiet": self.quiet, + "state": self.state.name, + "config": self.config, + "error": str(self.error) if self.error else None, + } diff --git a/jaseci_core/jaseci/jsorc/memory.py b/jaseci_core/jaseci/jsorc/memory.py index 8cc4980b9c..5e5c580ff2 100644 --- a/jaseci_core/jaseci/jsorc/memory.py +++ b/jaseci_core/jaseci/jsorc/memory.py @@ -231,7 +231,7 @@ def find_class_and_import(self, j_type, mod): return cls - def clear_cache(self): + def clear_cache(self, all=True): MemoryHook.__init__(self) #################################################### diff --git a/jaseci_core/jaseci/jsorc/redis.py b/jaseci_core/jaseci/jsorc/redis.py index c44c935e27..76cdaae263 100644 --- a/jaseci_core/jaseci/jsorc/redis.py +++ b/jaseci_core/jaseci/jsorc/redis.py @@ -131,11 +131,9 @@ def decommit_obj_from_cache(self, item): # CLEANER # ################################################### - def clear_cache(self): - if self.redis.is_running(): - self.redis.app.flushdb() - - MemoryHook.__init__(self) + def clear_cache(self, all=True): + super().clear_cache(all) + self.redis.clear(all) # ----------------------------------------------- #