Skip to content

Commit

Permalink
Rassemble les intégrations Litteralis en une seule
Browse files Browse the repository at this point in the history
  • Loading branch information
florimondmanca committed Jan 15, 2025
1 parent bbf6f0f commit 345043d
Show file tree
Hide file tree
Showing 37 changed files with 606 additions and 783 deletions.
5 changes: 1 addition & 4 deletions .env
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,8 @@ APP_JOP_ORG_ID=
###< JOP ###
###> Litteralis ###
APP_LITTERALIS_WFS_BASE_URL=https://apps.sogelink.fr
APP_LITTERALIS_ENABLED_ORGS='[]'
###< Litteralis ###
###> MEL ###
APP_MEL_LITTERALIS_CREDENTIALS=
APP_MEL_ORG_ID=
###< MEL ###
###> symfony/messenger ###
# Choose one of the transports below
# MESSENGER_TRANSPORT_DSN=doctrine://default
Expand Down
7 changes: 1 addition & 6 deletions .env.test
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,7 @@ APP_CLIENT_TIMEZONE=Etc/GMT-1 # Independant of Daylight Saving Time (DST)
APP_SECRET='$ecretf0rt3st'
APP_EUDONET_PARIS_CREDENTIALS='{"SubscriberLogin": "testSubcriberLogin", "SubscriberPassword": "testSubcriberPassword", "BaseName": "TEST_BASE_NAME", "UserLogin": "testUserLogin", "UserPassword": "testPassword", "UserLang": "lang_00", "ProductName": "api"}'
APP_EUDONET_PARIS_ORG_ID=e0d93630-acf7-4722-81e8-ff7d5fa64b66 # DiaLog org
APP_MEL_LITTERALIS_CREDENTIALS='testuser:testpass'
APP_MEL_ORG_ID=e0d93630-acf7-4722-81e8-ff7d5fa64b66 # DiaLog org
APP_FOUGERES_LITTERALIS_CREDENTIALS='testuser:testpass'
APP_FOUGERES_ORG_ID=e0d93630-acf7-4722-81e8-ff7d5fa64b66 # DiaLog org
APP_LONS_LE_SAUNIER_LITTERALIS_CREDENTIALS='testuser:testpass'
APP_LONS_LE_SAUNIER_ORG_ID=e0d93630-acf7-4722-81e8-ff7d5fa64b66 # DiaLog org
APP_LITTERALIS_CREDENTIALS='{"test": {"orgId": "e0d93630-acf7-4722-81e8-ff7d5fa64b66", "credentials": "testuser:testpass"}}'
SYMFONY_DEPRECATIONS_HELPER=999999
PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots
MAX_ITEMS_PER_PAGE=1
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
name: Litteralis Fougeres Import
name: Litteralis Import

on:
workflow_dispatch:
inputs:
enabled_orgs:
description: "Organisations à intégrer (format : array JSON)"
required: false
default: null
type: string

schedule:
- cron: '15 16 * * 1' # Voir https://crontab.guru/ : tous les lundis à 16h15 GMT

Expand Down Expand Up @@ -45,15 +52,23 @@ jobs:
- name: Init environment variables
run: |
echo "DATABASE_URL=${{ secrets.APP_FOUGERES_IMPORT_DATABASE_URL }}" >> .env.local
echo "DATABASE_URL=${{ secrets.APP_LITTERALIS_IMPORT_DATABASE_URL }}" >> .env.local
echo "BDTOPO_DATABASE_URL=${{ secrets.BDTOPO_DATABASE_URL }}" >> .env.local
echo "APP_FOUGERES_LITTERALIS_CREDENTIALS=${{ secrets.APP_FOUGERES_LITTERALIS_CREDENTIALS }}" >> .env.local
echo "APP_FOUGERES_ORG_ID=${{ vars.APP_FOUGERES_ORG_ID }}" >> .env.local
echo "APP_LITTERALIS_ENABLED_ORGS=${{ variables.APP_LITTERALIS_ENABLED_ORGS }}" >> .env.local
- name: Run import
run: make ci_litteralis_fougeres_import BIN_PHP="php" BIN_CONSOLE="php bin/console" BIN_COMPOSER="composer"
- name: Override enabled orgs if defined by input
if: ${{ inputs.enabled_orgs }}
run: |
echo "APP_LITTERALIS_ENABLED_ORGS=${{ inputs.enabled_orgs }}" >> .env.local
- name: Init organization environment variables
run: |
./tools/ci_litteralis_init_org_env_vars.py GHA_SECRETS "APP_LITTERALIS_ORG_*"
env:
APP_FOUGERES_IMPORT_APP: ${{ vars.APP_FOUGERES_IMPORT_APP }}
GHA_SECRETS: ${{ toJson(secrets) }}

