Skip to content

Commit 3e1547f

Browse files
committed
Use build report statuses in the QA Engine
1 parent a0fc057 commit 3e1547f

File tree

6 files changed

+107
-14
lines changed

6 files changed

+107
-14
lines changed

tools/bin/build_report.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@
4242

4343

4444
def get_status_page(connector) -> str:
45-
response = requests.get(f"https://dnsgjos7lj2fu.cloudfront.net/tests/summary/{connector}/index.html")
45+
# TODO (ben): ensure this is still working as expected
46+
response = requests.get(f"https://dnsgjos7lj2fu.cloudfront.net/tests/summary/connectors/{connector}/index.html")
4647
if response.status_code == 200:
4748
return response.text
4849

tools/ci_connector_ops/ci_connector_ops/qa_engine/enrichments.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import pandas as pd
77

88
def get_enriched_catalog(
9-
oss_catalog: pd.DataFrame,
10-
cloud_catalog: pd.DataFrame,
9+
oss_catalog: pd.DataFrame,
10+
cloud_catalog: pd.DataFrame,
1111
adoption_metrics_per_connector_version: pd.DataFrame) -> pd.DataFrame:
1212
"""Merge OSS and Cloud catalog in a single dataframe on their definition id.
1313
Transformations:
@@ -35,7 +35,7 @@ def get_enriched_catalog(
3535
indicator=True,
3636
suffixes=("", "_cloud"),
3737
)
38-
38+
3939
enriched_catalog.columns = enriched_catalog.columns.str.replace(
4040
"(?<=[a-z])(?=[A-Z])", "_", regex=True
4141
).str.lower() # column names to snake case

tools/ci_connector_ops/ci_connector_ops/qa_engine/validations.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
33
#
44

5-
65
from datetime import datetime
76
from typing import Iterable
87

@@ -43,7 +42,6 @@ def latest_build_is_successful(connector_qa_data: pd.Series) -> bool:
4342
latest_build_status = fetch_latest_build_status_for_connector_version(connector_technical_name, connector_version)
4443
return latest_build_status == "success"
4544

46-
4745
def get_qa_report(enriched_catalog: pd.DataFrame, oss_catalog_length: int) -> pd.DataFrame:
4846
"""Perform validation steps on top of the enriched catalog.
4947
Adds the following columns:
@@ -70,10 +68,7 @@ def get_qa_report(enriched_catalog: pd.DataFrame, oss_catalog_length: int) -> pd
7068
qa_report["documentation_is_available"] = qa_report.documentation_url.apply(url_is_reachable)
7169
qa_report["is_appropriate_for_cloud_use"] = qa_report.connector_definition_id.apply(is_appropriate_for_cloud_use)
7270

73-
qa_report["latest_build_is_successful"] = qa_report.apply(latest_build_is_successful)
74-
75-
qa_report["is_eligible_for_promotion_to_cloud"] = qa_report.apply(is_eligible_for_promotion_to_cloud, axis="columns")
76-
qa_report["report_generation_datetime"] = datetime.utcnow()
71+
qa_report["latest_build_is_successful"] = qa_report.apply(latest_build_is_successful, axis="columns")
7772

7873
qa_report["is_eligible_for_promotion_to_cloud"] = qa_report.apply(is_eligible_for_promotion_to_cloud, axis="columns")
7974
qa_report["report_generation_datetime"] = datetime.utcnow()

tools/ci_connector_ops/setup.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
# Copyright (c) 2022 Airbyte, Inc., all rights reserved.
33
#
44

5-
65
from setuptools import find_packages, setup
76

87
MAIN_REQUIREMENTS = [
@@ -21,7 +20,6 @@
2120
"pytest-mock~=3.10.0",
2221
]
2322

