Eureka
Afin de gérer les déploiements de la DevBox-Santé dans des environnements type Windows RDP (Remote Desktop Protocol) / Citrix, nous avons créé le projet Eureka. Eureka est l’annuaire des devbox-santé branchés sur les différents lecteurs de carte PC/SC:
Dans notre post du 20 septembre 2021, nous expliquions qu’il était difficile de faire le lien entre un partage de port USB (spécifique à chaque session utilisateur RDP) et un partage de port HTTP.
Chaque session utilisateur devait être associé à une DevBox-Santé sur un port http spécifique.
Eureka service
C’est pourquoi un service dédié, nommé Eureka peut être lancé sur le serveur RDP. Ce service Eureka joue le rôle d’annuaire des différentes sessions utilisateurs devbox-santé :
!theme aws-orange
!define DEVBOX_COLOR #278ef5
!define DMP_COLOR #35D9C0
!define MSS_COLOR #DE5D80
!define INS_COLOR #07A2CF
!define CPS_COLOR #D34A3C
!define VITALE_COLOR #5FD67A
!define PSC_COLOR #ff7765
!define APCV_COLOR #c6e66d
!define ANNUAIRE_COLOR #7613e0
!define DATA_COLOR #ffa800
node "Serveur RDP" {
package "Eureka" as eureka {
[DevBox-Santé1:9999] as devbox1 DEVBOX_COLOR
[DevBox-Santé2:9998] as devbox2 DEVBOX_COLOR
}
}
node "Poste utilisateur 1" {
[Application Intégrateur Front/Lourd] as int1
[Lecteur USB / Utilisateur 1] as usb1
}
node "Poste utilisateur 2" {
[Application Intégrateur Front/Lourd] as int2
[Lecteur USB / Utilisateur 2] as usb2
}
int1 --> eureka
devbox1 -- usb1 : mapping port USB
int2 --> eureka
devbox2 -- usb2 : mapping port USB
Ce service Windows est lancé au démarrage de serveur RDP et attend que les devbox-santé à leur démarrage s’enregistrent auprès de lui:
Ainsi, il suffit à l’application intégrateur de faire un appel à eureka pour connaître le numéro de port http d’écoute qui lui est spécifique.
Diagrammes de séquence
Du point de vue de l’intégrateur
!theme aws-orange
!define DEVBOX_COLOR #278ef5
!define DMP_COLOR #35D9C0
!define MSS_COLOR #DE5D80
!define INS_COLOR #07A2CF
!define CPS_COLOR #D34A3C
!define VITALE_COLOR #5FD67A
!define PSC_COLOR #ff7765
!define APCV_COLOR #c6e66d
!define ANNUAIRE_COLOR #7613e0
!define DATA_COLOR #ffa800
hide footbox
actor Utilisateur1
box "Serveur RDP"
participant Eureka
end box
box "Session utilisateur 1"
participant "DBX:8081" as DBX_8081 DEVBOX_COLOR
participant "Application Intégrateur" as AppInt1
participant "Application Web Intégrateur (front)" as WebApp1
end box
== Cas 1 : client lourd ==
...
group Démarrage application intégrateur (cas du client lourd)
Utilisateur1 -> AppInt1: Démarre l'applicationIntégrateur
activate AppInt1
AppInt1 -> AppInt1 : Appel système pour récupérer utilisateur windows
AppInt1 -> Eureka : GET /user/Utilisateur1
Eureka -> AppInt1 : {user: Utilisateur1, port: 8081}
AppInt1 -> DBX_8081 : GET localhost:8081/cps/readCps...
deactivate AppInt1
end
...
== Cas 2 : client web ==
group Démarrage application intégrateur (cas de l'application web)
Utilisateur1 -> WebApp1 : Accède depuis un navigateur http://superapp.integrateur
activate WebApp1
note over WebApp1 : Il n'est pas possible depuis un contexte web \nde récupérer le username windows
WebApp1 -> DBX_8081 : Lance une DevBox-sante par l'url devbox-sante://config?sessionId:12345
WebApp1 -> Eureka : GET /user/12345
Eureka -> WebApp1 : {user: Utilisateur1, sessionId: 12345, port: 8081}
WebApp1 -> DBX_8081 : GET localhost:8081/cps/readCps...
end
...
Ces diagrammes paraissent un peu magiques pour l’intégrateur. C’est pourquoi, voici un diagramme de séquence détaillant ce qui se passe dans les coulisses de la DevBox-santé, afin de faire le lien entre Utilisateur windows, session web utilisateur et port http des DevBox-Santé :
!theme aws-orange
!define DEVBOX_COLOR #278ef5
!define DMP_COLOR #35D9C0
!define MSS_COLOR #DE5D80
!define INS_COLOR #07A2CF
!define CPS_COLOR #D34A3C
!define VITALE_COLOR #5FD67A
!define PSC_COLOR #ff7765
!define APCV_COLOR #c6e66d
!define ANNUAIRE_COLOR #7613e0
!define DATA_COLOR #ffa800
hide footbox
actor Utilisateur1
box "Serveur RDP"
participant ServeurRDP
participant Eureka
end box
box "Session utilisateur 1"
participant SessionRDP1
participant "DBX:8081" as DBX_8081 DEVBOX_COLOR
participant "Application Intégrateur" as AppInt1
participant "WebApp Intégrateur\n(front)" as WebApp1
participant "Devbox temporaire" as DBX_TMP DEVBOX_COLOR
end box
== Démarrage serveur RDP ==
ServeurRDP -> Eureka : Démarrage service\nEureka
...
== Connexion utilisateur ==
Utilisateur1 -> SessionRDP1 : Se connecte
activate SessionRDP1
ServeurRDP <- SessionRDP1 : Démarre une nouvelle session
SessionRDP1 <-> ServeurRDP : Mapping port USB
SessionRDP1 -> DBX_8081 : Démarrage automatique\nd'une instance DevBox-Santé\n(port 8081 par exemple)
activate DBX_8081
DBX_8081 -> ServeurRDP : accés au port USB (pour lectures cartes)
DBX_8081 -> Eureka : POST {user: Utilisateur1, port:8081}
...
group Démarrage application intégrateur (cas du client lourd)
Utilisateur1 -> AppInt1: Démarre l'applicationIntégrateur
activate AppInt1
AppInt1 -> Eureka : GET /user/Utilisateur1
Eureka -> AppInt1 : {user: Utilisateur1, port: 8081}
AppInt1 -> DBX_8081 : GET localhost:8081/cps/readCps...
deactivate AppInt1
end
...
group Démarrage application intégrateur (cas de l'application web)
Utilisateur1 -> WebApp1 : Accède depuis un navigateur http://superapp.integrateur
activate WebApp1
WebApp1 -> DBX_TMP : devbox-sante://config?sessionId:12345
activate DBX_TMP
DBX_TMP -> DBX_8081 : healthcheck (is alive ?)
DBX_8081 -> DBX_TMP : 200 OK
DBX_TMP -> Eureka : POST {user: Utilisateur1, sessionId : 12345, port: 8081}
deactivate DBX_TMP
WebApp1 -> Eureka : GET /user/12345
Eureka -> WebApp1 : {user: Utilisateur1, sessionId: 12345, port: 8081}
WebApp1 -> DBX_8081 : GET localhost:8081/cps/readCps...
end
...