FIX #13553 Added option to exclude drafts: superset ingestion (#15770)

* Added option to exclude drafts: superset ingestion

* Updated supserset yaml docs

* Added tests for exlcude draft dashboards

* Added tests for exlcude draft dashboards

* Formatted queries.py
This commit is contained in:
Suman Maharana 2024-04-03 17:07:02 +05:30 committed by GitHub
parent daae3c48e3
commit 16eaf925e9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 104 additions and 14 deletions

View File

@ -77,6 +77,11 @@ class SupersetAPISource(SupersetSourceMixin):
dashboards = self.client.fetch_dashboards(current_page, page_size)
current_page += 1
for dashboard in dashboards.result:
if (
not self.source_config.includeDraftDashboard
and not dashboard.published
):
continue
yield dashboard
def yield_dashboard(

View File

@ -45,6 +45,7 @@ from metadata.ingestion.source.dashboard.superset.queries import (
FETCH_ALL_CHARTS,
FETCH_COLUMN,
FETCH_DASHBOARDS,
FETCH_PUBLISHED_DASHBOARDS,
)
from metadata.utils import fqn
from metadata.utils.filters import filter_by_datamodel
@ -100,7 +101,12 @@ class SupersetDBSource(SupersetSourceMixin):
"""
Get List of all dashboards
"""
dashboards = self.engine.execute(FETCH_DASHBOARDS)
query = (
FETCH_DASHBOARDS
if self.source_config.includeDraftDashboard
else FETCH_PUBLISHED_DASHBOARDS
)
dashboards = self.engine.execute(query)
for dashboard in dashboards:
yield FetchDashboard(**dashboard)

View File

@ -42,6 +42,7 @@ class DashboardResult(BaseModel):
position_json: Optional[str]
id: Optional[int]
email: Optional[str]
published: Optional[bool]
class SupersetDashboardCount(BaseModel):
@ -135,6 +136,7 @@ class FetchDashboard(BaseModel):
id: Optional[int]
dashboard_title: Optional[str]
position_json: Optional[str]
published: Optional[bool]
email: Optional[str]

View File

@ -18,8 +18,8 @@ select
s.id,
s.slice_name,
s.description,
s.datasource_id,
s.viz_type,
s.datasource_id,
s.viz_type,
t.table_name,
t.schema,
db.database_name,
@ -37,6 +37,7 @@ select
d.id,
d.dashboard_title,
d.position_json,
d.published,
au.email
from
dashboards d
@ -46,6 +47,22 @@ ON
d.created_by_fk = au.id
"""
FETCH_PUBLISHED_DASHBOARDS = """
select
d.id,
d.dashboard_title,
d.position_json,
d.published,
au.email
from
dashboards d
LEFT JOIN
ab_user au
ON
d.created_by_fk = au.id
where
d.published=true
"""
FETCH_ALL_CHARTS_TEST = """
select
@ -74,10 +91,10 @@ LIMIT 1
FETCH_COLUMN = """
select
tc.id,
table_name ,
column_name,
type,
tc.description
table_name ,
column_name,
type,
tc.description
from
table_columns tc
inner join

View File

@ -123,6 +123,47 @@
"status": "published",
"thumbnail_url": "/api/v1/dashboard/14/thumbnail/0088b55d1a7c34b5aa121f11252c11d5/",
"url": "/superset/dashboard/14/"
},
{
"certification_details": "",
"certified_by": "",
"changed_by": {
"first_name": "Superset",
"id": 1,
"last_name": "Admin",
"username": "admin"
},
"changed_by_name": "Superset Admin",
"changed_by_url": "/superset/profile/admin",
"changed_on_delta_humanized": "2 days ago",
"changed_on_utc": "2024-02-30T10:53:25.572977+0000",
"created_by": {
"first_name": "Superset",
"id": 1,
"last_name": "Admin"
},
"created_on_delta_humanized": "2 days ago",
"css": "",
"dashboard_title": "My DRAFT DASH",
"id": 15,
"is_managed_externally": false,
"json_metadata": "{\"show_native_filters\": true, \"color_scheme\": \"\", \"refresh_frequency\": 0, \"shared_label_colors\": {}, \"color_scheme_domain\": [], \"expanded_slices\": {}, \"label_colors\": {}, \"timed_refresh_immune_slices\": [], \"default_filters\": \"{}\", \"chart_configuration\": {}}",
"owners": [
{
"email": "admin@openmetadata.org",
"first_name": "Superset",
"id": 1,
"last_name": "Admin",
"username": "admin"
}
],
"position_json": "{\"CHART-dwSXo_0t5X\":{\"children\":[],\"id\":\"CHART-dwSXo_0t5X\",\"meta\":{\"chartId\":37,\"height\":50,\"sliceName\":\"% Rural\",\"uuid\":\"8f663401-854a-4da7-8e50-4b8e4ebb4f22\",\"width\":4},\"parents\":[\"ROOT_ID\",\"GRID_ID\",\"ROW-z_7odBWenK\"],\"type\":\"CHART\"},\"DASHBOARD_VERSION_KEY\":\"v2\",\"GRID_ID\":{\"children\":[\"ROW-z_7odBWenK\"],\"id\":\"GRID_ID\",\"parents\":[\"ROOT_ID\"],\"type\":\"GRID\"},\"HEADER_ID\":{\"id\":\"HEADER_ID\",\"meta\":{\"text\":\"My DASH\"},\"type\":\"HEADER\"},\"ROOT_ID\":{\"children\":[\"GRID_ID\"],\"id\":\"ROOT_ID\",\"type\":\"ROOT\"},\"ROW-z_7odBWenK\":{\"children\":[\"CHART-dwSXo_0t5X\"],\"id\":\"ROW-z_7odBWenK\",\"meta\":{\"background\":\"BACKGROUND_TRANSPARENT\"},\"parents\":[\"ROOT_ID\",\"GRID_ID\"],\"type\":\"ROW\"}}",
"published": false,
"roles": [],
"slug": null,
"status": "draft",
"thumbnail_url": "/api/v1/dashboard/15/thumbnail/0088b55d1a7c34b5aa121f11252c11d5/",
"url": "/superset/dashboard/15/"
}
]
},

View File

@ -72,6 +72,8 @@ with open(mock_file_path, encoding="UTF-8") as file:
MOCK_DASHBOARD_RESP = SupersetDashboardCount(**mock_data["dashboard"])
MOCK_DASHBOARD = MOCK_DASHBOARD_RESP.result[0]
PUBLISHED_DASHBOARD_COUNT = 1
PUBLISHED_DASHBOARD_NAME = "My DASH"
MOCK_CHART_RESP = SupersetChart(**mock_data["chart"])
MOCK_CHART = MOCK_CHART_RESP.result[0]
@ -94,9 +96,7 @@ MOCK_SUPERSET_API_CONFIG = {
}
},
"sourceConfig": {
"config": {
"type": "DashboardMetadata",
}
"config": {"type": "DashboardMetadata", "includeDraftDashboard": False}
},
},
"sink": {"type": "metadata-rest", "config": {}},
@ -334,6 +334,21 @@ class SupersetUnitTest(TestCase):
dashboard_list = self.superset_api.get_dashboards_list()
self.assertEqual(list(dashboard_list), [MOCK_DASHBOARD])
def test_api_get_published_dashboards_list(self):
"""
Mock the client and check that we get only published dashboards list
"""
with patch.object(
SupersetAPIClient, "fetch_total_dashboards", return_value=1
), patch.object(
SupersetAPIClient, "fetch_dashboards", return_value=MOCK_DASHBOARD_RESP
):
dashboard_list = list(self.superset_api.get_dashboards_list())
self.assertEqual(len(dashboard_list), PUBLISHED_DASHBOARD_COUNT)
self.assertEqual(
dashboard_list[0].dashboard_title, PUBLISHED_DASHBOARD_NAME
)
def test_charts_of_dashboard(self):
"""
Mock the client and check that we get a list

View File

@ -157,7 +157,8 @@ source:
# For MySQL Connection
# type: Mysql
# username: <username>
# password: <password>
# authType:
# password: <password>
# hostPort: <hostPort>
# databaseSchema: superset
@ -166,7 +167,8 @@ source:
# For Postgres Connection
# type: Postgres
# username: username
# password: password
# authType:
# password: <password>
# hostPort: localhost:5432
# database: superset
```

View File

@ -157,7 +157,8 @@ source:
# For MySQL Connection
# type: Mysql
# username: <username>
# password: <password>
# authType:
# password: <password>
# hostPort: <hostPort>
# databaseSchema: superset
@ -166,7 +167,8 @@ source:
# For Postgres Connection
# type: Postgres
# username: username
# password: password
# authType:
# password: <password>
# hostPort: localhost:5432
# database: superset
```