def test_main_streams(self, mock_stdout, botoclient): client = Mock() botoclient.return_value = client awslogs = AWSLogs() groups = [ { 'logGroups': [{ 'logGroupName': 'AAA' }, { 'logGroupName': 'BBB' }, { 'logGroupName': 'CCC' }] }, ] streams = [{'logStreams': [self._stream('DDD'), self._stream('EEE')]}] def paginator(value): mock = Mock() mock.paginate.return_value = { 'describe_log_groups': groups, 'describe_log_streams': streams }.get(value) return mock client.get_paginator.side_effect = paginator main("awslogs streams AAA".split()) self.assertEqual(mock_stdout.getvalue(), ("DDD\n" "EEE\n"))
def test_get_streams(self, botoclient): client = Mock() botoclient.return_value = client client.get_paginator.return_value.paginate.return_value = [ { 'logStreams': [self._stream('A'), self._stream('B'), self._stream('C')], 'nextToken': 1 }, { 'logStreams': [self._stream('D'), self._stream('E'), self._stream('F')], 'nextToken': 2 }, { 'logStreams': [self._stream('G')] }, ] awslogs = AWSLogs(log_group_name='group') self.assertEqual([g for g in awslogs.get_streams()], ['A', 'B', 'C', 'D', 'E', 'F', 'G'])
def test_get_streams(self, botoclient): client = Mock() botoclient.return_value = client client.get_paginator.return_value.paginate.return_value = [ { 'logStreams': [self._stream('AA'), self._stream('AB'), self._stream('AC')], 'nextToken': 1 }, { 'logStreams': [self._stream('AD'), self._stream('AE'), self._stream('AF')], 'nextToken': 2 }, { 'logStreams': [self._stream('AG')] }, ] awslogs = AWSLogs() self.assertEqual([g for g in awslogs.get_streams('group_name')], ['AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG']) self.assertEqual([g for g in awslogs.get_streams('group_name', 'A')], ['AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG' ]) # TODO test this properly
def test_parse_datetime(self, datetime_mock, botoclient): awslogs = AWSLogs() datetime_mock.utcnow.return_value = datetime(2015, 1, 1, 3, 0, 0, 0) datetime_mock.return_value = datetime(1970, 1, 1) def iso2epoch(iso_str): dt = datetime.strptime(iso_str, "%Y-%m-%d %H:%M:%S") return int(total_seconds(dt - datetime(1970, 1, 1)) * 1000) self.assertEqual(awslogs.parse_datetime(''), None) self.assertEqual(awslogs.parse_datetime(None), None) plan = (('2015-01-01 02:59:59', '1s'), ('2015-01-01 02:59:59', '1s ago'), ('2015-01-01 02:59:59', '1sec'), ('2015-01-01 02:59:59', '1sec ago'), ('2015-01-01 02:59:59', '1second'), ('2015-01-01 02:59:59', '1second ago'), ('2015-01-01 02:59:59', '1seconds'), ('2015-01-01 02:59:59', '1seconds ago'), ('2015-01-01 02:59:00', '1m'), ('2015-01-01 02:59:00', '1m ago'), ('2015-01-01 02:59:00', '1minute'), ('2015-01-01 02:59:00', '1minute ago'), ('2015-01-01 02:59:00', '1minutes'), ('2015-01-01 02:59:00', '1minutes ago'), ('2015-01-01 02:00:00', '1h'), ('2015-01-01 02:00:00', '1h ago'), ('2015-01-01 02:00:00', '1hour'), ('2015-01-01 02:00:00', '1hour ago'), ('2015-01-01 02:00:00', '1hours'), ('2015-01-01 02:00:00', '1hours ago'), ('2014-12-31 03:00:00', '1d'), ('2014-12-31 03:00:00', '1d ago'), ('2014-12-31 03:00:00', '1day'), ('2014-12-31 03:00:00', '1day ago'), ('2014-12-31 03:00:00', '1days'), ('2014-12-31 03:00:00', '1days ago'), ('2014-12-25 03:00:00', '1w'), ('2014-12-25 03:00:00', '1w ago'), ('2014-12-25 03:00:00', '1week'), ('2014-12-25 03:00:00', '1week ago'), ('2014-12-25 03:00:00', '1weeks'), ('2014-12-25 03:00:00', '1weeks ago'), ('2013-01-01 00:00:00', '1/1/2013'), ('2012-01-01 12:34:00', '1/1/2012 12:34'), ('2011-01-01 12:34:56', '1/1/2011 12:34:56'), ('2016-08-31 02:23:25', '2016-08-31T02:23:25.000Z'), ('2016-08-31 02:23:25', '2016-08-31 10:23:25 UTC-8')) for expected_iso, dateutil_time in plan: self.assertEqual(awslogs.parse_datetime(dateutil_time), iso2epoch(expected_iso)) self.assertRaises(UnknownDateError, awslogs.parse_datetime, '???')
def test_boto3_client_creation(self, mock_core_session): client = Mock() boto_session = Mock() mock_core_session.return_value = boto_session boto_session.create_client.return_value = client awslogs = AWSLogs() self.assertEqual(client, awslogs.client)
def test_boto3_client_invalid_region(self, mock_core_session): client = Mock() boto_session = Mock() mock_core_session.return_value = boto_session boto_session.create_client.return_value = client boto_session.aws_region.return_value = "Frankfurt" awslogs = AWSLogs() self.assertEqual(client, awslogs.client)
def test_get_groups_with_log_group_prefix(self, botoclient): client = Mock() botoclient.return_value = client client.get_paginator.return_value.paginate.return_value = [{ 'logGroups': [{ 'logGroupName': 'A' }] }] awslogs = AWSLogs(log_group_prefix='log_group_prefix') self.assertEqual([g for g in awslogs.get_groups()], ['A'])
def logs(): params = dict(request.args.items()) params['start'] = params.get('start') or config['logs_start_default'] params['log_stream_name'] = (params.get('log_stream_name') or config['logs_log_stream_name_default']) params['watch'] = params.get('watch') == 'true' logs = (snake_keys(log) for log in AWSLogs(**params).iter_logs()) if params['watch']: return Response((json.dumps(log) + '\r\n' for log in logs), mimetype='text/plain') else: return jsonify({'logs': list(logs)})
def test_get_streams_filtered_by_date(self, parse_datetime, botoclient): client = Mock() botoclient.return_value = client client.get_paginator.return_value.paginate.return_value = [{ 'logStreams': [ self._stream('A', 0, 1), self._stream('B', 0, 6), self._stream('C'), self._stream('D', sys.maxsize - 1, sys.maxsize) ], }] parse_datetime.side_effect = [5, 7] awslogs = AWSLogs(log_group_name='group', start='5', end='7') self.assertEqual([g for g in awslogs.get_streams()], ['B', 'C'])
def test_get_streams_from_pattern(self, botoclient): client = Mock() botoclient.return_value = client side_effect = [ { 'logStreams': [ self._stream('AAA'), self._stream('ABA'), self._stream('ACA') ], 'nextToken': 1 }, { 'logStreams': [ self._stream('BAA'), self._stream('BBA'), self._stream('BBB') ], 'nextToken': 2 }, { 'logStreams': [self._stream('CAC')] }, ] awslogs = AWSLogs() client.get_paginator.return_value.paginate.return_value = side_effect expected = ['AAA', 'ABA', 'ACA', 'BAA', 'BBA', 'BBB', 'CAC'] actual = [s for s in awslogs._get_streams_from_pattern('X', 'ALL')] self.assertEqual(actual, expected) client.get_paginator.return_value.paginate.return_value = side_effect expected = ['AAA', 'ABA', 'ACA'] actual = [s for s in awslogs._get_streams_from_pattern('X', 'A')] self.assertEqual(actual, expected) client.get_paginator.return_value.paginate.return_value = side_effect expected = ['AAA', 'ACA'] actual = [s for s in awslogs._get_streams_from_pattern('X', 'A[AC]A')] self.assertEqual(actual, expected)
def test_main_groups(self, mock_stdout, botoclient): client = Mock() botoclient.return_value = client awslogs = AWSLogs() groups = [ { 'logGroups': [{ 'logGroupName': 'AAA' }, { 'logGroupName': 'BBB' }, { 'logGroupName': 'CCC' }] }, ] client.get_paginator.return_value.paginate.return_value = groups main("awslogs groups".split()) self.assertEqual(mock_stdout.getvalue(), ("AAA\n" "BBB\n" "CCC\n"))
def test_get_groups(self, botoclient): client = Mock() botoclient.return_value = client client.get_paginator.return_value.paginate.return_value = [ { 'logGroups': [{ 'logGroupName': 'A' }, { 'logGroupName': 'B' }, { 'logGroupName': 'C' }], 'nextToken': 1 }, { 'logGroups': [{ 'logGroupName': 'D' }, { 'logGroupName': 'E' }, { 'logGroupName': 'F' }], 'nextToken': 2 }, { 'logGroups': [{ 'logGroupName': 'G' }] }, ] awslogs = AWSLogs() self.assertEqual([g for g in awslogs.get_groups()], ['A', 'B', 'C', 'D', 'E', 'F', 'G'])
def setUp(self): super(TestAWSLogs, self).setUp() self.aws = AWSLogs(connection_cls=Mock)
def test_main_get_deduplication(self, mock_stdout, botoclient): client = Mock() botoclient.return_value = client awslogs = AWSLogs() logs = [{ 'events': [{ 'eventId': 1, 'message': 'Hello 1', 'logStreamName': 'DDD' }, { 'eventId': 2, 'message': 'Hello 2', 'logStreamName': 'EEE' }, { 'eventId': 3, 'message': 'Hello 3', 'logStreamName': 'DDD' }], 'nextToken': 'token' }, { 'events': [{ 'eventId': 1, 'message': 'Hello 1', 'logStreamName': 'DDD' }, { 'eventId': 2, 'message': 'Hello 2', 'logStreamName': 'EEE' }, { 'eventId': 3, 'message': 'Hello 3', 'logStreamName': 'DDD' }], 'nextToken': 'token' }, { 'events': [] }] groups = [ { 'logGroups': [{ 'logGroupName': 'AAA' }, { 'logGroupName': 'BBB' }, { 'logGroupName': 'CCC' }] }, ] streams = [{'logStreams': [self._stream('DDD'), self._stream('EEE')]}] def paginator(value): mock = Mock() mock.paginate.return_value = { 'describe_log_groups': groups, 'describe_log_streams': streams }.get(value) return mock client.get_paginator.side_effect = paginator client.filter_log_events.side_effect = logs main("awslogs get AAA DDD --no-color".split()) self.assertEqual(mock_stdout.getvalue(), ("AAA DDD Hello 1\n" "AAA EEE Hello 2\n" "AAA DDD Hello 3\n"))
def streams(): params = dict(request.args.items()) params['start'] = params.get('start') or config['streams_start_default'] return jsonify({'streams': list(AWSLogs(**params).get_streams())})
def groups(): params = dict(request.args.items()) return jsonify({'groups': list(AWSLogs(**params).get_groups())})
def test_parse_datetime(self, datetime_mock, botoclient): awslogs = AWSLogs() datetime_mock.utcnow.return_value = datetime(2015, 1, 1, 3, 0, 0, 0) datetime_mock.return_value = datetime(1970, 1, 1) def epoch(dt): return int(total_seconds(dt - datetime(1970, 1, 1)) * 1000) self.assertEqual(awslogs.parse_datetime(''), None) self.assertEqual(awslogs.parse_datetime(None), None) self.assertEqual(awslogs.parse_datetime('1m'), epoch(datetime(2015, 1, 1, 2, 59, 0, 0))) self.assertEqual(awslogs.parse_datetime('1m ago'), epoch(datetime(2015, 1, 1, 2, 59, 0, 0))) self.assertEqual(awslogs.parse_datetime('1minute'), epoch(datetime(2015, 1, 1, 2, 59, 0, 0))) self.assertEqual(awslogs.parse_datetime('1minute ago'), epoch(datetime(2015, 1, 1, 2, 59, 0, 0))) self.assertEqual(awslogs.parse_datetime('1minutes'), epoch(datetime(2015, 1, 1, 2, 59, 0, 0))) self.assertEqual(awslogs.parse_datetime('1minutes ago'), epoch(datetime(2015, 1, 1, 2, 59, 0, 0))) self.assertEqual(awslogs.parse_datetime('1h'), epoch(datetime(2015, 1, 1, 2, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1h ago'), epoch(datetime(2015, 1, 1, 2, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1hour'), epoch(datetime(2015, 1, 1, 2, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1hour ago'), epoch(datetime(2015, 1, 1, 2, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1hours'), epoch(datetime(2015, 1, 1, 2, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1hours ago'), epoch(datetime(2015, 1, 1, 2, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1d'), epoch(datetime(2014, 12, 31, 3, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1d ago'), epoch(datetime(2014, 12, 31, 3, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1day'), epoch(datetime(2014, 12, 31, 3, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1day ago'), epoch(datetime(2014, 12, 31, 3, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1days'), epoch(datetime(2014, 12, 31, 3, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1days ago'), epoch(datetime(2014, 12, 31, 3, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1w'), epoch(datetime(2014, 12, 25, 3, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1w ago'), epoch(datetime(2014, 12, 25, 3, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1week'), epoch(datetime(2014, 12, 25, 3, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1week ago'), epoch(datetime(2014, 12, 25, 3, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1weeks'), epoch(datetime(2014, 12, 25, 3, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1weeks ago'), epoch(datetime(2014, 12, 25, 3, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1/1/2013'), epoch(datetime(2013, 1, 1, 0, 0, 0, 0))) self.assertEqual(awslogs.parse_datetime('1/1/2012 12:34'), epoch(datetime(2012, 1, 1, 12, 34, 0, 0))) self.assertEqual(awslogs.parse_datetime('1/1/2011 12:34:56'), epoch(datetime(2011, 1, 1, 12, 34, 56, 0))) self.assertRaises(UnknownDateError, awslogs.parse_datetime, '???')