- name: Run import
run: make ci_litteralis_import BIN_PHP="php" BIN_CONSOLE="php bin/console" BIN_COMPOSER="composer"

- name: Get log file path
id: logfile
Expand Down
67 changes: 0 additions & 67 deletions .github/workflows/litteralis_lons_le_saunier_import.yml

This file was deleted.

69 changes: 0 additions & 69 deletions .github/workflows/litteralis_mel_import.yml

This file was deleted.

16 changes: 2 additions & 14 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -271,23 +271,11 @@ ci_eudonet_paris_import: ## Run CI steps for Eudonet Paris Import workflow
./tools/scalingodbtunnel ${EUDONET_PARIS_IMPORT_APP} --host-url --port 10000 & ./tools/wait-for-it.sh 127.0.0.1:10000
make console CMD="app:eudonet_paris:import"

ci_litteralis_mel_import: ## Run CI steps for Litteralis MEL Import workflow
make composer CMD="install -n --prefer-dist"
scalingo login --ssh --ssh-identity ~/.ssh/id_rsa
./tools/scalingodbtunnel ${APP_MEL_IMPORT_APP} --host-url --port 10000 & ./tools/wait-for-it.sh 127.0.0.1:10000
make console CMD="app:mel:import"

ci_litteralis_fougeres_import: ## Run CI steps for Litteralis Fougeres Import workflow
make composer CMD="install -n --prefer-dist"
scalingo login --ssh --ssh-identity ~/.ssh/id_rsa
./tools/scalingodbtunnel ${APP_FOUGERES_IMPORT_APP} --host-url --port 10000 & ./tools/wait-for-it.sh 127.0.0.1:10000
make console CMD="app:fougeres:import"

ci_litteralis_lons_le_saunier_import: ## Run CI steps for Litteralis Lons-le-Saunier Import workflow
ci_litteralis_import: ## Run CI steps for Litteralis Import workflow
make composer CMD="install -n --prefer-dist"
scalingo login --ssh --ssh-identity ~/.ssh/id_rsa
./tools/scalingodbtunnel dialog --host-url --port 10000 & ./tools/wait-for-it.sh 127.0.0.1:10000
make console CMD="app:lons_le_saunier:import"
make console CMD="app:litteralis:import"

ci_bdtopo_migrate: ## Run CI steps for BD TOPO Migrate workflow
make composer CMD="install -n --prefer-dist"
Expand Down
15 changes: 3 additions & 12 deletions config/services.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,8 @@ services:
$jopOrgId: '%env(APP_JOP_ORG_ID)%'
$featureMap: '%features%'
$cifsFilterSet: '%env(cifs_filterset:default::APP_CIFS_FILTERS)%'
$melOrgId: '%env(APP_MEL_ORG_ID)%'
$melCredentials: '%env(APP_MEL_LITTERALIS_CREDENTIALS)%' # format: 'user:pass'
$fougeresOrgId: '%env(APP_FOUGERES_ORG_ID)%'
$fougeresCredentials: '%env(APP_FOUGERES_LITTERALIS_CREDENTIALS)%' # format: 'user:pass'
$lonsLeSaunierOrgId: '%env(APP_LONS_LE_SAUNIER_ORG_ID)%'
$lonsLeSaunierCredentials: '%env(APP_LONS_LE_SAUNIER_LITTERALIS_CREDENTIALS)%' # format: 'user:pass'
$litteralisEnabledOrgs: "%env(json:default::APP_LITTERALIS_ENABLED_ORGS)%"
$litteralisCredentials: "%env(litteralis_credentials:APP_LITTERALIS_ORG_)%"
$metabaseSiteUrl: '%env(APP_METABASE_SITE_URL)%'
$metabaseSecretKey: '%env(APP_METABASE_SECRET_KEY)%'
$mediaLocation: '%env(APP_MEDIA_LOCATION)%'
Expand Down Expand Up @@ -126,12 +122,7 @@ services:
# Litteralis
# --------------

