Orchestrateur

L'orchestrateur est en charge d'exécuter les vérifications (Check) et traitements (Processing). Gitlab est la solution qui gère l'orchestration. En se basant sur le système de pipeline, il est possible de créer un workflow en laissant Gitlab gérer toute la partie technique. Ce workflow suit donc la syntaxe Gitlab CI. Le workflow peut se composer de différentes étapes (séquentielles et/ou parallèle).

Création d'une exécution (Pour les vérification seulement, sinon voir Création d'une exécution(V2))

Avant de déclarer un nouveau type d'exécution dans l'Entrepôt, il faut créer le descripteur de l'exécution. Ce fichier descripteur doit respecter la syntaxe Gitlab CI .gitlab-ci.yml https://docs.gitlab.com/ee/ci/yaml/. Le fichier peut avoir n'importe quel nom sauf .gitlab-ci.yml.

Variables disponibles

La variable d'environnement GPF_WORK_DIR donne le chemin du répertoire de travail contenant les fichiers de livraison pour l'exécution en cours.

Paramètres d'une exécution

A la racine du répertoire GPF_WORK_DIR, le fichier parameters.json contient toutes les informations nécessaires à l'exécution :

  • executionId : identifiant de l'exécution à utiliser pour les logs
  • userId : identifiant de l'utilisateur qui a lancé l'exécution
  • paramètres : liste de clés/valeurs passer en paramètre pour l'exécution
  • information de connexion BDD (url, user, password, schéma) dans le cas des traitements vecteurs
  • information de conteneur Swift (url, token) dans le cas traitements raster
  • TODO
{
    executionId: 1231544456-1546546-164565 (UUID),
    userId: 1231544456-1546546-164565 (UUID),
    inputParameters: {
        param1: value1,
        param2: value2,
        ...,
    },
    targetParameters: {
        databaseInfo: { // si traitement vecteur
            url: "",
            user: "",
            password: "",
            schema: ""
        },
        objectStorageInfo:{ // si traitement raster
            url: "",
            token: ""
        } 
    },
    technicalParameters:{ // paramètres pour le retour du statut
        databaseInfo: {
            url: "",
            user: "",
            password: "",
            schema: ""
        } 
    }

}

A la racine du répertoire GPF_WORK_DIR, le répertoire upload contient les fichiers de la livraison.

TODO dans quel dépôt on met les fichiers d'exécutions

Lancement d'une exécution

Lorsque l'API Entrepôt est appelé pour un lancement d'exécution, la géoplateforme traduit cet appel pour que l'orchestrateur puisse l'exécuter.

Exécution d'un workflow

  • L'exécution Parent-Child
  • Variables
  • parameters.json
  • Gitlab-ci.yml
  • Gestion des erreurs

Niveau de logs

Variable d'envrionnement GPF_LOG_LEVEL avec comme valeurs possibles : DEBUG|INFO|WARN|ERROR

Possibilité de le surcharger dans la Parent pipeline -> à définir

Fin du traitement

{
    executionId: "",
    status: SUCCESS|FAILURE|TECHNICAL_ERROR,
    failures: [],
    trace: ""
}

FAILURE = le résultat de l'exécution n'est pas bonne (sens métier). TECHNICAL_ERROR = Erreur/Exception pendant l'exécution, elle n'a pas pu aboutir.

Rabbit

