def test_handle_listener_state_change_busy_to_unknown(self):
     from docker_supervisor.events import EventRejectedEvent
     from docker_supervisor.events import subscribe
     events = []
     def doit(event):
         events.append(event)
     subscribe(EventRejectedEvent, doit)
     options = DummyOptions()
     config = DummyPConfig(options, 'process1', '/bin/process1')
     process = DummyProcess(config)
     from docker_supervisor.dispatchers import EventListenerStates
     dispatcher = self._makeOne(process)
     process.listener_state = EventListenerStates.BUSY
     current_event = DummyEvent()
     process.event = current_event
     dispatcher.state_buffer = 'bogus data\n'
     self.assertEqual(dispatcher.handle_listener_state_change(), None)
     self.assertEqual(dispatcher.state_buffer, '')
     self.assertEqual(options.logger.data[0],
             "process1: bad result line: 'bogus data'")
     self.assertEqual(options.logger.data[1],
             'process1: BUSY -> UNKNOWN')
     self.assertEqual(options.logger.data[2],
                      'process1: has entered the UNKNOWN state and will '
                      'no longer receive events, this usually indicates '
                      'the process violated the eventlistener protocol')
     self.assertEqual(process.listener_state,
                      EventListenerStates.UNKNOWN)
     self.assertEqual(events[0].process, process)
     self.assertEqual(events[0].event, current_event)
 def test_handle_result_rejectevent(self):
     from docker_supervisor.events import subscribe
     options = DummyOptions()
     config = DummyPConfig(options, 'process1', '/bin/process1')
     process = DummyProcess(config)
     L = []
     def doit(event):
         L.append(event)
     from docker_supervisor import events
     subscribe(events.EventRejectedEvent, doit)
     from docker_supervisor.dispatchers import EventListenerStates
     dispatcher = self._makeOne(process)
     def rejected(event, result):
         from docker_supervisor.dispatchers import RejectEvent
         raise RejectEvent(result)
     class Dummy:
         pass
     process.group = Dummy()
     process.group.config = Dummy()
     process.group.config.result_handler = rejected
     process.listener_state = EventListenerStates.BUSY
     dispatcher.handle_result('foo')
     self.assertEqual(len(L), 1)
     self.assertEqual(L[0].__class__, events.EventRejectedEvent)
     self.assertEqual(process.listener_state,
                      EventListenerStates.ACKNOWLEDGED)
     self.assertEqual(options.logger.data[0],
                      'process1: event was rejected')
     self.assertEqual(options.logger.data[1],
                      'process1: BUSY -> ACKNOWLEDGED')
 def test_handle_listener_state_busy_gobbles(self):
     options = DummyOptions()
     config = DummyPConfig(options, 'process1', '/bin/process1')
     process = DummyProcess(config)
     from docker_supervisor.dispatchers import EventListenerStates
     dispatcher = self._makeOne(process)
     process.listener_state = EventListenerStates.BUSY
     class Dummy:
         pass
     process.group = Dummy()
     process.group.config = Dummy()
     from docker_supervisor.dispatchers import default_handler
     process.group.config.result_handler = default_handler
     dispatcher.state_buffer = 'RESULT 2\nOKbogus data\n'
     self.assertEqual(dispatcher.handle_listener_state_change(), None)
     self.assertEqual(dispatcher.state_buffer, '')
     self.assertEqual(options.logger.data[0],
                      'process1: event was processed')
     self.assertEqual(options.logger.data[1],
                      'process1: BUSY -> ACKNOWLEDGED')
     self.assertEqual(options.logger.data[2],
                      'process1: ACKNOWLEDGED -> UNKNOWN')
     self.assertEqual(options.logger.data[3],
                      'process1: has entered the UNKNOWN state and will '
                      'no longer receive events, this usually indicates '
                      'the process violated the eventlistener protocol')
     self.assertEqual(process.listener_state,
                      EventListenerStates.UNKNOWN)
 def test_handle_result_exception(self):
     from docker_supervisor.events import subscribe
     options = DummyOptions()
     config = DummyPConfig(options, 'process1', '/bin/process1')
     process = DummyProcess(config)
     L = []
     def doit(event):
         L.append(event)
     from docker_supervisor import events
     subscribe(events.EventRejectedEvent, doit)
     from docker_supervisor.dispatchers import EventListenerStates
     dispatcher = self._makeOne(process)
     def exception(event, result):
         raise ValueError
     class Dummy:
         pass
     process.group = Dummy()
     process.group.config = Dummy()
     process.group.config.result_handler = exception
     process.group.result_handler = exception
     process.listener_state = EventListenerStates.BUSY
     dispatcher.handle_result('foo')
     self.assertEqual(len(L), 1)
     self.assertEqual(L[0].__class__, events.EventRejectedEvent)
     self.assertEqual(process.listener_state,
                      EventListenerStates.UNKNOWN)
     self.assertEqual(options.logger.data[0],
                      'process1: event caused an error')
     self.assertEqual(options.logger.data[1],
                      'process1: BUSY -> UNKNOWN')
     self.assertEqual(options.logger.data[2],
                      'process1: has entered the UNKNOWN state and will '
                      'no longer receive events, this usually indicates '
                      'the process violated the eventlistener protocol')
