+ nodelist = arvados.util.list_all(self._client.nodes().list)
+
+ # node hostname, state
+ sinfo_out = subprocess.check_output(["sinfo", "--noheader", "--format=%n|%t|%f"])
+ nodestates = {}
+ nodefeatures = {}
+ for out in sinfo_out.splitlines():
+ try:
+ nodename, state, features = out.split("|", 3)
+ except ValueError:
+ continue
+ if state in ('alloc', 'alloc*',
+ 'comp', 'comp*',
+ 'mix', 'mix*',
+ 'drng', 'drng*'):
+ nodestates[nodename] = 'busy'
+ elif state in ('idle', 'fail'):
+ nodestates[nodename] = state
+ else:
+ nodestates[nodename] = 'down'
+ if features != "(null)":
+ nodefeatures[nodename] = features