def test_scribe_tail_handles_StreamTailerSetupError(): env = 'fake_env' stream_name = 'fake_stream' service = 'fake_service' levels = ['fake_level1'] components = ['build'] clusters = ['fake_cluster1'] queue = Queue() filter_fn = lambda *_: True with contextlib.nested( mock.patch('paasta_tools.paasta_cli.cmds.logs.scribereader', autospec=True), mock.patch('paasta_tools.paasta_cli.cmds.logs.log', autospec=True), ) as ( mock_scribereader, mock_log, ): mock_scribereader.get_stream_tailer.side_effect = StreamTailerSetupError('bla', 'unused1', 'unused2') with raises(StreamTailerSetupError): logs.scribe_tail( env, stream_name, service, levels, components, clusters, queue, filter_fn, ) mock_log.error.assert_any_call('Failed to setup stream tailing for %s in fake_env' % stream_name)
def test_scribe_tail_handles_StreamTailerSetupError(): env = 'fake_env' stream_name = 'fake_stream' service = 'fake_service' levels = ['fake_level1'] components = ['build'] clusters = ['fake_cluster1'] queue = Queue() filter_fn = lambda *_: True with contextlib.nested( mock.patch('paasta_tools.paasta_cli.cmds.logs.scribereader', autospec=True), mock.patch('paasta_tools.paasta_cli.cmds.logs.log', autospec=True), ) as ( mock_scribereader, mock_log, ): mock_scribereader.get_stream_tailer.side_effect = StreamTailerSetupError( 'bla', 'unused1', 'unused2') with raises(StreamTailerSetupError): logs.scribe_tail( env, stream_name, service, levels, components, clusters, queue, filter_fn, ) mock_log.error.assert_any_call( 'Failed to setup stream tailing for %s in fake_env' % stream_name)
def test_scribe_tail_ctrl_c(): env = 'fake_env' stream_name = 'fake_stream' service = 'fake_service' levels = ['fake_level1', 'fake_level2'] components = ['build', 'deploy'] clusters = ['fake_cluster1', 'fake_cluster2'] queue = Queue() filter_fn = lambda *_: True with contextlib.nested( mock.patch('paasta_tools.paasta_cli.cmds.logs.scribereader', autospec=True), ) as ( mock_scribereader, ): # There's no reason this method is the one that raises the # KeyboardInterrupt. This just happens to be the first convenient place # to simulate the user pressing Ctrl-C. mock_scribereader.get_env_scribe_host.side_effect = FakeKeyboardInterrupt try: logs.scribe_tail( env, stream_name, service, levels, components, clusters, queue, filter_fn, ) # We have to catch this ourselves otherwise it will fool pytest too! except FakeKeyboardInterrupt: raise Exception('The code under test failed to catch a (fake) KeyboardInterrupt!')
def test_scribe_tail_ctrl_c(): env = 'fake_env' stream_name = 'fake_stream' service = 'fake_service' levels = ['fake_level1', 'fake_level2'] components = ['build', 'deploy'] clusters = ['fake_cluster1', 'fake_cluster2'] queue = Queue() filter_fn = lambda *_: True with contextlib.nested( mock.patch('paasta_tools.paasta_cli.cmds.logs.scribereader', autospec=True), ) as (mock_scribereader, ): # There's no reason this method is the one that raises the # KeyboardInterrupt. This just happens to be the first convenient place # to simulate the user pressing Ctrl-C. mock_scribereader.get_env_scribe_host.side_effect = FakeKeyboardInterrupt try: logs.scribe_tail( env, stream_name, service, levels, components, clusters, queue, filter_fn, ) # We have to catch this ourselves otherwise it will fool pytest too! except FakeKeyboardInterrupt: raise Exception( 'The code under test failed to catch a (fake) KeyboardInterrupt!' )
def test_scribe_tail_log_everything(): env = 'fake_env' stream_name = 'fake_stream' service = 'fake_service' levels = ['fake_level1', 'fake_level2'] components = ['build', 'deploy'] clusters = ['fake_cluster1', 'fake_cluster2'] instance = 'fake_instance' queue = Queue() filter_fn = lambda *_: True tailer = iter([ format_log_line( levels[0], clusters, instance, 'build', 'level: first. component: build.', ), format_log_line( levels[1], clusters, instance, 'deploy', 'level: second. component: deploy.', ), ]) with contextlib.nested( mock.patch('paasta_tools.paasta_cli.cmds.logs.scribereader', autospec=True), ) as (mock_scribereader, ): mock_scribereader.get_env_scribe_host.return_value = { 'host': 'fake_host', 'port': 'fake_port', } mock_scribereader.get_stream_tailer.return_value = tailer logs.scribe_tail(env, stream_name, service, levels, components, clusters, queue, filter_fn) assert mock_scribereader.get_env_scribe_host.call_count == 1 mock_scribereader.get_stream_tailer.assert_called_once_with( stream_name, 'fake_host', 'fake_port', ) assert queue.qsize() == 2 # Sadly, fetching with a timeout seems to be needed with # multiprocessing.Queue (this was not the case with Queue.Queue). It # failed 8/10 times with a get_nowait() vs 0/10 times with a 0.1s # timeout. first_line = queue.get(True, 0.1) assert 'level: first. component: build.' in first_line second_line = queue.get(True, 0.1) assert 'level: second. component: deploy.' in second_line
def test_scribe_tail_log_nothing(): env = 'fake_env' stream_name = 'fake_stream' service = 'fake_service' levels = ['fake_level1', 'fake_level2'] components = ['build', 'deploy'] clusters = ['fake_cluster1', 'fake_cluster2'] instance = 'fake_instance' queue = Queue() filter_fn = lambda *_: False tailer = iter([ format_log_line( levels[0], clusters, instance, 'build', 'level: first. component: build.', ), format_log_line( levels[1], clusters, instance, 'deploy', 'level: second. component: deploy.', ), ]) with contextlib.nested( mock.patch('paasta_tools.paasta_cli.cmds.logs.scribereader', autospec=True), ) as ( mock_scribereader, ): mock_scribereader.get_env_scribe_host.return_value = { 'host': 'fake_host', 'port': 'fake_port', } mock_scribereader.get_stream_tailer.return_value = tailer logs.scribe_tail( env, stream_name, service, levels, components, clusters, queue, filter_fn, ) assert queue.qsize() == 0
def test_scribe_tail_log_nothing(): env = 'fake_env' stream_name = 'fake_stream' service = 'fake_service' levels = ['fake_level1', 'fake_level2'] components = ['build', 'deploy'] clusters = ['fake_cluster1', 'fake_cluster2'] instance = 'fake_instance' queue = Queue() filter_fn = lambda *_: False tailer = iter([ format_log_line( levels[0], clusters, instance, 'build', 'level: first. component: build.', ), format_log_line( levels[1], clusters, instance, 'deploy', 'level: second. component: deploy.', ), ]) with contextlib.nested( mock.patch('paasta_tools.paasta_cli.cmds.logs.scribereader', autospec=True), ) as (mock_scribereader, ): mock_scribereader.get_env_scribe_host.return_value = { 'host': 'fake_host', 'port': 'fake_port', } mock_scribereader.get_stream_tailer.return_value = tailer logs.scribe_tail( env, stream_name, service, levels, components, clusters, queue, filter_fn, ) assert queue.qsize() == 0
def test_scribe_tail_log_everything(): env = 'fake_env' stream_name = 'fake_stream' service = 'fake_service' levels = ['fake_level1', 'fake_level2'] components = ['build', 'deploy'] clusters = ['fake_cluster1', 'fake_cluster2'] instance = 'fake_instance' queue = Queue() filter_fn = lambda *_: True tailer = iter([ format_log_line( levels[0], clusters, instance, 'build', 'level: first. component: build.', ), format_log_line( levels[1], clusters, instance, 'deploy', 'level: second. component: deploy.', ), ]) with contextlib.nested( mock.patch('paasta_tools.paasta_cli.cmds.logs.scribereader', autospec=True), ) as ( mock_scribereader, ): mock_scribereader.get_env_scribe_host.return_value = { 'host': 'fake_host', 'port': 'fake_port', } mock_scribereader.get_stream_tailer.return_value = tailer logs.scribe_tail( env, stream_name, service, levels, components, clusters, queue, filter_fn ) assert mock_scribereader.get_env_scribe_host.call_count == 1 mock_scribereader.get_stream_tailer.assert_called_once_with( stream_name, 'fake_host', 'fake_port', ) assert queue.qsize() == 2 # Sadly, fetching with a timeout seems to be needed with # multiprocessing.Queue (this was not the case with Queue.Queue). It # failed 8/10 times with a get_nowait() vs 0/10 times with a 0.1s # timeout. first_line = queue.get(True, 0.1) assert 'level: first. component: build.' in first_line second_line = queue.get(True, 0.1) assert 'level: second. component: deploy.' in second_line