References
- - CPS-2155Getting issue details... STATUS
- Name convention for Managed Objects (3GPP TS 32.300 version 11.2.0 Release 11)
Open Discussion
# | Issue | Notes | Decision |
---|---|---|---|
1 | 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 |
Data Structures
Proposed Method signature
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 DMI REST Interface & Forwarded DMI Java Request Data Structure from NCMP
Issue | Notes | Decision | |
---|---|---|---|
1 | |||
2 | |||
3 | |||
4 | |||
5 |
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 |
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
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 |
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
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 | 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 |
moduleSetTag | Module set identifier | String | Y |
privateProperties | CMHandle private properties for the alternateID in the path. | Map | Y |
Response
Status code: 200 - OK
Name | Description | Location | Type | Mandatory |
---|---|---|---|---|
dataProducerJobId | The ID of the created job by the data producer. | response body | String | Y |
Data subjob status check (NCMP → DMI)
Request:
Method: GET
Path: /dmi/v1/dataJob/{requestId}/dataProducerJob/{dataProducerJobId}/status
Name | Description | Location | Type | Mandatory |
---|---|---|---|---|
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
Name | Description | Location | Type | Mandatory |
---|---|---|---|---|
status | enum that represents the status of the subjob. Possible values: | response body | enum: [ NOT_STARTED, RUNNING, FINSHED, FAILED, PARTIALLY_FAILED, CANCELLING, CANCELLED ] | Y |
Data subjob retrieve result (NCMP → DMI)
Request:
Method: GET
Path: /dmi/v1/dataJob/{requestId}/dataProducerJob/{dataProducerJobId}/result
Parameters:
Name | Description | Location | Type | Mandatory |
---|---|---|---|---|
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
Name | Description | Location | Type | Mandatory |
---|---|---|---|---|
resulturi | internal ncmp topic name | response body | String | Y |
Examples from DCM Study
DataJob Read request (rAPP -> DCM)
Datajob Write request (rAPP -> DCM)
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
Priority | Component | Description | JIRA |
---|---|---|---|
1 | NCMP | Create implementation proposal for NCMP to provide support for Data jobs qualifier during registration | |
2 | NCMP | NCMP to provide support for data producer identifier during registration | |
3 | NCMP | Support of Datajobs qualifier during registration | |
4 | NCMP | Modify the get cmHandle api to return dataProducerIdentifier, moduleSetTag, and alternateId | |
5 | NCMP | Modify lcm events to include dataProducerIdentifier and moduleSetTag | |
6 | NCMP | Create implementation proposal for NCMP to provide Java interface that can support Data jobs request | |
7 | NCMP | Define a java based datastructure for DataJob | |
8 | NCMP | Handle Datajob request in java interface | |
9 | NCMP | Handle async datajob response in java interface | |
10 | Define DMI REST interface for Datajobs | ||
11 | DMI | Define a java based datastructure dmi request for dmi endpoint | |
12 | DMI | Response schema for DMI dataJob response | |
13 | NCMP | Forward dataJob response from DMI to client topic in header as destination | |
14 | DMI | Stub should be modified to use generated code from OpenAPI | |
15 | E2E demo for internal team and stakeholder |
3 Comments
kieran mccarthy
First comment :
"path": "/SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR03gNodeBRadio00003/ManagedElement=NR03gNodeBRadio00003/GNBCUCPFunction=1/EUtraNetwork=1/EUtranFrequency=12",
2. operationId is a string
3. DataJob can be only for read OR write, i.e. operation with "op" : "read" cannot exist in same DataJob with other op types
4. We will provide examples with fields, attributes and scope examples.
Toine Siebelink
the examples are directly from Rafael's study. I think there are quiet a few inconsistencies hence the need for a chat....
kieran mccarthy
Agree - action taken to clarify as agreed.
I have attached the DataJob structures ... might be some small fine tuning but should be pretty much there.