App\Infrastructure\Symfony\Command\MELImportCommand:
arguments: ['@logger']
tags:
- { name: monolog.logger, channel: litteralis_import }

App\Infrastructure\Symfony\Command\FougeresImportCommand:
App\Infrastructure\Symfony\Command\LitteralisImportCommand:
arguments: ['@logger']
tags:
- { name: monolog.logger, channel: litteralis_import }
Expand Down
73 changes: 26 additions & 47 deletions docs/tools/litteralis.md
Original file line number Diff line number Diff line change
@@ -1,70 +1,49 @@
# Litteralis

DiaLog dispose d'une intégration avec [Litteralis]([Litteralis](https://www.sogelink.com/solution/litteralis/)). Cette solution de gestion de réglementation de l'éditeur Sogelink est utilisée par de nombreuses collectivités notamment de plus grande taille.
DiaLog dispose d'une intégration avec [Litteralis]([Litteralis](https://www.sogelink.com/solution/litteralis/)). Cette solution de gestion de réglementation de l'éditeur Sogelink est utilisée par de nombreuses collectivités, notamment celles de plus grande taille.

## Description

L'intégration requête l'API WFS de Litteralis. Pour cela elle a besoin d'**identifiants** ("credentials" au format "user:password") configuré par la collectivité qui nous donne accès à ses données Litteralis. Elle a aussi besoin de l'**UUID** de l'organisation dans DiaLog.
L'intégration requête l'API WFS de Litteralis pour extraire les emprises que DiaLog peut intégrer.

L'intégration est "générique" au sens où elle peut être réutilisée pour plusieurs collectivités. Chaque collectivité a donc un peu de code pour faire le pont entre des variables d'environnement contenant les informations ci-dessus et l'intégration générique.
## Configuration

## Organisations enregistrées
Les organisations à intégrer sont définies **dynamiquement** par la variable d'environnement `APP_LITTERALIS_ENABLED_ORGS` au format array JSON.

Le `code` est à utiliser en remplacement de `<INTG>` (pour "intégration") dans les commandes qui suivent
Par exemple :

| Code | Nom complet |
|---|---|
| `mel` | Métropole Européenne de Lille (département Nord 59, région Hauts-de-France) |
| `fougeres` | Ville de Fougères (sous-préfecture département Ille-et-Villaine 35, région Bretagne) |
| `lons_le_saunier` | Ville de Lons-le-Saunier (préfecture département Jura 39, région Bourgogne-Franche-Comté) |
```bash
APP_LITTERALIS_ENABLED_ORGS='["mel", "fougeres"]'
```

## Exécuter l'intégration
Dans GitHub Actions cette variable d'environnement est définie par une [variable](https://github.com/MTES-MCT/dialog/settings/variables/actions) dont le contenu est public (cela facilite aussi sa mise à jour pour ajouter une nouvelle collectivité).

L'intégration peut être exécutée à l'aide de commandes Symfony spécifiques à chaque collectivité.
Pour chaque organisation listée dans `APP_LITTERALIS_ENABLED_ORGS`, deux autres variables d'environnement sont nécessaires :

