Closed abulte closed 17 hours ago
Option 1 :
Option 2 :
J'ai écrit une première version du script pour 3/, ça a l'air faisable.
Mais il semble y avoir un problème en amont : un dashboard dupliqué (save as) ne peut pas être réimporté, même sans le modifier avec un script. On n'a pas ce problème avec un dashboard original (non dupliqué).
En creusant un peu, il y a beaucoup d'informations dans l'export du dashboard dupliqué qui n'ont pas été migrées depuis le dashboard original, notamment les chart_id
.
Exemple dans le fichier d'import du dashboard (même ids que dans l'original) :
metadata:
chart_configuration:
'11':
id: 11
crossFilters:
scope: global
chartsInScope:
- 7
- 8
- 9
- 10
- 12
- 13
- 14
- 15
- 17
- 18
- 19
- 20
Alors que les nouveaux chart_id
sont plutôt dans les 60 :
position:
CHART-explore-10-1:
children: []
id: CHART-explore-10-1
meta:
chartId: 61
height: 28
sliceName: "Jeux de donn\xE9es moissonn\xE9s"
uuid: a05ab325-c513-42eb-aa37-290c8dae15f4
width: 3
parents:
- ROOT_ID
- TABS-qRC-CeAyM1
- TAB-wvx-oFaL9G
- ROW-0bIIdAEYib
type: CHART
Pour référence, l'erreur à l'import :
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.11/site-packages/superset/cli/importexport.py", line 158, in import_dashboards
ImportDashboardsCommand(contents, overwrite=True).run()
File "/app/.heroku/python/lib/python3.11/site-packages/superset/commands/dashboard/importers/dispatcher.py", line 68, in run
raise exc
File "/app/.heroku/python/lib/python3.11/site-packages/superset/commands/dashboard/importers/dispatcher.py", line 57, in run
command.run()
File "/app/.heroku/python/lib/python3.11/site-packages/superset/commands/importers/v1/__init__.py", line 82, in run
raise self.import_error() from ex
superset.commands.dashboard.exceptions.DashboardImportError: Import dashboard failed for an unknown reason
2024-11-07 06:54:02,213:ERROR:superset.cli.importexport:There was an error when importing the dashboards(s), please check the exception traceback in the log
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.11/site-packages/superset/commands/importers/v1/__init__.py", line 75, in run
self._import(self._configs, self.overwrite)
File "/app/.heroku/python/lib/python3.11/site-packages/superset/commands/dashboard/importers/v1/__init__.py", line 138, in _import
config = update_id_refs(config, chart_ids, dataset_info)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/.heroku/python/lib/python3.11/site-packages/superset/commands/dashboard/importers/v1/utils.py", line 100, in update_id_refs
metadata["expanded_slices"] = {
^
File "/app/.heroku/python/lib/python3.11/site-packages/superset/commands/dashboard/importers/v1/utils.py", line 101, in <dictcomp>
str(id_map[int(old_id)]): value
~~~~~~^^^^^^^^^^^^^
KeyError: 11
La seule référence aux anciens ids qui pose problème est celle-ci (dans le yaml du dashboard) :
expanded_slices:
'11': true
Je la supprime 🤷 et je vois si je peux faire atterrir une première version du script de migration.
J'arrive à importer correctement un export de dashboard que j'ai modifié à ma sauce :
En revanche, ça ne met pas à jour les charts 😬 https://github.com/apache/superset/blob/de8282cea0d36c41ce2b780cc5f13ce9d5d3f0ee/superset/commands/dashboard/importers/v1/__init__.py#L122
Il est possible de modifier l'export du dashboard en type charts (slice), je teste ça.
En faisant un export de type Chart, on arrive à quelque chose de satisfaisant (les charts pointent vers le nouveau dataset).
Le processus crée de nouveaux charts pour la prod avec le même nom que ceux de démo. On ne peut pas changer leur nom, car cela change le nom sur le dashboard. Il n'y a pas de notion de tag. On peut utiliser la description qui affiche une petite infobulle dans la liste des charts et permet de les différencier. On peut aussi filtrer en fonction du dashboard auquel sont attachés les charts.
Si on récapitule, la procédure de duplication initiale est la suivante :
python cli.py duplicate dashboard_export_20241107T103118 "Dokku prod" cab84157-8787-4941-9221-e08cbb2c94ec --clean
Pour la mise à jour, en admettant qu'on développe sur le dashboard démo et qu'on veuille mettre à jour celui de prod, on pourrait faire :
(à valider)
Source du script (à migrer dans un repo ou dans le dépôt ecospheres-dashboard) https://gist.github.com/abulte/1f4b16cae0824ee11a3f1b539daed83c
Re mise à jour, le process envisagé ne marche pas, il faut :
Ce qui n'est pas optimal... On voudrait pouvoir exporter à nouveau le dashboard source et le mapper sur le dashboard cloné sans avoir à le supprimer.
Le dashboard est dupliqué via la méthode décrite ci-dessus https://dashboard.data.developpement-durable.gouv.fr/superset/dashboard/8/
J'ai dû supprimer manuellement les colonnes harvest__ckan_name
et harvest__ckan_source
du Dataset catalog_organization
de prod (colonnes inutiles qui n'existent plus sur la prod). Je l'ai fait aussi sur le Dataset de demo (future-proofing).
J'ai aussi renommé les Datasets de prod avec un suffixe _prod
pour plus de clarté (aurait pu être fait dans le script).
La mise à jour demo -> prod (ou prod -> demo) sera un autre sujet, hors scope de ce ticket.
Pour référence, l'export mouliné dashboard_export_20241112T124830_OUTPUT.zip
Needs #442
Objectif : dupliquer le dashboard patrimoine existant sur demo pour utiliser la nouvelle base de prod.
Le faire de la manière la plus automatique / réplicable possible