hermes-client
Explications sur le fonctionnement ou la structure de certains composants clés d’hermes-client.
Explications sur le fonctionnement ou la structure de certains composants clés d’hermes-client.
hermes-client
5.
7.
n’a jamais été atteinte) :
errorQueue_retryInterval
est écoulé depuis la dernière tentative, réessaye de traiter les événements présents dans la file d’erreurstrashbin_purgeInterval
est écoulé depuis la dernière tentative, purge les objets expirés de la corbeilleonSave
lorsqu’elle existe dans le plugin client5.
si l’application n’a pas été invitée à s’arrêterSi une exception est levée à l’étape 6.1.1
, elle sera considérée comme une erreur fatale, notifiée et le client s’arrêtera.
Si une exception est levée aux étapes 5.
à 6.
, elle est notifiée, son événement est ajouté à la file d’erreurs et le client redémarre à partir de l’étape 7.
.
Comme le modèle de données sur le serveur diffère de celui sur le client, les clients doivent convertir les événements distants reçus sur le bus de messages en événements locaux. Si l’événement local résultant est vide (le type de données ou les attributs modifiés dans l’événement distant ne sont pas définis sur le modèle de données client), l’événement est ignoré.
Lors de la mise à jour du modèle de données client, le client peut générer des événements locaux qui n’ont pas d’événement distant correspondant, i.e. pour mettre à jour une valeur d’attribut calculée avec un modèle Jinja qui vient d’être modifié.
flowchart TB subgraph Hermes-client direction TB datamodelUpdate[["mise à jour du modèle de données"]] remoteevent["Événement distant"] localevent["Événement local"] eventHandler(["Méthode de gestion de l'événement du plugin client"]) end datamodelUpdate-->|génère|localevent MessageBus["Bus de message"]-->|fournit|remoteevent remoteevent-->|convertit en|localevent localevent-->|passe à la bonne|eventHandler eventHandler-->|traite|Target["Cible"] classDef external fill:#fafafa,stroke-dasharray: 5 5 class MessageBus,Target external
Il arrive que les objets soient liés entre eux par des clés étrangères. Lorsqu’une erreur survient sur un objet dont la clé primaire fait référence à celle d’un ou plusieurs autres objets “parents”, il peut être souhaitable d’interrompre le traitement de tout ou partie des événements de ces objets parents jusqu’à ce que ce premier événement ait été correctement traité. Cela peut être réalisé en ajoutant les événements des objets parents à la file d’attente des erreurs au lieu de tenter de les traiter.
La première chose à faire est de déclarer les clés étrangères via hermes-server.datamodel.data-type-name.foreignkeys dans la configuration d’hermes-server. Le serveur ne fera rien d’autre avec ces clés étrangères que de les propager aux clients.
Ensuite, il faut définir la politique à appliquer aux clients via hermes-client.foreignkeys_policy dans chaque configuration hermes-client. Il y en a trois possibles :
disabled
: Aucun événement, la politique est désactivée. Probablement pas pertinent dans la plupart des cas, mais pourrait peut-être être utile à quelqu’un un jour.on_remove_event
: Uniquement sur les événements removed. Devrait suffire dans la plupart des cas.on_every_event
: Sur tous les types d’événements (added, modified, removed). Pour assurer une cohérence parfaite quoi qu’il arrive.Parfois, un événement peut être stocké dans la file d’erreurs en raison d’un problème de données (e.g. un nom de groupe avec un point terminal génère une erreur sur Active Directory). Si le point terminal est ensuite supprimé du nom de groupe sur la source de données, l’événement modified sera stocké dans la file d’erreurs et ne sera pas traité tant que le précédent n’aura pas été traité, ce qui ne pourra jamais se produire sans procéder à une opération risquée et non-souhaitable : l’édition manuelle du fichier cache du client.
L’auto remédiation résout ce type de problèmes en fusionnant les événements d’un même objet dans la file d’erreurs. Elle n’est pas activée par défaut, car elle peut perturber l’ordre de traitement normal des événements.
Prenons comme exemple un groupe créé avec un nom invalide. Comme son nom est invalide, le traitement de sa création échouera et l’événement sera stocké dans la file d’erreurs comme ceci :
flowchart TB subgraph errorqueue [File d'erreurs] direction TB ev1 end ev1["`**événement 1** *eventtype*: added *objType*: ADGroup *objpkey*: 42 *objattrs*: { grp_pkey: 42 name: 'NomInvalide.' desc: 'Demo group' }`"] classDef leftalign text-align:left class ev1 leftalign
Comme l’erreur a été notifiée, quelqu’un corrige le nom du groupe dans la source de données. Cette modification entraîne un événement modified correspondant. Cet événement modified ne sera pas traité, mais ajouté à la file d’erreurs puisque son objet a déjà un événement dans la file d’erreurs.
flowchart TB subgraph errorqueuebis [avec auto remédiation] direction TB ev1bis end subgraph errorqueue [Sans auto remédiation] direction TB ev1 ev2 end ev1["`**événement 1** *eventtype*: added *objType*: ADGroup *objpkey*: 42 *objattrs*: { grp_pkey: 42 name: 'NomInvalide.' desc: 'Demo group' }`"] ev2["`**événement 2** *eventtype*: modified *objType*: ADGroup *objpkey*: 42 *objattrs*: { modified: { name: 'NomValide' } }`"] ev1bis["`**événement 1** *eventtype*: added *objType*: ADGroup *objpkey*: 42 *objattrs*: { grp_pkey: 42 name: 'NomValide' desc: 'Demo group' }`"] classDef leftalign text-align:left class ev1,ev2,ev1bis leftalign
Contient l’état du client :
queueErrors: dict[str, str]
Dictionnaire contenant l’ensemble des messages d’erreurs des objets en file d’erreurs, pour pouvoir notifier de tout changement.
datamodelWarnings: dict[str, dict[str, dict[str, Any]]]
Dictionnaire contenant les avertissements actuels du modèle de données, pour pouvoir notifier de tout changement.
exception: str | None
Chaîne contenant la dernière trace d’exception.
initstartoffset: Any | None
Contient l’offset du premier message de la séquence initSync sur le bus de messages.
initstopoffset: Any | None
Contient l’offset du dernier message de la séquence initSync sur le bus de messages.
nextoffset: Any | None
Contient l’offset du prochain message à traiter sur le bus de messages.
Cache de la configuration précédente, utilisé pour pouvoir construire le modèle de données précédent et pour générer les expressions Jinja avec les plugins d’attributs.
Cache du dernier schéma de données, reçu d’hermes-server.
Cache de la file d’erreurs.
Un fichier par type de données distantes, contenant toutes les entrées distantes, telles qu’elles ont été traitées par le client sans générer d’erreur.
Lorsque la file d’erreurs est vide, doit avoir le même contenu que RemoteDataType_complete__.json
Un fichier par type de données distantes, contenant toutes les entrées distantes, telles qu’elles sont sur le serveur.
Lorsque la file d’erreurs est vide, doit avoir le même contenu que RemoteDataType.json
Uniquement si la corbeille est activée. Un fichier par type de données distant, contenant toutes les entrées distantes qui se trouvent dans la corbeille, telles qu’elles ont été traitées par le client sans générer d’erreur.
Lorsque la file d’erreurs est vide, doit avoir le même contenu que trashbin_RemoteDataType_complete__.json
Uniquement si la corbeille est activée. Un fichier par type de données distant, contenant toutes les entrées distantes qui se trouvent dans la corbeille, telles qu’elles sont sur le serveur.
Lorsque la file d’erreurs est vide, doit avoir le même contenu que trashbin_RemoteDataType.json
Un fichier par type de données local, contenant toutes les entrées locales, telles qu’elles ont été traitées par le client sans générer d’erreur.
Lorsque la file d’erreurs est vide, doit avoir le même contenu que __LocalDataType_complete__.json
Un fichier par type de données local, contenant toutes les entrées locales, telles qu’elles sont sur le serveur.
Lorsque la file d’erreurs est vide, doit avoir le même contenu que __LocalDataType.json
Uniquement si la corbeille est activée. Un fichier par type de données local, contenant toutes les entrées locales qui se trouvent dans la corbeille, telles qu’elles ont été traitées par le client sans générer d’erreur.
Lorsque la file d’erreurs est vide, doit avoir le même contenu que __trashbin_LocalDataType_complete__.json
Uniquement si la corbeille est activée. Un fichier par type de données local, contenant toutes les entrées locales qui se trouvent dans la corbeille, telles qu’elles sont sur le serveur.
Lorsque la file d’erreurs est vide, doit avoir le même contenu que __trashbin_LocalDataType.json