Ejemplo n.º 5
0
    def test_process_state_events_with_pid(self):
        from docker_supervisor.states import ProcessStates
        from docker_supervisor import events
        for klass in (
                events.ProcessStateRunningEvent,
                events.ProcessStateStoppedEvent,
                events.ProcessStateStoppingEvent,
        ):
            options = DummyOptions()
            pconfig1 = DummyPConfig(options, 'process1', 'process1',
                                    '/bin/process1')

            class DummyGroup:
                config = pconfig1

            process1 = DummyProcess(pconfig1)
            process1.group = DummyGroup
            process1.pid = 1
            event = klass(process1, ProcessStates.STARTING)
            headers, payload = self._deserialize(str(event))
            self.assertEqual(len(headers), 4)
            self.assertEqual(headers['processname'], 'process1')
            self.assertEqual(headers['groupname'], 'process1')
            self.assertEqual(headers['from_state'], 'STARTING')
            self.assertEqual(headers['pid'], '1')
            self.assertEqual(payload, '')
 def test_readable_closed(self):
     options = DummyOptions()
     config = DummyPConfig(options, 'process1', '/bin/process1')
     process = DummyProcess(config)
     dispatcher = self._makeOne(process)
     dispatcher.closed = True
     self.assertEqual(dispatcher.readable(), False)
Ejemplo n.º 7
0
    def test_process_state_events_starting_and_backoff(self):
        from docker_supervisor.states import ProcessStates
        from docker_supervisor import events
        for klass in (
                events.ProcessStateStartingEvent,
                events.ProcessStateBackoffEvent,
        ):
            options = DummyOptions()
            pconfig1 = DummyPConfig(options, 'process1', 'process1',
                                    '/bin/process1')

            class DummyGroup:
                config = pconfig1

            process1 = DummyProcess(pconfig1)
            process1.group = DummyGroup
            event = klass(process1, ProcessStates.STARTING)
            headers, payload = self._deserialize(str(event))
            self.assertEqual(len(headers), 4)
            self.assertEqual(headers['processname'], 'process1')
            self.assertEqual(headers['groupname'], 'process1')
            self.assertEqual(headers['from_state'], 'STARTING')
            self.assertEqual(headers['tries'], '0')
            self.assertEqual(payload, '')
            process1.backoff = 1
            event = klass(process1, ProcessStates.STARTING)
            headers, payload = self._deserialize(str(event))
            self.assertEqual(headers['tries'], '1')
            process1.backoff = 2
            event = klass(process1, ProcessStates.STARTING)
            headers, payload = self._deserialize(str(event))
            self.assertEqual(headers['tries'], '2')
 def test_handle_write_event(self):
     options = DummyOptions()
     config = DummyPConfig(options, 'process1', '/bin/process1')
     process = DummyProcess(config)
     dispatcher = self._makeOne(process)
     dispatcher.input_buffer = 'halloooo'
     self.assertEqual(dispatcher.handle_write_event(), None)
     self.assertEqual(options.written[0], 'halloooo')
 def test_reopenlogs(self):
     options = DummyOptions()
     config = DummyPConfig(options, 'process1', '/bin/process1',
                           stdout_logfile='/tmp/foo')
     process = DummyProcess(config)
     dispatcher = self._makeOne(process)
     dispatcher.reopenlogs()
     self.assertEqual(dispatcher.childlog.handlers[0].reopened, True)
