...
| Usecase | REST Method | URI | Example |
---|
1 | Add a data resource for a cmHandle | POST | dmi-root}/dmi/v1/data/ch/<cm-handle>/{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 | {dmiroot}/dmi/v1/data/ch/<cm-handle>/{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>/{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>/{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>/{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>/ {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>/{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>/{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}/{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}/{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>/{resource-identifier} { data : { .... the complete tree config to be replaced } } | see example 12 CPS-391Spike: Define and Agree NCMP REST Interface#RESTAPI |
DMI Inventory
| Use Case | Rest Method | URI | Example |
---|
1 | DMI registers a new data source with NCMP | POST | {ncmp-root}/ncmp/v1/dmi-plugin/ { "dmi-plugin-id : { dmi-plugin-id } "dmi-source-id" : { unique-data-source-id } }
dmi-plugin-id should be resolvable service name ink8s DNS | Scenario : Register/Create a new dmi-plugin data source in NCMP Method : POST URI : {ncmp-root}/ncmp/v1/dmi-plugin/ Header : Content-Type: application/json Body : { "dmi-plugin-id : "service:sample-service", "dmi-source-id" : "sample" } Success Response : HTTP/1.1 202 Accepted Date: Thu, 26 Jan 2021 20:56:30 GMT Server: example-server {} Error Response: HTTP/1.1 409 Conflict Date: Thu, 26 Jan 2021 20:56:30 GMT Server: example-server { "error" : { "error-type" : "protocol", "error-tag" : "data exists", "error-message" : "Datasource service:sample-service/sample already registered/created" } }
An error will tell the DMI Plugin that this datasource has already been processed - no need to recover the cmhandles again. |
2 | Delete a data source from NCMP DMI Plugin NCMP | DELETE | {ncmp-root}/ncmp/v1/dmi-pluigin/ { dmi-plugin-id}/dmi-source/ { unique-data-source-id } | Scenario Remove a data source and all related NCMP handles from NCMP Method : DELETE URI {ncmp-root}/ncmp/v1/cmhandle-source/dmi-pluigin/service:sample-service/dmi-source/sample-dmi-source Header : Content-Type: application/json Body : {}
Success Response : HTTP/1.1 202 Accepted Date: Thu, 26 Jan 2021 20:56:30 GMT Server: example-server {}
Error Response: HTTP/1.1 409 Conflict Date: Thu, 26 Jan 2021 20:56:30 GMT Server: example-server { "error" : { "error-type" : "protocol", "error-tag" : "data exists", "error-message" : "Datasource service:sample-service/sample-dmi-source already registered/created" } } An error will tell the DMI Plugin that this datasource has already been processed - no need to recover the cmhandles again. |
3 | NCMP requests cmhandles for a datasource (may be refresh of existing datasource or for a newly registered datasource)
NCMP DMI plugin | GET | {dmi-root}/v1/dmi-source/{unique-data-source-id}?topic={topic-id} Content-Type: application/json
Note - the following will refresh ALL dmi data sources managed by a dmi plugin {dmi-root}/v1/dmi-source?topic={topic-id} | Scenario : NCMP requests sync of cmhandles for a datasource Method : GET URI : {dmi-root}/v1/dmi-source/dmi-source-sample?topic={topic-id} Header : Content-Type: application/json Body : {}
Event Body : { "dmiPluginId" : "service:sample-service", //should be resolvable sevicename in k8s DNS "dmi-source-id" : "sample-id" "createcmhandles" : [ { "cmhandle" : "sample-cmhandle-1", "additionalProperties" : { "subsystemId" : "sample-subsystemId-1" "targetId" : "sample-targedId-1" } }, { "cmhandle" : "sample-cmhandle-2", "additionalProperties" : { "subsystemId" : "sample-subsystemId-2" "targetId" : "sample-targedId-2" } } ... ... ], |
4 | Notify of change to CMHandle(s) |
| Topic : 'NCMP_INVENTORY' / sync request topic
|
Topic The topic name should come from Data Catalog OR should DMI registry store the topic from the |
initialNCMP initial NCMP sync request?) | Topic : NCMP_INVENTORY Event Body : { "dmiPluginId" : "service:sample-service", "dmi-source-id" : "dmi-source-id-001" "createcmhandles" : # Newly discovered/created cmhandles { "cmhandle" : "cmhandle-001", "additionalProperties" : { "subsystemId" : "subsystemId-001" "targetId" : "targetId-001" } }, { "cmhandle" : "cmhandle-002", "additionalProperties" : { "subsystemId" : "subsystemId-001" "targetId" : "targetId-002" } } ... ... ], "updatedcmhandles" : # For example the cmhandle has got rehomes to a new system. { "cmhandle" : "cmhandle-003", "additionalProperties" : { "subsystemId" : "subsystemId-001" "targetId" : "targetId-001" } }, { "cmhandle" : "cmhandle-004", "additionalProperties" : { "subsystemId" : "subsystemId-001" "targetId" : "targetId-002" } } ... ... ], "removedcmhandles" : [ "cmhandle-005", .... ], # array of cmhandles that have been deleted from the network. "migratedcmhandles" : [ { "cmhandle" : "cmhandle-005", "additionalProperties" : { "subsystemId" : "subsystemId-001" "targetId" : "targetId-001" } }, { "cmhandle" : "cmhandle-006", "additionalProperties" : { "subsystemId" : "subsystemId-001" "targetId" : "targetId-002" } } ... ... ] }
|
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" : [ { ... } ] } ] }, { "name" : "ietf-yang-library", "revision" : "2016-06-21", "namespace" : "urn:ietf:params:xml:ns:yang:ietfyang-library" } ] } } |
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.
...