El modelo de base de datos se muestra en la siguiente imagen:
-
Variables del sistema
Las variables del sistema se configuran en la tabla app_configuration y son cargadas por cada módulo (Kerno, Hermes, Minerva...) en el arranque.
Estas variables permiten identificar, por ejemplo, caracteres separadores de valores o ARIs, valores máximos o mínimos para las validaciones por defecto de los atributos de plantilla, la periodicidad de ejecución de los procesos batch…
Estructura de la tabla
Cada variable registrada se caracteriza por los siguientes elementos:
-
id: identificador único de la tabla.
-
internal: boolean utilizado para indicar si una propiedad se puede ver desde la API pública en claro (si internal es ‘false’ no debe verse en claro).
-
config_key: propiedad a configurar.
-
value: el valor que adquiere la propiedad.
-
application: módulo al que aplica la propiedad.
Puede ser ‘kerno’, ‘hermes’, ‘minerva’, ‘zeus’ o tener valor nulo, en cuyo caso aplica a todos los módulos.
-
label: campo informativo que permite organizar las variables.
-
profile: perfil de ejecución en el que aplica la propiedad con su valor.
Es necesario que dicha tabla tenga las siguientes propiedades, siendo:
-
config_key la misma config_key que se incluye en la tabla
-
value el valor por defecto que Anjana proporciona y que se puede ser modificado
-
application el mismo valor que application en la tabla
-
descripción, que no existe en la tabla y es una mera explicación de cada propiedad
config_key |
value |
application |
descripción |
---|---|---|---|
anjana.activiti.data |
true |
hermes |
Flag para importar los WFs en el arrancado de Hermes |
anjana.activiti.input |
DC_WF, BG_WF |
hermes |
Carpetas a usar para poder importar WFs |
anjana.activiti.output |
/data/WF |
hermes |
Ruta temporal del directorio de ficheros para tratar los WFS |
anjana.async.db.corePoolSize |
5 |
kerno |
Tamaño del pool de conexiones a base de datos |
anjana.async.db.maxPoolSize |
20 |
kerno |
Tamaño máximo del pool de conexiones a base de datos |
anjana.async.db.queueCapacity |
100 |
kerno |
Tamaño de cola de las ejecuciones a base de datos |
anjana.async.hermes.corePoolSize |
5 |
kerno |
Tamaño del pool de hilos contra ejecuciones de Hermes |
anjana.async.hermes.maxPoolSize |
10 |
kerno |
Tamaño máximo del pool de hilos contra ejecuciones de Hermes |
anjana.async.hermes.queueCapacity |
1000 |
kerno |
Tamaño de la cola de las ejecuciones contra Hermes |
anjana.async.minerva.corePoolSize |
5 |
kerno |
Tamaño del pool de hilos contra ejecuciones de Minerva |
anjana.async.minerva.maxPoolSize |
20 |
kerno |
Tamaño máximo del pool de hilos contra ejecuciones de Minerva |
anjana.async.minerva.queueCapacity |
100 |
kerno |
Tamaño de la cola de las ejecuciones contra Minerva |
anjana.async.pool.corePoolSize |
5 |
hermes |
Tamaño del pool asíncrono de procesamiento de Hermes |
anjana.async.pool.maxPoolSize |
20 |
hermes |
Tamaño máximo del pool asíncrono de procesamiento de Hermes |
anjana.async.pool.queueCapacity |
100 |
hermes |
Tamaño de cola de procesamiento de Hermes |
anjana.combinations.max |
10 |
kerno |
Cantidad de combinaciones a mostrar como máximo para el carrito de adherencias |
anjana.expiration.days |
7 |
kerno |
Número de días que se suma a la fecha actual para fijar como fecha de expiración al objeto que depreca cuando se versiona por excel |
anjana.group.crossName |
Cross |
zeus |
Nombre del grupo que aglutina los roles cross en el perfil de usuario |
anjana.internationalization.separatorNameColumnsExcel |
_ |
kerno |
Carácter para utilizar como separador de valores en atributos multivaluados en Excel |
anjana.last-execution.maxRetry |
0 |
hermes |
Cantidad de reintentos en los pasos LastExecution de los WFS, siendo 0 intentos infinitos |
anjana.last-execution.waitRetry |
300 |
hermes |
Tiempo de espera entre intentos en los pasos LastExecution de los WFs |
anjana.mail.aws[0] |
|
zeus |
Propiedad del proveedor de donde sacar el email, se pueden tener varios numerando las propiedades con ‘[numero]’ (revisar las propiedades anjana.mail.azure[x] o anjana.mail.google[x]) |
anjana.mail.azure[0] |
|
zeus |
Propiedad del proveedor de donde sacar el email, se pueden tener varios numerando las propiedades con ‘[numero]’ |
anjana.mail.azure[1] |
otherMails |
zeus |
Propiedad del proveedor de donde sacar el email, se pueden tener varios numerando las propiedades con ‘[numero]’ |
anjana.mail.azure[2] |
userPrincipalName |
zeus |
Propiedad del proveedor de donde sacar el email, se pueden tener varios numerando las propiedades con ‘[numero]’ |
anjana.mail.db[0] |
|
zeus |
Propiedad del proveedor de donde sacar el email, se pueden tener varios numerando las propiedades con ‘[numero]’ |
anjana.mail.google[0] |
primaryEmail |
zeus |
Propiedad del proveedor de donde sacar el email, se pueden tener varios numerando las propiedades con ‘[numero]’ |
anjana.mail.google[1] |
emails |
zeus |
Propiedad del proveedor de donde sacar el email, se pueden tener varios numerando las propiedades con ‘[numero]’ |
anjana.mail.ldap[0] |
|
zeus |
Propiedad del proveedor de donde sacar el email, se pueden tener varios numerando las propiedades con ‘[numero]’ |
anjana.notification.expiration |
4 |
kerno |
Número de días de preaviso para las notificaciones indicando la próxima expiración de un objeto |
anjana.numberDatasetFieldsForWarning |
100 |
kerno |
Cantidad de dataset_fields para considerar un Dataset grande en el que las acciones efectuadas por los usuarios les redirigirán al Portal en vez de dejarles a la espera de la finalización |
anjana.numberEntitiesToSubmit |
50 |
kerno |
Cantidad de entidades a enviar a validar a la vez en la importación por Excel |
anjana.provider.primary |
Database |
zeus |
Propiedad para marcar si se quiere tener un proveedor principal preseleccionado en las pantallas de login y cuál debe ser. Este valor debe coincidir con la propiedad security.authentication.<proveedor> y el nombre de la instancia del proveedor elegido. Para base de datos y Ldap los valores son ‘Database’ y ‘Ldap’ correspondientemente. |
anjana.retries |
5 |
kerno |
Reintentos en caso de fallo de comunicación en la reindexación |
anjana.role.defaultRole |
default |
|
Rol que se aplica a los usuarios al registrarse en Anjana. Permite acceso a usuarios sin rol especificado en la aplicación. |
anjana.scheduling.enabled |
true |
kerno |
Flag para habilitar los batches de Kerno |
anjana.scheduling.expiration |
0 0 0 ? * * |
kerno |
Programación de la expiración de objetos (todos los días a las 00.00h) |
anjana.scheduling.licenseNotification |
0 0 0 ? * * |
zeus |
Programación de la tarea programada de aviso de caducidad de la licencia (cada día a las 00.00) |
anjana.scheduling.lineageObjectsPerPacket |
1000 |
kerno |
Cantidad de objetos por paquete para procesar el linaje |
anjana.scheduling.notification |
0 45 7 ? * * |
kerno |
Programación de la notificación de entidades a expirar (todos los días a las 7.45h) |
anjana.scheduling.notification |
0 0 0 ? * * |
zeus |
Programación de la tarea programada de revisión de roles cross |
anjana.scheduling.objectsPerPacket |
500 |
kerno |
Cantidad de objetos a procesar por paquete en procesamientos internos de Anjana |
anjana.scheduling.threads |
2 |
kerno |
Cantidad de hilos para batches |
anjana.scheduling.threadScheduleSeconds |
15 |
kerno |
Retraso en segundos entre paquetes de indexación |
anjana.separatorAttribute |
_- |
kerno |
Carácter utilizado como separador de atributos multivaluados en base de datos |
anjana.tot.createCustom |
false |
kerno |
Flag para que, en caso de que la extracción de metadato con un plugin obtenga un atributo que no se encuentre en plantilla, se cree como atributo custom del objeto |
anjana.waitRetry |
10 |
kerno |
Tiempo de espera entre cada intento en caso de fallo de comunicación en la reindexación |
anjana.workflow.launchIfCustomChanges |
true |
kerno |
Flag para considerar los atributos personalizados al comprobar los cambios en un objeto para lanzar o no el workflow |
ARI_OBJECT_SEPARATOR |
: |
|
Carácter usado para separar palabras claves en el nombre de la ARI de archivos subidos a Minio o S3 |
default_language_app |
en-US |
|
Idioma por defecto de la aplicación, valor del campo i18n_code de la tabla zeus.languages |
MAX_DECIMAL_PRECISION |
16 |
|
Número máximo de dígitos en la parte decimal de un input_decimal (o array) permitido |
MAX_INTEGER |
9223372036854775807 |
|
Número máximo en atributo de tipo entero, decimal, array o rango |
MAX_LENGTH_TEXT_BD |
255 |
|
Número máximo de caracteres permitidos en base de datos para campos de tipo input_text y su multi idioma, como en la validación de un workflow o la solicitud de adherencia |
MAX_LENGTH_TEXT_EDITOR |
300000 |
|
Número máximo de caracteres para un atributo de tipo text_area, enriched_textarea y multi idiomas de ambos permitido |
MIN_DECIMAL_PRECISION |
0 |
|
Número mínimo de dígitos en la parte decimal de un input_decimal (o array) permitido |
MIN_INTEGER |
-9223372036854775808 |
|
Número mínimo en atributo de tipo entero, decimal, array o rango |
MIN_LENGTH_TEXT_EDITOR |
1 |
|
Número mínimo de caracteres para un atributo de tipo input_text, text_area, enriched_textarea y multi idiomas de los tres permitido |
MIN_LENGTH_SEARCH_USER |
0 |
|
Número mínimo de caracteres para que el buscador de usuarios comience a dar resultados |
solr.module.kerno.collection |
kerno |
minerva |
Nombre de la colección de Solr para objetos de Anjana |
solr.module.kerno.generate |
true |
minerva |
Flag para crear la colección de objetos en Solr, si no existe, en el arrancado |
solr.module.kerno.replication |
1 |
minerva |
Replicación SolR de la colección de objetos |
solr.module.kerno.shards |
1 |
minerva |
Sharding SolR de la colección de objetos |
solr.module.recommendations.collection |
recommendations |
minerva |
Nombre de la colección de Solr para píldoras asistenciales de Anjana |
solr.module.recommendations.generate |
true |
minerva |
Flag para crear la colección de recomendaciones en Solr, si no existe, en el arrancado |
solr.module.recommendations.replication |
1 |
minerva |
Replicación SolR de la colección de recomendaciones |
solr.module.recommendations.shards |
1 |
minerva |
Sharding SolR de la colección de recomendaciones |
solr.multivalued-separator |
_- |
minerva |
Carácter que se utiliza para concatenar atributos multivaluados que debe coincidir con anjana.separatorAttribute de Kerno |
wf.async.waiter |
20000 |
hermes |
Tiempo de espera en ms de tareas internas de Activiti |
wf.validation.automatic |
true |
hermes |
Flag para habilitar la validación automática de tareas sin petición de acción humana |
Excepciones en configuración
Debido a limitaciones de la base de datos o el propio funcionamiento del atributo, hay casos en los que es necesario indicar un límite en algunos componentes y priorizar el valor configurado de la tabla appConfigurations ante la configurada en templateAtributtesValidations.
Si el valor de templateAtributtesValidations es mayor al valor que hay en appConfigurations, se priorizará el valor de appConfigurations.
Los casos son los siguientes:
-
MAX: Si el valor MAX de template_attribute_validations es superior a MAX_INTEGER de appConfigurations, se priorizará MAX_INTEGER de appConfigurations.
-
MIN: Si el valor MIN de template_attribute_validations es inferior a MIN_INTEGER de appConfigurations, se priorizará MIN_INTEGER de appConfigurations.
-
MAX_DECIMAL_PRECISION: Si el valor MAX_DECIMAL_PRECISION de template_attribute_validations es superior a MAX_DECIMAL_PRECISION de appConfigurations, se priorizará MAX_DECIMAL_PRECISION de appConfigurations.
-
MIN_DECIMAL_PRECISION: Si el valor MIN_DECIMAL_PRECISION de template_attribute_validations es inferior a MIN_DECIMAL_PRECISION de appConfigurations, se priorizará MIN_DECIMAL_PRECISION de appConfigurations.
-
MAX_LENGTH: Si el valor MAX_LENGTH de template_attribute_validations es superior a MAX_LENGTH_TEXT_EDITOR o MAX_LENGTH_TEXT_BD de appConfigurations, se priorizará MAX_LENGTH_TEXT_EDITOR en el caso de los TEXTAREA o MAX_LENGTH_TEXT_BD si es un input text o los textarea de los modales de workflows y adherencias.
-
MIN_LENGTH: Si el valor MIN_LENGTH de template_attribute_validations es inferior a MIN_LENGTH_TEXT_EDITOR de appConfigurations, se priorizará MIN_LENGTH_TEXT_EDITOR de appConfigurations.
Visión de Administrador
El alta de una nueva variable desde el panel de administración de Anjana Data se realiza en appConfigurations:
Al acceder se muestra una tabla que contiene todas las variables de la aplicación de la configuración actual.
La creación de una nueva variable se realiza mediante el botón New:
A continuación, se muestra cómo crear un parámetro de configuración:
Visión de Desarrollador
Para añadir las variables de configuración hay que configurar la tabla app_configurations del esquema Portuno. Para ello, hay que rellenar un sql como el siguiente:
INSERT INTO portuno.app_configuration (id, internal, config_key, value, application) VALUES (4, false, 'ACCESS_MINIO_URL', ' http://s3service:9000', NULL), (5, false, 'MIN_LENGTH_TEXT_EDITOR', '1', NULL), (6, false, 'MAX_LENGTH_TEXT_BD', '255', NULL), (9, false, 'MIN_DECIMAL_PRECISION', '1', NULL), (10, false, 'MAX_INTEGER', '2100000000', NULL); |
NOTAS:
-
Puesto que las variables se cargan en el arranque, Portuno debe estar arrancado antes que el resto de servicios para obtener correctamente las propiedades indicadas. Si algún servicio se iniciara antes que Portuno se quedará a la espera de que Portuno esté disponible para poder cargar esta configuración y terminar su inicialización.
-
En caso de que una variable esté configurada en app_configuration y en un fichero yml, la configuración que aplica es la de app_configuration.
-
Traducciones
Las traducciones disponibles para el portal en los distintos idiomas configurados en Anjana se encuentran almacenadas en la tabla translations. Por ello, cuando se añaden nuevos textos o se incorpora un nuevo idioma a la aplicación, es necesario incorporar aquí esas nuevas traducciones.
Cualquier cambio en esta tabla requiere la actualización de los ficheros de traducciones desde Portuno para poder hacer uso de los nuevos textos en la aplicación.
Estructura de la tabla
Cada traducción registrada se caracteriza por los siguientes elementos:
-
id_translations: identificador único de la tabla.
-
config_key: clave de traducción. Cada clave debe aparecer en esta tabla tantas veces como idiomas haya configurados.
-
language: idioma de traducción en código i18n. Debe coincidir con el campo i18n_code de la tabla languages.
-
value: texto traducido al idioma indicado.
-
used_for: texto que permite segregar las traducciones por uso. Es informativo.
-
internal: boolean que permite indicar si la traducción se corresponde con un texto propio de la aplicación (internal = 'true') o si, por el contrario, se corresponde con una traducción propia de la configuración utilizada como nombres de atributos, roles… (internal = 'false').
Visión de Administrador
El alta de las traducciones se realiza en el panel de administración de Anjana Data en Translations:
Al acceder se muestra una tabla que contiene todas las traducciones usadas por el portal de Anjana.
La creación de una nueva traducción se realiza mediante el botón New:
Mediante el wizard de creación se asignan valores a los elementos anteriormente descritos:
Visión del Desarrollador
Para añadir las traducciones hay que configurar la tabla translations del esquema Portuno. Para ello, hay que rellenar un sql como el siguiente:
INSERT INTO portuno.translations (id_translations, config_key, "language", used_for, value, internal) VALUES (2, 'ACTION_FINISH_WORKFLOW_KEY', 'en-US', 'AUDIT', 'Workflow finished', true), (3, 'ACTION_FINISH_WORKFLOW_KEY', 'es-ES', 'AUDIT', 'Workflow finalizado', true), (4, 'ACTION_DESCRIPTION_FINISH_WORKFLOW_KEY', 'en-US', 'AUDIT', 'Finished workflow for #OBJECT_NAME#', true), (5, 'ACTION_DESCRIPTION_FINISH_WORKFLOW_KEY', 'es-ES', 'AUDIT', 'Workflow finalizado para #OBJECT_NAME#', true), (6, 'ACTION_ERROR_KEY', 'en-US', NULL, 'Error', true), (7, 'ACTION_ERROR_KEY', 'es-ES', NULL, 'Error', true); |
NOTAS:
-
Es necesario que se configuren las traducciones siguiendo este criterio:
-
internal='true': traducciones internas de Anjana, necesarias para la correcta visualización de la aplicación
-
internal='false': traducciones de textos propios de la configuración, es decir, textos relacionados con atributos de las plantillas, menús, secciones, roles, OUs… que son configurables y varían en función del entorno y su parametría.
-
-
No se debe añadir en la tabla de portuno.translations dos claves de traducción distintas con el mismo texto traducido para dos atributos o para dos valores de un mismo atributo.
-
No es recomendable establecer como clave de traducción los nombres de los diferentes subtipos de objetos puesto que supondrá que estos aparezcan traducidos en el portal a pesar de que no tienen traducción.
-
Para los atributos Infraestructura, Tecnología y Zona:
-
Todas las claves de traducción de los valores posibles de dichos campos deben ser iguales que las distintas partes que componen la tripleta con la que se configura la conexión con los plugins de Tot.
-
Por ejemplo: Si una tripleta en el plugin de tot de Azure se configura como azure/azure analytics/production entonces las clave de traducción del valor azure en infrastructure debe ser “azure”, para el valor de azure analytics en technology debe ser “azure analytics” y para el valor production de zone debe ser “production”.
-
Los valores de estos atributos deben no contener ‘:’, ‘#’, ‘(‘ o ‘)’ para no interferir con los identificadores internos de Anjana.
-
Para las traducciones de los roles, la clave de traducción ha de ser el texto “ROLE.” concatenado del nombre del rol establecido en la tabla zeus.role en la columna role_name. Por ejemplo: ROLE.developer
-
Para las traducciones de los nombres de los idiomas, la clave de traducción ha de ser el código i18n del idioma en la tabla languages.
Traducciones internas deAnjana
Hay valores de traducciones internas que se repiten en diferentes claves, ya que estas se han generado según la funcionalidad o pantalla en la que se encuentren. En caso de querer cambiar una traducción interna de Anjana se tendrá que tener en cuenta que habrá que cambiar el valor de varias claves en la tabla de Translations de Portuno.
Por ejemplo, en caso de querer cambiar la traducción de un atributo obligatorio de una entidad como Infraestructura, habrá que cambiar tanto el valor de la clave de Infraestructura del wizard de creación como la de los filtros, el atributo de la plantilla o el del tooltip de la cabecera de un objeto.
A continuación se desglosan las claves de traducción de los atributos obligatorios de las plantillas de entidades/relaciones:
Nombre:
-
COMMON.NAME
-
NEW_WIZARD_ASSISTANT.CARD_NAME
-
labelTranslationKey y placeHolderTranslationKey del atributo con name = ‘name’ en anjana.attribute_definition
Infraestructura:
-
NEW_WIZARD_ASSISTANT.INFRASTRUCTURE
-
TOOLTIP.INFRASTRUCTURE
-
labelTranslationKey y placeHolderTranslationKey del atributo con name = ‘infrastructure’ en anjana.attribute_definition
Tecnología:
-
NEW_WIZARD_ASSISTANT.TECHNOLOGY
-
TOOLTIP.TECHNOLOGY
-
labelTranslationKey y placeHolderTranslationKey del atributo con name = ‘technology’ en anjana.attribute_definition
Zona:
-
NEW_WIZARD_ASSISTANT.ZONE
-
TOOLTIP.ZONE
-
labelTranslationKey y placeHolderTranslationKey del atributo con name = ‘zone’ en anjana.attribute_definition
Localización:
-
NEW_WIZARD_ASSISTANT.PATH
-
TOOLTIP.PATH
-
labelTranslationKey y placeHolderTranslationKey del atributo con name = ‘path’ en anjana.attribute_definition
Unidad Organizativa:
-
CONTAINER
-
GRAPH.NODE_ORGANIZATIONAL_UNIT
-
MODAL.ORGANIZATIONAL_UNIT
-
TOOLTIP.ORGANIZATIONAL_UNIT
-
FILTERS.ORGANIZATIONAL_UNIT
-
labelTranslationKey y placeHolderTranslationKey del atributo con name = ‘organizationalUnit’ en anjana.attribute_definition
Posición:
-
COMMON.POSITION
-
labelTranslationKey y placeHolderTranslationKey del atributo con name = ‘position’ en anjana.attribute_definition
Nombre físico:
-
COMMON.PHYSICAL_NAME
-
labelTranslationKey y placeHolderTranslationKey del atributo con name = ‘physicalName’ en anjana.attribute_definition
Origen:
-
COMMON.SOURCE
-
FORM_RELATION.SOURCE
-
RELATION.SOURCE
-
SOURCE
-
labelTranslationKey y placeHolderTranslationKey del atributo con name = ‘source’ en anjana.attribute_definition
Destino:
-
FORM_RELATION.DESTINATION
-
RELATION.DESTINATION
-
FILTERS.DESTINATION
-
DESTINATION
-
labelTranslationKey y placeHolderTranslationKey del atributo con name = ‘destination’ en anjana.attribute_definition