+ nodelist = arvados.util.list_all(self._client.nodes().list)
+
+ # node hostname, state
+ sinfo_out = subprocess.check_output(["sinfo", "--noheader", "--format=%n %t"])
+ nodestates = {}
+ for out in sinfo_out.splitlines():
+ nodename, state = out.split(" ", 2)
+ if state in ('alloc', 'comp'):
+ nodestates[nodename] = 'busy'
+ elif state == 'idle':
+ nodestates[nodename] = 'idle'
+ else:
+ nodestates[nodename] = 'down'
+
+ for n in nodelist:
+ if n["slot_number"] and n["hostname"] and n["hostname"] in nodestates:
+ n["crunch_worker_state"] = nodestates[n["hostname"]]
+ else:
+ n["crunch_worker_state"] = 'down'
+
+ return nodelist