Workflow¶
DefaultIngestWorkflow¶
Un Workflow est défini en JSON avec la structure suivante :
- un identifiant (id)
- une clé (identifier)
- un nom (name)
- une catégorie (typeProc)
- une liste de Steps : La structure d’une step donnée est la suivante
un identifiant de famille de Workers (workerGroupId)
un identifiant de Step (stepName)
un modèle d’exécution (behavior) pouvant être : BLOCKING : le traitement est bloqué en cas d’erreur, il est nécessaire de recommencer le workflow NOBLOCKING : le traitement peut continuer malgrée les erreurs
un modèle de distribution :
kind: un type pouvant être :
- REF : pas de distribution pour ce step et définit une référence vers un fichier à traiter. (Exemple: manifest.xml)
- LIST :
- si la valeur de “element” est “Units” : la liste des éléments à traiter est incluse dans un fichier ingestLevelStack.json. Ce fichier contient les guid des archive units ordonnés par niveau de graphe.
- si la valeur de “element” est autre : la liste des éléments à traiter est représentée par les fichiers présents dans le sous-répertoire représenté par “element” (ex : “ObjectGroup”)
- LIST_IN_FILE: Fichier contenant une liste de GUID à traiter dans la distribution
l’élément de distribution (element) indiquant l’élément unique (REF) ou le chemin vers un dossier ou un fichier sur le Workspace (LIST, LIST_IN_FILE)
type: est-ce une distribution sur des unités archivistiques ou sur des groupes d’objets.
statusOnEmptyDistribution: Le statut qu’on attribue au step si jamais la distribution n’a pas eu lieu. Par defaut: WARNING
bulkSize: La taille du bulk : c’est à dire le nombre d’élément qui sera envoyé au worker. Par défaut, la valeur est récupérée depuis la configuration avec la variable workerBulkSize.
une liste d’Actions :
un nom d’action (actionKey)
un modèle d’exécution (behavior) pouvant être BLOCKING ou NOBLOCKING
des paramètres d’entrées (in) :
un nom (name) utilisé pour référencer cet élément entre différents handlers d’une même étape
une cible (uri) comportant un schema (WORKSPACE, MEMORY, VALUE) et un path :
- WORKSPACE:path indique le chemin relatif sur le workspace
- MEMORY:path indique le nom de la clef de valeur
- VALUE:path indique la valeur statique en entrée
chaque handler peut accéder à ces valeurs, définies dans l’ordre stricte, via le handlerIO
- WORKSPACE : implicitement un File
- MEMORY : implicitement un objet mémoire déjà alloué par un Handler précédent
- VALUE : implicitement une valeur String
des paramètres de sortie (out) :
un nom (name) utilisé pour référencer cet élément entre différents handlers d’une même étape
une cible (uri) comportant un schema (WORKSPACE, MEMORY) et un path :
- WORKSPACE:path indique le chemin relatif sur le workspace
- MEMORY:path indique le nom de la clef de valeur
chaque handler peut stocker les valeurs finales, définies dans l’ordre stricte, via le handlerIO
- WORKSPACE : implicitement un File local
- MEMORY : implicitement un objet mémoire
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 | {
"id": "DefaultIngestWorkflow",
"name": "Default Ingest Workflow",
"identifier": "PROCESS_SIP_UNITARY",
"typeProc": "INGEST",
"comment": "Default Ingest Workflow V6",
"steps": [
{
"workerGroupId": "DefaultWorker",
"stepName": "STP_INGEST_CONTROL_SIP",
"behavior": "BLOCKING",
"distribution": {
"kind": "REF",
"element": "SIP/manifest.xml"
},
"actions": [
{
"action": {
"actionKey": "CHECK_SEDA",
"behavior": "BLOCKING"
}
},
{
"action": {
"actionKey": "CHECK_HEADER",
"behavior": "BLOCKING",
"in": [
{
"name": "checkContract",
"uri": "VALUE:true"
},
{
"name": "checkOriginatingAgency",
"uri": "VALUE:true"
},
{
"name": "checkProfile",
"uri": "VALUE:true"
}
]
}
},
{
"action": {
"actionKey": "CHECK_DATAOBJECTPACKAGE",
"behavior": "BLOCKING",
"in": [
{
"name": "checkNoObject",
"uri": "VALUE:false"
},
{
"name": "UnitType",
"uri": "VALUE:INGEST"
}
],
"out": [
{
"name": "unitsLevel.file",
"uri": "WORKSPACE:UnitsLevel/ingestLevelStack.json"
},
{
"name": "mapsDOtoOG.file",
"uri": "WORKSPACE:Maps/DATA_OBJECT_TO_OBJECT_GROUP_ID_MAP.json"
},
{
"name": "mapsDO.file",
"uri": "WORKSPACE:Maps/DATA_OBJECT_ID_TO_GUID_MAP.json"
},
{
"name": "mapsObjectGroup.file",
"uri": "WORKSPACE:Maps/OBJECT_GROUP_ID_TO_GUID_MAP.json"
},
{
"name": "mapsObjectGroup.file",
"uri": "MEMORY:MapsMemory/OG_TO_ARCHIVE_ID_MAP.json"
},
{
"name": "mapsDOIdtoDODetail.file",
"uri": "WORKSPACE:Maps/DATA_OBJECT_ID_TO_DATA_OBJECT_DETAIL_MAP.json"
},
{
"name": "mapsUnits.file",
"uri": "WORKSPACE:Maps/ARCHIVE_ID_TO_GUID_MAP.json"
},
{
"name": "globalSEDAParameters.file",
"uri": "WORKSPACE:ATR/globalSEDAParameters.json"
},
{
"name": "mapsObjectGroup.file",
"uri": "MEMORY:MapsMemory/OBJECT_GROUP_ID_TO_GUID_MAP.json"
}
]
}
}
]
},
{
"workerGroupId": "DefaultWorker",
"stepName": "STP_OG_CHECK_AND_TRANSFORME",
"behavior": "BLOCKING",
"distribution": {
"kind": "LIST_ORDERING_IN_FILE",
"element": "ObjectGroup"
},
"actions": [
{
"action": {
"actionKey": "CHECK_DIGEST",
"behavior": "BLOCKING",
"in": [
{
"name": "algo",
"uri": "VALUE:SHA-512"
}
],
"out": [
{
"name": "groupObject",
"uri": "MEMORY:groupObjectId"
}
]
}
},
{
"action": {
"actionKey": "OG_OBJECTS_FORMAT_CHECK",
"behavior": "BLOCKING",
"in": [
{
"name": "groupObject",
"uri": "MEMORY:groupObjectId"
}
]
}
}
]
},
{
"workerGroupId": "DefaultWorker",
"stepName": "STP_UNIT_CHECK_AND_PROCESS",
"behavior": "BLOCKING",
"distribution": {
"kind": "LIST_ORDERING_IN_FILE",
"element": "Units"
},
"actions": [
{
"action": {
"actionKey": "CHECK_UNIT_SCHEMA",
"behavior": "BLOCKING",
"out": [
{
"name": "unit",
"uri": "MEMORY:unitId"
}
]
}
},
{
"action": {
"actionKey": "UNITS_RULES_COMPUTE",
"behavior": "BLOCKING",
"in": [
{
"name": "unit",
"uri": "MEMORY:unitId"
}
]
}
}
]
},
{
"workerGroupId": "DefaultWorker",
"stepName": "STP_STORAGE_AVAILABILITY_CHECK",
"behavior": "BLOCKING",
"distribution": {
"kind": "REF",
"element": "SIP/manifest.xml"
},
"actions": [
{
"action": {
"actionKey": "STORAGE_AVAILABILITY_CHECK",
"behavior": "BLOCKING"
}
}
]
},
{
"workerGroupId": "DefaultWorker",
"stepName": "STP_OBJ_STORING",
"behavior": "BLOCKING",
"distribution": {
"kind": "LIST_ORDERING_IN_FILE",
"element": "ObjectGroup"
},
"actions": [
{
"action": {
"actionKey": "OBJ_STORAGE",
"behavior": "BLOCKING",
"out": [
{
"name": "groupObject",
"uri": "MEMORY:groupObjectId"
}
]
}
},
{
"action": {
"actionKey": "OG_METADATA_INDEXATION",
"behavior": "BLOCKING",
"in": [
{
"name": "groupObject",
"uri": "MEMORY:groupObjectId"
}
]
}
}
]
},
{
"workerGroupId": "DefaultWorker",
"stepName": "STP_UNIT_METADATA",
"behavior": "BLOCKING",
"distribution": {
"kind": "LIST_ORDERING_IN_FILE",
"element": "Units"
},
"actions": [
{
"action": {
"actionKey": "UNIT_METADATA_INDEXATION",
"behavior": "BLOCKING",
"in": [
{
"name": "UnitType",
"uri": "VALUE:INGEST"
},
{
"name": "globalSEDAParameters.file",
"uri": "WORKSPACE:ATR/globalSEDAParameters.json"
}
]
}
}
]
},
{
"workerGroupId": "DefaultWorker",
"stepName": "STP_OG_STORING",
"behavior": "BLOCKING",
"distribution": {
"kind": "LIST",
"element": "ObjectGroup"
},
"actions": [
{
"action": {
"actionKey": "OG_METADATA_STORAGE",
"behavior": "BLOCKING"
}
},
{
"action": {
"actionKey": "COMMIT_LIFE_CYCLE_OBJECT_GROUP",
"behavior": "BLOCKING"
}
},
]
},
{
"workerGroupId": "DefaultWorker",
"stepName": "STP_UNIT_STORING",
"behavior": "BLOCKING",
"distribution": {
"kind": "LIST",
"element": "Units"
},
"actions": [
{
"action": {
"actionKey": "UNIT_METADATA_STORAGE",
"behavior": "BLOCKING"
}
},
{
"action": {
"actionKey": "COMMIT_LIFE_CYCLE_UNIT",
"behavior": "BLOCKING"
}
}
]
},
{
"workerGroupId": "DefaultWorker",
"stepName": "STP_ACCESSION_REGISTRATION",
"behavior": "BLOCKING",
"distribution": {
"kind": "REF",
"element": "SIP/manifest.xml"
},
"actions": [
{
"action": {
"actionKey": "ACCESSION_REGISTRATION",
"behavior": "BLOCKING",
"in": [
{
"name": "mapsUnits.file",
"uri": "WORKSPACE:Maps/ARCHIVE_ID_TO_GUID_MAP.json"
},
{
"name": "mapsDO.file",
"uri": "WORKSPACE:Maps/OBJECT_GROUP_ID_TO_GUID_MAP.json"
},
{
"name": "mapsDO.file",
"uri": "WORKSPACE:Maps/DATA_OBJECT_ID_TO_DATA_OBJECT_DETAIL_MAP.json"
},
{
"name": "globalSEDAParameters.file",
"uri": "WORKSPACE:ATR/globalSEDAParameters.json"
}
]
}
}
]
},
{
"workerGroupId": "DefaultWorker",
"stepName": "STP_INGEST_FINALISATION",
"behavior": "FINALLY",
"distribution": {
"kind": "REF",
"element": "SIP/manifest.xml"
},
"actions": [
{
"action": {
"actionKey": "ATR_NOTIFICATION",
"behavior": "NOBLOCKING",
"in": [
{
"name": "mapsUnits.file",
"uri": "WORKSPACE:Maps/ARCHIVE_ID_TO_GUID_MAP.json",
"optional": true
},
{
"name": "mapsDO.file",
"uri": "WORKSPACE:Maps/DATA_OBJECT_ID_TO_GUID_MAP.json",
"optional": true
},
{
"name": "mapsDOtoOG.file",
"uri": "WORKSPACE:Maps/DATA_OBJECT_TO_OBJECT_GROUP_ID_MAP.json",
"optional": true
},
{
"name": "mapsDOtoVersionBDO.file",
"uri": "WORKSPACE:Maps/DATA_OBJECT_ID_TO_DATA_OBJECT_DETAIL_MAP.json",
"optional": true
},
{
"name": "globalSEDAParameters.file",
"uri": "WORKSPACE:ATR/globalSEDAParameters.json",
"optional": true
},
{
"name": "mapsOG.file",
"uri": "WORKSPACE:Maps/OBJECT_GROUP_ID_TO_GUID_MAP.json",
"optional": true
}
],
"out": [
{
"name": "atr.file",
"uri": "WORKSPACE:ATR/responseReply.xml"
}
]
}
},
{
"action": {
"actionKey": "ROLL_BACK",
"behavior": "BLOCKING"
}
}
]
}
]
}
|
Etapes¶
Step 1 - STP_INGEST_CONTROL_SIP : Check SIP / distribution sur REF GUID/SIP/manifest.xml
PREPARE_STORAGE_INFO : - Vérifier que le storage est disponible - Récupérer les informations de connection au storage et les offres de stockage.
CHECK_SEDA : - Test existence manifest.xml - Validation XSD SEDA manifest.xml
CHECK_HEADER : - CHECK_AGENT: Vérifier l’existence des services agents dans le manifest et dans le référentiel des services agents. - CHECK_CONTRACT_INGEST : Vérifier l’existence des contrats d’entrée dans le manifest et dans le référentiel des contrats d’entrée - CHECK_IC_AP_RELATION: Vérifier le profile d’archivage et sa relation avec le contrat d’entrée - CHECK_ARCHIVEPROFILE: valider le manifest avec le fichier XSD/RNG défini dans le profile d’archivage
CHECK_DATAOBJECTPACKAGE:
Cas 1: arbres et plans d’accès
- CHECK_NO_OBJECT
- CHECK_MANIFEST_OBJECTNUMBER
- CHECK_MANIFEST
- Cas 2: SIP
- CHECK_MANIFEST_DATAOBJECT_VERSION
- CHECK_MANIFEST_OBJECTNUMBER
- CHECK_MANIFEST
- CHECK_CONSISTENCY
CHECK_NO_OBJECT: Vérifier l’existence ou pas des objets binaires et des objets physiques - Vérifier l’égalité du nomber de fichiers binaires dans le workspace par rapport au manifest. - Extract seda: créer des fichiers json représentant les méta-données des unités archivistiques et groupes d’objets - Si en plus, l’ingest n’est pas un arbre ou un plan de classement, vérifier la cohérence entre les unités archivistiques et les groupes d’objets.
CHECK_MANIFEST_OBJECTNUMBER : - Comptage BinaryDataObject dans manifest.xml en s’assurant d’aucun doublon : - List Workspace GUID/SIP/content/ - CheckObjectsNumber Comparaison des 2 nombres et des URI
CHECK_MANIFEST : - Extraction BinaryDataObject de manifest.xml / MAP des Id BDO / Génération GUID - Extraction ArchiveUnit de manifest.xml / MAP des id AU / Génération GUID - Contrôle des références dans les AU des Id BDO - Stockage dans Workspace des BDO et AU
CHECK_CONSISTENCY : vérification de la cohérence objet/unit
Step 2 - STP_OG_CHECK_AND_TRANSFORME : Check Objects Compliance du SIP / distribution sur LIST GUID/BinaryDataObject
- CHECK_DIGEST : Contrôle de l’objet binaire correspondant du BDO taille et empreinte via Workspace
- OG_OBJECTS_FORMAT_CHECK : - Contrôle du format des objets binaires - Consolidation de l’information du format dans l’object groupe correspondant si nécessaire
Step 3 - STP_UNIT_CHECK_AND_PROCESS : Check des archive unit et de leurs règles associées
- CHECK_UNIT_SCHEMA : Contrôles intelligents du Json représentant l’Archive Unit par rapport à un schéma Json
- UNITS_RULES_COMPUTE : Calcul des règles de gestion
Step 4 - STP_STORAGE_AVAILABILITY_CHECK : Check Storage Availability / distribution REF GUID/SIP/manifest.xml
- STORAGE_AVAILABILITY_CHECK : Contrôle de la taille totale à stocker par rapport à la capacité des offres de stockage pour une stratégie et un tenant donnés
Step 5 - STP_OBJ_STORING : Rangement et indexation des objets
- OBJ_STORAGE : Écriture des objets sur l’offre de stockage des BDO des GO
- OG_METADATA_INDEXATION : Indexation des métadonnées des ObjectGroup
Step 6 - STP_UNIT_METADATA : Indexation des métadonnées des Units
- UNIT_METADATA_INDEXATION : Transformation Json Unit et intégration GUID Unit + GUID GO
Step 7 - STP_OG_STORING : Rangement des métadonnées des objets
- OG_METADATA_STORAGE : Enregistrement en base des métadonnées des ObjectGroup ainsi que leurs journaux de cycle de vie
- COMMIT_LIFE_CYCLE_OBJECT_GROUP : Écriture des objets sur l’offre de stockage des BDO des GO
Step 8 - STP_UNIT_STORING : Index Units / distribution sur LIST GUID/Units
- UNIT_METADATA_STORAGE : Enregistrement en base des métadonnées des Units ainsi que leurs journaux de cycle de vie
- COMMIT_LIFE_CYCLE_UNIT : Écriture des métadonnées des Units sur l’offre de stockage des BDO des GO
Step 9 - STP_ACCESSION_REGISTRATION : Alimentation du registre de fond
- ACCESSION_REGISTRATION : enregistrement des archives prises en charge dans le Registre des Fonds
Step 10 et finale - STP_INGEST_FINALISATION : Notification de la fin de l’opération d’entrée. Cette étape est obligatoire et sera toujours exécutée, en dernière position.
- ATR_NOTIFICATION : - génération de l’ArchiveTransferReply xml (OK ou KO) - enregistrement de l’ArchiveTransferReply xml dans les offres de stockage
Création d’un nouveau step¶
Un step est une étape de workflow. Il regroupe un ensemble d’actions (handler). Ces steps sont définis dans le workflowJSONvX.json (X=1,2).