"Push patch to remote" KO lors de la comparaison de module / instance distante (divers cas)

Problem description

“Push patch to remote” KO lors de la comparaison de module / instance distante si le patch impacte des objets “System”

Steps to reproduce

I have reproduced the problem on an up-to-date Simplicité instance
and those are the steps to do it:

image

image

Technical information

Instance /health
[Platform]
Status=OK
Version=5.2.8
BuiltOn=2022-06-22 22:49
Git=5.2/a570308df19c08bd3c207c43f21c033a3287623a
Encoding=UTF-8
EndpointIP=21.0.15.6
EndpointURL=http://e5d5407250e2:8080
TimeZone=Europe/Paris
SystemDate=2022-06-29 10:14:44

[Application]
ApplicationVersion=1.0.0
ContextPath=
ContextURL=https://bca.dok-re7.intra.renault.fr
ActiveSessions=3
TotalUsers=8311
EnabledUsers=1867
LastLoginDate=2022-06-29 10:09:15

[Server]
ServerInfo=Apache Tomcat/9.0.64
ServerType=WEB
ServerActiveSessions=3
ServerSessionTimeout=30

[OS]
Name=Linux
Architecture=amd64
Version=3.10.0-1160.66.1.el7.x86_64
DockerImageName=centos7
SystemEncoding=UTF-8

[JavaVM]
Version=17.0.3
Vendor=Eclipse Adoptium
VMName=OpenJDK 64-Bit Server VM
VMVersion=17.0.3+7
ScriptEngine=rhino
ScriptEngineVersion=Rhino 1.7.13 2020 09 02
HeapFree=2327557
HeapSize=3040896
HeapMaxSize=3040896
TotalFreeSize=2327557

[Cache]
ObjectCache=911
ObjectCacheMax=10000
ObjectCacheRatio=9
ProcessCache=10
ProcessCacheMax=10000
ProcessCacheRatio=0
APIGrantCache=5
APIGrantCacheMax=1000
APIGrantRatio=0

[Database]
Vendor=2
ProductName=MySQL
ProductVersion=5.6.39-log
DriverName=MySQL Connector/J
DriverVersion=mysql-connector-java-8.0.29 (Revision: dd61577595edad45c398af508cf91ad26fc4144f)
DBDate=2022-06-29 10:14:44
DBDateOffset=0
DBPatchLevel=5;P02;83aba48650c13a6dae0ef5f65dc65a81
UsingBLOBs=true

[Healthcheck]
Date=2022-06-29 10:14:44
ElapsedTime=16

Simplicité logs
2022-06-29 10:09:15,762 ERROR [] No right on action create for items of object ModuleLink
    
2022-06-29 10:09:15,762 INFO [] Action: create
2022-06-29 10:09:15,762 INFO [] New record key row_id
2022-06-29 10:09:15,754 INFO [] Found field mdk_parent_id.mdl_name = [BCSIModule_ActorPortfolio]
2022-06-29 10:09:15,754 INFO [] Found field mdk_cascad = [R]
2022-06-29 10:09:15,754 INFO [] Found field row_module_id.mdl_name = [BCSIModule_Application]
2022-06-29 10:09:15,754 INFO [] Start import object ModuleLink:
2022-06-29 10:09:15,762|SIMPLICITE|ERROR||http://e5d5407250e2:8080||ECOREIO001|a068181|com.simplicite.util.integration.SAXImportXML|importObject||Erreur I/O: Import object ModuleLink, status = KO
2022-06-29 10:09:15,754 ERROR [] No right on action create for items of object ModuleLink
    
