DCM → NCMP
Table of Contents |
---|
References
...
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
...
- 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 DMI REST Interface & Forwarded DMI Java Request Data Structure from NCMP
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
openapi: 3.0.3
info:
description: Support datajobs through one or more subjob for each DMI and Data Producer
Identifier combination
title: NCMP Data Subjob API
version: 1.0.0
servers:
- url: /dmi
tags:
- description: DMI plugin rest apis
name: dmi-datajob
paths:
/v1/dataJob/{requestId}:
post:
description: Create a read request
operationId: createReadRequest
parameters:
- description: Identifier for the overall Datajob
explode: false
in: path
name: requestId
required: true
schema:
example: some-identifier
type: string
style: simple
requestBody:
content:
application/3gpp-json-patch+json:
schema:
$ref: '#/components/schemas/SubjobRequest'
description: Operation body
responses:
"200":
content:
application/json:
schema:
$ref: '#/components/schemas/createReadRequest_200_response'
description: Response for subjob
tags:
- dmi-datajob
components:
parameters:
requestIdInPath:
description: Identifier for the overall Datajob
explode: false
in: path
name: requestId
required: true
schema:
example: some-identifier
type: string
style: simple
schemas:
SubjobRequest:
properties:
dataAcceptType:
description: Defines the data response accept type
example: application/vnd.3gpp.object-tree-hierarchical+json
type: string
dataContentType:
description: Defines the data request content type
example: application/3gpp-json-patch+json
type: string
dataProducerId:
description: ID of the producer registered by DMI for the alternateIds in
the operations in this request
example: my-data-producer-identifier
type: string
data:
$ref: '#/components/schemas/SubjobRequest_data'
required:
- data
- dataProducerId
type: object
ReadOperation:
example:
op: read
operationId: 1
path: SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003/GNBCUCPFunction=2
attributes: userLabel
scope:
scopeTyp: BASE_ONLY
items:
$ref: '#/components/schemas/ReadOperation_inner'
type: array
WriteOperation:
example:
op: add
path: SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003/GNBCUCPFunction=1/EUtraNetwork=1/EUtranFrequency=12
value:
id: 12
attributes:
userLabel: label12
items:
$ref: '#/components/schemas/WriteOperation_inner'
type: array
CmHandleProperties:
type: object
Resource:
properties:
id:
description: Identifier of the resource object
example: resource-identifier
type: string
attributes:
additionalProperties:
example: "userLabel: label11"
type: string
description: Key value map representing the objects class attributes and
values
type: object
type: object
ActionParameters:
additionalProperties:
type: string
description: The input of the action in the form of key value pairs
type: object
Object:
type: object
createReadRequest_200_response:
example:
dataProducerJobId: dataProducerJobId
properties:
dataProducerJobId:
description: The data job ID.
type: string
type: object
SubjobRequest_data:
oneOf:
- $ref: '#/components/schemas/ReadOperation'
- $ref: '#/components/schemas/WriteOperation'
ReadOperation_inner:
properties:
path:
description: Defines the resource on which operation is executed
example: SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003
type: string
op:
description: Describes the operation to execute
example: read
type: string
operationId:
description: Unique identifier for the operation within the request
example: "1"
type: string
attributes:
description: This parameter specifies the attributes of the scoped resources
that are returned
items:
example: cellId
type: string
type: array
fields:
description: This parameter specifies the attribute fields of the scoped
resources that are returned
items:
type: string
type: array
filter:
description: This parameter is used to filter the scoped Managed Objects.
Only Managed Objects passing the filter criteria will be fetched
example: NRCellDU/attributes/administrativeState==LOCKED
type: string
scopeType:
description: ScopeType selects MOs depending on relationships with Base
Managed Object
example: BASE_ONLY
type: string
scopeLevel:
description: Only used when the scope type is BASE_NTH_LEVEL to specify
amount of levels to search
example: 0
type: integer
moduleSetTag:
description: Module set identifier
example: my-module-set-tag
type: string
cmHandleProperties:
type: object
required:
- op
- path
type: object
WriteOperation_inner_value:
description: Value dependent on the op specified. Resource for an add. Object
for a replace. ActionParameters for an action.
oneOf:
- $ref: '#/components/schemas/Resource'
- $ref: '#/components/schemas/ActionParameters'
- $ref: '#/components/schemas/Object'
type: object
WriteOperation_inner:
properties:
path:
description: Defines the resource on which operation is executed
example: SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003
type: string
op:
description: Describes the operation to execute
example: add
type: string
operationId:
description: Unique identifier for the operation within the request
example: "1"
type: string
value:
$ref: '#/components/schemas/WriteOperation_inner_value'
required:
- op
- path
type: object
|
...
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
...
Datajob write 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 3gppPatchOperation
...
Y
3gppPatchOperation
...
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:
"add": creates a new MO with the id and attributes given in the value
"replace": replaces the value of an attribute specified in the path (attribute is separated with a # from the MO path) with the object in the value
"remove": removes the MO given in the path, value is not applicable
"action": executes an MO action in the path (action is separated with a # from the MO path) with the input parameters in the value
...
Unique identifier of the operation within the request
...
NA if op == remove
Resource if op == add
Object if op == replace
ActionParameters if op == action
...
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
DMI3gppReadOperation
...
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
...
Module set identifier
...
CMHandle private properties for the alternateID in the path.
...
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
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",
"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",
"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"
}
]
} |
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
...
- 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
...
/SubNetwork=Europe/SubNetwork=Belgium
...
/SubNetwork=Europe/SubNetwork=Belgium/SubNetwork=Brabant/ManagedElement=Antwerpen01/Function=X/Cell-A123
...
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
...
4G Cell Relation
...
SubNetwork=Europe/SubNetwork=Ireland,SubNetwork=NETSimW/ManagedElement=LTE08dg2ERBS00041/ENodeBFunction=1/EUtranCellFDD=LTE08dg2ERBS00041-1/EUtranFreqRelation=1,EUtranCellRelation=17
...
5G Cell Relation
...
SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR14gNodeBRadio00018/ManagedElement=NR14gNodeBRadio00018/GNBCUCPFunction=1/NRCellCU=NR14gNodeBRadio00018-1/EUtranCellRelation=1
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 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
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. | 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
Name | Description | Type | Mandatory |
---|---|---|---|
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",
"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"
}
]
} |
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 |
|
Proposed JIRAs
Component
Description
JIRA
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Jira | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|