Nom des queues à définir/renseigner. (Variable d'environnement pour laisser la possibilité de changer ?)

UPDATE executionResult SET status = '' AND result = "{JSON}"

Création d'une exécution (V2)

Avant de déclarer un nouveau type d'exécution dans l'Entrepôt, il faut créer le descripteur de l'exécution. Ce fichier descripteur doit respecter la syntaxe Gitlab CI .gitlab-ci.yml https://docs.gitlab.com/ee/ci/yaml/. Le fichier peut avoir n'importe quel nom sauf .gitlab-ci.yml.

Variables disponibles

La variable d'environnement GPF_WORK_DIR donne le chemin du répertoire de travail contenant le fichier parameter.json

Paramètres d'une exécution

A la racine du répertoire GPF_WORK_DIR, le fichier parameters.json contient toutes les informations nécessaires à l'exécution :

  • executionId (_id) : identifiant de l'exécution à utiliser pour les logs
  • job_name : nom de la pipeline
  • pipeline_status : map clé valeur, qui contien le nom et le status d'un job
  • parameters : liste de clés/valeurs passer en paramètre pour l'exécution
  • inputs: objet en entrée qui servira aux scripts
  • output: objet en sortie qui est attendu.
  • dans l'objet global_variables:
  • information de connexion BDD (url, user, password, schéma)
  • information de conteneur Swift (url, token)
{
    _id*    uuid
    job_name*    string
    pipeline_status: {  --> c'est une map qui contient pour chaque job de la pipeline le résultat
        string: string // job_name: SUCCESS|FAILURE|TECHNICAL_ERROR    
        job_name1 : SUCCESS,
        job_name2 : FAILURE
        ...
    },
    inputs*    {
        uploads    [{
            _id*    string
            type*    stringEnum(uploadType)
            name*    string 
            type_infos* {dépend du type de livraison}
            srs* string 
            extent {
                west BigDecimal // precision = 13, scale = 10  EG: 140.0094623500
                east BigDecimal
                north BigDecimal
                south BigDecimal
            }
            size    long
            storage: {
                _id* string
                name string
                type stringEnum(storageType)
                type_infos { dépend du type de storage }
            }
        }]
        stored_datas    [{
            _id*    string 
            type* stringEnum(storedDataType) 
            name*    string
            type_infos* {dépend du type de donnée stockée}
            srs    string
            extent {
                west BigDecimal
                east BigDecimal
                north BigDecimal
                south BigDecimal
            }
            size long 
            storage: {
                _id* string
                name string
                type stringEnum(storageType)
                type_infos { dépend du type de storage }
            }
        }]
    }
    output*  (Obligatoire uniquement dans le cas d'un processing, pas pour un checking) 
    {
       upload    {
           _id* string 
           type* stringEnum(uploadType)
           name* string
           type_infos* {dépend du type de livraison}
           srs* string
           extent {
               west BigDecimal
               east BigDecimal
               north BigDecimal
               south BigDecimal
           }
           size long
           storage: {
               _id* string
               name string
               type stringEnum(storageType)
               type_infos { dépend du type de storage }
           }
       }
       stored_data    {
            _id*    string
            name*    string
            type*    stringEnum(storedDataType)
            type_infos* {dépend du type de donnée stockée}
            srs    string
            extent {
                west BigDecimal
                east BigDecimal
                north BigDecimal
                south BigDecimal
            }
            size long 
            storage: {
                _id* string
                name string
                type stringEnum(storageType)
                type_infos { dépend du type de storage }
            }
        }
    },
    parameters*    {
        "name1": "value1",
        "name2": "value2"
    },
    global_variables* {
        postgresql* {
            user*:
            pass*:
        } 
        swift* {
            identity_api_version,
            auth_url,
            project_domain_name,
            region_name,
            tenant_id,
            tenant_name,
            user_domain_name,
            username,
            password
        } 
    }
}

Exemple pour une donnée vectorielle

Exemple pour une donnée vectorielle
{
    _id*    uuid
    job_name*    string
    pipeline_status: {
        vector_integration : SUCCESS    --> le nom du script de votre coté
    },
    inputs*    {
        uploads    [{
            _id*    string,
            type*    VECTOR,
            name*    string,
            type_infos* {},
            srs* string,
            extent {
                west BigDecimal
                east BigDecimal
                north BigDecimal
                south BigDecimal
            }
            size    long
            storage: {
                _id* string
                name string
                type : SWIFT
                type_infos {
                    pot_name: string
                }
            }
        }]
    }
    output* (Obligatoire uniquement dans le cas d'un processing, pas pour un checking)
    {
       stored_data    {
            _id*     string
            name*    string
            type* : "VECTOR_DB"
            type_infos* { // --> null si GENERATING, et rempli si MODIFYING
                relations: [
                    name: string
                    type: TABLE | VIEW
                    attributes: string[]
                    primary_key: string[]
                ]
            }
            status* : MODIFYING / GENERATING
            srs    : string    // --> null si GENERATING, et rempli si MODIFYING
            extent {
                west BigDecimal
                east BigDecimal
                north BigDecimal
                south BigDecimal
            } // --> null si GENERATING, et rempli si MODIFYING
            size :    // --> taille en octets du schéma
            storage: {
                _id* string,
                name string,
                type : POSTGRESQL,
                type_infos {
                    host,
                    port,
                    database_name
                }
            }
        }
    },
    parameters*    {
        "srs": "EPSG:4326"
    },
    global_variables* {
        VOIR MESSAGE GENERAL
    }

}

Lancement d'une exécution

Lorsque l'API Entrepôt est appelé pour un lancement d'exécution, la géoplateforme traduit cet appel pour que l'orchestrateur puisse l'exécuter.

Exécution d'un workflow

  • L'exécution Parent-Child
  • Variables
  • parameters.json
  • Gitlab-ci.yml
  • Gestion des erreurs

Niveau de logs

Variable d'envrionnement GPF_LOG_LEVEL avec comme valeurs possibles : DEBUG|INFO|WARN|ERROR

Possibilité de le surcharger dans la Parent pipeline -> à définir

Fin du traitement

le resultat d'un traitement est attendu dans un fichier nommé result.json, qui contiendra la même structure que le parameter.json avec les donnée mise à jour que les scripts auront générés.

liste des donnée qui sont suceptible de changer.

  • Dans output.upload ou output.stored_data :
  • type_infos de
  • srs
  • extent
  • size
  • Dans pipeline_status : Une ligne par job terminé

FAILURE = le résultat de l'exécution n'est pas bonne (sens métier). TECHNICAL_ERROR = Erreur/Exception pendant l'exécution, elle n'a pas pu aboutir.

Rabbit

Nom des queues à définir/renseigner. (Variable d'environnement pour laisser la possibilité de changer ?)

UPDATE executionResult
SET status = '' AND result = "{JSON}"