**Pour l'import en prod** :
* `APP_LITTERALIS_ORG_<NAME>_ID` : l'UUID de l'organisation dans DiaLog.
> L'UUID peut être récupéré dans l'administration, dans la page d'édition de l'organisation. Pour l'UUID de prod, demander à l'admin.
>
> (Hack : il est aussi visible dans le `<select>` du filtre Organisation de la [liste des arrêtés](https://dialog.beta.gouv.fr/regulations).)
* `APP_LITTERALIS_ORG_<NAME>_CREDENTIALS` : les identifiants de requêtage de l'API WFS pour cette organisation, au format `username:password`.
> Ces identifiants sont à activer dans Litteralis par la collectivité qui nous donne accès à ses données.
1. Récupérer le UUID de l'organisation en prod. Pour cela demander à un super-admin : l'UUID est visible dans l'édition d'une organisation sur la page Organisations du dashboard.
2. Créer un fichier `.env.prod.local` vide, et y définir :
* `BDTOPO_DATABASE_URL`
* `APP_<INTG>_ORG_ID=<ID>``<ID>` est l'UUID de l'organisation que vous venez de récupérer.
* `APP_<INTG>_LITTERALIS_CREDENTIALS` avec les identifiants MEL au format `user:password` (les demander à un membre de l'équipe dev)
3. Ouvrir un [tunnel](./db.md#utiliser-une-db-scalingo-en-local) vers la DB de prod :
## Utilisation

```bash
./tools/scalingodbtunnel dialog
```
### Avec GitHub Actions

Copier l'URL qui s'affiche dans le terminal.
L'import est exécuté **automatiquement** tous les lundis à l'aide d'un [workflow](../../.github/workflows/litteralis_import.yml) GitHub Actions.

4. Dans `.env.prod.local`, ajouter `DATABASE_URL=URL``URL` est l'URL que vous venez de copier.
5. Lancer cette commande :
L'import peut aussi être exécuté **manuellement** à l'aide du bouton "Workflow dispatch". Vous pouvez alors n'exécuter l'import que pour certaines collectivités en précisant le paramètre `enabled_orgs`, qui remplacera temporairement la variable `APP_LITTERALIS_ENABLED_ORGS` configurée sur le repo.

```bash
make console CMD="app:<INTG>:import --env=prod"
```
### En local

L'exécution prendra plusieurs minutes. Les logs d'exécution seront ajoutés au dossier `logs/litteralis/`. En cas d'exception la commande échouera. Un rapport final "pretty print" est affiché.
Pour le développement, l'import peut être exécuté en local en appelant la commande Symfony :

**Pour le dev local** : remplir `.env.local` au lieu de `.env.prod`, sauter les étapes 3 et 4 (utiliser votre DB locale), et ne pas inclure le flag `--env=prod`.
```bash
make console CMD="app:litteralis:import"
```

## Déploiement périodique automatique

Les données Litteralis des différentes organisations sont automatiquement intégrées en production tous les lundis à 16h00.

Cette automatisation est réalisée au moyen de [GitHub Actions](./github_actions.md) via un workflow par organisation.

La configuration passe par diverses variables d'environnement listées ci-dessous :
| Variable d'environnement | Configuration | Description |
|---|---|---|
| `APP_MEL_IMPORT_APP` | [Variable](https://docs.github.com/fr/actions/learn-github-actions/variables) au sens GitHub Actions | L'application Scalingo cible (par exemple `dialog` pour la production) |
| `APP_MEL_IMPORT_DATABASE_URL` | Secret | L'URL d'accès à la base de données par la CI (`./tools/scalingodbtunnel APP --host-url`) |
| `APP_MEL_LITTERALIS_CREDENTIALS` | [Secret](https://docs.github.com/fr/actions/security-guides/using-secrets-in-github-actions) au sens GitHub Actions | Les identifiants d'accès à l'API Litteralis de la MEL |
| `APP_MEL_ORG_ID` | Variable | Le UUID de l'organisation "Métropole Européenne de Lille" dans l'environnement défini par `APP_MEL_IMPORT_APP` |
| `APP_FOUGERES_LITTERALIS_CREDENTIALS`, `APP_FOUGERES_ORG_ID` | Secrets | Idem que pour la MEL |
| `APP_LONS_LE_SAUNIER_LITTERALIS_CREDENTIALS`, `APP_LONS_LE_SAUNIER_ORG_ID` | Secrets | Idem que pour la MEL |
| `GH_SCALINGO_SSH_PRIVATE_KEY` | Secret | Clé SSH privée permettant l'accès à Scalingo par la CI |
Cela lira les variables `APP_LITTERALIS_ENABLED_ORGS` et `APP_LITTERALIS_ORG_*` dans votre `.env.local`.

## Références

Expand Down
Loading

0 comments on commit 345043d

Please sign in to comment.