16535: Use package consts for http methods.
[arvados.git] / services / nodemanager / arvnodeman / status.py
index b2eb7c827f64d56eb978d6a4b45c5f7478c898f1..1e18996da6cacc24a6a0d7a06c6af91682912ef5 100644 (file)
@@ -6,6 +6,7 @@ from __future__ import absolute_import, print_function
 from future import standard_library
 
 import http.server
+import time
 import json
 import logging
 import socketserver
@@ -77,15 +78,23 @@ class Tracker(object):
     def __init__(self):
         self._mtx = threading.Lock()
         self._latest = {
-            'cloud_errors': 0,
+            'list_nodes_errors': 0,
+            'create_node_errors': 0,
+            'destroy_node_errors': 0,
             'boot_failures': 0,
             'actor_exceptions': 0
         }
         self._version = {'Version' : __version__}
+        self._idle_nodes = {}
 
     def get_json(self):
         with self._mtx:
-            return json.dumps(dict(self._latest, **self._version))
+            times = {'idle_times' : {}}
+            now = time.time()
+            for node, ts in self._idle_nodes.items():
+                times['idle_times'][node] = int(now - ts)
+            return json.dumps(
+                dict(dict(self._latest, **self._version), **times))
 
     def keys(self):
         with self._mtx:
@@ -104,4 +113,17 @@ class Tracker(object):
             self._latest.setdefault(counter, 0)
             self._latest[counter] += value
 
+    def idle_in(self, nodename):
+        with self._mtx:
+            if self._idle_nodes.get(nodename):
+                return
+            self._idle_nodes[nodename] = time.time()
+
+    def idle_out(self, nodename):
+        with self._mtx:
+            try:
+                del self._idle_nodes[nodename]
+            except KeyError:
+                pass
+
 tracker = Tracker()