2022-06-29 10:09:15,754 INFO [] Action: create
2022-06-29 10:09:15,754 INFO [] New record key row_id
2022-06-29 10:09:15,747 INFO [] Found field mdk_parent_id.mdl_name = [RenaultAPI]
2022-06-29 10:09:15,747 INFO [] Found field mdk_cascad = [R]
2022-06-29 10:09:15,747 INFO [] Found field row_module_id.mdl_name = [BCSIModule_Application]
2022-06-29 10:09:15,747 INFO [] Start import object ModuleLink:
2022-06-29 10:09:15,754|SIMPLICITE|ERROR||http://e5d5407250e2:8080||ECOREIO001|a068181|com.simplicite.util.integration.SAXImportXML|importObject||Erreur I/O: Import object ModuleLink, status = KO
2022-06-29 10:09:15,747 ERROR [] No right on action create for items of object ModuleLink
    
2022-06-29 10:09:15,747 INFO [] Action: create
2022-06-29 10:09:15,747 INFO [] New record key row_id
2022-06-29 10:09:15,738 INFO [] Found field mdk_parent_id.mdl_name = [BCSIModule_Commons]
2022-06-29 10:09:15,738 INFO [] Found field mdk_cascad = [R]
2022-06-29 10:09:15,738 INFO [] Found field row_module_id.mdl_name = [BCSIModule_Application]
2022-06-29 10:09:15,738 INFO [] Start import object ModuleLink:
2022-06-29 10:09:15,747|SIMPLICITE|ERROR||http://e5d5407250e2:8080||ECOREIO001|a068181|com.simplicite.util.integration.SAXImportXML|importObject||Erreur I/O: Import object ModuleLink, status = KO
2022-06-29 10:09:15,581|SIMPLICITE|INFO||http://e5d5407250e2:8080||ICOREIO001|a068181|com.simplicite.util.engine.Interface|importData||Information I/O: Start scanning data, origin: I/O XML import file0
2022-06-29 10:09:15,536|SIMPLICITE|INFO||http://e5d5407250e2:8080||INFO|a068181|com.simplicite.webapp.servlets.IOServlet|doPost||Evénement: I/O service IMPORTXML source=file0...
Browser logs
NA
Other relevant information

Ce problème touche tous les objets du module System (ModuleLink, ObjectFieldSystem, etc…).
→ autre exemple de log pour ObjectFieldSystem

2022-06-29 10:18:08,428 ERROR [] No right on action create for items of object ObjectFieldSystem
    
