Merge branch '7286-nodeman-destroy-broken-nodes' closes #7286
[arvados.git] / services / nodemanager / arvnodeman / computenode / dispatch / slurm.py
index 27397e5d5015f7eca875520238066b2625149396..225d856ba740cd207996d7a053e9169300b57561 100644 (file)
@@ -10,9 +10,14 @@ from . import \
 from . import ComputeNodeShutdownActor as ShutdownActorBase
 
 class ComputeNodeShutdownActor(ShutdownActorBase):
+    SLURM_END_STATES = frozenset(['down\n', 'down*\n',
+                                  'drain\n', 'drain*\n',
+                                  'fail\n', 'fail*\n'])
+
     def on_start(self):
-        arv_node = self._monitor.arvados_node.get()
+        arv_node = self._arvados_node()
         if arv_node is None:
+            self._nodename = None
             return super(ComputeNodeShutdownActor, self).on_start()
         else:
             self._nodename = arv_node['hostname']
@@ -27,7 +32,8 @@ class ComputeNodeShutdownActor(ShutdownActorBase):
 
     @ShutdownActorBase._retry((subprocess.CalledProcessError,))
     def cancel_shutdown(self):
-        self._set_node_state('RESUME')
+        if self._nodename:
+            self._set_node_state('RESUME')
         return super(ComputeNodeShutdownActor, self).cancel_shutdown()
 
     @ShutdownActorBase._stop_if_window_closed
@@ -42,7 +48,7 @@ class ComputeNodeShutdownActor(ShutdownActorBase):
     def await_slurm_drain(self):
         output = subprocess.check_output(
             ['sinfo', '--noheader', '-o', '%t', '-n', self._nodename])
-        if output == 'drain\n':
+        if output in self.SLURM_END_STATES:
             self._later.shutdown_node()
         else:
             self._timer.schedule(time.time() + 10,