| 
									
										
										
										
											2023-08-27 07:40:52 +00:00
										 |  |  | import time | 
					
						
							| 
									
										
										
										
											2023-09-11 22:23:44 +00:00
										 |  |  | from datetime import timedelta | 
					
						
							| 
									
										
										
										
											2023-08-27 07:40:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import boto3 | 
					
						
							|  |  |  | import pytest | 
					
						
							|  |  |  | from botocore.exceptions import ClientError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from moto import mock_logs | 
					
						
							| 
									
										
										
										
											2023-09-11 22:23:44 +00:00
										 |  |  | from moto.core.utils import unix_time, unix_time_millis, utcnow | 
					
						
							| 
									
										
										
										
											2023-08-27 07:40:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_logs | 
					
						
							|  |  |  | def test_start_query__unknown_log_group(): | 
					
						
							|  |  |  |     client = boto3.client("logs", "us-east-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     log_group_name = "/aws/codebuild/lowercase-dev" | 
					
						
							|  |  |  |     client.create_log_group(logGroupName=log_group_name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = client.start_query( | 
					
						
							|  |  |  |         logGroupName=log_group_name, | 
					
						
							|  |  |  |         startTime=int(time.time()), | 
					
						
							|  |  |  |         endTime=int(time.time()) + 300, | 
					
						
							|  |  |  |         queryString="test", | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert "queryId" in response | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as exc: | 
					
						
							|  |  |  |         client.start_query( | 
					
						
							|  |  |  |             logGroupName="/aws/codebuild/lowercase-dev-invalid", | 
					
						
							|  |  |  |             startTime=int(time.time()), | 
					
						
							|  |  |  |             endTime=int(time.time()) + 300, | 
					
						
							|  |  |  |             queryString="test", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # then | 
					
						
							|  |  |  |     exc_value = exc.value | 
					
						
							|  |  |  |     assert "ResourceNotFoundException" in exc_value.response["Error"]["Code"] | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         exc_value.response["Error"]["Message"] | 
					
						
							|  |  |  |         == "The specified log group does not exist" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_logs | 
					
						
							|  |  |  | def test_get_query_results(): | 
					
						
							|  |  |  |     client = boto3.client("logs", "us-east-1") | 
					
						
							|  |  |  |     log_group_name = "test" | 
					
						
							|  |  |  |     log_stream_name = "stream" | 
					
						
							|  |  |  |     client.create_log_group(logGroupName=log_group_name) | 
					
						
							|  |  |  |     client.create_log_stream(logGroupName=log_group_name, logStreamName=log_stream_name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     data = [ | 
					
						
							|  |  |  |         ( | 
					
						
							| 
									
										
										
										
											2023-09-11 22:23:44 +00:00
										 |  |  |             int(unix_time_millis(utcnow() - timedelta(minutes=x))), | 
					
						
							| 
									
										
										
										
											2023-08-27 07:40:52 +00:00
										 |  |  |             f"event nr {x}", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         for x in range(5) | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     events = [{"timestamp": x, "message": y} for x, y in reversed(data)] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.put_log_events( | 
					
						
							|  |  |  |         logGroupName=log_group_name, logStreamName=log_stream_name, logEvents=events | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     query_id = client.start_query( | 
					
						
							|  |  |  |         logGroupName="test", | 
					
						
							| 
									
										
										
										
											2023-09-11 22:23:44 +00:00
										 |  |  |         startTime=int(unix_time(utcnow() - timedelta(minutes=10))), | 
					
						
							|  |  |  |         endTime=int(unix_time(utcnow() + timedelta(minutes=10))), | 
					
						
							| 
									
										
										
										
											2023-08-27 07:40:52 +00:00
										 |  |  |         queryString="fields @message", | 
					
						
							|  |  |  |     )["queryId"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp = client.get_query_results(queryId=query_id) | 
					
						
							|  |  |  |     assert resp["status"] == "Complete" | 
					
						
							|  |  |  |     assert len(resp["results"]) == 5 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     fields = set([row["field"] for field in resp["results"] for row in field]) | 
					
						
							|  |  |  |     assert fields == {"@ptr", "@message"} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     messages = [ | 
					
						
							|  |  |  |         row["value"] | 
					
						
							|  |  |  |         for field in resp["results"] | 
					
						
							|  |  |  |         for row in field | 
					
						
							|  |  |  |         if row["field"] == "@message" | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     assert messages == [ | 
					
						
							|  |  |  |         "event nr 4", | 
					
						
							|  |  |  |         "event nr 3", | 
					
						
							|  |  |  |         "event nr 2", | 
					
						
							|  |  |  |         "event nr 1", | 
					
						
							|  |  |  |         "event nr 0", | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Only find events from last 2 minutes | 
					
						
							|  |  |  |     query_id = client.start_query( | 
					
						
							|  |  |  |         logGroupName="test", | 
					
						
							| 
									
										
										
										
											2023-09-11 22:23:44 +00:00
										 |  |  |         startTime=int(unix_time(utcnow() - timedelta(minutes=2, seconds=1))), | 
					
						
							|  |  |  |         endTime=int(unix_time(utcnow() - timedelta(seconds=1))), | 
					
						
							| 
									
										
										
										
											2023-08-27 07:40:52 +00:00
										 |  |  |         queryString="fields @message", | 
					
						
							|  |  |  |     )["queryId"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp = client.get_query_results(queryId=query_id) | 
					
						
							|  |  |  |     assert len(resp["results"]) == 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     messages = [ | 
					
						
							|  |  |  |         row["value"] | 
					
						
							|  |  |  |         for field in resp["results"] | 
					
						
							|  |  |  |         for row in field | 
					
						
							|  |  |  |         if row["field"] == "@message" | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     assert messages == ["event nr 2", "event nr 1"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_logs | 
					
						
							|  |  |  | def test_describe_completed_query(): | 
					
						
							|  |  |  |     client = boto3.client("logs", "us-east-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.create_log_group(logGroupName="test") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     query_id = client.start_query( | 
					
						
							|  |  |  |         logGroupName="test", | 
					
						
							| 
									
										
										
										
											2023-09-11 22:23:44 +00:00
										 |  |  |         startTime=int(unix_time(utcnow() + timedelta(minutes=10))), | 
					
						
							|  |  |  |         endTime=int(unix_time(utcnow() + timedelta(minutes=10))), | 
					
						
							| 
									
										
										
										
											2023-08-27 07:40:52 +00:00
										 |  |  |         queryString="fields @message", | 
					
						
							|  |  |  |     )["queryId"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     queries = client.describe_queries(logGroupName="test")["queries"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert len(queries) == 1 | 
					
						
							|  |  |  |     assert queries[0]["queryId"] == query_id | 
					
						
							|  |  |  |     assert queries[0]["queryString"] == "fields @message" | 
					
						
							|  |  |  |     assert queries[0]["status"] == "Complete" | 
					
						
							|  |  |  |     assert queries[0]["createTime"] | 
					
						
							|  |  |  |     assert queries[0]["logGroupName"] == "test" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     queries = client.describe_queries(logGroupName="test", status="Complete")["queries"] | 
					
						
							|  |  |  |     assert len(queries) == 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     queries = client.describe_queries(logGroupName="test", status="Scheduled")[ | 
					
						
							|  |  |  |         "queries" | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     assert len(queries) == 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_logs | 
					
						
							|  |  |  | def test_describe_queries_on_log_group_without_any(): | 
					
						
							|  |  |  |     client = boto3.client("logs", "us-east-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.create_log_group(logGroupName="test1") | 
					
						
							|  |  |  |     assert client.describe_queries(logGroupName="test1")["queries"] == [] |