1 # Copyright (C) The Arvados Authors. All rights reserved.
3 # SPDX-License-Identifier: AGPL-3.0
5 from __future__ import absolute_import, print_function
6 from future import standard_library
14 from ._version import __version__
16 _logger = logging.getLogger('status.Handler')
19 class Server(socketserver.ThreadingMixIn, http.server.HTTPServer, object):
20 def __init__(self, config):
21 port = config.getint('Manage', 'port')
22 self.enabled = port >= 0
24 _logger.warning("Management server disabled. "+
25 "Use [Manage] config section to enable.")
28 self._tracker = tracker
29 self._tracker.update({'config_max_nodes': config.getint('Daemon', 'max_nodes')})
30 super(Server, self).__init__(
31 (config.get('Manage', 'address'), port), Handler)
32 self._thread = threading.Thread(target=self.serve_forever)
33 self._thread.daemon = True
40 class Handler(http.server.BaseHTTPRequestHandler, object):
42 if self.path == '/status.json':
43 self.send_response(200)
44 self.send_header('Content-type', 'application/json')
46 self.wfile.write(tracker.get_json())
47 elif self.path == '/_health/ping':
48 code, msg = self.check_auth()
51 self.send_response(code)
54 self.send_response(200)
55 self.send_header('Content-type', 'application/json')
57 self.wfile.write(json.dumps({"health":"OK"}))
59 self.send_response(404)
61 def log_message(self, fmt, *args, **kwargs):
62 _logger.info(fmt, *args, **kwargs)
65 mgmt_token = self.server._config.get('Manage', 'ManagementToken')
66 auth_header = self.headers.get('Authorization', None)
69 return 404, "disabled"
70 elif auth_header == None:
71 return 401, "authorization required"
72 elif auth_header != 'Bearer '+mgmt_token:
73 return 403, "authorization error"
76 class Tracker(object):
78 self._mtx = threading.Lock()
84 self._version = {'Version' : __version__}
88 return json.dumps(dict(self._latest, **self._version))
92 return self._latest.keys()
96 return self._latest.get(key)
98 def update(self, updates):
100 self._latest.update(updates)
102 def counter_add(self, counter, value=1):
104 self._latest.setdefault(counter, 0)
105 self._latest[counter] += value