DCM → NCMP
Table of Contents |
---|
References
Jira server ONAP Jira columnIds issuekey,summary,issuetype,created,updated,duedate,assignee,reporter,priority,status,resolution columns key,summary,type,created,updated,due,assignee,reporter,priority,status,resolution serverId 425b2b0a-557c-3c0c-b515-579789cceedb key CPS-2155
...
Open Discussion
# |
---|
Issue | Notes |
---|
Issues & Decisions
Decision |
---|
1 |
dataaccepttype
Do we need to consider this parameter in our NCMP internal Java interface?dataaccepttype. From the client application
The Controller will validate and set the Default as necessary kieran mccarthy Sourabh Sourabh Kolawole Adebisi-Adeolokun Toine Siebelink
datacontenttype
Do we need to consider this parameter in our NCMP internal Java interface?NCMP should maintain what content type as received and not modify kieran mccarthy Sourabh Sourabh Kolawole Adebisi-Adeolokun Toine Siebelink
attributes
This has plural but all examples contain a single String, why?
kieran mccarthy & Rafael to come back with a 'definition' and 'example
Kolawole Adebisi-Adeolokun to follow up with stakeholders on decision by 19/03/2024
The study mentions 'fields
and attributes
". None of the examples use 'fields
'. We can see only 'value'
Objects (in the write use cases)
kieran mccarthy & Rafael to come back with a 'definition' and 'example
Read and Write data jobs are 2 deff. objects.
Kolawole Adebisi-Adeolokun to follow up with stakeholders on decision by 19/03/2024
Combine all java api parameters into 1 parameter object?
Team
follow common practice and have a few parameters ie. dataJobId is NOT part of the client request but generated in DCM so it seems logical to keep this separates
Confirm that validation is the responsibility of the REST?
Yes, the rest controller will do input validation. via email 26/03/2024 Csaba Kocsis
Is Status likely to change in the future? Considering using string for flexibility.
Java interfaces shall be 'strings' Csaba Kocsis
Kolawole Adebisi-Adeolokun
Is ScopeType likely to change in the future? Don't want to use an enum if change is likely
Java interfaces shall be 'strings Csaba Kocsis Kolawole Adebisi-Adeolokun
Can one request contain both read and write operations?
Writes and reads will not mix. But different writes operations can mix, like update or create. via email 26/03/2024 Csaba Kocsis
Was there a decision made on whether write requests were using kafka or is there any discussion ongoing?
Retrieving the results for the write is done through HTTP synchronously.
name of privateProperties (CMHandle private properties for the alternateID in the path.)
Agreed to use "cmHandleProperties" Csaba Kocsis Kolawole Adebisi-Adeolokun
Data Structures
Proposed Method signature
Code Block | ||||
---|---|---|---|---|
| ||||
void processReadDataJob(String dataAcceptType, String dataContentType, String dataJobId, List<ReadOperation> readOperations)
void processWriteDataJob(String dataAcceptType, String dataContentType, String dataJobId, List<WriteOperation> writeOperations, Map<String,String> metadata) |
Notes
- The order of Operations is important and needs to be maintained hence the use of 'List'
- The output is 'void' for the scope in this user story, it will be defined later
dataaccepttype
anddatacontenttype
might be needed too, see issue #1 and #2. If required we could combine them to reduce the number of parameter in an object likeRestProtocolParameters
Proposed openapi.yaml
View file | ||||
---|---|---|---|---|
|
Datajob read request
...
destination
...
The destination of the results. ( e.g. S3 Bucket)
...
Query
...
string
...
N
...
dataaccepttype
...
Define the data response accept type. Passible values:
· application/vnd.3gpp.object-tree-hierarchical+json (default)
· application/vnd.3gpp.object-tree-flat+json
...
request body
...
enum
...
N
...
datacontenttype
...
Define the data request content type. Passible values:
· application/3gpp-json-patch+json (default)
...
request body
...
enum
...
N
...
data
...
List of operations to be executed.
...
request body
...
List of 3gppReadOperation
...
Y
3gppReadOperation
...
It is a unique identifier of a managed object (MO) on a network element.
Defines the resource on which operation is executed. Typically could be Fully Distinguished Name (FDN).
...
Describes the operation to execute. The value can be: "read"
...
Unique identifier of the operation within the request
...
This parameter specifies the attributes of the scoped resources that are returned.
...
This parameter specifies the attribute fields of the scoped resources that are returned.
This should be used if an attribute is a struct and only a subset of its fields should be returned.
...
The parameter is used to filter the scoped Managed Objects. Only Managed Objects passing the filter criteria will be fetched.
...
ScopeType selects MOs depending on relationships with Base Managed Object.
...
Only used when the scope type is BASE_NTH_LEVEL
...
MVP (Minimum Viable Product) for DCM |
|
| |
2 | DataJob Read v Write prioritization | Write should be prioritized over read |
|
3 | Use of '/ ' causes some issues | kieran mccarthy Csaba Kocsis to review this impact on querying of FDN |
|
4 | Prioritize CPS-2009 Update remaining existing/legacy NCMP APIs to support alternate Id (FDN) - Developer Wiki - Confluence (onap.org) - over Read. | New Epic requested for DataJob Read sperate this from 1964. Expected even earlier than q3 Agreed to move higher on R14 - #17 |
|
Issues & Decisions
Issue | Notes | Decision | |
---|---|---|---|
1 | dataaccepttype Do we need to consider this parameter in our NCMP internal Java interface? | The controller should accept/reject dataaccepttype. From the client application | The Controller will validate and set the Default as necessary kieran mccarthy Sourabh Sourabh Kolawole Adebisi-Adeolokun Toine Siebelink |
2 | datacontenttype Do we need to consider this parameter in our NCMP internal Java interface? | NCMP should maintain the content type as received and not modify datacontenttype. | NCMP should maintain what content type as received and not modify kieran mccarthy Sourabh Sourabh Kolawole Adebisi-Adeolokun Toine Siebelink |
3 |
| kieran mccarthy & Rafael to come back with a 'definition' and 'example | Kolawole Adebisi-Adeolokun to follow up with stakeholders on decision by 19/03/2024 |
4 | The study mentions ' | kieran mccarthy & Rafael to come back with a 'definition' and 'example | Read and Write data jobs are 2 deff. objects. Kolawole Adebisi-Adeolokun to follow up with stakeholders on decision by 19/03/2024 |
5 | Combine all java api parameters into 1 parameter object? | There is a limit (sonar quality check) of 7 parameter max for a method | Team |
6 | Confirm that validation is the responsibility of the REST? | Yes, the rest controller will do input validation. via email 26/03/2024 Csaba Kocsis | |
7 | Is Status likely to change in the future? Considering using string for flexibility. | Java interfaces shall be 'strings' Csaba Kocsis | |
8 | Is ScopeType likely to change in the future? Don't want to use an enum if change is likely | Java interfaces shall be 'strings Csaba Kocsis Kolawole Adebisi-Adeolokun | |
9 | Can one request contain both read and write operations? | Writes and reads will not mix. But different writes operations can mix, like update or create. via email 26/03/2024 Csaba Kocsis | |
10 | Was there a decision made on whether write requests were using kafka or is there any discussion ongoing? | Retrieving the results for the write is done through HTTP synchronously. | |
11 | name of privateProperties (CMHandle private properties for the alternateID in the path.) | Can keep this var name as "cmHandleProperties" for consistency? | Agreed to use "cmHandleProperties" Csaba Kocsis Kolawole Adebisi-Adeolokun |
12 | Non mandatory fields | moduleSetTag is not mandatory privateProperties is not mandatory | |
13 | REST endpoints | Separate endpoints required for read and write |
Data Structures
Proposed Method signature
Code Block | ||||
---|---|---|---|---|
| ||||
void processReadDataJob(String dataAcceptType, String dataContentType, String dataJobId, List<ReadOperation> readOperations)
void processWriteDataJob(String dataAcceptType, String dataContentType, String dataJobId, List<WriteOperation> writeOperations, Map<String,String> metadata) |
Notes
- The order of Operations is important and needs to be maintained hence the use of 'List'
- The output is 'void' for the scope in this user story, it will be defined later
dataaccepttype
anddatacontenttype
might be needed too, see issue #1 and #2. If required we could combine them to reduce the number of parameter in an object likeRestProtocolParameters
Datajob read request
Name | Description | Location | Type | Mandatory |
---|---|---|---|---|
destination | The destination of the results. ( e.g. S3 Bucket) | Query | string | N |
dataaccepttype | Define the data response accept type. Passible values: · application/vnd.3gpp.object-tree-hierarchical+json (default) · application/vnd.3gpp.object-tree-flat+json | request body | enum | N |
datacontenttype | Define the data request content |
Datajob write request
Name | Description | Location | Type | Mandatory | ||||
---|---|---|---|---|---|---|---|---|
destination | The destination of the results. ( e.g. S3 Bucket) | Query | string | N | ||||
dataaccepttype | Define the data response accept type. Passible values: · application/vnd.3gpp.object-treejson-hierarchicalpatch+json (default) · application/vnd.3gpp.object-tree-flat+json | request body | enum | Ndatacontenttype | ||||
Define the data request content type. Passible values: · application/3gpp-json-patch+json (default) | request body | enum | N | data | List of operations to be executed. | request body | List of 3gppPatchOperation3gppReadOperation | Y |
3gppPatchOperation3gppReadOperation
Name | Description | Type | Mandatory |
---|---|---|---|
path | It is a unique identifier of a managed object (MO) on a network element. | String | Y |
op | Describes the operation to execute. The value can be: "add": creates a new MO with the id and attributes given in the value | String | Y |
operationId | Unique identifier of the operation within the request | Integer | N | value | Object | N |
Resource
...
Identifier of the resource object
...
Attributes object whose members are the class attributes and values. The object contains key/value map where:
- key is the attribute name
- value is the attribute value
...
ActionParameters
...
The input of the action. Key value pairs.
...
REST Response from DCM
Name | Description | Type | Mandatory |
jobId | The id of the data job | string | Y |
status | The status of the jobid | enum: [ NOT_STARTED, RUNNING, FINSHED, FAILED, PARTIALLY_FAILED, CANCELLING, CANCELLED ] | Y |
statusuri | Status uri for the jobid. Example: {apiRoot}/ranoam/cm/v1/dataJob/{jobId} | uri | Y |
resultsuri | Result uri for the jobid. Example: {apiRoot}/s3-bucket/{bucketId} | uri | Y |
Data SubJob create (NCMP → DMI)
This is a mirror of the Datajob read/write request with the added details needed for the DMI plugins. Below you can see the changes for the READ but the same changes are applicable for the WRITE too.
Method: POST
Path: /dmi/v1/dataJob/{requestId}
DMI Data SubJob read request
...
destination
...
The destination of the results. ( e.g. S3 Bucket)
...
Query
...
string
...
N
...
dataaccepttype
...
Define the data response accept type. Passible values:
· application/vnd.3gpp.object-tree-hierarchical+json (default)
· application/vnd.3gpp.object-tree-flat+json
...
request body
...
enum
...
N
...
datacontenttype
...
Define the data request content type. Passible values:
· application/3gpp-json-patch+json (default)
...
request body
...
enum
...
N
...
dataProducerId
...
ID of the producer registered by DMI for the alernateIDs in the operations in this request.
...
request body
...
String
...
Y
...
requestId
...
Identifier for the overall Datajob
...
Path
...
String
...
Y
...
data
...
List of operations to be executed.
...
request body
...
List of DMI3gppReadOperation
...
Y
read" | String | Y | |
operationId | Unique identifier of the operation within the request | Integer | N |
attributes | This parameter specifies the attributes of the scoped resources that are returned. | List of String | N |
fields | This parameter specifies the attribute fields of the scoped resources that are returned. This should be used if an attribute is a struct and only a subset of its fields should be returned. | List of String | N |
filter | The parameter is used to filter the scoped Managed Objects. Only Managed Objects passing the filter criteria will be fetched. | String | N |
scopeType | ScopeType selects MOs depending on relationships with Base Managed Object. | enum[BASE_ONLY, BASE_ALL, BASE_NTH_LEVEL, BASE_SUBTREE] | N |
scopeLevel | Only used when the scope type is BASE_NTH_LEVEL | Integer | N |
Datajob write request
Name | Description | Location | Type | Mandatory |
---|---|---|---|---|
destination | The destination of the results. ( e.g. S3 Bucket) | Query | string | N |
dataaccepttype | Define the data response accept type. Passible values: · application/vnd.3gpp.object-tree-hierarchical+json (default) · application/vnd.3gpp.object-tree-flat+json | request body | enum | N |
datacontenttype | Define the data request content type. Passible values: · application/3gpp-json-patch+json (default) | request body | enum | N |
data | List of operations to be executed. | request body | List of 3gppPatchOperation | Y |
3gppPatchOperation
Name | Description | Type | Mandatory |
---|---|---|---|
path | It is a unique identifier of a managed object (MO) on a network element. | String | Y |
op | Describes the operation to execute. The value can be: "add": creates a new MO with the id and attributes given in the value | String | Y |
operationId | Unique identifier of the operation within the request | Integer | N |
value | NA if op == remove Resource if op == add Object if op == replace ActionParameters if op == action | Object | N |
Resource
DMI3gppReadOperation
Name | Description | Type | Mandatory |
---|---|---|---|
path | It is a unique identifier of a managed object (MO) on a network element. | String | Y |
op | Describes the operation to execute. The value can be: "read" | String | Y |
operationId | Unique identifier of the operation within the request | Integer | N |
attributes | This parameter specifies the attributes of the scoped resources that are returned. | List of String | N |
fields | This parameter specifies the attribute fields of the scoped resources that are returned. This should be used if an attribute is a struct and only a subset of its fields should be returned. | List of String | N |
filter | The parameter is used to filter the scoped Managed Objects. Only Managed Objects passing the filter criteria will be fetched. | List of String | N | scopeType | enum[BASE_ONLY, BASE_ALL, BASE_NTH_LEVEL, BASE_SUBTREE] | N |
scopeLevel | Only used when the scope type is BASE_NTH_LEVEL | Integer | N |
moduleSetTag | Module set identifier | String | Y |
privateProperties | CMHandle private properties for the alternateID in the path. | Map | Y |
Response
Status code: 200 - OK
...
Data subjob status check (NCMP → DMI)
Request:
Method: GET
Path: /dmi/v1/dataJob/{requestId}/dataProducerJob/{dataProducerJobId}/status
...
dataProducerId
...
ID of the producer registered by DMI for the alernateIDs in the operations in this request.
...
Query
...
String
...
Y
...
requestId
...
Identifier for the overall Datajob
...
Path
...
String
...
Y
...
dataProducerJobId
...
Identifier of the job created by the data producer.
...
Path
...
String
...
Y
Response:
Status code: 200 - OK
...
status
...
Y
Data subjob retrieve result (NCMP → DMI)
Request:
Method: GET
Path: /dmi/v1/dataJob/{requestId}/dataProducerJob/{dataProducerJobId}/result
Parameters:
...
dataProducerId
...
ID of the producer registered by DMI for the alernateIDs in the operations in this request.
...
Query
...
String
...
Y
...
requestId
...
Identifier for the overall Datajob
...
Path
...
String
...
Y
...
dataProducerJobId
...
Identifier of the job created by the data producer.
...
Path
...
String
...
Y
...
destination
...
The destination of the results: Kafka topic name or s3 bucket name. This shall be put into the Kafka message headers returned to NCMP
...
Query
...
String
...
Y
id | Identifier of the resource object | String | N |
attributes | Attributes object whose members are the class attributes and values. The object contains key/value map where:
| Object | N |
ActionParameters
Name | Description | Type | Mandatory |
---|---|---|---|
input | The input of the action. Key value pairs. | Object | N |
REST Response from DCM
Name | Description | Type | Mandatory |
jobId | The id of the data job | string | Y |
status | The status of the jobid | enum: [ NOT_STARTED, RUNNING, FINSHED, FAILED, PARTIALLY_FAILED, CANCELLING, CANCELLED ] | Y |
statusuri | Status uri for the jobid. Example: {apiRoot}/ranoam/cm/v1/dataJob/{jobId} | uri | Y |
resultsuri | Result uri for the jobid. Example: {apiRoot}/s3-bucket/{bucketId} | uri | Y |
Examples from DCM Study
DataJob Read request (rAPP -> DCM)
JSON Viewer | ||||
---|---|---|---|---|
| ||||
{
"dataaccepttype": "application/vnd.3gpp.object-tree-hierarchical+json",
"datacontenttype": "application/3gpp-json-patch+json",
"data": [
{
"op": "read",
"operationId": 1,
"path": "SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003/GNBCUCPFunction=2",
"attributes": "userLabel",
"scope": {
"scopeType" : "BASE_ONLY"
}
},
{
"op": "read",
"operationId": 2,
"path": "SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR01gNodeBRadio00001/ManagedElement=NR01gNodeBRadio00001/GNBDUFunction=1",
"filter": "NRCellDU/attributes/administrativeState==LOCKED"
},
{
"op": "read",
"operationId": 3,
"path": "SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003/GNBCUCPFunction=1",
"attributes ": "cellId"
}]
} |
Datajob Write request (rAPP -> DCM)
JSON Viewer | ||||
---|---|---|---|---|
| ||||
{
"dataaccepttype": "application/vnd.3gpp.object-tree-hierarchical+json",
"datacontenttype": "application/3gpp-json-patch+json",
"data": [
{
"op": "add",
"path": "SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003/GNBCUCPFunction=1/EUtraNetwork=1/EUtranFrequency=12",
"value": {
"id": "12",
"attributes": {
"userLabel": "label12",
"arfcnValueEUtranDl": "12"
}
}
},
{
"op": "add" |
Response:
WRITE
Status Code: 200 - Ok
Data part of the message
READ
Status Code: 200 - Ok
...
resulturi
...
internal ncmp topic name
...
response body
...
String
...
Y
Examples from DCM Study
DataJob Read request (rAPP -> DCM)
JSON Viewer | ||||
---|---|---|---|---|
| ||||
{ "dataaccepttype": "application/vnd.3gpp.object-tree-hierarchical+json", "datacontenttype": "application/3gpp-json-patch+json", "data": [ { "op": "read", "operationId": 1, "path": "SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003/GNBCUCPFunction=2", "attributes": "userLabel", "scope": { "scopeType" : "BASE_ONLY" } }, { "op": "read", "operationId": 2, "path": "SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR01gNodeBRadio00001/ManagedElement=NR01gNodeBRadio00001/GNBDUFunction=1", "filter": "NRCellDU/attributes/administrativeState==LOCKED" }, { "op": "read", "operationId": 3, "path": "SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003/GNBCUCPFunction=1", /EUtraNetwork=1/EUtranFrequency=11", "attributes value": "cellId"{ }] } |
Datajob Write request (rAPP -> DCM)
JSON Viewer | ||||
---|---|---|---|---|
| ||||
{ "dataaccepttypeid": "application/vnd.3gpp.object-tree-hierarchical+json11", "datacontenttype "attributes": "application/3gpp-json-patch+json",{ "data": [ "userLabel": "label11" } } }, { "op": "addreplace", "path": "SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003/GNBCUCPFunction=1/EUtraNetwork=1/EUtranFrequency=121#/attributes/userLabel", "value": { "label1" }, { "idop": "12remove", "attributes": {"path": "SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003/GNBCUCPFunction=1/EUtraNetwork=1/EUtranFrequency=13" }, { "userLabelop": "label12action", "arfcnValueEUtranDl""path": "12" } } }, { SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003", "opvalue": "addsync", "path": "SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003/GNBCUCPFunction=1/EUtraNetwork=1/EUtranFrequency=11", "value": { "id": "11", "attributes": { "userLabel": "label11" } } }, { "op": "replace", "path": "SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003/GNBCUCPFunction=1/EUtraNetwork=1/EUtranFrequency=1#/attributes/userLabel", "value": "label1" }, { "op": "remove", "path": "SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003/GNBCUCPFunction=1/EUtraNetwork=1/EUtranFrequency=13" }, { "op": "action", "path": "SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003", "value": "sync" } ] } |
Proposed JIRAs
}
]
} |
Resolve Data Job Operation Path Algorithm
requirement: find the cm handle(id) with the longest match between alternatId and the the input path
Table 1: Registered Cm Handles and their Alternate IDs
CmHandleId | AlternateId | Note |
---|---|---|
ch-1 | /SubNetwork=Europe/SubNetwork=Ireland | Represents a group of radio nodes |
ch-2 | /SubNetwork=Europe/SubNetwork=Ireland/SubNetwork=WestMeath | Represents a group of radio nodes |
ch-3 | /SubNetwork=Europe/SubNetwork=Ireland/SubNetwork=WestMeath/ManagedElement=Athlone01 | Single radio node |
ch-4 | /SubNetwork=Europe/SubNetwork=Ireland/SubNetwork=WestMeath/ManagedElement=Athlone02 | Single radio node |
ch-5 | /SubNetwork=Europe/SubNetwork=Ireland/SubNetwork=LongFord | Represent a group of radio nodes |
ch-6 | /SubNetwork=Europe/SubNetwork=Ireland/SubNetwork=LongFord/ManagedElement=Ballymahon01 | Single radio node |
ch-7 | /SubNetwork=Europe/SubNetwork=Ireland/SubNetwork=LongFord/ManagedElement=Ballymahon02 | Single radio node |
The algorithm knows (3GPP) Path element are separated by / . Pseudo code:
- targetCandidate = complete path
- cmHandleId = InventoryPersistenceImpl#getCmHandleDataNodeByAlternateId(targetCandidate)
- if found: EXIT MATCH
- if NOT targetCandidate.CONTAINS('/') : EXIT WITH NO MATCH
- targetCandidate = targetCandidate.SUBSTRING(0,targetCandidate,INDEXOF('/')-1)
- repeat step 2 etc.
Table 2: Sample match results
Operation path (matching part in bold) | matching cm handle | (DMI) resource identifier | lookup attempts | Note |
---|---|---|---|---|
/SubNetwork=Europe/SubNetwork=Ireland/SubNetwork=WestMeath/ManagedElement=Athlone01/Function=X/Cell=A123 | ch-3 | /Function=X/Cell=A123 | 3 | |
/SubNetwork=Europe/SubNetwork=Ireland/SubNetwork=WestMeath | ch-2 | / | 1 | This is an operation on a group of radio nodes |
/SubNetwork=Europe/SubNetwork=Ireland/SubNetwork=WestMeath/ManagedElement=Mullingar01/Function=X/Cell=A123 | ch-2 | /ManagedElement=Mullingar01/Function=X/Cell=A123 | 4 | This is probably unintended but the system wil try to execute it anyhow but in the southbound system no matches wil be found |
/SubNetwork=Europe/SubNetwork=Belgium | No Match | 2 | ||
/SubNetwork=Europe/SubNetwork=Belgium/SubNetwork=Brabant/ManagedElement=Antwerpen01/Function=X/Cell-A123 | No Match | 7 |
Performance Considerations
- For successful matches the performance (number of lookups) wil depend on the number of element under the last subnetwork (the level of subnetworks wil NOT impact performance of positive matches)
- For failed match attempts the performance will depend on the total number of elements including the level of subnetworks
Realistic FDN Examples
Example | URI FDN |
---|---|
4G Cell Relation |
|
5G Cell Relation |
|
Component
Description
JIRA
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|