Coverage for frappe_manager / ssl_manager / nginx_controller.py: 33%
21 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-07-02 18:35 +0530
« prev ^ index » next coverage.py v7.13.5, created at 2026-07-02 18:35 +0530
1"""
2Controls nginx process operations (reload/restart).
4This module separates nginx control operations from configuration reading,
5following the Single Responsibility Principle and improving testability.
6"""
8from frappe_manager.docker import ComposeFile, DockerClient
9from frappe_manager.output_manager import OutputHandler
10from frappe_manager.output_manager.rich_output import RichOutputHandler
13class NginxController:
14 """
15 Controls nginx process operations.
17 This class is responsible only for controlling the nginx process
18 (reload, restart). It does not handle configuration or path management.
20 Attributes:
21 service_name: Name of the nginx service in docker-compose
22 compose_file_manager: The compose file manager
23 docker_client: The docker client for operations
24 """
26 def __init__(
27 self,
28 service_name: str,
29 compose_file_manager: ComposeFile,
30 docker_client: DockerClient,
31 output_handler: OutputHandler | None = None,
32 ):
33 """
34 Initialize the nginx controller.
36 Args:
37 service_name: Name of the nginx service (e.g., 'nginx', 'nginx-proxy')
38 compose_file_manager: The compose file manager
39 docker_client: The docker client for operations
40 output_handler: Optional output handler for display operations
41 """
42 self.service_name = service_name
43 self.compose_file_manager = compose_file_manager
44 self.docker_client = docker_client
45 self.output = output_handler or RichOutputHandler()
47 def reload(self):
48 """
49 Reload nginx configuration without stopping the service.
51 jwilder/nginx-proxy requires SIGHUP to PID 1 for docker-gen regeneration.
52 Regular nginx uses standard reload signal.
53 """
54 self.output.change_head("Reloading nginx")
56 if self.docker_client.compose.is_service_running(self.service_name):
57 if self.service_name == "global-nginx-proxy":
58 self.docker_client.compose.exec(service=self.service_name, command="sh -c 'kill -HUP 1'", stream=False)
59 else:
60 self.docker_client.compose.exec(service=self.service_name, command="nginx -s reload", stream=False)
61 self.output.print("Reloaded nginx")
63 def restart(self):
64 """
65 Restart the nginx service.
67 This completely stops and starts the nginx container, which will
68 interrupt active connections but ensures a clean restart.
69 """
70 self.output.change_head("Restarting nginx")
72 if self.docker_client.compose.is_service_running(self.service_name):
73 output = self.docker_client.compose.restart(services=[self.service_name], stream=False)
74 self.output.print("Restarting nginx")