STATE_DEAD = 'dead'
STATE_STOPPED = 'stopped'
+STATE_FAILED = 'failed'
STATE_RUNNING = 'running'
def get_signame(signal_number):
explicitly).
- Running - after start() was called, it started successfully and is
now running.
+ - Failed - the component failed (crashed) and is waiting for a restart
- Dead - it failed and can not be resurrected.
Init
| | |
|failure | failed() |
| | |
- v | |
+ v | | start()/restart()
+<-----------+ |
| |
| kind == dispensable or kind|== needed and failed late
- +-----------------------------+
+ +-----------------------> Failed
|
| kind == core or kind == needed and it failed too soon
v
exit_str)
if not self.running():
raise ValueError("Can't fail component that isn't running")
- self.__state = STATE_STOPPED
+ self.__state = STATE_FAILED
self._failed_internal()
# If it is a core component or the needed component failed to start
# (including it stopped really soon)
"""
return self.__state == STATE_RUNNING
+ def is_failed(self):
+ """Informs if the component has failed and is waiting for a restart.
+
+ Unlike the case of running(), if this returns True it always means
+ the corresponding process has died and not yet restarted.
+
+ """
+ return self.__state == STATE_FAILED
+
def _start_internal(self):
"""
This method does the actual starting of a process. You need to override
self.assertFalse(self.__stop_called)
self.assertFalse(self.__failed_called)
self.assertFalse(component.running())
+ self.assertFalse(component.is_failed())
# We can't stop or fail the component yet
self.assertRaises(ValueError, component.stop)
self.assertRaises(ValueError, component.failed, 1)
self.assertFalse(self.__stop_called)
self.assertFalse(self.__failed_called)
self.assertTrue(component.running())
+ self.assertFalse(component.is_failed())
def __check_dead(self, component):
"""
self.assertTrue(self.__failed_called)
self.assertEqual(1, self._exitcode)
self.assertFalse(component.running())
+ self.assertFalse(component.is_failed())
# Surely it can't be stopped when already dead
self.assertRaises(ValueError, component.stop)
# Nor started
self.assertFalse(self.__stop_called)
self.assertTrue(self.__failed_called)
self.assertTrue(component.running())
+ self.assertFalse(component.is_failed())
# Check it can't be started again
self.assertRaises(ValueError, component.start)
self.assertFalse(self.__stop_called)
self.assertTrue(self.__failed_called)
self.assertFalse(component.running())
+ self.assertTrue(component.is_failed())
def __do_start_stop(self, kind):
"""
self.assertTrue(self.__stop_called)
self.assertFalse(self.__failed_called)
self.assertFalse(component.running())
+ self.assertFalse(component.is_failed())
# Check it can't be stopped twice
self.assertRaises(ValueError, component.stop)
# Or failed