Ejemplo n.º 10
0
 def test_handle_request_stdout_logfile_missing(self):
     options = DummyOptions()
     pconfig = DummyPConfig(options, 'foo', 'foo', 'it/is/missing')
     supervisord = PopulatedDummySupervisor(options, 'foo', pconfig)
     handler = self._makeOne(supervisord)
     request = DummyRequest('/logtail/foo', None, None, None)
     handler.handle_request(request)
     self.assertEqual(request._error, 410)
 def test_handle_write_event_uncaught_raised(self):
     options = DummyOptions()
     config = DummyPConfig(options, 'test', '/test')
     process = DummyProcess(config)
     dispatcher = self._makeOne(process)
     dispatcher.input_buffer = 'halloooo'
     import errno
     options.write_error = errno.EBADF
     self.assertRaises(OSError, dispatcher.handle_write_event)
 def test_close(self):
     options = DummyOptions()
     config = DummyPConfig(options, 'process1', '/bin/process1')
     process = DummyProcess(config)
     dispatcher = self._makeOne(process)
     dispatcher.close()
     self.assertEqual(dispatcher.closed, True)
     dispatcher.close() # make sure we don't error if we try to close twice
     self.assertEqual(dispatcher.closed, True)
 def test_handle_read_event(self):
     options = DummyOptions()
     options.readfd_result = 'abc'
     config = DummyPConfig(options, 'process1', '/bin/process1',
                           stdout_capture_maxbytes=100)
     process = DummyProcess(config)
     dispatcher = self._makeOne(process)
     self.assertEqual(dispatcher.handle_read_event(), None)
     self.assertEqual(dispatcher.output_buffer, 'abc')
 def test_handle_sigusr2(self):
     options = DummyOptions()
     options._signal = signal.SIGUSR2
     pconfig1 = DummyPConfig(options, 'process1', 'process1',
                             '/bin/process1')
     from docker_supervisor.process import ProcessStates
     process1 = DummyProcess(pconfig1, state=ProcessStates.STOPPING)
     process1.delay = time.time() - 1
     supervisord = self._makeOne(options)
     pconfigs = [DummyPConfig(options, 'foo', 'foo', '/bin/foo')]
     options.process_group_configs = DummyPGroupConfig(options,
                                                       'foo',
                                                       pconfigs=pconfigs)
     supervisord.handle_signal()
     self.assertEqual(supervisord.options.mood, 1)
     self.assertEqual(options.logs_reopened, True)
     self.assertEqual(options.logger.data[0],
                      'received SIGUSR2 indicating log reopen request')
 def test_handle_write_event_nodata(self):
     options = DummyOptions()
     config = DummyPConfig(options, 'test', '/test')
     process = DummyProcess(config)
     dispatcher = self._makeOne(process)
     self.assertEqual(dispatcher.input_buffer, '')
     dispatcher.handle_write_event
     self.assertEqual(dispatcher.input_buffer, '')
     self.assertEqual(options.written, {})
 def test_ctor_nologfiles(self):
     options = DummyOptions()
     config = DummyPConfig(options, 'process1', '/bin/process1')
     process = DummyProcess(config)
     dispatcher = self._makeOne(process)
     self.assertEqual(dispatcher.process, process)
     self.assertEqual(dispatcher.channel, 'stdout')
     self.assertEqual(dispatcher.fd, 0)
     self.assertEqual(dispatcher.childlog, None)
