| ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' |
| ' Copyright 2023 O-RAN-SC Projects NONRTRIC, SIM, OAM |
| ' This work is licensed under a Creative Commons Attribution 4.0 International License. |
| ' SPDX-License-Identifier: CC-BY-4.0 |
| ' https://creativecommons.org/licenses/by/4.0/deed.en |
| |
| @startuml o-ran-sc-i-pm-streaming-sequence |
| title |
| Performance Measurement Data flows |
| stream based and 3GPP xml file based |
| end title |
| |
| ' format |
| autonumber 1 1 "<b>[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 |
| end box |
| |
| box "NONRTRIC" #GoldenRod |
| participant "Information Coordinator Service (DME)" as dmeICS << NONRTRIC >> |
| end box |
| |
| box "NONRTRIC RAN PM" #gold |
| 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 Common" #gold |
| participant "Topology Service" as topo |
| participant "Message Router / Kafka" as mr |
| 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 "SMO O-Cloud" #gold |
| participant "Deployment Management Service" as dms |
| end box |
| |
| 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 <O2> |
| end loop |
| simData -> topo : RESTCONF GET ietf-network-topology |
| simData <- topo : ietf-network-topology |
| |
| == onboarding == |
| |
| nf -> ves : <<HTTP/TLS>> VES pnfRegistration <O1> |
| ves -> mr : forward VES pnfRegistration |
| mr -> sdnr : grep VES pnfRegistration |
| sdnr -> sdnr : create Mount Point |
| sdnr -> nf : <<NETCONF/TLS>> establish connection <O1-CM> |
| 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 <R1-OAM(tbc)> |
| sdnr -> nf : <<NETCONF/TLS>> PM Job Creation <O1-CM> |
| else Managed PM jobs on NFs |
| rApp -> pmCoord : configure PM data streaming subscription <R1-OAM(tbc)> |
| pmCoord -> pmCoord : analyze subscription |
| pmCoord -> sdnr : PM Job Creation |
| sdnr -> nf : <<NETCONF/TLS>> PM Job Creation <O1-CM> |
| end |
| nf -> sdnr : PM Job Created\nincludes http target for stream establishment <O1-CM> |
| sdnr -> pmCoord : PM Job Created |
| |
| == PM Data Streaming == |
| |
| nf -> pmCollectStream : <<HTTP/TLS>> establish Streaming Connection \nincludes mapping from streamId to jobId <O1-PM> |
| pmCollectStream -> nf : <<HTTP/TLS>> Connection Established returns ConnectionId (wss:url) <O1-PM> |
| |
| 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 : <<WebSocket>> report PM data via stream unit (wss:url) <O1-PM> |
| 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 == |
| |
| alt Unmanaged PM jobs on NFs |
| rApp -> sdnr : configure file-based PM data subscription <R1-OAM(tbc)> |
| sdnr -> nf : <<NETCONF/TLS>> PM Job Creation <O1-CM> |
| else Managed PM jobs on NFs |
| rApp -> pmCoord : configure file-based PM data subscription <R1-OAM(tbc)> |
| pmCoord -> pmCoord : analyze subscription |
| pmCoord -> sdnr : PM Job Creation |
| sdnr -> nf : <<NETCONF/TLS>> PM Job Creation <O1-CM> |
| nf -> sdnr : PM Job Created <O1-CM> |
| 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 <O1-PM> |
| ves -> mr : File-Ready |
| mr -> pmDFC : File-Ready |
| pmDFC -> nf : <<(S)FTP/FTPS/SCP/TLS>> Collect/Transfer File <O1-PM> |
| pmDFC -> pmDb : store PM Data (3GPP-XML format) |
| pmDFC -> mr : PM Data (raw) available |
| end |
| |
| == PM Data Conversion (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 |
| |
| ' == 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 |
| |
| |
| == DME Data Producers & Consumers <<R1 DME>>== |
| 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) |
| pmProducer -> dmeICS : Register data 'streamed ranpm' type (if not already registered) |
| 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 |
| 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 -[#Blue]> mr : data: (type : 'streamed ranpm') |
| mr -[#Blue]> rApp: data : (type : 'streamed ranpm') |
| opt wait for new data |
| mr -> pmProducer : PM Data (json) available |
| end |
| end loop |
| 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) |
| pmInflux -> dmeICS : Register data 'stored ranpm' type (if not already registered) |
| group #a0a0a090 <color #red>TBC</color> |
| 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 |
| activate rApp |
| end group |
| note over rApp, pmProducer : DME coordinates between DME Producer/Consumer |
| dmeICS -> pmProducer : Job/subscription created - includes job parameters |
| activate pmProducer |
| loop while data available / continuous |
| 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 rApp |
| end opt |
| |
| group #a0a0a090 <color #red>TBC</color> |
| ' 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' |
| ' 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 <color #red>TBC</color> |
| 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 |
| activate rApp |
| end group |
| loop while data available / continuous |
| rApp -> pmDbInflux : retrieve appropriate PM Data (json) |
| opt wait for new data |
| mr -> rApp : data available: (type : 'stored ranpm') |
| end |
| end loop |
| deactivate rApp |
| end opt |
| end group |
| |
| end loop |
| |
| ' What happens when PM job on NF is removed? (And How?) |
| ' 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. |
| |
| ' 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? |
| |
| |
| 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 |