import os
from psutil import Process, TimeoutExpired
from firex_keeper.keeper_helper import get_keeper_dir
from firexapp.common import qualify_firex_bin
from firexapp.discovery import PkgVersionInfo
from firexapp.submit.console import setup_console_logging
from firexapp.submit.tracking_service import (
TrackingService,
popen_tracking_service_subproc,
)
logger = setup_console_logging(__name__)
[docs]
class FireXKeeperLauncher(TrackingService):
def __init__(self):
self.broker_recv_ready_file = None
def start(self, args, uid=None, **kwargs) -> {}:
keeper_debug_dir = get_keeper_dir(uid.logs_dir)
os.makedirs(keeper_debug_dir, exist_ok=True)
self.broker_recv_ready_file = os.path.join(
keeper_debug_dir, "keeper_celery_recvr_ready"
)
stdout_file = os.path.join(keeper_debug_dir, "keeper.stdout.txt")
cmd = [
qualify_firex_bin("firex_keeper"),
"--uid",
str(uid),
"--logs_dir",
uid.logs_dir,
"--chain",
args.chain,
"--broker_recv_ready_file",
self.broker_recv_ready_file,
]
with open(stdout_file, "w+") as f:
pid = popen_tracking_service_subproc(
cmd,
stdout_file_handle=f,
cwd=keeper_debug_dir,
).pid
try:
Process(pid).wait(0.1)
except TimeoutExpired:
logger.debug(f"Started background FireXKeeper with pid {pid}")
else:
logger.error(
"Failed to start FireXKeeper -- task DB will not be available."
)
return {}
def ready_for_tasks(self, **kwargs) -> bool:
return os.path.isfile(self.broker_recv_ready_file)
@staticmethod
def get_pkg_version_info() -> PkgVersionInfo:
import firex_keeper
return PkgVersionInfo(pkg="firex-keeper", version=firex_keeper.__version__)