-
Notifications
You must be signed in to change notification settings - Fork 14.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Druid dashboard import/export. (#1811)
* Druid dashboard import * Fix tests. * Parse params with trailing commas * Resolved issue with datasource is not in DB yet when slice perms are set * Finish rebase
- Loading branch information
Showing
6 changed files
with
686 additions
and
464 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
import logging | ||
from sqlalchemy.orm.session import make_transient | ||
|
||
|
||
def import_datasource( | ||
session, | ||
i_datasource, | ||
lookup_database, | ||
lookup_datasource, | ||
import_time): | ||
"""Imports the datasource from the object to the database. | ||
Metrics and columns and datasource will be overrided if exists. | ||
This function can be used to import/export dashboards between multiple | ||
superset instances. Audit metadata isn't copies over. | ||
""" | ||
make_transient(i_datasource) | ||
logging.info('Started import of the datasource: {}'.format( | ||
i_datasource.to_json())) | ||
|
||
i_datasource.id = None | ||
i_datasource.database_id = lookup_database(i_datasource).id | ||
i_datasource.alter_params(import_time=import_time) | ||
|
||
# override the datasource | ||
datasource = lookup_datasource(i_datasource) | ||
|
||
if datasource: | ||
datasource.override(i_datasource) | ||
session.flush() | ||
else: | ||
datasource = i_datasource.copy() | ||
session.add(datasource) | ||
session.flush() | ||
|
||
for m in i_datasource.metrics: | ||
new_m = m.copy() | ||
new_m.table_id = datasource.id | ||
logging.info('Importing metric {} from the datasource: {}'.format( | ||
new_m.to_json(), i_datasource.full_name)) | ||
imported_m = i_datasource.metric_cls.import_obj(new_m) | ||
if (imported_m.metric_name not in | ||
[m.metric_name for m in datasource.metrics]): | ||
datasource.metrics.append(imported_m) | ||
|
||
for c in i_datasource.columns: | ||
new_c = c.copy() | ||
new_c.table_id = datasource.id | ||
logging.info('Importing column {} from the datasource: {}'.format( | ||
new_c.to_json(), i_datasource.full_name)) | ||
imported_c = i_datasource.column_cls.import_obj(new_c) | ||
if (imported_c.column_name not in | ||
[c.column_name for c in datasource.columns]): | ||
datasource.columns.append(imported_c) | ||
session.flush() | ||
return datasource.id | ||
|
||
|
||
def import_simple_obj(session, i_obj, lookup_obj): | ||
make_transient(i_obj) | ||
i_obj.id = None | ||
i_obj.table = None | ||
|
||
# find if the column was already imported | ||
existing_column = lookup_obj(i_obj) | ||
i_obj.table = None | ||
if existing_column: | ||
existing_column.override(i_obj) | ||
session.flush() | ||
return existing_column | ||
|
||
session.add(i_obj) | ||
session.flush() | ||
return i_obj |
22 changes: 22 additions & 0 deletions
22
superset/migrations/versions/1296d28ec131_druid_exports.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
"""Adds params to the datasource (druid) table | ||
Revision ID: 1296d28ec131 | ||
Revises: e46f2d27a08e | ||
Create Date: 2016-12-06 17:40:40.389652 | ||
""" | ||
|
||
# revision identifiers, used by Alembic. | ||
revision = '1296d28ec131' | ||
down_revision = '6414e83d82b7' | ||
|
||
from alembic import op | ||
import sqlalchemy as sa | ||
|
||
|
||
def upgrade(): | ||
op.add_column('datasources', sa.Column('params', sa.String(length=1000), nullable=True)) | ||
|
||
|
||
def downgrade(): | ||
op.drop_column('datasources', 'params') |
Oops, something went wrong.