Ejemplo n.º 17
0
 def test_EventRejectedEvent_attributes(self):
     from docker_supervisor.events import EventRejectedEvent
     options = DummyOptions()
     pconfig1 = DummyPConfig(options, 'process1', 'process1',
                             '/bin/process1')
     process = DummyProcess(pconfig1)
     rejected_event = DummyEvent()
     event = EventRejectedEvent(process, rejected_event)
     self.assertEqual(event.process, process)
     self.assertEqual(event.event, rejected_event)
 def test_handle_read_event_logging_nologs(self):
     options = DummyOptions()
     options.readfd_result = 'supercalifragilisticexpialidocious'
     config = DummyPConfig(options, 'process1', '/bin/process1')
     process = DummyProcess(config)
     dispatcher = self._makeOne(process)
     # just make sure there are no errors if a child logger doesnt
     # exist
     self.assertEqual(dispatcher.handle_read_event(), None)
     self.assertEqual(dispatcher.childlog, None)
 def test_handle_write_event_over_os_limit(self):
     options = DummyOptions()
     config = DummyPConfig(options, 'test', '/test')
     process = DummyProcess(config)
     dispatcher = self._makeOne(process)
     options.write_accept = 1
     dispatcher.input_buffer = 'a' * 50
     dispatcher.handle_write_event()
     self.assertEqual(len(dispatcher.input_buffer), 49)
     self.assertEqual(options.written[0], 'a')
 def test_ctor_logfile_only(self):
     options = DummyOptions()
     config = DummyPConfig(options, 'process1', '/bin/process1',
                           stdout_logfile='/tmp/foo')
     process = DummyProcess(config)
     dispatcher = self._makeOne(process)
     self.assertEqual(dispatcher.process, process)
     self.assertEqual(dispatcher.channel, 'stdout')
     self.assertEqual(dispatcher.fd, 0)
     self.assertEqual(dispatcher.childlog.__class__, DummyLogger)
 def test_repr(self):
     options = DummyOptions()
     config = DummyPConfig(options, 'process1', '/bin/process1')
     process = DummyProcess(config)
     dispatcher = self._makeOne(process)
     drepr = repr(dispatcher)
     self.assertTrue(drepr.startswith('<PInputDispatcher at'), drepr)
     self.assertNotEqual(
         drepr.find('<supervisor.tests.base.DummyProcess instance at'),
         -1)
     self.assertTrue(drepr.endswith('(stdin)>'), drepr)
 def test_handle_listener_state_change_busy_to_insufficient(self):
     options = DummyOptions()
     config = DummyPConfig(options, 'process1', '/bin/process1')
     process = DummyProcess(config)
     from docker_supervisor.dispatchers import EventListenerStates
     dispatcher = self._makeOne(process)
     process.listener_state = EventListenerStates.BUSY
     dispatcher.state_buffer = 'bogus data yo'
     self.assertEqual(dispatcher.handle_listener_state_change(), None)
     self.assertEqual(dispatcher.state_buffer, 'bogus data yo')
     self.assertEqual(process.listener_state, EventListenerStates.BUSY)
 def test_handle_read_event_logging_childlog(self):
     options = DummyOptions()
     options.readfd_result = 'supercalifragilisticexpialidocious'
     config = DummyPConfig(options, 'process1', '/bin/process1',
                           stdout_logfile='/tmp/foo')
     process = DummyProcess(config)
     dispatcher = self._makeOne(process)
     self.assertEqual(dispatcher.handle_read_event(), None)
     self.assertEqual(len(dispatcher.childlog.data), 1)
     self.assertEqual(dispatcher.childlog.data[0],
                      'supercalifragilisticexpialidocious')
 def test_handle_read_event_nodata(self):
     options = DummyOptions()
     options.readfd_result = ''
     config = DummyPConfig(options, 'process1', '/bin/process1')
     process = DummyProcess(config)
     dispatcher = self._makeOne(process)
     self.assertEqual(dispatcher.handle_read_event(), None)
     self.assertEqual(dispatcher.state_buffer, '')
     from docker_supervisor.dispatchers import EventListenerStates
     self.assertEqual(dispatcher.process.listener_state,
                      EventListenerStates.ACKNOWLEDGED)
    def test_diff_add_remove(self):
        options = DummyOptions()
        supervisord = self._makeOne(options)

        pconfig = DummyPConfig(options, 'process1', 'process1')
        group1 = DummyPGroupConfig(options, 'group1', pconfigs=[pconfig])

        pconfig = DummyPConfig(options, 'process2', 'process2')
        group2 = DummyPGroupConfig(options, 'group2', pconfigs=[pconfig])

        new = [group1, group2]

        added, changed, removed = supervisord.diff_to_active()
        self.assertEqual(added, [])
        self.assertEqual(changed, [])
        self.assertEqual(removed, [])

        added, changed, removed = supervisord.diff_to_active(new)
        self.assertEqual(added, new)
        self.assertEqual(changed, [])
        self.assertEqual(removed, [])

        supervisord.options.process_group_configs = new
        added, changed, removed = supervisord.diff_to_active()
        self.assertEqual(added, new)

        supervisord.add_process_group(group1)
        supervisord.add_process_group(group2)

        pconfig = DummyPConfig(options, 'process3', 'process3')
        new_group1 = DummyPGroupConfig(options, pconfigs=[pconfig])

        pconfig = DummyPConfig(options, 'process4', 'process4')
        new_group2 = DummyPGroupConfig(options, pconfigs=[pconfig])

        new = [group2, new_group1, new_group2]

        added, changed, removed = supervisord.diff_to_active(new)
        self.assertEqual(added, [new_group1, new_group2])
        self.assertEqual(changed, [])
        self.assertEqual(removed, [group1])
