OLD | NEW |
1 import os, BaseHTTPServer, cgi, threading, urllib, fcntl, logging | 1 import os, BaseHTTPServer, cgi, threading, urllib, fcntl, logging |
2 import common | 2 import common |
3 from autotest_lib.scheduler import drone_manager, scheduler_config | 3 from autotest_lib.scheduler import drone_manager, scheduler_config |
4 | 4 |
5 _PORT = 13467 | 5 _PORT = 13467 |
6 | 6 |
7 _HEADER = """ | 7 _HEADER = """ |
8 <html> | 8 <html> |
9 <head><title>Scheduler status</title></head> | 9 <head><title>Scheduler status</title></head> |
10 <body> | 10 <body> |
11 Actions:<br> | 11 Actions:<br> |
12 <a href="?reparse_config=1">Reparse global config values</a><br> | 12 <a href="?reparse_config=1">Reparse global config values</a><br> |
| 13 <a href="?restart_scheduler=1">Restart the scheduler</a><br> |
13 <br> | 14 <br> |
14 """ | 15 """ |
15 | 16 |
16 _FOOTER = """ | 17 _FOOTER = """ |
17 </body> | 18 </body> |
18 </html> | 19 </html> |
19 """ | 20 """ |
20 | 21 |
21 class StatusServerRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): | 22 class StatusServerRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
22 def _send_headers(self): | 23 def _send_headers(self): |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 for drone in self.server._drone_manager.get_drones(): | 68 for drone in self.server._drone_manager.get_drones(): |
68 self._write_drone(drone) | 69 self._write_drone(drone) |
69 self._write_line() | 70 self._write_line() |
70 | 71 |
71 | 72 |
72 def _execute_actions(self, arguments): | 73 def _execute_actions(self, arguments): |
73 if 'reparse_config' in arguments: | 74 if 'reparse_config' in arguments: |
74 scheduler_config.config.read_config() | 75 scheduler_config.config.read_config() |
75 self.server._drone_manager.refresh_drone_configs() | 76 self.server._drone_manager.refresh_drone_configs() |
76 self._write_line('Reparsed config!') | 77 self._write_line('Reparsed config!') |
| 78 elif 'restart_scheduler' in arguments: |
| 79 self.server._shutdown_scheduler = True |
| 80 self._write_line('Posted the shutdown request') |
77 self._write_line() | 81 self._write_line() |
78 | 82 |
79 | 83 |
80 def do_GET(self): | 84 def do_GET(self): |
81 self._send_headers() | 85 self._send_headers() |
82 self.wfile.write(_HEADER) | 86 self.wfile.write(_HEADER) |
83 | 87 |
84 arguments = self._parse_arguments() | 88 arguments = self._parse_arguments() |
85 self._execute_actions(arguments) | 89 self._execute_actions(arguments) |
86 self._write_all_fields() | 90 self._write_all_fields() |
87 self._write_drone_list() | 91 self._write_drone_list() |
88 | 92 |
89 self.wfile.write(_FOOTER) | 93 self.wfile.write(_FOOTER) |
90 | 94 |
91 | 95 |
92 class StatusServer(BaseHTTPServer.HTTPServer): | 96 class StatusServer(BaseHTTPServer.HTTPServer): |
93 def __init__(self): | 97 def __init__(self): |
94 address = ('', _PORT) | 98 address = ('', _PORT) |
95 # HTTPServer is an old-style class :( | 99 # HTTPServer is an old-style class :( |
96 BaseHTTPServer.HTTPServer.__init__(self, address, | 100 BaseHTTPServer.HTTPServer.__init__(self, address, |
97 StatusServerRequestHandler) | 101 StatusServerRequestHandler) |
98 self._shutting_down = False | 102 self._shutting_down = False |
99 self._drone_manager = drone_manager.instance() | 103 self._drone_manager = drone_manager.instance() |
| 104 self._shutdown_scheduler = False |
100 | 105 |
101 # ensure the listening socket is not inherited by child processes | 106 # ensure the listening socket is not inherited by child processes |
102 old_flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD) | 107 old_flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD) |
103 fcntl.fcntl(self.fileno(), fcntl.F_SETFD, old_flags | fcntl.FD_CLOEXEC) | 108 fcntl.fcntl(self.fileno(), fcntl.F_SETFD, old_flags | fcntl.FD_CLOEXEC) |
104 | 109 |
105 | 110 |
106 def shutdown(self): | 111 def shutdown(self): |
107 if self._shutting_down: | 112 if self._shutting_down: |
108 return | 113 return |
109 logging.info('Shutting down server...') | 114 logging.info('Shutting down server...') |
110 self._shutting_down = True | 115 self._shutting_down = True |
111 # make one last request to awaken the server thread and make it exit | 116 # make one last request to awaken the server thread and make it exit |
112 urllib.urlopen('http://localhost:%s' % _PORT) | 117 urllib.urlopen('http://localhost:%s' % _PORT) |
113 | 118 |
114 | 119 |
115 def _serve_until_shutdown(self): | 120 def _serve_until_shutdown(self): |
116 logging.info('Status server running on %s', self.server_address) | 121 logging.info('Status server running on %s', self.server_address) |
117 while not self._shutting_down: | 122 while not self._shutting_down: |
118 self.handle_request() | 123 self.handle_request() |
119 | 124 |
120 | 125 |
121 def start(self): | 126 def start(self): |
122 self._thread = threading.Thread(target=self._serve_until_shutdown, | 127 self._thread = threading.Thread(target=self._serve_until_shutdown, |
123 name='status_server') | 128 name='status_server') |
124 self._thread.start() | 129 self._thread.start() |
OLD | NEW |