CPS-390
-
Getting issue details...
STATUS
Issues and Decisions
| Issue | Notes | Decision |
---|
1 | How will hostname and port be provided when DMI-Plugin register itself and its list of cmHandles with NCMP | The team thinks that the information should instead be provided in the form of a ‘host-name’ and a ‘port’ (there was some debate on service-name v. host-name but it was settled on host-name)
e.g. "dmi-plugin" : { <host-name>, <port> }
Where the host-name is unique. (the DB might assign an internal unique ID for each entry but that is just for indexing and x-referencing in a relation DB and this ID is not to be used/ exposed externally) |
|
DMI URI
DMI URI format to follow below pattern Sandeep Shah
<OP>dmi/<v{v-number}>/ch/<cm-handle>/<data|operations|dmi-action>/ds/{datastore}/[rp:]<resource-path>?<query>
URI | Mandatory or Optional | Description |
---|
<OP> | mandatory | the HTTP method |
dmi | mandatory | the dmi root resource |
<v{v-number}> | mandatory | version of the dmi interface is the target resource URI is the query parameter list |
<cm-handle> | mandatory | unique (string) identifier of a yang tree instance. |
<data|operations|dmi-action> | mandatory | yang data, rpc operation or a (non-modeled) ncmp api action |
{datastore} | optional | optional datastore |
<resource-path> | optional | the path expression identifying the resource that is being accessed by the operation. If this field is not present, then the target resource is the API itself. |
<query> | optional | the set of parameters associated with the RESTCONF message; see Section 3.4 of [RFC3986]. RESTCONF parameters have the familiar form of "name=value" pairs. Most query parameters are optional to implement by the server and optional to use by the client. Each optional query parameter is identified by a URI |
Datastore
If datastore (ds/{datastore}) is not included in the URL then the request is defaulted to ncmp-datastore:running/operational.
If the cmhandle metadata indicates that data is not synched in CPS then the request is forwarded to the dmi-plugin
RESTCONF/NETCONF relationship
![](/download/attachments/103420488/image2021-5-10_16-28-3.png?version=1&modificationDate=1623147106000&api=v2)
REST API
The examples in the below table refer back to the NCMP interface as the only difference is the URI prefix /dmi instead of /ncmp
REST API details
| Usecase | REST Method | URI | Example |
---|
1 | Add a data resource for a cmHandle | POST | {dmi-root}/dmi/v1/data/ch/<cmhandle>/ds/ncmp-datastore:running/{parent-data-resource-identifier} { <new-yang-data-resource> } Content-Type: application/json "data" payload : yang-data+json | see example 4 CPS-391Spike: Define and Agree NCMP REST Interface#RESTAPI |
2 | Delete a data resource for a cmHandle | PUT | {dmi-root}/dmi/v1/data/ch/<cm-handle>/ds/ncmp-datastore:running/{resource-identifier} | see example 7 CPS-391Spike: Define and Agree NCMP REST Interface#RESTAPI |
3 | Patch a data resource for a cmHandle | PATCH | {dmi-root}/dmi/v1/data/ch/<cm-handle>/ds/ncmp-datastore:running/{resource-identifier} { <yang-data-for-merging> } Content-Type: application/json "data" payload : yang-data+json | see example 5 CPS-391Spike: Define and Agree NCMP REST Interface#RESTAPI |
4 | Patch multiple child resources for a single cmHandle | PATCH | {dmi-root}/dmi/v1/data/ch/<cm-handle>/ds/ncmp-datastore:running/{resource-identifier}
Content-Type: application/json "data" payload : yang-patch+json | see example 6 CPS-391Spike: Define and Agree NCMP REST Interface#RESTAPI |
5 | Execute a yang action on a cmhandle instance | POST | {dmi-root}/dmi/v1/data/ch/<cm-handle>/ds/ncmp-datastore:operational/{resource-identifier}/{action}
input: { "param1Name" :"param1Value”, "param2Name" : "param2Value” }
Note : If the "action" statement has no "input" section, the request message MUST NOT include a message-body | see example 10 CPS-391Spike: Define and Agree NCMP REST Interface#RESTAPI |
6 | Execute an rpc operation | POST | {dmi-root}/dmi/v1/operations/ch/<cm-handle>/ds/ncmp-datastore:operational/ {module-name}:{action} { input: { "param1Name" : "param1Value”, "param2Name" : "param2Value” } } Note: If there is no "input" section, the request MUST NOT include a message-body | see example 11 CPS-391Spike: Define and Agree NCMP REST Interface#RESTAPI |
7 | Read a filtered set of data under a data resource for a cmHandle | PUT | {dmiroot}/dmi/v1/data/ch/<cm-handle>/ds/ncmp-datastore:operational/{resource-identifier}?fields={fields-expression} Option | Description |
---|
fields | Request a subset of the target resource contents |
|
|
8 | Read data resources with specified fields under a given data resource for a given cmHandle | PUT | {dmi-root}/dmi/v1/data/ch/<cm-handle>/ds/ncmp-datastore:operational/{resource-identifier}?fields={fields-expression}
Option | Description |
---|
fields | Request a subset of the target resource contents |
| see example 12 CPS-391Spike: Define and Agree NCMP REST Interface#RESTAPI |
9 | Get data resource with 'fileds' for a cmhandle with a given scope condition | PUT | {dmi-root}/dmi/v1/data/ch/{cm-handle}/ds/ncmp-datastore:operational/{resourcepath}?fields={fields}&scope={scope} | see example 2 CPS-391Spike: Define and Agree NCMP REST Interface#RESTAPI |
10 | Read descendant nodes to a given depth for a given cmHandle | PUT | {dmi-root}/dmi/v1/data/ch/{cm-handle}/ds/ncmp-datastore:operational/{resource-identifier}?depth={level}
Option | Description |
---|
depth | Request limited sub-tree depth in the reply content If '1' then only immediate resource is retrieved If '2' then resource plus next level resources are retrieved |
| see example 12 CPS-391Spike: Define and Agree NCMP REST Interface#RESTAPI |
11 | Replace data for a CMHandle | PUT | {dmi-root}/dmi/v1/data/ch/<cm-handle>/ds/ncmp-datastore:running/{resource-identifier} {data : { .... the complete tree config to be replaced }} | see example 12 CPS-391Spike: Define and Agree NCMP REST Interface#RESTAPI |
DMI Inventory and Sync
| Use Case | Rest Method | URI | Example |
---|
1 | DMI notifies NCMP of new , deleted or changed cmhandles DMI Plugin NCMP | POST | {ncmp-root}/ncmp/v1/ch/ | Scenario : DMI notifies NCMP of new cmhandles Method : POST URI : {ncmp-root}/ncmp/v1/ch/ Header : Content-Type: application/json
Body : {}
Body : { "dmi-plugin" : "system:5555", //should be resolvable sevicename in k8s DNS "createdcmhandles" : [ // Used for initial cm handle registrations or subsequent cmhandle creations (post initial registration) { "cmhandle" : "rf4er5454", "additionalProperties" : { "subsystemId" : "system-001" "targetId" : "Subnetwork=Stockholm,MeContext=Kista,ManagedElement=Kista001" } }, { "cmhandle" : "dfget656", "additionalProperties" : { "subsystemId" : "system-001" "targetId" : "Subnetwork=Stockholm,MeContext=Kista, ManagedElement=Kista-002" } } ... ... ], ... # Used for updates to cmhandles "updatedcmhandles" : # For example the cmhandle has got rehomes to a new system. { "cmhandle" : "rf4er5454", "additionalProperties" : { "subsystemId" : "system-001" "targetId" : "Subnetwork=Stockholm,MeContext=Kista,ManagedElement=Kista001" } }, { "cmhandle" : "dfget656", "additionalProperties" : { "subsystemId" : "system-001" "targetId" : "Subnetwork=Stockholm,MeContext=Kista, ManagedElement=Kista-002" } } ... ... ], // Used for deleted cmhandles "removedcmhandles" : [ "sfsdf", .... ], # array of cmhandles that have been deleted from the network. ... } |
2 | Get all the registered cmhandles for a given plugin | GET | {ncmp-root}/ncmp/v1/dmi-plugins/{plugin-id}/ch | Scenario : Get all cmhandles from NCMP for a given dmi-plugin. May be used for conciliation Method : GET URI : {ncmp-root}/ncmp/v1/dmi-plugins/{dmi-plugin}/ch Header : Content-Type: application/json
Body : // EMPTY BODY
Success Response : HTTP/1.1 200 Ok Date: Thu, 26 Jan 2021 20:56:30 GMT Server: example-server { "cmhandles" : [ { "cmhandle" : "sdf8fs0d8", "additionalProperties" : [ "target" : "Subnetwork=Stockholm,MeContext=Kista,ManagedElement=Kista001", "subSystem" : "system-001" ] }, { "cmhandle" : "sdsd6567687", "additionalProperties" : [ "target" : "Subnetwork=Stockholm,MeContext=Kista,ManagedElement=Kista002", "subSystem" : "system-001" ] } ... } |
3 | Notify of change to CMHandle(s) | - | Topic : 'NCMP_INVENTORY' / sync request topic Topic name should come from Data Catalog OR should DMI registry store the topic from the initial NCMP sync request?) | Topic : NCMP_INVENTORY
Event Body : { "dmi-plugin" : "sample-adapter:5555", "createdcmhandles" : # Newly discovered/created cmhandles { "cmhandle" : "rf4er5454", "additionalProperties" : { "subsystemId" : "system-001" "targetId" : "Subnetwork=Stockholm,MeContext=Kista,ManagedElement=Kista001" } }, { "cmhandle" : "dfget656", "additionalProperties" : { "subsystemId" : "system-001" "targetId" : "Subnetwork=Stockholm,MeContext=Kista, ManagedElement=Kista-002" } } ... ... ], "updatedcmhandles" : # For example the cmhandle has got rehomes to a new system. { "cmhandle" : "rf4er5454", "additionalProperties" : { "subsystemId" : "system-001" "targetId" : "Subnetwork=Stockholm,MeContext=Kista,ManagedElement=Kista001" } }, { "cmhandle" : "dfget656", "additionalProperties" : { "subsystemId" : "system-001" "targetId" : "Subnetwork=Stockholm,MeContext=Kista, ManagedElement=Kista-002" } } ... ... ], "removedcmhandles" : [ "sfsdf", .... ], # array of cmhandles that have been deleted from the network. ... } |
4 | Sync the model to NCMP | PUT | {dmi-root}/dmi/v1/sync/ch/<cmhandle> | Scenario : NCMP requests sync of cmhandle yang tree Method : PUT URI : {dmi-root}/dmi/v1/sync/ch/243234 Header : Content-Type: application/json Body : {}
Body : { "additionalProperties" : { "subsystemId" : "sample-subsystemId" "targetId" : "Subnetwork=Stockholm,MeContext=Kista,ManagedElement=1" } }
Response : HTTP/1.1 200 OK Date: Thu, 26 Jan 2017 20:56:30 GMT Server: example-server Content-Type: application/yang-data-json { _3gpp-common-managed-element:ManagedElement [ { id=1, ... _3gpp-nr-nrm-gnbdufunction:GNBDUFunction :[ { id=1, nrsectcarr3gpp:NRSectorCarrier=1 { # level 2 "_3gpp-common-top:id" : "NRSectorCarrier-1", # level 3 "attributes" : { # level 3 "txDirection" : "DL_AND_UL", # level 4 "arfcnUL" : "55555", # level 4 ... } }, ... ] } |
Model API
| Use Case | Rest Method | URI | Example |
---|
1 | Get model (module set) for cmhandles | PUT | {dmi-root}/dmi/v1/model/ch/<cm-handle> | Scenario : Get the model data for a given cmhandle Method : PUT URI : {dmi-root}/dmi/v1/model/ch/cmhandle-001?fields=ietf-yang-library:modules-set Header : Content-Type: application/json Accept: application/json Body : { "operation" : "read", "cmhandle" : "cmhandle-001", "additionalProperties" : [ "target" : "sample-target", "subSystem" : "subSystem-001" ] }
Response:
{ "cmHandle" : "cmhandle-001", "ietf-yang-library:modules-set" : [ # from RFC 8525 { "name" : "123456", "module" : [ { "name" : "store", "revision" : "2020-12-09", "namespace" : "org:onap:cps:test:store", "submodule" : [ { "name" : "bookstore", "revision" : "2020-12-17", "namespace" : "org:onap:cps:test:bookstore", "submodule" : [ { ... } ] } ] } } |
GET Request with body
The HTTP libraries of certain languages (notably JavaScript) don’t allow GET requests to have a request body. In fact, some users are surprised that GET requests are ever allowed to have a body.
The truth is that RFC 7231—the RFC that deals with HTTP semantics and content—does not define what should happen to a GET request with a body! As a result, some HTTP servers allow it, and some—especially caching proxies—don’t.
The authors of Elasticsearch prefer using GET for a search request because they feel that it describes the action—retrieving information—better than the POST verb. However, because GET with a request body is not universally supported, the search API also accepts POST requests: }
The same rule applies to any other GET API that requires a request body.
See Elasticsearch details here for more info
yang-patch operations (see rfc8072)
"create", "delete", "insert", "merge", "move", "replace", and "remove"
YANG Data Structure Extensions
https://tools.ietf.org/html/rfc8791
References
Follow principles/patterns of RESTCONF RFC-8040 https://datatracker.ietf.org/doc/html/rfc8040
Follow principles/patterns of yang-patch RFC-8072 https://datatracker.ietf.org/doc/html/rfc8040
Follow principles/patterns of RESTCONF NMDA RFC-8527 https://datatracker.ietf.org/doc/html/rfc8527