Ejemplo n.º 26
0
 def _test_one_ProcessStateEvent(self, klass):
     from docker_supervisor.states import ProcessStates
     from docker_supervisor.events import ProcessStateEvent
     self.assertTrue(issubclass(klass, ProcessStateEvent))
     options = DummyOptions()
     pconfig1 = DummyPConfig(options, 'process1', 'process1',
                             '/bin/process1')
     process = DummyProcess(pconfig1)
     inst = klass(process, ProcessStates.STARTING)
     self.assertEqual(inst.process, process)
     self.assertEqual(inst.from_state, ProcessStates.STARTING)
     self.assertEqual(inst.expected, True)
Ejemplo n.º 27
0
 def test_handle_request_stdout_logfile_none(self):
     options = DummyOptions()
     pconfig = DummyPConfig(options,
                            'process1',
                            '/bin/process1',
                            priority=1,
                            stdout_logfile='/tmp/process1.log')
     supervisord = PopulatedDummySupervisor(options, 'process1', pconfig)
     handler = self._makeOne(supervisord)
     request = DummyRequest('/logtail/process1', None, None, None)
     handler.handle_request(request)
     self.assertEqual(request._error, 410)
 def test_handle_error(self):
     options = DummyOptions()
     config = DummyPConfig(options, 'test', '/test')
     process = DummyProcess(config)
     dispatcher = self._makeOne(process)
     try:
         raise ValueError('foo')
     except:
         dispatcher.handle_error()
     result = options.logger.data[0]
     self.assertTrue(result.startswith(
         'uncaptured python exception, closing channel'),result)
 def test_handle_listener_state_change_from_unknown(self):
     options = DummyOptions()
     config = DummyPConfig(options, 'process1', '/bin/process1')
     process = DummyProcess(config)
     from docker_supervisor.dispatchers import EventListenerStates
     dispatcher = self._makeOne(process)
     process.listener_state = EventListenerStates.UNKNOWN
     dispatcher.state_buffer = 'whatever'
     self.assertEqual(dispatcher.handle_listener_state_change(), None)
     self.assertEqual(dispatcher.state_buffer, '')
     self.assertEqual(options.logger.data, [])
     self.assertEqual(process.listener_state, EventListenerStates.UNKNOWN)
 def test_ctor_capturelog_only(self):
     options = DummyOptions()
     config = DummyPConfig(options, 'process1', '/bin/process1',
                           stdout_capture_maxbytes=300)
     process = DummyProcess(config)
     dispatcher = self._makeOne(process)
     self.assertEqual(dispatcher.process, process)
     self.assertEqual(dispatcher.channel, 'stdout')
     self.assertEqual(dispatcher.fd, 0)
     self.assertEqual(dispatcher.capturelog.__class__,DummyLogger)
     self.assertEqual(dispatcher.mainlog, None)
     self.assertEqual(dispatcher.childlog, None)