]> git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/cephadm/http_server.py
bump version to 18.2.4-pve3
[ceph.git] / ceph / src / pybind / mgr / cephadm / http_server.py
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()