Skip to content

Commit 022c054

Browse files
committed
qa-engine: define cloud eligibility
1 parent 5ceb14a commit 022c054

File tree

4 files changed

+101
-2
lines changed

4 files changed

+101
-2
lines changed

tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#
44

55

6+
from datetime import datetime
67
from enum import Enum
78
from typing import List
89

@@ -32,6 +33,8 @@ class ConnectorQAReport(BaseModel):
3233
number_of_connections: int
3334
number_of_users: int
3435
sync_success_rate: float
36+
is_eligible_for_cloud: bool
37+
report_generation_datetime: datetime
3538

3639
class QAReport(BaseModel):
3740
connectors_qa_report: List[ConnectorQAReport]

tools/ci_connector_ops/ci_connector_ops/qa_engine/validations.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,22 @@
33
#
44

55

6+
from datetime import datetime
7+
from typing import Iterable
8+
69
import pandas as pd
710
import requests
811

912
from .constants import INAPPROPRIATE_FOR_CLOUD_USE_CONNECTORS
1013
from .inputs import OSS_CATALOG
1114
from .models import ConnectorQAReport, QAReport
1215

16+
TRUTHY_COLUMNS_TO_BE_ELIGIBLE = [
17+
"documentation_is_available",
18+
"is_appropriate_for_cloud_use",
19+
"latest_build_is_successful"
20+
]
21+
1322
class QAReportGenerationError(Exception):
1423
pass
1524

@@ -20,6 +29,14 @@ def url_is_reachable(url: str) -> bool:
2029
def is_appropriate_for_cloud_use(definition_id: str) -> bool:
2130
return definition_id not in INAPPROPRIATE_FOR_CLOUD_USE_CONNECTORS
2231

32+
def is_eligible_for_cloud(connector_qa_data: pd.Series) -> bool:
33+
if connector_qa_data["is_on_cloud"]:
34+
return False
35+
return all([
36+
connector_qa_data[col]
37+
for col in TRUTHY_COLUMNS_TO_BE_ELIGIBLE
38+
])
39+
2340
def get_qa_report(enriched_catalog: pd.DataFrame) -> pd.DataFrame:
2441
"""Perform validation steps on top of the enriched catalog.
2542
Adds the following columns:
@@ -51,10 +68,17 @@ def get_qa_report(enriched_catalog: pd.DataFrame) -> pd.DataFrame:
5168
qa_report["number_of_users"] = 0 # TODO, tracked in https://github.com/airbytehq/airbyte/issues/21721
5269
qa_report["sync_success_rate"] = .0 # TODO, tracked in https://github.com/airbytehq/airbyte/issues/21721
5370

71+
qa_report["is_eligible_for_cloud"] = qa_report.apply(is_eligible_for_cloud, axis="columns")
72+
qa_report["report_generation_datetime"] = datetime.utcnow()
73+
5474
# Only select dataframe columns defined in the ConnectorQAReport model.
5575
qa_report= qa_report[[field.name for field in ConnectorQAReport.__fields__.values()]]
5676
# Validate the report structure with pydantic QAReport model.
5777
QAReport(connectors_qa_report=qa_report.to_dict(orient="records"))
5878
if len(qa_report) != len(OSS_CATALOG):
5979
raise QAReportGenerationError("The QA report does not contain all the connectors defined in the OSS catalog.")
6080
return qa_report
81+
82+
def get_connectors_eligible_for_cloud(qa_report: pd.DataFrame) -> Iterable[ConnectorQAReport]:
83+
for _, row in qa_report[qa_report["is_eligible_for_cloud"]].iterrows():
84+
yield ConnectorQAReport(**row)

tools/ci_connector_ops/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424

2525
setup(
26-
version="0.1.6",
26+
version="0.1.8",
2727
name="ci_connector_ops",
2828
description="Packaged maintained by the connector operations team to perform CI for connectors",
2929
author="Airbyte",

tools/ci_connector_ops/tests/test_qa_engine/test_validations.py

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import pandas as pd
77
import pytest
88

9-
from ci_connector_ops.qa_engine import inputs, enrichments, models, validations
9+
from ci_connector_ops.qa_engine import enrichments, inputs, models, validations
1010

1111
@pytest.fixture
1212
def enriched_catalog() -> pd.DataFrame:
@@ -32,3 +32,75 @@ def test_report_generation_error(enriched_catalog, mocker):
3232
mocker.patch.object(validations, "url_is_reachable", mocker.Mock(return_value=True))
3333
with pytest.raises(validations.QAReportGenerationError):
3434
return validations.get_qa_report(enriched_catalog.sample(10))
35+
36+
@pytest.mark.parametrize(
37+
"connector_qa_data, expected_to_be_eligible",
38+
[
39+
(
40+
pd.Series({
41+
"is_on_cloud": False,
42+
"documentation_is_available": True,
43+
"is_appropriate_for_cloud_use": True,
44+
"latest_build_is_successful": True
45+
}),
46+
True
47+
),
48+
(
49+
pd.Series({
50+
"is_on_cloud": True,
51+
"documentation_is_available": True,
52+
"is_appropriate_for_cloud_use": True,
53+
"latest_build_is_successful": True
54+
}),
55+
False
56+
),
57+
(
58+
pd.Series({
59+
"is_on_cloud": True,
60+
"documentation_is_available": False,
61+
"is_appropriate_for_cloud_use": False,
62+
"latest_build_is_successful": False
63+
}),
64+
False
65+
),
66+
(
67+
pd.Series({
68+
"is_on_cloud": False,
69+
"documentation_is_available": False,
70+
"is_appropriate_for_cloud_use": True,
71+
"latest_build_is_successful": True
72+
}),
73+
False
74+
),
75+
(
76+
pd.Series({
77+
"is_on_cloud": False,
78+
"documentation_is_available": True,
79+
"is_appropriate_for_cloud_use": False,
80+
"latest_build_is_successful": True
81+
}),
82+
False
83+
),
84+
(
85+
pd.Series({
86+
"is_on_cloud": False,
87+
"documentation_is_available": True,
88+
"is_appropriate_for_cloud_use": True,
89+
"latest_build_is_successful": False
90+
}),
91+
False
92+
)
93+
]
94+
)
95+
def test_is_eligible_for_cloud(connector_qa_data: pd.Series, expected_to_be_eligible: bool):
96+
assert validations.is_eligible_for_cloud(connector_qa_data) == expected_to_be_eligible
97+
98+
def test_get_connectors_eligible_for_cloud(qa_report: pd.DataFrame):
99+
qa_report["is_eligible_for_cloud"] = True
100+
connectors_eligible_for_cloud = list(validations.get_connectors_eligible_for_cloud(qa_report))
101+
assert len(qa_report) == len(connectors_eligible_for_cloud)
102+
assert all([c.is_eligible_for_cloud for c in connectors_eligible_for_cloud])
103+
104+
qa_report["is_eligible_for_cloud"] = False
105+
connectors_eligible_for_cloud = list(validations.get_connectors_eligible_for_cloud(qa_report))
106+
assert len(connectors_eligible_for_cloud) == 0

0 commit comments

Comments
 (0)