Example #1
0
    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'])
Example #2
0
    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)
Example #3
0
 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])
Example #4
0
    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'],
        )
Example #5
0
 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()
Example #6
0
    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'],
        )
Example #7
0
    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'
        )
Example #8
0
    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,
            )
Example #9
0
    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)
Example #10
0
 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')],
     )
Example #11
0
    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)
Example #12
0
 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')
Example #13
0
 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)