def test_init_log_list(self, MockLoggingClient): MockLoggingClient.return_value.project = 'yoyodyne-1020' # Nothing specified - log name is derived from the project name normal_reader = Reader() self.assertEqual( normal_reader.log_list, ['projects/yoyodyne-1020/logs/compute.googleapis.com%2Fvpc_flows'], ) # Custom name specified - log name is added to log list custom_reader = Reader(log_name='custom-log') self.assertEqual(custom_reader.log_list, ['custom-log'])
def test_init_times(self, MockLoggingClient): MockLoggingClient.return_value.project = 'yoyodyne-102010' earlier = datetime(2018, 4, 3, 9, 51, 22) later = datetime(2018, 4, 3, 10, 51, 22) # End time specified - start defaults to one hour back reader = Reader(end_time=later) self.assertEqual(reader.end_time, later) self.assertEqual(reader.start_time, earlier) # Start time specified - end defaults to "now" reader = Reader(start_time=earlier) self.assertIsNotNone(reader.end_time) self.assertNotEqual(reader.end_time, later) self.assertEqual(reader.start_time, earlier)
def test_limited_project_access(self, MockResourceManagerClient, MockLoggingClient): MockResourceManagerClient.return_value.list_projects.return_value = [ MagicMock(project_id='proj1'), MagicMock(project_id='proj2'), MagicMock(project_id='proj3'), ] MockLoggingClient.return_value.project = 'proj1' MockLoggingClient.return_value.list_entries.side_effect = [ PermissionDenied(''), iter(SAMPLE_ENTRIES), NotFound(''), ] reader = Reader( start_time=datetime(2018, 4, 3, 9, 51, 22), end_time=datetime(2018, 4, 3, 10, 51, 33), collect_multiple_projects=True, ) self.assertEqual( reader.log_list, [ BASE_LOG_NAME.format('proj1'), BASE_LOG_NAME.format('proj2'), BASE_LOG_NAME.format('proj3'), ], ) self.assertEqual(list(reader), [FlowRecord(x) for x in SAMPLE_ENTRIES])
def test_iteration(self, MockLoggingClient): MockLoggingClient.return_value.project = 'yoyodyne-102010' MockLoggingClient.return_value.list_entries.return_value = iter(SAMPLE_ENTRIES) earlier = datetime(2018, 4, 3, 9, 51, 22) later = datetime(2018, 4, 3, 10, 51, 33) reader = Reader(start_time=earlier, end_time=later, log_name='my_log') # Test for flows getting created actual = list(reader) expected = [FlowRecord(x) for x in SAMPLE_ENTRIES] self.assertEqual(actual, expected) # Test the client getting called correctly expression = ( 'resource.type="gce_subnetwork" AND ' '(logName="my_log") AND ' 'Timestamp >= "2018-04-03T09:50:22Z" AND ' 'Timestamp < "2018-04-03T10:52:33Z" AND ' 'jsonPayload.start_time >= "2018-04-03T09:51:22Z" AND ' 'jsonPayload.start_time < "2018-04-03T10:51:33Z"' ) MockLoggingClient.return_value.list_entries.assert_called_once_with( filter_=expression, page_size=1000, resource_names=['projects/yoyodyne-102010'], )
def setUp(self): patch_path = PREFIX('LoggingClient') with patch(patch_path, autospec=True) as MockLoggingClient: MockLoggingClient.return_value.project = 'yoyodyne-102010' MockLoggingClient.return_value.list_entries.return_value = iter( SAMPLE_ENTRIES ) self.reader = Reader()
def test_log_list( self, MockCredentials, MockResourceManagerClient, MockLoggingClient ): MockLoggingClient.return_value.project = 'yoyodyne-102010' MockLoggingClient.return_value.list_entries.return_value = iter(SAMPLE_ENTRIES) MockResourceManagerClient.return_value.list_projects.return_value = [ MagicMock(project_id='yoyodyne-102010'), MagicMock(project_id='proj2'), ] # explicit log overwrites project_list self.assertEqual( Reader( start_time=datetime(2018, 4, 3, 9, 51, 22), end_time=datetime(2018, 4, 3, 10, 51, 33), log_name='my_log', collect_multiple_projects=True, ).log_list, ['my_log'], ) # project_list includes multiple logs self.assertEqual( Reader( start_time=datetime(2018, 4, 3, 9, 51, 22), end_time=datetime(2018, 4, 3, 10, 51, 33), service_account_info={'foo': 1}, collect_multiple_projects=True, ).log_list, [ 'projects/yoyodyne-102010/logs/compute.googleapis.com%2Fvpc_flows', 'projects/proj2/logs/compute.googleapis.com%2Fvpc_flows', ], ) # no project_list uses client list self.assertEqual( Reader( start_time=datetime(2018, 4, 3, 9, 51, 22), end_time=datetime(2018, 4, 3, 10, 51, 33), service_account_info={'foo': 1}, collect_multiple_projects=False, ).log_list, ['projects/yoyodyne-102010/logs/compute.googleapis.com%2Fvpc_flows'], )
def test_init_with_credentials_json(self, MockLoggingClient): with NamedTemporaryFile() as temp_file: path = temp_file.name Reader(service_account_json=path, project='yoyodyne-102010') MockLoggingClient.from_service_account_json.assert_called_once_with( path, project='yoyodyne-102010' )
def test_multiple_projects( self, MockCredentials, MockResourceManagerClient, MockLoggingClient ): creds = MagicMock(Credentials, project_id='proj1') MockCredentials.from_service_account_info.return_value = creds MockLoggingClient.return_value.project = 'yoyodyne-102010' MockLoggingClient.return_value.list_entries.return_value = iter(SAMPLE_ENTRIES) MockResourceManagerClient.return_value.list_projects.return_value = [ MagicMock(project_id='proj1'), MagicMock(project_id='proj2'), MagicMock(project_id='proj3'), ] reader = Reader( start_time=datetime(2018, 4, 3, 9, 51, 22), end_time=datetime(2018, 4, 3, 10, 51, 33), service_account_info={'foo': 1}, collect_multiple_projects=True, ) MockCredentials.from_service_account_info.assert_called_once_with({'foo': 1}) MockLoggingClient.assert_called_once_with(project='proj1', credentials=creds) # Test for flows getting created actual = list(reader) expected = [FlowRecord(x) for x in SAMPLE_ENTRIES] self.assertEqual(actual, expected) # Test the client getting called correctly with multiple projects expression = ( 'resource.type="gce_subnetwork" AND ' '(logName="projects/proj1/logs/' 'compute.googleapis.com%2Fvpc_flows" OR ' 'logName="projects/proj2/logs/' 'compute.googleapis.com%2Fvpc_flows" OR ' 'logName="projects/proj3/logs/' 'compute.googleapis.com%2Fvpc_flows") AND ' 'Timestamp >= "2018-04-03T09:50:22Z" AND ' 'Timestamp < "2018-04-03T10:52:33Z" AND ' 'jsonPayload.start_time >= "2018-04-03T09:51:22Z" AND ' 'jsonPayload.start_time < "2018-04-03T10:51:33Z"' ) mock_list_calls = MockLoggingClient.return_value.list_entries.mock_calls for proj in ('proj1', 'proj2', 'proj3'): self.assertIn( call( filter_=expression, page_size=1000, resource_names=[f'projects/{proj}'], ), mock_list_calls, )
def test_init_with_credentials_info(self, MockCredentials, MockLoggingClient): creds = MagicMock(Credentials) creds.project_id = 'proj1' MockCredentials.from_service_account_info.return_value = creds client = MagicMock(Client) client.project = 'yoyodyne-102010' MockLoggingClient.return_value = client Reader(service_account_info={'foo': 1}) MockCredentials.from_service_account_info.assert_called_once_with({'foo': 1}) MockLoggingClient.assert_called_once_with(project='proj1', credentials=creds)
def test_no_resource_manager_api( self, MockResourceManagerClient, MockLoggingClient ): MockResourceManagerClient.return_value.list_projects.side_effect = [ GoogleAPIError, ] MockLoggingClient.return_value.project = 'yoyodyne-102010' MockLoggingClient.return_value.list_entries.return_value = iter(SAMPLE_ENTRIES) self.assertEqual( Reader( start_time=datetime(2018, 4, 3, 9, 51, 22), end_time=datetime(2018, 4, 3, 10, 51, 33), collect_multiple_projects=True, ).log_list, [BASE_LOG_NAME.format('yoyodyne-102010')], )
def test_init_with_credentials_info_and_project( self, MockCredentials, MockLoggingClient ): # The credentials file specifies one project_id creds = MagicMock(Credentials) creds.project_id = 'proj1' MockCredentials.from_service_account_info.return_value = creds # The client has another one, which will be ignored client = MagicMock(Client) client.project = 'proj2' MockLoggingClient.return_value = client # The request is for a third one, which we'll use Reader(service_account_info={'foo': 1}, project='proj3') MockCredentials.from_service_account_info.assert_called_once_with({'foo': 1}) MockLoggingClient.assert_called_once_with(project='proj3', credentials=creds)
def test_init_with_environment(self, MockLoggingClient): MockLoggingClient.return_value.project = 'yoyodyne-102010' Reader(project='yoyodyne-102010') MockLoggingClient.assert_called_once_with(project='yoyodyne-102010')
def test_init_with_client(self, MockLoggingClient): logging_client = MagicMock(Client) logging_client.project = 'yoyodyne-102010' reader = Reader(logging_client=logging_client) self.assertEqual(MockLoggingClient.call_count, 0) self.assertIs(reader.logging_client, logging_client)