Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(635)

Side by Side Diff: scheduler/status_server.py

Issue 6551020: Merge remote branch 'autotest-upstream/master' into try-box1 (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/autotest.git@master
Patch Set: patch Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « scheduler/monitor_db.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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()
OLDNEW
« no previous file with comments | « scheduler/monitor_db.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698