Terarea  2
The automation project
Loading...
Searching...
No Matches
server_management.py
Go to the documentation of this file.
1"""_summary_
2 This is the file in charge of containing the functions that will manage the server run status.
3"""
4
5import signal
6import uvicorn
7from fastapi import FastAPI, Response
8from fastapi.middleware.cors import CORSMiddleware
9from display_tty import Disp, TOML_CONF, FILE_DESCRIPTOR, SAVE_TO_FILE, FILE_NAME
10from . import CONST
11from .http_codes import HCI
12from .runtime_data import RuntimeData
13
14
16 """_summary_
17 """
18
19 def __init__(self, runtime_data: RuntimeData, error: int = 84, success: int = 0, debug: bool = False) -> None:
20 """_summary_
21 """
22 # -------------------------- Inherited values --------------------------
23 self.runtime_data_initialised: RuntimeData = runtime_data
24 self.error: int = error
25 self.success: int = success
26 self.debug: bool = debug
27 # ------------------------ The logging function ------------------------
28 self.disp: Disp = Disp(
29 TOML_CONF,
30 FILE_DESCRIPTOR,
31 SAVE_TO_FILE,
32 FILE_NAME,
33 debug=self.debug,
34 logger=self.__class__.__name__
35 )
36
37 def __del__(self) -> None:
38 """_summary_
39 The destructor of the class
40 """
41 self.disp.log_info(
42 "Server sub processes are shutting down.",
43 "__del__"
44 )
45 if self.is_server_alive() is True:
46 del self.runtime_data_initialised.database_link
47 self.runtime_data_initialised.database_link = None
48 del self.runtime_data_initialised.bucket_link
49 self.runtime_data_initialised.continue_running = False
50 if self.runtime_data_initialised.server is not None:
51 self.runtime_data_initialised.server.handle_exit(
52 signal.SIGTERM, None
53 )
54 self.runtime_data_initialised.server = None
55 if self.runtime_data_initialised.background_tasks_initialised is not None:
56 del self.runtime_data_initialised.background_tasks_initialised
57 self.runtime_data_initialised.background_tasks_initialised = None
58
59 def is_server_alive(self) -> bool:
60 """
61 Check if the server is still running.
62 Returns:
63 bool: Returns True if it is running.
64 """
65 return self.runtime_data_initialised.continue_running
66
67 def is_server_running(self) -> bool:
68 """
69 Check if the server is still running.
70 Returns:
71 bool: Returns True if it is running.
72 """
73 return self.is_server_alive()
74
75 async def shutdown(self) -> Response:
76 """
77 The function to shutdown the server
78 Returns:
79 Response: Return the shutdown server message
80 """
81 if self.runtime_data_initialised.database_link.is_connected() is True:
82 self.runtime_data_initialised.database_link.disconnect_db()
83 if self.runtime_data_initialised.bucket_link.is_connected() is True:
84 self.runtime_data_initialised.bucket_link.disconnect()
85 self.runtime_data_initialised.continue_running = False
86 self.runtime_data_initialised.server.handle_exit(signal.SIGTERM, None)
87 body = self.runtime_data_initialised.boilerplate_responses_initialised.build_response_body(
88 title="Shutdown",
89 message="The server is shutting down.",
90 resp="Shutdown",
91 token="",
92 error=False
93 )
94 return HCI.success(body, content_type=CONST.CONTENT_TYPE, headers=self.runtime_data_initialised.json_header)
95
96 # -------------------Initialisation-----------------------
97
98 def initialise_classes(self) -> None:
99 """
100 The function to initialise the server classes
101 """
102
103 self.runtime_data_initialised.app = FastAPI()
104 self.runtime_data_initialised.app.add_middleware(
105 CORSMiddleware,
106 allow_origins=["*"],
107 allow_credentials=True,
108 allow_methods=["*"],
109 allow_headers=["*"],
110 )
111 msg = "uvicorn.Config(\n"
112 msg += f"app='{self.runtime_data_initialised.app}',\n"
113 msg += f"host='{self.runtime_data_initialised.host}',\n"
114 msg += f"port='{self.runtime_data_initialised.port}',\n"
115 msg += f"lifespan='{CONST.SERVER_LIFESPAN}',\n"
116 msg += f"timeout_keep_alive='{CONST.SERVER_TIMEOUT_KEEP_ALIVE}',\n"
117 msg += f"workers='{CONST.SERVER_WORKERS}',\n"
118 msg += f"reload='{CONST.SERVER_DEV_RELOAD}',\n"
119 msg += f"reload_dirs='{CONST.SERVER_DEV_RELOAD_DIRS}',\n"
120 msg += f"log_level='{CONST.SERVER_DEV_LOG_LEVEL}',\n"
121 msg += f"use_colors='{CONST.SERVER_DEV_USE_COLOURS}',\n"
122 msg += f"proxy_headers='{CONST.SERVER_PROD_PROXY_HEADERS}',\n"
123 msg += f"forwarded_allow_ips='{CONST.SERVER_PROD_FORWARDED_ALLOW_IPS}'"
124 msg += "\n\n)"
125 self.disp.log_debug(msg, "initialise_classes")
126 self.runtime_data_initialised.config = uvicorn.Config(
127 app=self.runtime_data_initialised.app,
128 host=self.runtime_data_initialised.host,
129 port=self.runtime_data_initialised.port,
130 lifespan=CONST.SERVER_LIFESPAN,
131 timeout_keep_alive=CONST.SERVER_TIMEOUT_KEEP_ALIVE,
132 workers=CONST.SERVER_WORKERS,
133 reload=CONST.SERVER_DEV_RELOAD,
134 reload_dirs=CONST.SERVER_DEV_RELOAD_DIRS,
135 log_level=CONST.SERVER_DEV_LOG_LEVEL,
136 use_colors=CONST.SERVER_DEV_USE_COLOURS,
137 proxy_headers=CONST.SERVER_PROD_PROXY_HEADERS,
138 forwarded_allow_ips=CONST.SERVER_PROD_FORWARDED_ALLOW_IPS
139 )
140 self.runtime_data_initialised.server = uvicorn.Server(
141 self.runtime_data_initialised.config)
142 self.runtime_data_initialised.continue_running = True
None __init__(self, RuntimeData runtime_data, int error=84, int success=0, bool debug=False)