X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=spec%2Fpm-streaming%2Fo-ran-sc-i-pm-streaming-sequence.puml;h=dab94ad9c3eb71f9b9623f79d05d4931afd8df44;hb=refs%2Fchanges%2F11%2F12011%2F1;hp=21ab369adf5580f9de6a031dcefde0d08eeb52ec;hpb=f700afbede6966ce0c3d8b5dd459317e40ff7988;p=oam.git diff --git a/spec/pm-streaming/o-ran-sc-i-pm-streaming-sequence.puml b/spec/pm-streaming/o-ran-sc-i-pm-streaming-sequence.puml index 21ab369..dab94ad 100644 --- a/spec/pm-streaming/o-ran-sc-i-pm-streaming-sequence.puml +++ b/spec/pm-streaming/o-ran-sc-i-pm-streaming-sequence.puml @@ -5,44 +5,91 @@ ' https://creativecommons.org/licenses/by/4.0/deed.en @startuml o-ran-sc-i-pm-streaming-sequence -title Performance Data Streaming +title + Performance Measurement Data flows + stream based and 3GPP xml file based +end title + +' format autonumber 1 1 "[00]" hide unlinked +hide stereotype +skinparam backgroundColor #fefefe +skinparam roundcorner 15 + +skinparam participant { + BackgroundColor<< NONRTRIC >> green + FontColor<< NONRTRIC >> #eeeeee +} + +skinparam database { + BackgroundColor<< NONRTRIC >> green + FontColor<< NONRTRIC >> green +} +' end format + +' the sequence diagram +box "User Space" #LightBlue + actor "User" as user +end box box "App layer" #LightBlue - participant "rApp" as rApp + participant "rApp" as rApp end box box "NONRTRIC" #GoldenRod - participant "Information Coordinator Service (DME)" as dmeICS #Green + participant "Information Coordinator Service (DME)" as dmeICS << NONRTRIC >> end box + box "NONRTRIC RAN PM" #gold - participant "PM (File) Collector" as pmDFC #Green - participant "PM Data Converter" as pmConvert #Green - participant "PM Data Producer (Streamed)" as pmProducer #Green - participant "PM Data Influx Producer/Consumer" as pmInflux #Green - database "PM Datastore (S3)" as pmDb #Green - database "PM Datastore (InfluxDB)" as pmDbInflux #Green + participant "PM (File) Collector" as pmDFC << NONRTRIC >> + participant "PM Data Converter" as pmConvert << NONRTRIC >> + participant "PM Data Producer (Streamed)" as pmProducer << NONRTRIC >> + participant "PM Data Influx Producer/Consumer" as pmInflux << NONRTRIC >> end box -box "SMO OAM" #gold +box "SMO Common" #gold + participant "Topology Service" as topo participant "Message Router / Kafka" as mr - participant "OAM PM Coordination" as pmCoord - participant "PM (Stream) Collector" as pmCollectStream #LightGreen + database "PM Datastore (S3)" as pmDb << NONRTRIC >> + database "PM Datastore (InfluxDB)" as pmDbInflux << NONRTRIC >> +end box + +box "SMO OAM" #gold + participant "PM Coordination" as pmCoord + participant "PM Collector" as pmCollectStream participant "VES Collector" as ves participant "OAM Controller" as sdnr end box -box "Network Topology Simulation" #LightPink - participant "NetworkFunction\n2401 NTSims" as nf - participant "PM File\nCreator Sim" as pmFileCreator #Green +box "SMO O-Cloud" #gold + participant "Deployment Management Service" as dms end box -box "Simulation" #LightBlue - participant "PM Trigger App" as trigger +box "Network" #LightPink + participant "NetworkFunction\nNTSims" as nf + participant "PM File\nCreator Sim" as pmFileCreator << NONRTRIC >> +end box + +box "Simulation" #LightPink + database "Network PM" as netPm + participant "Data Generation" as simData + participant "UE Location Generation" as trigger end box == init == + +user -> topo : provide (RAN) topology +dms -> topo : RESTCONF GET ietf-network-topology +dms <- topo : ietf-network-topology +loop for all nodes in the topology + dms -> nf : Create simulated network function +end loop +simData -> topo : RESTCONF GET ietf-network-topology +simData <- topo : ietf-network-topology + +== onboarding == + nf -> ves : <> VES pnfRegistration ves -> mr : forward VES pnfRegistration mr -> sdnr : grep VES pnfRegistration @@ -51,6 +98,21 @@ sdnr -> nf : <> establish connection sdnr -> mr : Connected! mr -> pmCoord : Connection to NF established +== PM Data Generation == + +loop at least every second + trigger -> simData : send geo location for each UE + simData -> simData : UE perform cell selection + simData -> simData : Generator throughput data \nand RSRQ (PM values) + simData -> netPm : Store PM values per UE \nand timestamp + simData -> simData : aggregate data per nrDuCell + simData -> netPm : Store PM values per nrDuCell \nand timestamp + simData -> simData : aggregate data per O-RAN RU + simData -> netPm : Store PM values per O-RAN RU \nand timestamp + simData -> simData : aggregate data per O-RAN DU + simData -> netPm : Store PM values per O-RAN DU \nand timestamp +end loop + == Stream-based PM JOB Configuration == alt Unmanaged PM jobs on NFs rApp -> sdnr : configure PM data streaming subscription @@ -61,21 +123,22 @@ else Managed PM jobs on NFs pmCoord -> sdnr : PM Job Creation sdnr -> nf : <> PM Job Creation end -nf -> sdnr : PM Job Created\nincludes http target for stream establishment +nf -> sdnr : PM Job Created\nincludes http target for stream establishment sdnr -> pmCoord : PM Job Created == PM Data Streaming == nf -> pmCollectStream : <> establish Streaming Connection \nincludes mapping from streamId to jobId pmCollectStream -> nf : <> Connection Established returns ConnectionId (wss:url) -trigger -> sdnr : <> Trigger PM stream (Periodic?),\nwhen UEs are entering, leaving the cell -note left of nf : PM reporting happens continuously/periodicly, not triggered by specific events ? -loop while PM job is active in NF - sdnr -> nf : <> trigger - note left of nf : PM reporting happens continuously/periodicly. Not sure what is this trigger ? - nf -> pmCollectStream : <> report PM data via stream unit (wss:url) - pmCollectStream -> pmDb : store pm data (XML or GPB) - pmCollectStream -> mr : PM Data (raw) available + +loop while performance job is active + nf -> netPm : request data based on PM-Job + netPm -> nf : send data + nf -> nf : convert simulated PM Data into GPB + nf -> pmCollectStream : <> report PM data via stream unit (wss:url) + pmCollectStream -> pmCollectStream : convert GPB into 3GPP-xml format + pmCollectStream -> pmDb : store PM Data (3GPP-XMLformat) + pmCollectStream -> mr : PM Data (raw) available\n{jobId,sender,pm-database-query-command} end == File-based PM Job Configuration == @@ -88,56 +151,60 @@ else Managed PM jobs on NFs pmCoord -> pmCoord : analyze subscription pmCoord -> sdnr : PM Job Creation sdnr -> nf : <> PM Job Creation - nf -> sdnr : PM Job Created + nf -> sdnr : PM Job Created sdnr -> pmCoord : PM Job Created end == PM Data File Collection == loop while PM job is active in NF + nf -> netPm : request data based on PM-Job + netPm -> nf : send data + nf -> nf : store simulated PM Data as 3GPP-XML file nf -> ves : File-Ready - ves -> mr : File-Ready - mr -> pmDFC : File-Ready + ves -> mr : File-Ready + mr -> pmDFC : File-Ready pmDFC -> nf : <<(S)FTP/FTPS/SCP/TLS>> Collect/Transfer File - pmDFC -> pmDb : store pm data (XML) + pmDFC -> pmDb : store PM Data (3GPP-XML format) pmDFC -> mr : PM Data (raw) available end -== PM Data Convertion (Common) == +== PM Data Conversion (Common) == loop while PM Job is active in NF mr -> pmConvert : PM Data (raw) available - pmConvert -> pmDb : Collect raw (XML? GPB?) PM Data + pmConvert -> pmDb : Collect raw (3GPP-XML format) PM Data pmConvert -> pmConvert : Covert PM data to JSON - pmConvert -> pmDb : Store pm data (json) + pmConvert -> pmDb : Store PM Data (json) pmConvert -> mr : PM Data (json) available end -== DME Data Producers & Consumers (Common) == +' == DME Data Producers & Consumers (Common) == +' +' loop while PM Job is active in NF +' mr -> pmConvert : PM Data (raw) available +' pmConvert -> pmDb : Collect raw (3GPP-XML format) PM Data +' pmConvert -> pmConvert : Covert PM data to JSON +' pmConvert -> pmDb : Store PM Data (json) +' pmConvert -> mr : PM Data (json) available +'end -loop while PM Job is active in NF - mr -> pmConvert : PM Data (raw) available - pmConvert -> pmDb : Collect raw (XML? GPB?) PM Data - pmConvert -> pmConvert : Covert PM data to JSON - pmConvert -> pmDb : Store pm data (json) - pmConvert -> mr : PM Data (json) available -end == DME Data Producers & Consumers <>== loop while PM Job is active in NF opt RAN PM Data (R1-PM 'streamed ranpm' datatype) is streamed to rApp - note over pmProducer, dmeICS : Init RAN PM Data Producer registration with DME (DME Producer) + note over pmProducer, dmeICS : Init RAN PM Data Producer registration with DME (DME Producer) pmProducer -> dmeICS : Register data 'streamed ranpm' type (if not already registered) - pmProducer -> dmeICS : Register as 'streamed ranpm' producder + pmProducer -> dmeICS : Register as 'streamed ranpm' producer note over rApp, dmeICS : rApp creates 'streamed ranpm' subscription (DME Consumer) rApp -> dmeICS : Register data 'streamed ranpm' type (if not already registered) - rApp -> dmeICS : Create subscription/job for 'streamed ranpm' data + rApp -> dmeICS : Create subscription/job for 'streamed ranpm' data activate rApp note over rApp, pmProducer : DME coordinates between DME Producer/Consumer dmeICS -> pmProducer : Job/subscription created - includes job parameters loop while data available / continuous - pmProducer -> pmDb : retrieve appropriate pm data (json) + pmProducer -> pmDb : retrieve appropriate PM Data (json) pmProducer -[#Blue]> mr : data: (type : 'streamed ranpm') mr -[#Blue]> rApp: data : (type : 'streamed ranpm') opt wait for new data @@ -147,45 +214,44 @@ loop while PM Job is active in NF deactivate rApp end opt - opt RAN PM Data (R1-PM 'stored ranpm' datatype) is produced by influxDB producer - note over pmInflux, dmeICS : Init RAN PM Data Producer registration with DME (DME Producer) + note over pmInflux, dmeICS : Init RAN PM Data Producer registration with DME (DME Producer) pmInflux -> dmeICS : Register data 'stored ranpm' type (if not already registered) group #a0a0a090 TBC - pmInflux -> dmeICS : Register as 'stored ranpm' producder + pmInflux -> dmeICS : Register as 'stored ranpm' producer note over rApp, dmeICS : rApp creates 'stored ranpm' subscription (DME Consumer) rApp -> dmeICS : Register data 'stored ranpm' type (if not already registered) - rApp -> dmeICS : Create subscription/job for 'streamed ranpm' data + rApp -> dmeICS : Create subscription/job for 'streamed ranpm' data activate rApp end group note over rApp, pmProducer : DME coordinates between DME Producer/Consumer dmeICS -> pmProducer : Job/subscription created - includes job parameters - activate pmproducer + activate pmProducer loop while data available / continuous - pmInflux -> pmDb : retrieve appropriate pm data (json) - pmInflux -> pmDbInflux : store appropriate pm data (json) + pmInflux -> pmDb : retrieve appropriate PM Data (json) + pmInflux -> pmDbInflux : store appropriate PM Data (json) pmInflux -> mr : data available: (type : 'stored ranpm') opt wait for new data mr -> pmProducer : PM Data (json) available end end loop - deactivate pmproducer + deactivate pmProducer deactivate rApp end opt group #a0a0a090 TBC - ' Currently AIMLFMW does not act as a DME consumer to read the InfluxDB. It reads it direct + ' Currently AIMLFW does not act as a DME consumer to read the InfluxDB. It reads it direct ' According to the 'current' specs that is fine - AIMLFW is not an 'rApp' - ' Howeever, as the Disaggregated SMo work prgressed it will need to use DME. + ' However, as the Disaggregated SMo work progressed it will need to use DME. opt RAN PM Data (R1-PM 'stored ranpm' datatype) is consumed by rApp from influxDB producer group #a0a0a090 TBC note over rApp, dmeICS : rApp creates 'stored ranpm' subscription (DME Consumer) rApp -> dmeICS : Register data 'stored ranpm' type (if not already registered) - rApp -> dmeICS : Create subscription/job for 'streamed ranpm' data + rApp -> dmeICS : Create subscription/job for 'streamed ranpm' data activate rApp end group loop while data available / continuous - rApp -> pmDbInflux : retrieve appropriate pm data (json) + rApp -> pmDbInflux : retrieve appropriate PM Data (json) opt wait for new data mr -> rApp : data available: (type : 'stored ranpm') end @@ -197,14 +263,14 @@ loop while PM Job is active in NF end loop ' What happens when PM job on NF is removed? (And How?) -' Should DME job be automatically removed? +' draft: The SMO wont be informed about new measurements – no ves file ready or no pm-stream based on the PM job. +' The PM Job can be deactivated (admin-state to locked) or removed via NETCONF operation defined in 3GPP yang modules -> O1. -' End Diagram -' Format -right footer Copyright 2023 O-RAN-SC Projects NONRTRIC, SIM, OAM\lThis work is licensed under a Creative Commons Attribution 4.0\l International License.\lSPDX-License-Identifier: CC-BY-4.0\n2023-09-21 | o-ran-sc.org oam project | Thanks to PlantUML! +' Should DME job be automatically removed? +' draft: Here we should start developing an answer 😊 +' The DME job – does it depend on the PM job or does it control the PM job? + -skinparam backgroundColor #fefefe -'skinparam handwritten true -skinparam roundcorner 15 +right footer Copyright 2023 O-RAN-SC Projects NONRTRIC, SIM, OAM\lThis work is licensed under a Creative Commons Attribution 4.0\l International License.\lSPDX-License-Identifier: CC-BY-4.0\n2023-09-21 | o-ran-sc.org oam project | Thanks to PlantUML! @enduml