2022-06-29 10:18:08,428 INFO [] Action: create
2022-06-29 10:18:08,428 WARN [] REF_NOT_FOUND: Unable to find reference obf_field_id of object ObjectFieldSystem
2022-06-29 10:18:08,428 INFO [] New record key row_id
2022-06-29 10:18:08,396 INFO [] Found field obf_ref_object_id.obo_name = []
2022-06-29 10:18:08,396 INFO [] Found field obf_copy = []
2022-06-29 10:18:08,396 INFO [] Found field obf_ref_order = []
2022-06-29 10:18:08,396 INFO [] Found field obf_fld_dfault = []
2022-06-29 10:18:08,396 INFO [] Found field obf_cascad = []
2022-06-29 10:18:08,396 INFO [] Found field obf_field_id.fld_dfault = [1]
2022-06-29 10:18:08,396 INFO [] Found field obf_ref_field_id.fld_name = []
2022-06-29 10:18:08,396 INFO [] Found field obf_fld_visible = []
2022-06-29 10:18:08,396 INFO [] Found field obf_area_id.ofa_name = [BCSICompApp-2]
2022-06-29 10:18:08,396 INFO [] Found field obf_card = []
2022-06-29 10:18:08,396 INFO [] Found field obf_object_id.obo_name = [BCSICompApp]
2022-06-29 10:18:08,396 INFO [] Found field obf_area_id.ofa_position = [2]
2022-06-29 10:18:08,396 INFO [] Found field obf_fld_researchreq = []
2022-06-29 10:18:08,396 INFO [] Found field obf_field_id.fld_name = [CompAppRelationType]
2022-06-29 10:18:08,396 INFO [] Found field obf_field_id.fld_type = [7]
2022-06-29 10:18:08,396 INFO [] Found field obf_fld_listmore = []
2022-06-29 10:18:08,396 INFO [] Found field obf_ref_export = [1]
2022-06-29 10:18:08,396 INFO [] Found field obf_fld_updatable = []
2022-06-29 10:18:08,396 INFO [] Found field obf_input = []
2022-06-29 10:18:08,396 INFO [] Found field obf_visible = []
2022-06-29 10:18:08,396 INFO [] Found field obf_group_by = []
2022-06-29 10:18:08,396 INFO [] Found field obf_order = [1999]
2022-06-29 10:18:08,396 INFO [] Found field obf_fld_required = []
2022-06-29 10:18:08,396 INFO [] Found field obf_fld_more = []
2022-06-29 10:18:08,396 INFO [] Found field obf_fld_research = []
2022-06-29 10:18:08,396 INFO [] Found field row_module_id.mdl_name = [BCSIModule_Application]
2022-06-29 10:18:08,396 INFO [] Found field obf_dfault_order = []
2022-06-29 10:18:08,396 INFO [] Start import object ObjectFieldSystem:
2022-06-29 10:18:08,428|SIMPLICITE|ERROR||http://e5d5407250e2:8080||ECOREIO001|a068181|com.simplicite.util.integration.SAXImportXML|importObject||Erreur I/O: Import object ObjectFieldSystem, status = KO
2022-06-29 10:18:08,166|SIMPLICITE|INFO||http://e5d5407250e2:8080||ICOREIO001|a068181|com.simplicite.util.engine.Interface|importData||Information I/O: Start scanning data, origin: I/O XML import file0
2022-06-29 10:18:08,078|SIMPLICITE|INFO||http://e5d5407250e2:8080||INFO|a068181|com.simplicite.webapp.servlets.IOServlet|doPost||Evénement: I/O service IMPORTXML source=file0...

Bonjour,

Merci pour les explications.
La log indique un problème de droit de création sur l’objet ModuleLink.

  • Le patch passe-t-il si on l’applique “à la main” sur l’instance à distance donc sans passer par IO ?
  • ou alors le nom de l’action dans le patch est mal nommée… ça aurait dû générer “insert” au lieu de “create” ?

UPDATE :
Après analyse, visiblement le patch généré depuis le diff d’arbre JSON est avec une action “create” alors que la XML utilise comme verbe “insert” “upsert”… et Simplicité a parfois du mal avec les ronds dans les carrés.

on va corriger.

1 Like

Autre cas qui semble plus lié au modèle de l’objet Field / fld_tray / ENUM FLD_TRAY ne contient pas la valeur par défaut “0” de fld_tray… fld_tray n’étant pas obligatoire, j’ai supprimé la valeur par défaut et repris les données en BD (UPDATE m_field SET fld_tray='' WHERE fld_tray='0';)

