From a3f437574d38442ba6e7decba63185bc771eefb5 Mon Sep 17 00:00:00 2001 From: Baz Date: Thu, 29 Sep 2022 21:23:04 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Source=20YouTube=20Analytics:=20?= =?UTF-8?q?fix=20`check=5Fconnection`=20403=20error=20(#17399)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/seed/source_definitions.yaml | 2 +- .../src/main/resources/seed/source_specs.yaml | 2 +- .../source-youtube-analytics/Dockerfile | 2 +- .../source_youtube_analytics/source.py | 25 +++++++++++++------ .../unit_tests/test_source.py | 2 +- .../integrations/sources/youtube-analytics.md | 1 + 6 files changed, 23 insertions(+), 11 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 2aecc56717a79a..13b28a71f2e737 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1107,7 +1107,7 @@ - sourceDefinitionId: afa734e4-3571-11ec-991a-1e0031268139 name: YouTube Analytics dockerRepository: airbyte/source-youtube-analytics - dockerImageTag: 0.1.1 + dockerImageTag: 0.1.2 documentationUrl: https://docs.airbyte.io/integrations/sources/youtube-analytics icon: youtube.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index cbd3be27634ae1..4b29a1df4e35ad 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -11525,7 +11525,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-youtube-analytics:0.1.1" +- dockerImage: "airbyte/source-youtube-analytics:0.1.2" spec: documentationUrl: "https://docs.airbyte.io/integrations/sources/youtube-analytics" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-youtube-analytics/Dockerfile b/airbyte-integrations/connectors/source-youtube-analytics/Dockerfile index f2e903c8f82af8..5f59df26be359c 100644 --- a/airbyte-integrations/connectors/source-youtube-analytics/Dockerfile +++ b/airbyte-integrations/connectors/source-youtube-analytics/Dockerfile @@ -34,5 +34,5 @@ COPY source_youtube_analytics ./source_youtube_analytics ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.1 +LABEL io.airbyte.version=0.1.2 LABEL io.airbyte.name=airbyte/source-youtube-analytics diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/source.py b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/source.py index a79633dbf76c69..302bb747397a50 100644 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/source.py +++ b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/source.py @@ -36,12 +36,22 @@ class JobsResource(HttpStream): name = None primary_key = None http_method = None + raise_on_http_errors = True url_base = "https://youtubereporting.googleapis.com/v1/" JOB_NAME = "Airbyte reporting job" def next_page_token(self, response: requests.Response) -> Optional[Mapping[str, Any]]: return None + def should_retry(self, response: requests.Response) -> bool: + # if the connected Google account is not bounded with target Youtube account, + # we receive `401: UNAUTHENTICATED` + if response.status_code == 401: + setattr(self, "raise_on_http_errors", False) + return False + else: + return super().should_retry(response) + def parse_response(self, response: requests.Response, **kwargs) -> Iterable[Mapping]: return [response.json()] @@ -169,13 +179,14 @@ def get_authenticator(config): def check_connection(self, logger, config) -> Tuple[bool, any]: authenticator = self.get_authenticator(config) jobs_resource = JobsResource(authenticator=authenticator) - - try: - jobs_resource.list() - except Exception as e: - return False, str(e) - - return True, None + result = jobs_resource.list() + if result: + return True, None + else: + return ( + False, + "The Youtube account is not valid. Please make sure you're trying to use the active Youtube Account connected to your Google Account.", + ) def streams(self, config: Mapping[str, Any]) -> List[Stream]: authenticator = self.get_authenticator(config) diff --git a/airbyte-integrations/connectors/source-youtube-analytics/unit_tests/test_source.py b/airbyte-integrations/connectors/source-youtube-analytics/unit_tests/test_source.py index ffc1b68305588e..48aa6975787a0a 100644 --- a/airbyte-integrations/connectors/source-youtube-analytics/unit_tests/test_source.py +++ b/airbyte-integrations/connectors/source-youtube-analytics/unit_tests/test_source.py @@ -14,7 +14,7 @@ def test_check_connection(requests_mock): access_token = "token" mock_oauth_call = requests_mock.post("https://oauth2.googleapis.com/token", json={"access_token": access_token, "expires_in": 0}) - mock_jobs_call = requests_mock.get("https://youtubereporting.googleapis.com/v1/jobs", json={}) + mock_jobs_call = requests_mock.get("https://youtubereporting.googleapis.com/v1/jobs", json={"jobs": [1, 2, 3]}) source = SourceYoutubeAnalytics() logger_mock, config_mock = MagicMock(), MagicMock() diff --git a/docs/integrations/sources/youtube-analytics.md b/docs/integrations/sources/youtube-analytics.md index 409411c9685471..1fac232283f77b 100644 --- a/docs/integrations/sources/youtube-analytics.md +++ b/docs/integrations/sources/youtube-analytics.md @@ -82,5 +82,6 @@ Quota usage is not an issue because data is retrieved once and then filtered, so | Version | Date | Pull Request | Subject | | :--- | :--- | :--- | :--- | +| 0.1.2 | 2022-09-29 | [17399](https://github.com/airbytehq/airbyte/pull/17399) | Fixed `403` error while `check connection` | | 0.1.1 | 2022-08-18 | [15744](https://github.com/airbytehq/airbyte/pull/15744) | Fix `channel_basic_a2` schema fields data type | | 0.1.0 | 2021-11-01 | [7407](https://github.com/airbytehq/airbyte/pull/7407) | Initial Release |