Development Guides
Accès à l'API S-EdS
Ce document explique comment une application déployée par SAp peut utiliser l'API REST du Service EdS.
Pré-requis
Client keycloak
Après le premier déploiement de l'application, un administrateur KeyCloak doit modifier le client public associé à l'application (l'identifiant du client est le nom de l'application) comme suit:
- ajouter un mapper au Client Scope Dedicated (Client details/ Client scopes/
nom du client-dedicated/ Add mapper/ By configuration) - choisir User Client Role
- donner un nom unique, par exemple: eds-mapper
- choisir le client id: eds
- dans Token Claim name saisir
resource_access.${client_id}.roles - Sauvegarder
Ceci permet au jeton JWT associé au client public de l'application de contenir les rôles EdS associés à l'utilisateur.
Utilisateur connecté
L'utilisateur doit avoir les rôles fins EdS nécessaires aux opérations qu'il souhaite utiliser.
L'utilisateur doit avoir accès aux EdS sur lesquels il souhaite faire des opérations.
Principe
L'application utilise le jeton JWT qui lui est fourni pour s'authentifier (voir la documentation sur l'Exposition de l'application), comme le montrent les exemples ci-dessous.
A fins de tests il est également possible de se connecter à KeyCloak pour obtenir un jeton JWT en procédant comme suit:
- préparer un fichier au format
application/x-www-form-urlencodedcontenant les informations de connexion:
grant_type=password&client_id=client&username=user&password=password
où client est le client public associé à l'application, et user/password les login et mot de passe de l'utilisateur connecté.
- exécuter une requête vers Keycloak :
curl -d@kcdata http://keycloak-cluster-service.kosmos-iam.svc.cluster.local/realms/realm/protocol/openid-connect/token
kcdata étant le nom du fichier préparé à l'étape précédente, et realm le nom du royaume KeyCloak.
- la réponse à cette requête est une structure JSON, le token est dans le champ access_token de cette structure.
L'URL de l'API S-EdS est fournie par une KosmosInterface de type EdS, via la propriété endpoint. L'application aura donc dans son fichier kosmos.yaml un pré-requis de type EdS.
L'application pourra effectuer des requêtes HTTP vers le Service EdS conformément au swagger du service (voir ci-après).
Documentation de l'API
Sur une plateforme de type KDL le swagger de l'API S-EdS est accessible en effectuant un port-forward du service de l'API avec la commande suivante :
kubectl -n kosmos-system-restricted port-forward svc/eds-back-kosmos-eds-api-server 3080:3080
Le swagger est alors accessible depuis un navigateur à l'URL suivante: http://localhost:3080/swagger/v1
Exemples
Dans les commandes qui suivent:
eds-endpointdésigne l'URL de l'API EdS obtenue de la KosmosInterface EdS.- le token JWT est dans la variable d'environnement TOKEN,
- on s'intéresse à un EdS appelé
edstest, - on considère une sauvegarde nommée
testsv.
La requête suivante permet d'effectuer une sauvegarde :
curl -H "Authorization: Bearer $TOKEN" -d'{"name":"testsv"}' -v eds-endpoint/v1/storages/edstest/backup
La requête suivante permet d'obtenir l'état de la sauvegarde :
curl -H "Authorization: Bearer $TOKEN" -v eds-endpoint/v1/backups/testsv
La requête suivante permet d'effectuer une restauration :
curl -H "Authorization: Bearer $TOKEN" -d'{"name":"testsv"}' -v eds-endpoint/v1/storages/edstest/restore
Créer un EdS manuellement
Ce n'est pas la méthode à privilégier, nous conseillons plutôt d'utiliser l'IHM prévue à cet effet.
Pour créer un EdS la commande kubectl suffit : kubectl apply -f path/to/file.yaml fonctionne (avec file.yaml le manifeste descriptif de la KosmosStorage à créer).
Le fichier à fournir par type de moyen de stockage
Kafka
Le KosmosStorageType kafka-v1 et donc toutes les KosmosStorages de type kafka-v1 référencent un préfixe de topic Kafka.
Exemple de Kosmos Storage kafka-v1
apiVersion: EdS.kosmos.tech/v1
kind: KosmosStorage
metadata:
name: kafka-EdS
namespace: kosmos-system-restricted
spec:
type: kafka-v1
displayName: "Instance kafka-EdS"
description: "Topic Kafka"
createdBy: "EdSuser@athea.tech"
environment: PROD
mode: Enabled
tags:
- name: datastore
value: global.athea.samples.kafka-EdS
createParameters:
partitions: 2
replications: 2
configs:
- key: max.message.bytes
value: "128000"
- key: flush.messages
value: "1"
group: mon-groupe
source: true
La partie spécifique a le format suivant :
createParameters:
partitions: <nb partitions>
replications: <nb replicas>
configs:
- key: <propriete>
value: <valeur>
- ...
group: <groupe>
source: <true|false>
partitions: facutatif - nombre de partitions du topic (valeur par défaut configurée dans kosmos-mds-kafka)
replications: facutatif - nombre de replicas du topic (valeur par défaut configurée dans kosmos-mds-kafka)
configs: facultatif - éléments de configuration Kafka supplémentaires
group: facutatif - nom du groupe de consumers Kafka qui accédera au topic (valeur par défaut: nom de la KS-group)
source: facultatif - permet d'indiquer si l'EdS sera accédé par l'application IDU (Import de Données Utilisateur) (valeur par défaut: false)
OpenSearch
Préfixe d'index
Le KosmosStorageType opensearch-indexprefix-v1 et donc toutes les KosmosStorages de type opensearch-indexprefix-v1 référencent un préfixe d'index OpenSearch.
Convention de nommage des KS de préfixe d'index OpenSearch:
Comme on crée un préfixe d'index si la KosmosStorage est supprimée, tous les index portant ce préfixe sont supprimés. Par exemple, si dans OpenSearch on a les index ksName-1, ksNameMyIndex et otherIndex, supprimer la KosmosStorage de nom ksName supprimera les index ksName-1 et ksNameMyIndex, mais ne supprimera pas otherIndex (les comptes associés à ce préfixe d'index seront supprimés aussi).
Ce fonctionnement pourrait engendrer des suppressions non souhaitées si une KosmosStorage est le préfixe d'une autre. Pour éviter ce problème, lorsqu'une KosmosStorage est créée, le contrôleur kosmos-mds-opensearch vérifie qu'il n'existe pas déjà une autre KosmosStorage, qui référence le même cluster OpenSearch, qui soit le préfixe ou un suffixe de la KosmosStorage que l'on cherche a créer. Par exemple, s'il existe une KS ksName1 et que l'on souhaite créer ksName, alors la création sera refusée, car ksName est un préfixe de ksName1. De la même manière, si il existe une KS ksN et que l'on souhaite créer ksName, alors la création sera aussi refusée, car ksName est un suffixe de ksN.
Il est donc recommandé de ne pas utiliser un nom trop court pour une KosmosStorage OpenSearch afin d'éviter les risques de vouloir créer à l'avenir une KS qui serait un suffixe d'une KS existante.
Exemple :
apiVersion: EdS.kosmos.tech/v1
kind: KosmosStorage
metadata:
name: opensearch-index-EdS
namespace: kosmos-system-restricted
spec:
## Partie spécifique au type
createParameters:
indices:
- filepath: opensearch/index.json
revision: develop
suffix: -index1
url: ssh://git@gitlab.technique.artemis:2222/infostructure/socle/service-applicatif/gitops-lab/EdS/EdS-files.git
- suffix: -index2
instance: es00
## Champs communs aux KosmosStorage de tous types
createdBy: "EdSuser@athea.tech"
description: Index OpenSearch
displayName: Instance opensearch-index-EdS
environment: PROD
mode: Enabled
tags:
- name: classification
value: DR
- name: datastore
value: global.athea.samples.opensearch-index-EdS
type: opensearch-indexprefix-v1
La partie spécifique a le format suivant :
createParameters:
indices:
- filepath: <path/to/file.json>
revision: <branch or tag>
suffix: -index1
url: <git repository>
- suffix: -index2
[...]
instance: es00
instance : facultatif - c'est le cluster (es00) OpenSearch dans lequel doit être créé l'EdS. Ce champ n'est pas obligatoire car une valeur par défaut est configurée dans l'outil S-EdS. Si ce champ référence un cluster inconnu dans la configuration de l'outil S-EdS, une erreur est retournée.
indices : facultatif - une liste d'index à créer lors de l'activation de l'EdS. La liste peut être vide, auquel cas lors de l'activation de l'EdS seuls les comptes d'accès au préfixe d'index sont créés dans OpenSearch et aucune autre action n'est effectuée dans le moyen de stockage. Chaque élément de la liste est un dictionnaire avec les paramètres suivants :
suffix: obligatoire - le suffixe à ajouter au nom de la KS pour créer le nom de l'index. Par exemple pour une KS de nomksName, si on asuffix: -val1, alors l'index créé dans OpenSearch seraksName-val1.url: facultatif - si on souhaite que l'index soit créé avec des paramètres spécifiques, il faut fournir un fichier json descriptif. Cette url est le dépôt git dans lequel ce ficher est présent.revision: obligatoire si url est renseigné - la branche ou le tag sur lequel on peut trouver le fichier de configurationfilepath: obligatoire si url est renseigné - le chemin complet dans le dépôt vers le fichier de configuration.
Le format de fichier (un fichier json) de configuration attendu est conforme au standard opensearch, en voilà un exemple :
{
"settings": {
// Paramètres de l'index
"index": {
"number_of_shards": 2,
"number_of_replicas": 1
}
},
"mappings": {
// Mapping de l'index
"properties": {
"age": {
"type": "integer"
}
}
},
"aliases": {
// Alias de l'index
"sample-alias1": {}
}
}
Remarque: un fichier de configuration n'a pas besoin d'avoir tous ces paramètres, si on souhaite ne configurer que le mapping par exemple, on peut fournir un fichier comme celui-ci :
{
"mappings": {
"properties": {
"age": {
"type": "integer"
}
}
}
}
Script
Lorsque qu'une KS de type opensearch-script-v1 est créée (ou activée), le script correspondant est créé dans le cluster OpenSearch. L'outil S-EdS s'assure néanmoins au préalable qu'il n'existe pas un script (une KS) de même nom qui référence le même cluster OpenSearch pour ne pas remplacer un script existant.
Exemple :
apiVersion: EdS.kosmos.tech/v1
kind: KosmosStorage
metadata:
name: opensearch-script-EdS
namespace: kosmos-system-restricted
spec:
## Partie spécifique au type
createParameters:
filepath: opensearch/script.json
instance: es00
revision: develop
url: ssh://git@gitlab.technique.artemis:2222/infostructure/socle/service-applicatif/gitops-lab/EdS/EdS-files.git
## Champs communs aux KosmosStorage de tous types
createdBy: "EdSuser@athea.tech"
description: Script OpenSearch
displayName: Instance opensearch-script-EdS
environment: PROD
mode: Enabled
tags:
- name: classification
value: DR
- name: datastore
value: global.athea.samples.opensearch-script-EdS
type: opensearch-script-v1
La partie spécifique a le format suivant :
createParameters:
instance: es00
filepath: <path/to/file.json>
revision: <branch or tag>
url: <git repository>
instance : facultatif - c'est le cluster (es00, es01, ou es80) OpenSearch dans laquelle doit être créé l'EdS. Ce champ n'est pas obligatoire comme une valeur par défaut est configurée dans l'outil S-EdS. Si ce champ référence un cluster inconnu dans la configuration de l'outil S-EdS, une erreur est retournée.
url : obligatoire - pour importer un script, il faut fournir le fichier du script (un fichier json). Ce champ correspond à l'url du dépôt git contenant le fichier en question.
revision : obligatoire - le branche ou le tag du dépôt git contenant le script à importer.
filepath : obligatoire - le chemin complet dans le dépôt vers le script.
Exemple de fichier (json) de script qui peut être importé :
{
"script": {
"lang": "painless",
"source": "\n int total = 0;\n for (int i = 0; i < doc['ratings'].length; ++i) {\n total += doc['ratings'][i];\n }\n return total;\n "
}
}
Cet exemple est issu de la documentation officielle OpenSearch.
Compléments de configuration
Après la création d'un EdS opensearch par l'IHM EdS, il est possible de compléter sa définition via des gestes d'administration, dans le cluster opensearch metier.
####### Création de template
Un template permet d'initialiser un nouvel index avec les mappings et les settings définis dans le template.
Pour créer un template, procéder comme suit:
- Se connecter à OpenSearch en suivant la procédure indiquée dans le Manuel d'Administration.
- Créer un fichier contenant la définition du template, par exemple :
[opensearch@elasticsearch-0 ~] cat > tmpl
{
"index_patterns": [
"tplidx*"
],
"template": {
"settings": {
"number_of_shards": 2,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"timestamp": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"value": {
"type": "double"
}
}
}
}
}
index_patternsindique les index sur lesquels seront appliqués le template (ici tous les index dont le nom commence par tplidx).templatecontient la définition de l'index.
- Exécuter la requête de création de template, par exemple :
[opensearch@elasticsearch-0 ~] curl -u admin-X PUT -H"Content-type: application/json" -d@tmpl http://localhost:9200/_index_template/tpltest
Avec cet exemple, tous les index dont le nom commence par tplidx auront les mappings et settings définis dans le template.
Consulter la documentation OpenSearch pour d'autres renseignements sur les templates.
####### Création de datastream
Un datastream est un flux composé en interne de plusieurs index sous-jacents. L'écriture se fait sur le dernier index du datastream, la lecture se fait sur tous les index.
Pour créer un datastream, procéder comme suit:
- Se connecter à OpenSearch en suivant la procédure indiquée dans le Manuel d'Administration.
- Créer un fichier contenant la définition du template qui sera associé au datastream (voir ci-dessus). Le template devra contenir la propriété
"data_stream" : {}indiquant qu'il s'agit d'un template associé à un datastream et non à un index, le pattern correspondant au nom du datastream. Les données devront contenir un champ d'horodatage appelé@timestamppar défaut; il est possible de définir le nom de ce champ dans la propriétédata_stream, par exemple :
"data_stream": {
"timestamp_field": {
"name": "request_time"
}
- Executer la requête de création de datastream, par exemple :
[opensearch@elasticsearch-0 ~] curl -u admin-X PUT http://localhost:9200/_data_stream/teststream
ou insérer directement des données dans le datastream (procéder comme pour écrire des données dans un index, en utilisant le nom du datastream comme nom d'index). OpenSearch crée le datastream et le premier index sous-jacent.
Consulter la documentation OpenSearch pour d'autres renseignements sur les datastreams.
####### Création de pipeline d'ingestion
Un pipeline permet de spécifier une ou plusieurs tâches à appliquer sur les données avant leur ingestion.
Pour créer un pipeline, procéder comme suit:
- Se connecter à OpenSearch en suivant la procédure indiquée dans le Manuel d'Administration.
- Créer un fichier contenant la définition du pipeline, comme suit :
{
"description" : "..."
"processors" : [...]
}
Le champ processors définit la suite de traitements à effectuer sur les données avant ingestion. Par exemple le processor suivant ajoute un champ nommé un_champ ayant la valeur une_valeur aux données ingérées.
{
"set": {
"field": "un_champ",
"value": "une_valeur"
}
}
Se reférer à la documentation OpenSearch pour la liste des processors possibles.
- Exécuter la requête de création de pipeline, par exemple :
[opensearch@elasticsearch-0 ~] curl -u admin-X PUT -H"Content-type: application/json" -d@ppl http://localhost:9200/_ingest/pipeline/testppl
L'utilisation du pipeline se fait en ajoutant le paramètre de requête pipeline=nom_du_pipeline à la requête de création de document.
Consulter la documentation OpenSearch pour d'autres renseignements sur les pipelines.
PostgreSQL
Le KosmosStorageType pg-v1 et donc toutes les KosmosStorages de type pg-v1 référencent une base de données PostgreSQL.
Exemple de Kosmos Storage pg-v1
apiVersion: EdS.kosmos.tech/v1
kind: KosmosStorage
metadata:
name: pg-EdS
namespace: kosmos-system-restricted
spec:
type: pg-v1
displayName: "Instance pg-EdS"
description: "Bases PG"
createdBy: "EdSuser@athea.tech"
environment: PROD
mode: Enabled
tags:
- name: datastore
value: global.athea.samples.pg-EdS
createParameters:
instance: pg-shared
scripts:
- url: ssh://git@gitlab.technique.artemis:2222/infostructure/socle/service-applicatif/gitops-lab/EdS/EdS-files.git
path: postgresql
revision: develop
files:
- /create_table.sql
La partie spécifique a le format suivant:
createParameters:
instance: <nom d'instance>
extensions:
- <extension>
scripts:
- url: <URL SSH du projet GIT>
path: <chemin dans le projet GIT>
revision: <version dans le projet GIT>
files:
- <chemin relatif du fichier>
- ...
- ...
La propriété createParameters permet de choisir l'instance de PostgreSQL, de définir les extensions PostgreSQL à activer (parmi celles supportées par l'instance choisie), et permet de définir une liste (optionnelle) de scripts d'initialisation de la base (DDL).
Si aucun script n'est nécessaire, il faut omettre l'élément scripts dans la propriété createParameters.
Chaque élément de la liste contient les champs suivants:
url : obligatoire - url du dépôt git contenant le(s) script(s).
revision : obligatoire - le branche ou le tag du dépôt git contenant le(s) script(s).
path : obligatoire - le chemin dans le dépôt du répertoire contenant le(s) script(s).
files: obligatoire - liste de scripts. La liste doit contenir au moins un fichier.
S3
Le KosmosStorageType s3-v1 et donc toutes les KosmosStorages de type s3-v1 référencent un bucket S3.
Exemple de Kosmos Storage S3
apiVersion: EdS.kosmos.tech/v1
kind: KosmosStorage
metadata:
name: s3-EdS
namespace: kosmos-system-restricted
spec:
type: s3-v1
displayName: "Instance s3-EdS"
description: "Bucket S3"
createdBy: "EdSuser@athea.tech"
environment: PROD
mode: Enabled
tags:
- name: datastore
value: global.athea.samples.s3-EdS
createParameters:
source: true
La partie spécifique a le format suivant:
createParameters:
source: <true | false>
Il faut juste indiquer si l'EdS sera accédé par l'application IDU (Import de Données Utilisateur)
ClickHouse
Le KosmosStorageType ch-v1 et donc toutes les KosmosStorages de type ch-v1 référencent une base de données ClickHouse.
Exemple de Kosmos Storage ch-v1
apiVersion: EdS.kosmos.tech/v1
kind: KosmosStorage
metadata:
name: ch-EdS
namespace: kosmos-system-restricted
spec:
type: ch-v1
displayName: "Instance ch-EdS"
description: "Bases ClickHouse"
createdBy: "EdSuser@athea.tech"
environment: PROD
mode: Enabled
tags:
- name: datastore
value: global.athea.samples.ch-EdS
createParameters:
scripts:
- url: ssh://git@gitlab.technique.artemis:2222/infostructure/socle/service-applicatif/gitops-lab/EdS/EdS-files.git
path: ch
revision: develop
files:
- /create_table.sql
La partie spécifique a le format suivant:
createParameters:
scripts:
- url: <URL SSH du projet GIT>
path: <chemin dans le projet GIT>
revision: <version dans le projet GIT>
files:
- <chemin relatif du fichier>
- ...
- ...
La propriété createParameters permet de définir une liste (optionnelle) de scripts d'initialisation de la base (DDL).
Si aucun script n'est nécessaire, il faut positionner un élément createParameters vide: createParameters: {}.
Chaque élément de la liste contient les champs suivants:
url : obligatoire - url du dépôt git contenant le(s) script(s).
revision : obligatoire - le branche ou le tag du dépôt git contenant le(s) script(s).
path : obligatoire - le chemin dans le dépôt du répertoire contenant le(s) script(s).
files: obligatoire - liste de scripts. La liste doit contenir au moins un fichier.
vStore
Le KosmosStorageType vs-v1 et donc toutes les KosmosStorages de type vs-v1 référencent une base de données vStore.
Exemple de Kosmos Storage vs-v1
apiVersion: EdS.kosmos.tech/v1
kind: KosmosStorage
metadata:
name: vs-EdS
namespace: kosmos-system-restricted
spec:
type: vs-v1
displayName: "Instance vs-EdS"
description: "Bases vStore"
createdBy: "EdSuser@athea.tech"
environment: PROD
mode: Enabled
tags:
- name: datastore
value: global.athea.samples.vs-EdS
createParameters:
url: ssh://git@gitlab.technique.artemis:2222/infostructure/socle/service-applicatif/gitops-lab/EdS/EdS-files.git
path: vstore
revision: develop
files:
models:
path: EdSvs_model.yaml
policies:
path: EdSvs_policy.yaml
La partie spécifique a le format suivant:
createParameters:
files:
models:
path: <fichier contenant le datamodel>
policies:
path: <fichier contenant les policies>
url: <URL SSH du projet GIT>
path: <chemin dans le projet GIT>
revision: <version dans le projet GIT>
La propriété createParameters permet de définir les fichiers contenant le datamodel et les policies associés à l'EdS. Ces fichiers doivent être présents dans le dépôt décrit par les paramètres url (url du dépôt git contenant les fichiers de définition), path (path dans le dépôt git contenant les fichiers de définition) et revision (révision du dépôt git à utiliser).