Martin Skorupski | 9ba5019 | 2023-09-22 10:37:26 +0200 | [diff] [blame] | 1 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 2 | ' Copyright 2023 O-RAN-SC Projects NONRTRIC, SIM, OAM |
Martin Skorupski | 9ba5019 | 2023-09-22 10:37:26 +0200 | [diff] [blame] | 3 | ' This work is licensed under a Creative Commons Attribution 4.0 International License. |
| 4 | ' SPDX-License-Identifier: CC-BY-4.0 |
| 5 | ' https://creativecommons.org/licenses/by/4.0/deed.en |
| 6 | |
| 7 | @startuml o-ran-sc-i-pm-streaming-sequence |
Martin Skorupski | 8797bdf | 2023-09-22 11:20:35 +0200 | [diff] [blame] | 8 | title |
| 9 | Performance Measurement Data flows |
| 10 | stream based and 3GPP xml file based |
| 11 | end title |
| 12 | |
| 13 | ' format |
Martin Skorupski | 9ba5019 | 2023-09-22 10:37:26 +0200 | [diff] [blame] | 14 | autonumber 1 1 "<b>[00]" |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 15 | hide unlinked |
Martin Skorupski | 8797bdf | 2023-09-22 11:20:35 +0200 | [diff] [blame] | 16 | hide stereotype |
| 17 | skinparam backgroundColor #fefefe |
| 18 | skinparam roundcorner 15 |
Martin Skorupski | 9ba5019 | 2023-09-22 10:37:26 +0200 | [diff] [blame] | 19 | |
Martin Skorupski | 8797bdf | 2023-09-22 11:20:35 +0200 | [diff] [blame] | 20 | skinparam participant { |
| 21 | BackgroundColor<< NONRTRIC >> green |
| 22 | FontColor<< NONRTRIC >> #eeeeee |
| 23 | } |
| 24 | |
| 25 | skinparam database { |
| 26 | BackgroundColor<< NONRTRIC >> green |
| 27 | FontColor<< NONRTRIC >> green |
| 28 | } |
| 29 | ' end format |
| 30 | |
| 31 | ' the sequence diagram |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 32 | box "User Space" #LightBlue |
| 33 | actor "User" as user |
| 34 | end box |
| 35 | |
Martin Skorupski | 9ba5019 | 2023-09-22 10:37:26 +0200 | [diff] [blame] | 36 | box "App layer" #LightBlue |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 37 | participant "rApp" as rApp |
Martin Skorupski | 9ba5019 | 2023-09-22 10:37:26 +0200 | [diff] [blame] | 38 | end box |
| 39 | |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 40 | box "NONRTRIC" #GoldenRod |
Martin Skorupski | 8797bdf | 2023-09-22 11:20:35 +0200 | [diff] [blame] | 41 | participant "Information Coordinator Service (DME)" as dmeICS << NONRTRIC >> |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 42 | end box |
Martin Skorupski | 8797bdf | 2023-09-22 11:20:35 +0200 | [diff] [blame] | 43 | |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 44 | box "NONRTRIC RAN PM" #gold |
Martin Skorupski | 8797bdf | 2023-09-22 11:20:35 +0200 | [diff] [blame] | 45 | participant "PM (File) Collector" as pmDFC << NONRTRIC >> |
| 46 | participant "PM Data Converter" as pmConvert << NONRTRIC >> |
| 47 | participant "PM Data Producer (Streamed)" as pmProducer << NONRTRIC >> |
| 48 | participant "PM Data Influx Producer/Consumer" as pmInflux << NONRTRIC >> |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 49 | end box |
| 50 | |
| 51 | box "SMO Common" #gold |
| 52 | participant "Topology Service" as topo |
| 53 | participant "Message Router / Kafka" as mr |
Martin Skorupski | 8797bdf | 2023-09-22 11:20:35 +0200 | [diff] [blame] | 54 | database "PM Datastore (S3)" as pmDb << NONRTRIC >> |
| 55 | database "PM Datastore (InfluxDB)" as pmDbInflux << NONRTRIC >> |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 56 | end box |
| 57 | |
Martin Skorupski | 9ba5019 | 2023-09-22 10:37:26 +0200 | [diff] [blame] | 58 | box "SMO OAM" #gold |
Martin Skorupski | 8797bdf | 2023-09-22 11:20:35 +0200 | [diff] [blame] | 59 | participant "PM Coordination" as pmCoord |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 60 | participant "PM Collector" as pmCollectStream |
Martin Skorupski | 9ba5019 | 2023-09-22 10:37:26 +0200 | [diff] [blame] | 61 | participant "VES Collector" as ves |
Martin Skorupski | 9ba5019 | 2023-09-22 10:37:26 +0200 | [diff] [blame] | 62 | participant "OAM Controller" as sdnr |
| 63 | end box |
| 64 | |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 65 | box "SMO O-Cloud" #gold |
| 66 | participant "Deployment Management Service" as dms |
| 67 | end box |
| 68 | |
| 69 | box "Network" #LightPink |
Martin Skorupski | 8797bdf | 2023-09-22 11:20:35 +0200 | [diff] [blame] | 70 | participant "NetworkFunction\nNTSims" as nf |
| 71 | participant "PM File\nCreator Sim" as pmFileCreator << NONRTRIC >> |
Martin Skorupski | 9ba5019 | 2023-09-22 10:37:26 +0200 | [diff] [blame] | 72 | end box |
| 73 | |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 74 | box "Simulation" #LightPink |
| 75 | database "Network PM" as netPm |
| 76 | participant "Data Generation" as simData |
| 77 | participant "UE Location Generation" as trigger |
Martin Skorupski | 9ba5019 | 2023-09-22 10:37:26 +0200 | [diff] [blame] | 78 | end box |
| 79 | |
| 80 | == init == |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 81 | |
| 82 | user -> topo : provide (RAN) topology |
| 83 | dms -> topo : RESTCONF GET ietf-network-topology |
| 84 | dms <- topo : ietf-network-topology |
| 85 | loop for all nodes in the topology |
| 86 | dms -> nf : Create simulated network function <O2> |
| 87 | end loop |
| 88 | simData -> topo : RESTCONF GET ietf-network-topology |
| 89 | simData <- topo : ietf-network-topology |
| 90 | |
| 91 | == onboarding == |
| 92 | |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 93 | nf -> ves : <<HTTP/TLS>> VES pnfRegistration <O1> |
| 94 | ves -> mr : forward VES pnfRegistration |
| 95 | mr -> sdnr : grep VES pnfRegistration |
| 96 | sdnr -> sdnr : create Mount Point |
| 97 | sdnr -> nf : <<NETCONF/TLS>> establish connection <O1-CM> |
| 98 | sdnr -> mr : Connected! |
| 99 | mr -> pmCoord : Connection to NF established |
Martin Skorupski | 9ba5019 | 2023-09-22 10:37:26 +0200 | [diff] [blame] | 100 | |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 101 | == PM Data Generation == |
| 102 | |
| 103 | loop at least every second |
| 104 | trigger -> simData : send geo location for each UE |
| 105 | simData -> simData : UE perform cell selection |
| 106 | simData -> simData : Generator throughput data \nand RSRQ (PM values) |
| 107 | simData -> netPm : Store PM values per UE \nand timestamp |
| 108 | simData -> simData : aggregate data per nrDuCell |
| 109 | simData -> netPm : Store PM values per nrDuCell \nand timestamp |
| 110 | simData -> simData : aggregate data per O-RAN RU |
| 111 | simData -> netPm : Store PM values per O-RAN RU \nand timestamp |
| 112 | simData -> simData : aggregate data per O-RAN DU |
| 113 | simData -> netPm : Store PM values per O-RAN DU \nand timestamp |
| 114 | end loop |
| 115 | |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 116 | == Stream-based PM JOB Configuration == |
| 117 | alt Unmanaged PM jobs on NFs |
| 118 | rApp -> sdnr : configure PM data streaming subscription <R1-OAM(tbc)> |
| 119 | sdnr -> nf : <<NETCONF/TLS>> PM Job Creation <O1-CM> |
| 120 | else Managed PM jobs on NFs |
| 121 | rApp -> pmCoord : configure PM data streaming subscription <R1-OAM(tbc)> |
| 122 | pmCoord -> pmCoord : analyze subscription |
| 123 | pmCoord -> sdnr : PM Job Creation |
| 124 | sdnr -> nf : <<NETCONF/TLS>> PM Job Creation <O1-CM> |
| 125 | end |
Martin Skorupski | 8797bdf | 2023-09-22 11:20:35 +0200 | [diff] [blame] | 126 | nf -> sdnr : PM Job Created\nincludes http target for stream establishment <O1-CM> |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 127 | sdnr -> pmCoord : PM Job Created |
Martin Skorupski | 9ba5019 | 2023-09-22 10:37:26 +0200 | [diff] [blame] | 128 | |
| 129 | == PM Data Streaming == |
| 130 | |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 131 | nf -> pmCollectStream : <<HTTP/TLS>> establish Streaming Connection \nincludes mapping from streamId to jobId <O1-PM> |
| 132 | pmCollectStream -> nf : <<HTTP/TLS>> Connection Established returns ConnectionId (wss:url) <O1-PM> |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 133 | |
| 134 | loop while performance job is active |
| 135 | nf -> netPm : request data based on PM-Job |
| 136 | netPm -> nf : send data |
| 137 | nf -> nf : convert simulated PM Data into GPB |
Martin Skorupski | 8797bdf | 2023-09-22 11:20:35 +0200 | [diff] [blame] | 138 | nf -> pmCollectStream : <<WebSocket>> report PM data via stream unit (wss:url) <O1-PM> |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 139 | pmCollectStream -> pmCollectStream : convert GPB into 3GPP-xml format |
| 140 | pmCollectStream -> pmDb : store PM Data (3GPP-XMLformat) |
| 141 | pmCollectStream -> mr : PM Data (raw) available\n{jobId,sender,pm-database-query-command} |
Martin Skorupski | 9ba5019 | 2023-09-22 10:37:26 +0200 | [diff] [blame] | 142 | end |
| 143 | |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 144 | == File-based PM Job Configuration == |
| 145 | |
| 146 | alt Unmanaged PM jobs on NFs |
| 147 | rApp -> sdnr : configure file-based PM data subscription <R1-OAM(tbc)> |
| 148 | sdnr -> nf : <<NETCONF/TLS>> PM Job Creation <O1-CM> |
| 149 | else Managed PM jobs on NFs |
| 150 | rApp -> pmCoord : configure file-based PM data subscription <R1-OAM(tbc)> |
| 151 | pmCoord -> pmCoord : analyze subscription |
| 152 | pmCoord -> sdnr : PM Job Creation |
| 153 | sdnr -> nf : <<NETCONF/TLS>> PM Job Creation <O1-CM> |
Martin Skorupski | 8797bdf | 2023-09-22 11:20:35 +0200 | [diff] [blame] | 154 | nf -> sdnr : PM Job Created <O1-CM> |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 155 | sdnr -> pmCoord : PM Job Created |
| 156 | end |
| 157 | |
| 158 | == PM Data File Collection == |
| 159 | |
| 160 | loop while PM job is active in NF |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 161 | nf -> netPm : request data based on PM-Job |
| 162 | netPm -> nf : send data |
| 163 | nf -> nf : store simulated PM Data as 3GPP-XML file |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 164 | nf -> ves : File-Ready <O1-PM> |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 165 | ves -> mr : File-Ready |
| 166 | mr -> pmDFC : File-Ready |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 167 | pmDFC -> nf : <<(S)FTP/FTPS/SCP/TLS>> Collect/Transfer File <O1-PM> |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 168 | pmDFC -> pmDb : store PM Data (3GPP-XML format) |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 169 | pmDFC -> mr : PM Data (raw) available |
| 170 | end |
| 171 | |
Martin Skorupski | 3bf6d6f | 2023-09-22 11:29:57 +0200 | [diff] [blame] | 172 | == PM Data Conversion (Common) == |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 173 | |
| 174 | loop while PM Job is active in NF |
| 175 | mr -> pmConvert : PM Data (raw) available |
Martin Skorupski | 8797bdf | 2023-09-22 11:20:35 +0200 | [diff] [blame] | 176 | pmConvert -> pmDb : Collect raw (3GPP-XML format) PM Data |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 177 | pmConvert -> pmConvert : Covert PM data to JSON |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 178 | pmConvert -> pmDb : Store PM Data (json) |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 179 | pmConvert -> mr : PM Data (json) available |
| 180 | end |
| 181 | |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 182 | ' == DME Data Producers & Consumers (Common) == |
| 183 | ' |
| 184 | ' loop while PM Job is active in NF |
| 185 | ' mr -> pmConvert : PM Data (raw) available |
| 186 | ' pmConvert -> pmDb : Collect raw (3GPP-XML format) PM Data |
| 187 | ' pmConvert -> pmConvert : Covert PM data to JSON |
| 188 | ' pmConvert -> pmDb : Store PM Data (json) |
| 189 | ' pmConvert -> mr : PM Data (json) available |
| 190 | 'end |
| 191 | |
| 192 | |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 193 | == DME Data Producers & Consumers <<R1 DME>>== |
| 194 | loop while PM Job is active in NF |
| 195 | |
| 196 | opt RAN PM Data (R1-PM 'streamed ranpm' datatype) is streamed to rApp |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 197 | note over pmProducer, dmeICS : Init RAN PM Data Producer registration with DME (DME Producer) |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 198 | pmProducer -> dmeICS : Register data 'streamed ranpm' type (if not already registered) |
Martin Skorupski | 3bf6d6f | 2023-09-22 11:29:57 +0200 | [diff] [blame] | 199 | pmProducer -> dmeICS : Register as 'streamed ranpm' producer |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 200 | note over rApp, dmeICS : rApp creates 'streamed ranpm' subscription (DME Consumer) |
| 201 | rApp -> dmeICS : Register data 'streamed ranpm' type (if not already registered) |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 202 | rApp -> dmeICS : Create subscription/job for 'streamed ranpm' data |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 203 | activate rApp |
| 204 | note over rApp, pmProducer : DME coordinates between DME Producer/Consumer |
| 205 | dmeICS -> pmProducer : Job/subscription created - includes job parameters |
| 206 | loop while data available / continuous |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 207 | pmProducer -> pmDb : retrieve appropriate PM Data (json) |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 208 | pmProducer -[#Blue]> mr : data: (type : 'streamed ranpm') |
| 209 | mr -[#Blue]> rApp: data : (type : 'streamed ranpm') |
| 210 | opt wait for new data |
| 211 | mr -> pmProducer : PM Data (json) available |
| 212 | end |
| 213 | end loop |
| 214 | deactivate rApp |
| 215 | end opt |
| 216 | |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 217 | opt RAN PM Data (R1-PM 'stored ranpm' datatype) is produced by influxDB producer |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 218 | note over pmInflux, dmeICS : Init RAN PM Data Producer registration with DME (DME Producer) |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 219 | pmInflux -> dmeICS : Register data 'stored ranpm' type (if not already registered) |
| 220 | group #a0a0a090 <color #red>TBC</color> |
Martin Skorupski | 3bf6d6f | 2023-09-22 11:29:57 +0200 | [diff] [blame] | 221 | pmInflux -> dmeICS : Register as 'stored ranpm' producer |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 222 | note over rApp, dmeICS : rApp creates 'stored ranpm' subscription (DME Consumer) |
| 223 | rApp -> dmeICS : Register data 'stored ranpm' type (if not already registered) |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 224 | rApp -> dmeICS : Create subscription/job for 'streamed ranpm' data |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 225 | activate rApp |
| 226 | end group |
| 227 | note over rApp, pmProducer : DME coordinates between DME Producer/Consumer |
| 228 | dmeICS -> pmProducer : Job/subscription created - includes job parameters |
Martin Skorupski | 8797bdf | 2023-09-22 11:20:35 +0200 | [diff] [blame] | 229 | activate pmProducer |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 230 | loop while data available / continuous |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 231 | pmInflux -> pmDb : retrieve appropriate PM Data (json) |
| 232 | pmInflux -> pmDbInflux : store appropriate PM Data (json) |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 233 | pmInflux -> mr : data available: (type : 'stored ranpm') |
| 234 | opt wait for new data |
| 235 | mr -> pmProducer : PM Data (json) available |
| 236 | end |
| 237 | end loop |
Martin Skorupski | 8797bdf | 2023-09-22 11:20:35 +0200 | [diff] [blame] | 238 | deactivate pmProducer |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 239 | deactivate rApp |
| 240 | end opt |
| 241 | |
| 242 | group #a0a0a090 <color #red>TBC</color> |
Martin Skorupski | 3bf6d6f | 2023-09-22 11:29:57 +0200 | [diff] [blame] | 243 | ' Currently AIMLFW does not act as a DME consumer to read the InfluxDB. It reads it direct |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 244 | ' According to the 'current' specs that is fine - AIMLFW is not an 'rApp' |
Martin Skorupski | 8797bdf | 2023-09-22 11:20:35 +0200 | [diff] [blame] | 245 | ' However, as the Disaggregated SMo work progressed it will need to use DME. |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 246 | opt RAN PM Data (R1-PM 'stored ranpm' datatype) is consumed by rApp from influxDB producer |
| 247 | group #a0a0a090 <color #red>TBC</color> |
| 248 | note over rApp, dmeICS : rApp creates 'stored ranpm' subscription (DME Consumer) |
| 249 | rApp -> dmeICS : Register data 'stored ranpm' type (if not already registered) |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 250 | rApp -> dmeICS : Create subscription/job for 'streamed ranpm' data |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 251 | activate rApp |
| 252 | end group |
| 253 | loop while data available / continuous |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 254 | rApp -> pmDbInflux : retrieve appropriate PM Data (json) |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 255 | opt wait for new data |
| 256 | mr -> rApp : data available: (type : 'stored ranpm') |
| 257 | end |
| 258 | end loop |
| 259 | deactivate rApp |
| 260 | end opt |
| 261 | end group |
| 262 | |
| 263 | end loop |
| 264 | |
| 265 | ' What happens when PM job on NF is removed? (And How?) |
Martin Skorupski | d94f1e1 | 2023-09-22 12:42:24 +0200 | [diff] [blame] | 266 | ' draft: The SMO wont be informed about new measurements – no ves file ready or no pm-stream based on the PM job. |
| 267 | ' The PM Job can be deactivated (admin-state to locked) or removed via NETCONF operation defined in 3GPP yang modules -> O1. |
| 268 | |
| 269 | ' Should DME job be automatically removed? |
| 270 | ' draft: Here we should start developing an answer 😊 |
| 271 | ' The DME job – does it depend on the PM job or does it control the PM job? |
| 272 | |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 273 | |
Martin Skorupski | f700afb | 2023-09-22 11:08:38 +0200 | [diff] [blame] | 274 | 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! |
Martin Skorupski | 9ba5019 | 2023-09-22 10:37:26 +0200 | [diff] [blame] | 275 | |
Martin Skorupski | 9ba5019 | 2023-09-22 10:37:26 +0200 | [diff] [blame] | 276 | @enduml |