]>
Commit | Line | Data |
---|---|---|
1e59de90 TL |
1 | import cherrypy |
2 | import threading | |
3 | import logging | |
4 | from typing import TYPE_CHECKING | |
5 | ||
6 | from cephadm.agent import AgentEndpoint | |
7 | from cephadm.service_discovery import ServiceDiscovery | |
8 | from mgr_util import test_port_allocation, PortAlreadyInUse | |
9 | from orchestrator import OrchestratorError | |
10 | ||
11 | if TYPE_CHECKING: | |
12 | from cephadm.module import CephadmOrchestrator | |
13 | ||
14 | ||
15 | def cherrypy_filter(record: logging.LogRecord) -> int: | |
16 | blocked = [ | |
17 | 'TLSV1_ALERT_DECRYPT_ERROR' | |
18 | ] | |
19 | msg = record.getMessage() | |
20 | return not any([m for m in blocked if m in msg]) | |
21 | ||
22 | ||
23 | logging.getLogger('cherrypy.error').addFilter(cherrypy_filter) | |
24 | cherrypy.log.access_log.propagate = False | |
25 | ||
26 | ||
27 | class CephadmHttpServer(threading.Thread): | |
28 | def __init__(self, mgr: "CephadmOrchestrator") -> None: | |
29 | self.mgr = mgr | |
30 | self.agent = AgentEndpoint(mgr) | |
31 | self.service_discovery = ServiceDiscovery(mgr) | |
32 | self.cherrypy_shutdown_event = threading.Event() | |
33 | self._service_discovery_port = self.mgr.service_discovery_port | |
34 | self.secure_monitoring_stack = self.mgr.secure_monitoring_stack | |
35 | super().__init__(target=self.run) | |
36 | ||
37 | def configure_cherrypy(self) -> None: | |
38 | cherrypy.config.update({ | |
39 | 'environment': 'production', | |
40 | 'engine.autoreload.on': False, | |
41 | }) | |
42 | ||
43 | def configure(self) -> None: | |
44 | self.configure_cherrypy() | |
45 | self.agent.configure() | |
46 | self.service_discovery.configure(self.mgr.service_discovery_port, | |
47 | self.mgr.get_mgr_ip(), | |
48 | self.secure_monitoring_stack) | |
49 | ||
50 | def config_update(self) -> None: | |
51 | self.service_discovery_port = self.mgr.service_discovery_port | |
52 | if self.secure_monitoring_stack != self.mgr.secure_monitoring_stack: | |
53 | self.secure_monitoring_stack = self.mgr.secure_monitoring_stack | |
54 | self.restart() | |
55 | ||
56 | @property | |
57 | def service_discovery_port(self) -> int: | |
58 | return self._service_discovery_port | |
59 | ||
60 | @service_discovery_port.setter | |
61 | def service_discovery_port(self, value: int) -> None: | |
62 | if self._service_discovery_port == value: | |
63 | return | |
64 | ||
65 | try: | |
66 | test_port_allocation(self.mgr.get_mgr_ip(), value) | |
67 | except PortAlreadyInUse: | |
68 | raise OrchestratorError(f'Service discovery port {value} is already in use. Listening on old port {self._service_discovery_port}.') | |
69 | except Exception as e: | |
70 | raise OrchestratorError(f'Cannot check service discovery port ip:{self.mgr.get_mgr_ip()} port:{value} error:{e}') | |
71 | ||
72 | self.mgr.log.info(f'Changing service discovery port from {self._service_discovery_port} to {value}...') | |
73 | self._service_discovery_port = value | |
74 | self.restart() | |
75 | ||
76 | def restart(self) -> None: | |
77 | cherrypy.engine.stop() | |
78 | cherrypy.server.httpserver = None | |
79 | self.configure() | |
80 | cherrypy.engine.start() | |
81 | ||
82 | def run(self) -> None: | |
83 | try: | |
84 | self.mgr.log.debug('Starting cherrypy engine...') | |
85 | self.configure() | |
86 | cherrypy.server.unsubscribe() # disable default server | |
87 | cherrypy.engine.start() | |
88 | self.mgr.log.debug('Cherrypy engine started.') | |
89 | self.mgr._kick_serve_loop() | |
90 | # wait for the shutdown event | |
91 | self.cherrypy_shutdown_event.wait() | |
92 | self.cherrypy_shutdown_event.clear() | |
93 | cherrypy.engine.stop() | |
94 | cherrypy.server.httpserver = None | |
95 | self.mgr.log.debug('Cherrypy engine stopped.') | |
96 | except Exception as e: | |
97 | self.mgr.log.error(f'Failed to run cephadm http server: {e}') | |
98 | ||
99 | def shutdown(self) -> None: | |
100 | self.mgr.log.debug('Stopping cherrypy engine...') | |
101 | self.cherrypy_shutdown_event.set() |