2022-06-30 09:52:02,218 ERROR [] Validation error: [ERR_ENUM:Accès via menu#ERROR#fld_tray]
    
2022-06-30 09:52:02,217 INFO [] Action: update
2022-06-30 09:52:02,210 INFO [] Found internal key row_id = 9234
2022-06-30 09:52:02,207 INFO [] Found field fld_tray = [["0"]]
2022-06-30 09:52:02,207 INFO [] Found field fld_name = [AppDatacategCategUpstream]
2022-06-30 09:52:02,207 INFO [] Start import object Field:
2022-06-30 09:52:02,218|SIMPLICITE|ERROR||http://e5d5407250e2:8080||ECOREIO001|a068181|com.simplicite.util.integration.SAXImportXML|importObject||Erreur I/O: Import object Field, status = KO
2022-06-30 09:52:02,025|SIMPLICITE|INFO||http://e5d5407250e2:8080||ICOREIO001|a068181|com.simplicite.util.engine.Interface|importData||Information I/O: Start scanning data, origin: I/O XML import file0
2022-06-30 09:52:01,928|SIMPLICITE|INFO||http://e5d5407250e2:8080||INFO|a068181|com.simplicite.webapp.servlets.IOServlet|doPost||Evénement: I/O service IMPORTXML source=file0...

Autre cas de “fake news” :wink: (ou “faux positif”) : les exports JSON réalisés sur les instances dev (exécutant l’action de comparaison avec une instance distante) et re7 (instance distante) ne sont pas alignés :

diff /mnt/c/Users/a068181/Downloads/BCSIModule_Security-0.1*.json
2402c2402
<              "fld_name": {"value": "AppDatacategCateg"},
---
>              "fld_name": "AppDatacategCateg",
3003c3003
<             "fld_name": "AppDatacategZenType",
---
>             "fld_name": {"value": "AppDatacategZenType"},
3555c3555
<       "obo_name": "BCSIAppDatacategDatasource",
---
>       "obo_name": {"value": "BCSIAppDatacategDatasource"},

Les deux instances sont sur le même build :

[Platform]
Status=OK
Version=5.2.8
BuiltOn=2022-06-22 22:49
Git=5.2/a570308df19c08bd3c207c43f21c033a3287623a
Encoding=UTF-8
EndpointIP=21.0.15.6
EndpointURL=http://e5d5407250e2:8080
TimeZone=Europe/Paris
SystemDate=2022-06-30 10:07:26

En 5.2, il y a un garde fou sur le preValidate d’un champ pour remettre à vide en cas d’import d’un XML legacy :

	// Force empty if legacy 0 value is set
	f = getField("fld_tray", false);
	if (f!=null && Tool.FALSE.equals(f.getValue()))
		f.setValue("");

mais effectivement il n’y a pas de patch SQL qui remette à vide en 5.2.
Cela avait été fait en 5.1 où il y avait bien update m_field set fld_tray=null where fld_tray='0';
On va le refaire en 5.2 au cas où si ça avait été ajouté entre temps.

oui normalement la valeur du champ est un simple string mais désormais Simplicité gère l’historique des modifications pour faire les ALTER de nom de colonne ou de table (et ne pas recréer une colonne ou table). Dans ce cas, ça génère des oldvalues dans un objet JSON pour permettre à celui qui reçoit le patch de comparer avec un ancien nom du champ/objet :

"fld_name": {"value": "AppDatacategCateg", oldvalue: "...", oldvalue2: "..." },

cf onglet historique de Field et de Object internal

  • Si pas de oldvalue alors il faudrait exporter un string simple
  • et sinon, il faudrait uniquement comparer la valeur, pas les old values.

On va améliorer ça.

1 Like

En fait c’est rendu nécessaire si on laisse la valeur par défaut de fld_tray à 0 et qu’un malveillant (comme moi :supervillain:) ré-applique les valeurs par défaut… :hot_face:

La version 5.2.9 de cette fin de semaine va donc contenir :

  • Le patch qui remet à vide fld_tray si égal à “0” (dupliqué de la 5.1)
  • Le diff d’arbre JSON traite le faux positif pour gérer le fait que { "value": "x", ... } == "x"
  • Et si un champ/objet n’a pas été renommé (pas d’historique), le toJSONObject devrait générer "fld_name": "x" et plus "fld_name": { "value": "x" }
1 Like

Super!
Merci beaucoup, cette feature de comparaison entre environnements va très fortement simplifier notre processus de delivery “cherry-pick on the cake” :cake:

Oui c’est l’objectif.

En terme de diff de modèles relationnels, même les SGBD n’ont aucun outillage… il faut innover.
Ca a toujours été compliqué de trouver un langage qui rentre ça sur une page “humainement” lisible. L’export de module en arbre JSON (fichiers éclatés ou non, et le diff via parcours d’arbre) sont nouveaux donc à observer avec attention au début sur vos modules complexes.

Bref tous les retours qui peuvent améliorer l’expérience suivants vos modèles particuliers seront appréciés :wink:

1 Like