plano/model_server/src/cli.py

111 lines
3 KiB
Python
Raw Normal View History

2024-10-10 17:44:41 -07:00
import sys
import subprocess
2024-12-08 11:16:34 -08:00
import argparse
from src.commons.globals import logger
from src.commons.utils import (
get_version,
wait_for_health_check,
check_lsof,
install_lsof,
2024-12-08 15:43:19 -08:00
find_processes_by_port,
kill_processes,
2024-10-10 17:44:41 -07:00
)
def start_server(port=51000):
2024-12-08 11:16:34 -08:00
"""Start the Uvicorn server."""
logger.info("Starting model server - loading some awesomeness, please wait...")
2024-10-10 17:44:41 -07:00
process = subprocess.Popen(
[
"python",
"-m",
"uvicorn",
2024-12-08 15:43:19 -08:00
"src.main:app",
"--host",
"0.0.0.0",
"--port",
2024-12-08 11:16:34 -08:00
str(port),
],
2024-10-10 17:44:41 -07:00
start_new_session=True,
bufsize=1,
universal_newlines=True,
2024-12-08 11:16:34 -08:00
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
2024-10-10 17:44:41 -07:00
)
if wait_for_health_check(f"http://0.0.0.0:{port}/healthz"):
2024-12-08 11:16:34 -08:00
logger.info(f"Model server started successfully with PID {process.pid}.")
2024-10-10 17:44:41 -07:00
else:
2024-12-08 11:16:34 -08:00
logger.error("Model server failed to start in time, shutting it down.")
2024-10-10 17:44:41 -07:00
process.terminate()
def stop_server(port=51000, wait=True, timeout=10):
2024-12-08 11:16:34 -08:00
"""Stop the Uvicorn server."""
if check_lsof():
logger.info("`lsof` is already installed.")
else:
logger.info("`lsof` not found, attempting to install...")
if install_lsof():
logger.info("`lsof` installed successfully.")
else:
logger.error("Failed to install `lsof`.")
sys.exit(1)
logger.info(f"Stopping processes on port {port}...")
2024-12-08 15:43:19 -08:00
port_processes = find_processes_by_port(port)
2024-12-08 11:16:34 -08:00
if port_processes is None:
logger.info(f"No processes found listening on port {port}.")
else:
if len(port_processes):
2024-12-08 15:43:19 -08:00
process_killed = kill_processes(port_processes, wait, timeout)
2024-12-08 11:16:34 -08:00
if not process_killed:
logger.error(f"Unable to kill all processes on {port}")
2024-12-08 15:43:19 -08:00
else:
logger.info(f"All processes on port {port} have been killed.")
2024-12-08 11:16:34 -08:00
else:
logger.error(f"Unable to find processes on {port}")
2024-10-10 17:44:41 -07:00
def restart_server(port=51000):
2024-10-10 17:44:41 -07:00
"""Restart the Uvicorn server."""
stop_server(port)
start_server(port)
2024-12-08 11:16:34 -08:00
def main():
"""
Start, stop, or restart the Uvicorn server based on command-line arguments.
"""
parser = argparse.ArgumentParser(description="Manage the Uvicorn server.")
parser.add_argument(
"action",
choices=["start", "stop", "restart"],
default="start",
nargs="?",
help="Action to perform on the server (default: start).",
)
parser.add_argument(
"--port",
type=int,
default=51000,
help="Port number for the server (default: 51000).",
)
args = parser.parse_args()
logger.info(f"Model server version: {get_version()}")
if args.action == "start":
start_server(args.port)
elif args.action == "stop":
stop_server(args.port)
elif args.action == "restart":
restart_server(args.port)
else:
logger.error(f"Unknown action: {args.action}")
sys.exit(1)