def test_running(self): """ Test the running method. """ from supvisors.application import ApplicationStatus from supvisors.process import ProcessStatus application = ApplicationStatus('ApplicationTest', self.supvisors.logger) self.assertFalse(application.running()) # add a stopped process info = any_stopped_process_info() process = ProcessStatus(info['group'], info['name'], self.supvisors) process.add_info('10.0.0.1', info) application.add_process(process) application.update_status() self.assertFalse(application.running()) # add a running process info = any_running_process_info() process = ProcessStatus(info['group'], info['name'], self.supvisors) process.add_info('10.0.0.1', info) application.add_process(process) application.update_status() self.assertTrue(application.running())
def test_stopped(self): """ Test the stopped method. """ from supvisors.application import ApplicationStatus from supvisors.process import ProcessStatus application = ApplicationStatus('ApplicationTest', self.supvisors.logger) self.assertTrue(application.stopped()) # add a stopped process info = any_stopped_process_info() process = ProcessStatus(info['group'], info['name'], self.supvisors) process.add_info('10.0.0.1', info) application.add_process(process) application.update_status() self.assertTrue(application.stopped()) # add a running process info = any_running_process_info() process = ProcessStatus(info['group'], info['name'], self.supvisors) process.add_info('10.0.0.1', info) application.add_process(process) application.update_status() self.assertFalse(application.stopped())
def test_update_status(self): """ Test the rules to update the status of the application method. """ from supervisor.states import ProcessStates from supvisors.application import ApplicationStatus from supvisors.process import ProcessStatus from supvisors.ttypes import ApplicationStates application = ApplicationStatus('ApplicationTest', self.supvisors.logger) # add processes to the application for info in database_copy(): process = ProcessStatus(info['group'], info['name'], self.supvisors) process.add_info('10.0.0.1', info) application.add_process(process) # init status # there are lots of states but the 'strongest' is STARTING # STARTING is a 'running' state so major/minor failures are applicable application.update_status() self.assertEqual(ApplicationStates.STARTING, application.state) # there is a FATAL state in the process database # no rule is set for processes, so there are only minor failures self.assertFalse(application.major_failure) self.assertTrue(application.minor_failure) # set FATAL process to major fatal_process = next((process for process in application.processes.values() if process.state == ProcessStates.FATAL), None) fatal_process.rules.required = True # update status. major failure is now expected application.update_status() self.assertEqual(ApplicationStates.STARTING, application.state) self.assertTrue(application.major_failure) self.assertFalse(application.minor_failure) # set STARTING process to RUNNING starting_process = next((process for process in application.processes.values() if process.state == ProcessStates.STARTING), None) starting_process.state = ProcessStates.RUNNING # update status. there is still one BACKOFF process leading to STARTING application application.update_status() self.assertEqual(ApplicationStates.STARTING, application.state) self.assertTrue(application.major_failure) self.assertFalse(application.minor_failure) # set BACKOFF process to EXITED backoff_process = next((process for process in application.processes.values() if process.state == ProcessStates.BACKOFF), None) backoff_process.state = ProcessStates.EXITED # update status. the 'strongest' state is now STOPPING # as STOPPING is not a 'running' state, failures are not applicable application.update_status() self.assertEqual(ApplicationStates.STOPPING, application.state) self.assertFalse(application.major_failure) self.assertFalse(application.minor_failure) # set STOPPING process to STOPPED stopping_process = next((process for process in application.processes.values() if process.state == ProcessStates.STOPPING), None) stopping_process.state = ProcessStates.STOPPED # update status. the 'strongest' state is now RUNNING # failures are applicable again application.update_status() self.assertEqual(ApplicationStates.RUNNING, application.state) self.assertTrue(application.major_failure) self.assertFalse(application.minor_failure) # set RUNNING processes to STOPPED for process in application.processes.values(): if process.state == ProcessStates.RUNNING: process.state = ProcessStates.STOPPED # update status. the 'strongest' state is now RUNNING # failures are not applicable anymore application.update_status() self.assertEqual(ApplicationStates.STOPPED, application.state) self.assertFalse(application.major_failure) self.assertFalse(application.minor_failure)
def test_update_status(self): """ Test the rules to update the status of the application method. """ from supervisor.states import ProcessStates from supvisors.application import ApplicationStatus from supvisors.process import ProcessStatus from supvisors.ttypes import ApplicationStates application = ApplicationStatus('ApplicationTest', self.supvisors.logger) # add processes to the application for info in ProcessInfoDatabase: process = ProcessStatus(info['group'], info['name'], self.supvisors) process.add_info('10.0.0.1', info.copy()) application.add_process(process) # init status # there are lots of states but the 'strongest' is STARTING # STARTING is a 'running' state so major/minor failures are applicable application.update_status() self.assertEqual(ApplicationStates.STARTING, application.state) # there is a FATAL state in the process database # no rule is set for processes, so there are only minor failures self.assertFalse(application.major_failure) self.assertTrue(application.minor_failure) # set FATAL process to major fatal_process = next((process for process in application.processes.values() if process.state == ProcessStates.FATAL), None) fatal_process.rules.required = True # update status. major failure is now expected application.update_status() self.assertEqual(ApplicationStates.STARTING, application.state) self.assertTrue(application.major_failure) self.assertFalse(application.minor_failure) # set STARTING process to RUNNING starting_process = next( (process for process in application.processes.values() if process.state == ProcessStates.STARTING), None) starting_process.state = ProcessStates.RUNNING # update status. there is still one BACKOFF process leading to STARTING application application.update_status() self.assertEqual(ApplicationStates.STARTING, application.state) self.assertTrue(application.major_failure) self.assertFalse(application.minor_failure) # set BACKOFF process to EXITED backoff_process = next( (process for process in application.processes.values() if process.state == ProcessStates.BACKOFF), None) backoff_process.state = ProcessStates.EXITED # update status. the 'strongest' state is now STOPPING # as STOPPING is not a 'running' state, failures are not applicable application.update_status() self.assertEqual(ApplicationStates.STOPPING, application.state) self.assertFalse(application.major_failure) self.assertFalse(application.minor_failure) # set STOPPING process to STOPPED stopping_process = next( (process for process in application.processes.values() if process.state == ProcessStates.STOPPING), None) stopping_process.state = ProcessStates.STOPPED # update status. the 'strongest' state is now RUNNING # failures are applicable again application.update_status() self.assertEqual(ApplicationStates.RUNNING, application.state) self.assertTrue(application.major_failure) self.assertFalse(application.minor_failure) # set RUNNING processes to STOPPED for process in application.processes.values(): if process.state == ProcessStates.RUNNING: process.state = ProcessStates.STOPPED # update status. the 'strongest' state is now RUNNING # failures are not applicable anymore application.update_status() self.assertEqual(ApplicationStates.STOPPED, application.state) self.assertFalse(application.major_failure) self.assertFalse(application.minor_failure)