3 from __future__ import absolute_import, print_function
7 from . import clientactor
12 class ArvadosNodeListMonitorActor(clientactor.RemotePollLoopActor):
13 """Actor to poll the Arvados node list.
15 This actor regularly polls the list of Arvados node records, and
16 sends it to subscribers.
19 def is_common_error(self, exception):
20 return isinstance(exception, config.ARVADOS_ERRORS)
22 def _item_key(self, node):
25 def _send_request(self):
26 nodelist = arvados.util.list_all(self._client.nodes().list)
28 # node hostname, state
29 sinfo_out = subprocess.check_output(["sinfo", "--noheader", "--format=%n %t"])
31 for out in sinfo_out.splitlines():
33 nodename, state = out.split(" ", 2)
34 if state in ('alloc', 'alloc*',
38 nodestates[nodename] = 'busy'
40 nodestates[nodename] = 'idle'
42 nodestates[nodename] = 'down'
47 if n["slot_number"] and n["hostname"] and n["hostname"] in nodestates:
48 n["crunch_worker_state"] = nodestates[n["hostname"]]
50 n["crunch_worker_state"] = 'down'
54 class CloudNodeListMonitorActor(clientactor.RemotePollLoopActor):
55 """Actor to poll the cloud node list.
57 This actor regularly polls the cloud to get a list of running compute
58 nodes, and sends it to subscribers.
61 def __init__(self, client, timer_actor, server_calc, *args, **kwargs):
62 super(CloudNodeListMonitorActor, self).__init__(
63 client, timer_actor, *args, **kwargs)
64 self._calculator = server_calc
66 def is_common_error(self, exception):
67 return isinstance(exception, config.CLOUD_ERRORS)
69 def _item_key(self, node):
72 def _send_request(self):
73 nodes = self._client.list_nodes()
75 # Replace with libcloud NodeSize object with compatible
76 # CloudSizeWrapper object which merges the size info reported from
77 # the cloud with size information from the configuration file.
78 n.size = self._calculator.find_size(n.size.id)