base_deploy: add support for persistent state

Signed-off-by:  Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
Eric Callahan 2021-12-02 08:42:10 -05:00
parent d23f72d232
commit 3a547fb530
1 changed files with 48 additions and 10 deletions

View File

@ -6,8 +6,9 @@
from __future__ import annotations from __future__ import annotations
import logging import logging
import time
from typing import TYPE_CHECKING, Dict, Any from typing import TYPE_CHECKING, Dict, Any, Optional
if TYPE_CHECKING: if TYPE_CHECKING:
from confighelper import ConfigHelper from confighelper import ConfigHelper
from utils import ServerError from utils import ServerError
@ -16,18 +17,44 @@ if TYPE_CHECKING:
class BaseDeploy: class BaseDeploy:
def __init__(self, def __init__(self,
config: ConfigHelper, config: ConfigHelper,
cmd_helper: CommandHelper cmd_helper: CommandHelper,
name: Optional[str] = None,
prefix: str = "",
cfg_hash: Optional[str] = None
) -> None: ) -> None:
name_parts = config.get_name().split() if name is None:
self.name = name_parts[-1] name = config.get_name().split()[-1]
self.name = name
if prefix:
prefix = f"{prefix} {self.name}: "
self.prefix = prefix
self.server = config.get_server() self.server = config.get_server()
self.cmd_helper = cmd_helper self.cmd_helper = cmd_helper
if name_parts == 1: self.refresh_interval = cmd_helper.get_refresh_interval()
self.prefix: str = "" refresh_interval = config.getint('refresh_interval', None)
if config.get('type', "") == "web": if refresh_interval is not None:
self.prefix = f"Web Client {self.name}: " self.refresh_interval = refresh_interval * 60 * 60
else: if cfg_hash is None:
self.prefix = f"Application {self.name}: " cfg_hash = config.get_hash().hexdigest()
self.cfg_hash = cfg_hash
storage: Dict[str, Any] = self._load_storage()
self.last_refresh_time: float = storage.get('last_refresh_time', 0.0)
def needs_refresh(self) -> bool:
storage = self._load_storage()
last_cfg_hash = storage.get('last_config_hash', "")
next_refresh_time = self.last_refresh_time + self.refresh_interval
return (
self.cfg_hash != last_cfg_hash or
time.time() > next_refresh_time
)
def get_last_refresh_time(self) -> float:
return self.last_refresh_time
def _load_storage(self) -> Dict[str, Any]:
umdb = self.cmd_helper.get_umdb()
return umdb.get(self.name, {})
async def refresh(self) -> None: async def refresh(self) -> None:
pass pass
@ -38,6 +65,17 @@ class BaseDeploy:
def get_update_status(self) -> Dict[str, Any]: def get_update_status(self) -> Dict[str, Any]:
return {} return {}
def get_persistent_data(self) -> Dict[str, Any]:
return {
'last_config_hash': self.cfg_hash,
'last_refresh_time': self.last_refresh_time
}
def _save_state(self) -> None:
umdb = self.cmd_helper.get_umdb()
self.last_refresh_time = time.time()
umdb[self.name] = self.get_persistent_data()
def log_exc(self, msg: str, traceback: bool = True) -> ServerError: def log_exc(self, msg: str, traceback: bool = True) -> ServerError:
log_msg = f"{self.prefix}{msg}" log_msg = f"{self.prefix}{msg}"
if traceback: if traceback: