@startuml
title UDP Integration Test Workflow
participant "Test" as test
participant "SUT" as sut
participant "UDP Stub Server" as udp
participant "TCP Status Server" as tcp
test -> tcp : clear_buffer
test -> sut : exercise SUT
sut -> udp : logging call 1
udp -> tcp : call received
sut -> udp : logging call 2
udp -> tcp : call received
test -> tcp : get_buffer
test <- tcp : buffer
test -> test : assert buffer
@enduml
@startuml
Alice -> Bob: Authentication Request
Bob --> Alice: Authentication Response
Alice -> Bob: Another authentication Request
Alice <-- Bob: another authentication Response
@enduml
@startuml
skinparam backgroundColor #EEEBDC
skinparam sequenceArrowColor DeepSkyBlue
skinparam sequenceParticipantBorderColor DeepSkyBlue
skinparam sequenceActorBorderColor DeepSkyBlue
skinparam sequenceLifeLineBorderColor blue
actor User
participant "First Class" as A
participant "Second Class" as B
participant "Last Class" as C
User -> A: DoMoreWork
activate A
@enduml
@startuml
hide footbox
Foo -> Bar : "xx"
opt color=red
Foo -> Bar : "calculate"
end
Foo -> Bar : "yy"
@enduml
SEQUENCE DIAGRAM
5159517637574656
Generation of a PNG image illustratedPngServletPngServletUmlExtractorUmlExtractorDiagramResponseDiagramResponsePlantUML libraryPlantUML librarygetSource()getUmlSource()getOutputFormat()<<create>>sendDiagram()generateImage()
SEQUENCE DIAGRAM
5160583594770432
Generation of a PNG image illustratedPngServletPngServletUmlExtractorUmlExtractorDiagramResponseDiagramResponsePlantUML libraryPlantUML librarygetSource()getUmlSource()getOutputFormat()<<create>>sendDiagram()generateImage()
@startuml
Alice -> Bob: Authentication Request
Bob --> Alice: Authentication Response
Alice -> Bob: Another authentication Request
Alice <-- Bob: another authentication Response
@enduml
SEQUENCE DIAGRAM
5163399751139328
UserUserSystemSystemSelect a palette from Favorites or Generated Palettes screensDisplay Palette Details screen
SEQUENCE DIAGRAM
5167500102729728
UserUserSystemSystemSelect a palette from Favorites or Generated Palettes screensDisplay Palette Details screen
@startuml
skin BlueModern
title Transform Profiles CRUD (Create Read <s>Update</s> Delete)
actor User
participant "WebUI" as W
participant "Orchestra" as O
'participant "Storage" as S
'participant "Transform" as T
'participant "Publisher" as P
User -> W: Login
activate W
W -> O: GET /user/login (auth m@f.com:pass)
activate O
O -> O: Get user from MongoDB
O --> W: <b>OK 200</b> {"status"=200\n "value"={"_id": "<uuid>", "name": "Michaël Fischer", ...}}
deactivate O
W --> User: 'Successfull login'
deactivate W
User -> W: Profiles Tab
activate W
loop every N seconds (AJAX)
W -> O: GET /transform/profile (auth m@f.com:pass)
activate O
O -> O: Get profiles from MongoDB
O --> W: <b>OK 200</b> {"status"=200,\n "value"=[{"_id": "<uuid>", "encoder_name": "ffmpeg", ...}, ...]}
deactivate O
W --> User: << Show/update profiles list >>
end
deactivate W
User -> W: Add a profile (with add form)
activate W
W -> O: POST /transform/profile (auth m@f.com:pass)\n {"title": "HD 1080p", "description": "...", ...}
activate O
O -> O: Save profile to MongoDB
O --> W: <b>OK 200</b> {"status"=200,\n "value"={"_id": "<uuid_of_profile>", "title": "HD 1080p", ...}}
deactivate O
W --> User: << Flash info message\n'The transform profile "HD 1080p" has been added.' >>
deactivate W
User -> W: Remove a profile
activate W
W -> O: DELETE /transform/profile/id/<uuid_of_profile> (auth m@f.com:pass)
activate O
O -> O: Remove profile from MongoDB
O --> W: <b>OK 200</b> {"status"=200,\n "value"="The transform profile \\"YouTube SD\\" has been deleted."}
deactivate O
W --> User: << Flash info message\n'The transform profile "YouTube SD" has been deleted.' >>
deactivate W
@enduml
SEQUENCE DIAGRAM
5207439808921600
:Utilisateur:Utilisateur:DlgPrincipal:DlgPrincipal:DlgListeURLs:DlgListeURLsJFileChooserJFileChooserJOptionPaneJOptionPaneCtrlGetURLCtrlGetURLCtrlTestURLCtrlTestURLCtrlHistoryCtrlHistoryClick Sélectionner un dossiernew()Sélectionner dossierdossierClick vérifier les URLsFile[] filesSelectedgetUrlsFromFile(filesSelected[])Vector<URLs> tabURLfromLine()tabUrlalt[tabUrl.size() > 0]checkListURLs(tabUrl)Vector<URLs> tabUrlKO := checkURL()tabUrlKOalt[tabUrlKO.isEmpty()]showMessageDialog("Toutes les URLs sont valides.")showMessageDialog("Il y a "+tabUrlKO.size()+" URL(s) non valide(s).")new(tabUrlKO)showMessageDialog("Pas d'URL dans le dossier.")updateHistory(filesSelected[])
SEQUENCE DIAGRAM
5212174741929984
:Utilisateur:Utilisateur:DlgPrincipal:DlgPrincipal:DlgListeURLs:DlgListeURLsJFileChooserJFileChooserJOptionPaneJOptionPaneCtrlGetURLCtrlGetURLCtrlTestURLCtrlTestURLCtrlHistoryCtrlHistoryClick Sélectionner un dossiernew()Sélectionner dossierdossierClick vérifier les URLsFile[] filesSelectedgetUrlsFromFile(filesSelected[])Vector<URLs> tabURLfromLine()tabUrlalt[tabUrl.size() > 0]checkListURLs(tabUrl)Vector<URLs> tabUrlKO := checkURL()tabUrlKOalt[tabUrlKO.isEmpty()]showMessageDialog("Toutes les URLs sont valides.")showMessageDialog("Il y a "+tabUrlKO.size()+" URL(s) non valide(s).")new(tabUrlKO)showMessageDialog("Pas d'URL dans le dossier.")updateHistory(filesSelected[])
@startuml
actor user
box "h2o-zookeeper.jar"
participant water.zookeeper.h2odriver as driver
end box
box "h2o-zookeeper.jar (1)"
participant "water.zookeeper.h2oworker (1)" as worker1
participant "water.H2O (1)" as h2o1
end box
box "h2o-zookeeper.jar (2)"
participant "water.zookeeper.h2oworker (2)" as worker2
participant "water.H2O (2)" as h2o2
end box
box "zookeeper.jar"
database zookeeper
end box
autonumber
== User starts a new H2O cloud ==
user -> driver : User starts driver process
activate driver
note left
User specifies zkConnectionString: a.b.c.d:e
User specifies zkRoot: /zk/path/h2o-uuid
User specifies numNodes: 2
java -jar h2o-zookeeper.jar water.zookeeper.h2odriver
-zk a.b.c.d:e
-zkroot "/zk/path/h2o-uuid"
-nodes 2
-start
end note
== Establish root ZNode for this cloud ==
driver -> zookeeper : Driver creates zkRoot
note left
create("/zk/path/h2o-uuid", (PERSISTENT))
ZNode data: { "numNodes" : 2 }
User is responsible for providing
a unique cloud name (h2o-uuid).
end note
driver <- zookeeper : OK
driver -> zookeeper : Driver creates zkRoot/nodes
note left
create("/zk/path/h2o-uuid/nodes", (PERSISTENT))
end note
driver <- zookeeper : OK
user <- driver : OK
deactivate driver
== Start workers ==
user -> worker1 : Start H2O node 1
activate worker1
note left
java -jar h2o-zookeeper.jar water.zookeeper.h2oworker
-zk a.b.c.d:e
-zkroot "/zk/path/h2o-uuid"
-nodes 2
[plus other H2O options]
end note
worker1 -> h2o1 : Start H2O node 1
activate h2o1
worker1 <- h2o1 : H2O node 1 port chosen
worker1 -> zookeeper : Worker creates ZNode
note left
create("/zk/path/h2o-uuid/nodes/", (PERSISTENT, SEQUENCE))
ZNode data: { "ip" : "n1a.n1b.n1c.n1d", "port" : n1e, "pid" : pid1 }
end note
worker1 <- zookeeper : OK
user -> worker2 : Start H2O node 2
activate worker2
note left
java -jar h2o-zookeeper.jar water.zookeeper.h2oworker
-zk a.b.c.d:e
-zkroot "/zk/path/h2o-uuid"
-nodes 2
[plus other H2O options]
end note
worker2 -> h2o2 : Start H2O node 2
activate h2o2
worker2 <- h2o2 : H2O node 2 port chosen
worker2 -> zookeeper : Worker creates ZNode
note left
create("/zk/path/h2o-uuid/nodes/", (PERSISTENT, SEQUENCE))
ZNode data: { "ip" : "n2a.n2b.n2c.n2d", "port" : n2e, "pid" : pid2 }
end note
worker2 <- zookeeper : OK
== Poll for nodes started ==
worker1 -> zookeeper : Poll for all nodes started
note left
getChildren("/zk/path/h2o-uuid/nodes")
end note
worker1 <- zookeeper : OK
note right
"/zk/path/h2o-uuid/nodes/1"
{ "ip" : "n1a.n1b.n1c.n1d", "port" : n1e, "pid" : pid1 }
"/zk/path/h2o-uuid/nodes/2"
{ "ip" : "n2a.n2b.n2c.n2d", "port" : n2e, "pid" : pid2 }
end note
worker2 -> zookeeper : Poll for all nodes started
note left
getChildren("/zk/path/h2o-uuid/nodes")
end note
worker2 <- zookeeper : OK
note right
(Same as above)
end note
== H2O nodes request flatfile from workers ==
worker1 <- h2o1 : Request flatfile
worker1 <- h2o1 : Worker provides flatfile to H2O
worker2 <- h2o2 : Request flatfile
worker2 -> h2o2 : Worker provides flatfile to H2O
== H2O nodes find each other and notify workers ==
h2o1 -> h2o2 : H2O nodes form a cloud
h2o2 -> h2o1 : H2O nodes form a cloud
worker1 <- h2o1 : cloud size 2
worker2 <- h2o2 : cloud size 2
== Workers create a master (sentinal) ZNode (only one create succeeds) ==
worker1 -> zookeeper : Create cloud ready ZNode
note left
create("/zk/path/h2o-uuid/master", (PERSISTENT))
ZNode data: { "ip" : "n1a.n1b.n1c.n1d", "port" : n1e, "pid" : pid1 }
end note
worker1 <- zookeeper : OK
deactivate worker1
worker2 -> zookeeper : Create master ZNode (cloud ready)
note left
create("/zk/path/h2o-uuid/master", (PERSISTENT))
ZNode data: { "ip" : "n2a.n2b.n2c.n2d", "port" : n2e, "pid" : pid2 }
end note
worker2 <- zookeeper : KeeperException.NodeExists
note right
This is OK, exactly one node wins the race
end note
deactivate worker2
== User polls for cloud up ==
user -> driver : User polls for cloud up
activate driver
note left
java -jar h2o-zookeeper.jar water.zookeeper.h2odriver
-zk a.b.c.d:e
-zkroot "/zk/path/h2o-uuid"
-wait
end note
driver -> zookeeper : Poll for master node ip and port of the new H2O cloud
note left
getData("/zk/path/h2o-uuid/master")
end note
driver <- zookeeper : OK
note right
{ "ip" : "n1a.n1b.n1c.n1d", "port" : n1e, "pid" : pid1 }
end note
user <- driver: Master node ip, port
deactivate driver
== User interacts with H2O cloud ==
user -> h2o1 : Point browser to H2O Web UI
@enduml
SEQUENCE DIAGRAM
5253001895739392
Sequence diagram of Libera Tango Device Server objectstango_dbtango_dbLiberaBrilliancePlusLiberaBrilliancePlusLiberaClientLiberaClientLiberaAttrLiberaAttrLiberaSignalLiberaSignalSignalSignalinit_deviceget_device_propertyCreateloop[All attribute and signal nodes]AddScalarCreateAddSignalCreateConnectloop[All configured signals]InitializeOpenset_state(ON)operating in state ONpar[Attribute update thread]Readdata valueatribute pointer is directly updated[Signal reading thread]Readdata bufferchanges are kept in signal buffer[allways_executed_hook call]GetDatadata value arrays
SEQUENCE DIAGRAM
5253989201346560
Sequence diagram of Libera Tango Device Server objectstango_dbtango_dbLiberaBrilliancePlusLiberaBrilliancePlusLiberaClientLiberaClientLiberaAttrLiberaAttrLiberaSignalLiberaSignalSignalSignalinit_deviceget_device_propertyCreateloop[All attribute and signal nodes]AddScalarCreateAddSignalCreateConnectloop[All configured signals]InitializeOpenset_state(ON)operating in state ONpar[Attribute update thread]Readdata valueatribute pointer is directly updated[Signal reading thread]Readdata bufferchanges are kept in signal buffer[allways_executed_hook call]GetDatadata value arrays
@startuml
title Sequence diagram of Libera Tango Device Server objects
== init_device ==
tango_db <- LiberaBrilliancePlus : get_device_property
LiberaBrilliancePlus -> LiberaClient : Create
loop All attribute and signal nodes
LiberaBrilliancePlus -> LiberaClient : AddScalar
LiberaClient -> LiberaAttr : Create
LiberaBrilliancePlus -> LiberaClient : AddSignal
LiberaClient -> LiberaSignal : Create
end
LiberaBrilliancePlus -> LiberaClient : Connect
loop All configured signals
LiberaClient -> LiberaSignal : Initialize
LiberaSignal -> Signal : Open
end
LiberaBrilliancePlus <-- LiberaClient : set_state(ON)
== operating in state ON ==
par Attribute update thread
LiberaClient -> LiberaAttr : Read
LiberaClient <-- LiberaAttr : data value
note right : atribute pointer is directly updated
else Signal reading thread
LiberaSignal -> Signal : Read
LiberaSignal <-- Signal : data buffer
note left : changes are kept in signal buffer
else allways_executed_hook call
LiberaBrilliancePlus -> LiberaSignal : GetData
LiberaBrilliancePlus <-- LiberaSignal : data value arrays
end
@enduml