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

1""" 

2Controls nginx process operations (reload/restart). 

3 

4This module separates nginx control operations from configuration reading, 

5following the Single Responsibility Principle and improving testability. 

6""" 

7 

8from frappe_manager.docker import ComposeFile, DockerClient 

9from frappe_manager.output_manager import OutputHandler 

10from frappe_manager.output_manager.rich_output import RichOutputHandler 

11 

12 

13class NginxController: 

14 """ 

15 Controls nginx process operations. 

16 

17 This class is responsible only for controlling the nginx process 

18 (reload, restart). It does not handle configuration or path management. 

19 

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 """ 

25 

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. 

35 

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() 

46 

47 def reload(self): 

48 """ 

49 Reload nginx configuration without stopping the service. 

50 

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") 

55 

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") 

62 

63 def restart(self): 

64 """ 

65 Restart the nginx service. 

66 

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") 

71 

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")