24-
2523
setup(
2624
version="0.1.9",
2725
name="ci_connector_ops",

tools/ci_connector_ops/tests/test_qa_engine/test_inputs.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import pandas as pd
99
import pytest
10+
from unittest.mock import MagicMock, call
11+
import requests
1012

1113
from ci_connector_ops.qa_engine import inputs, constants
1214

@@ -56,3 +58,48 @@ def test_fetch_adoption_metrics_per_connector_version(mocker):
5658
project_id=expected_project_id,
5759
credentials=inputs.service_account.Credentials.from_service_account_info.return_value
5860
)
61+
62+
@pytest.mark.parametrize("connector_name, connector_version, mocked_json_payload, mocked_status_code, expected_status", [
63+
(
64+
"connectors/source-pokeapi",
65+
"0.1.5",
66+
{
67+
"link": "https://github.com/airbytehq/airbyte/actions/runs/4029659593",
68+
"outcome": "success",
69+
"docker_version": "0.1.5",
70+
"timestamp": "1674872401",
71+
"connector": "connectors/source-pokeapi"
72+
},
73+
200,
74+
"success"
75+
),
76+
(
77+
"connectors/source-pokeapi",
78+
"0.1.5",
79+
{
80+
"link": "https://github.com/airbytehq/airbyte/actions/runs/4029659593",
81+
"outcome": "failed",
82+
"docker_version": "0.1.5",
83+
"timestamp": "1674872401",
84+
"connector": "connectors/source-pokeapi"
85+
},
86+
200,
87+
"failed"
88+
),
89+
(
90+
"connectors/source-pokeapi",
91+
"0.1.5",
92+
None,
93+
404,
94+
None
95+
),
96+
])
97+
def test_fetch_latest_build_status_for_connector_version_success(mocker, connector_name, connector_version, mocked_json_payload, mocked_status_code, expected_status):
98+
# Mock the api call to get the latest build status for a connector version
99+
mock_response = MagicMock()
100+
mock_response.json.return_value = mocked_json_payload
101+
mock_response.status_code = mocked_status_code
102+
mock_get = mocker.patch.object(requests, 'get', return_value=mock_response)
103+
104+
assert inputs.fetch_latest_build_status_for_connector_version(connector_name, connector_version) == expected_status
105+
assert mock_get.call_args == call(f"{constants.CONNECTOR_BUILD_OUTPUT_URL}/{connector_name}/{connector_version}.json")

tools/ci_connector_ops/tests/test_qa_engine/test_validations.py

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55

66
import pandas as pd
77
import pytest
8+
from unittest.mock import MagicMock, call
9+
import requests
810

911
from ci_connector_ops.qa_engine import enrichments, inputs, models, validations
1012

1113
@pytest.fixture
1214
def enriched_catalog(oss_catalog, cloud_catalog, adoption_metrics_per_connector_version) -> pd.DataFrame:
1315
return enrichments.get_enriched_catalog(
14-
oss_catalog,
15-
cloud_catalog,
16+
oss_catalog,
17+
cloud_catalog,
1618
adoption_metrics_per_connector_version
1719
)
1820

@@ -108,3 +110,53 @@ def test_get_connectors_eligible_for_cloud(qa_report: pd.DataFrame):
108110
qa_report["is_eligible_for_promotion_to_cloud"] = False
109111
connectors_eligible_for_cloud = list(validations.get_connectors_eligible_for_cloud(qa_report))
110112
assert len(connectors_eligible_for_cloud) == 0
113+
114+
@pytest.mark.parametrize("connector_qa_data, build_file_payload, build_file_status, expected_is_successful", [
115+
(
116+
pd.Series({
117+
"connector_version": "0.1.0",
118+
"connector_technical_name": "connectors/source-pokeapi",
119+
}),
120+
{
121+
"link": "https://github.com/airbytehq/airbyte/actions/runs/4029659593",
122+
"outcome": "success",
123+
"docker_version": "0.1.5",
124+
"timestamp": "1674872401",
125+
"connector": "connectors/source-pokeapi"
126+
},
127+
200,
128+
True
129+
),
130+
(
131+
pd.Series({
132+
"connector_version": "0.1.0",
133+
"connector_technical_name": "connectors/source-pokeapi",
134+
}),
135+
{
136+
"link": "https://github.com/airbytehq/airbyte/actions/runs/4029659593",
137+
"outcome": "failed",
138+
"docker_version": "0.1.5",
139+
"timestamp": "1674872401",
140+
"connector": "connectors/source-pokeapi"
141+
},
142+
200,
143+
False
144+
),
145+
(
146+
pd.Series({
147+
"connector_version": "0.1.0",
148+
"connector_technical_name": "connectors/source-pokeapi",
149+
}),
150+
None,
151+
404,
152+
False
153+
),
154+
])
155+
def test_latest_build_is_successful(mocker, connector_qa_data: pd.Series, build_file_payload: object, build_file_status: int, expected_is_successful: bool):
156+
# Mock the api call to get the latest build status for a connector version
157+
mock_response = MagicMock()
158+
mock_response.json.return_value = build_file_payload
159+
mock_response.status_code = build_file_status
160+
mocker.patch.object(requests, 'get', return_value=mock_response)
161+
162+
assert validations.latest_build_is_successful(connector_qa_data) == expected_is_successful

0 commit comments

Comments
 (0)