How will hostname and port be provided when DMI-Plugin dmiPlugin 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-plugindmiPlugin" : { <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)
Instead of using ‘host-names’ and ‘ports’ parameters between java applications when in the cloud all we need is ‘service-names’ . The mapping of service-names to hosts and ports is done as part of the cloud configuration, in our case Kubernetes. And these are dynamic! The client application can then use a simple dns-lookup to connect to an instance of the service.
Using service names also allows any plugin to use implement scaling as they see fit e.g. partitioning
For the ONAP DMI Plugin which initial have only 1 instance we can simply hard-code the service-name and us the same name in the Kubernetes configuration e.g. “onap.cps.dmi-plugindmiPlugin"
2
Additional information in request body duplicates cmHandleId this is redundant information
Suggested to remove from request body to avoid possible error scenarios.
Only the one with the additionalInformation is needed and remove body
3
No need for Sync method, this is basic standard read operation at the root level for that cm-handlecmHandle
4
Use include 'location' property when request yang-module sources
Suggestion: do include it in the request but allow DMI-Plugin dmiPlugin to decide to use it or now. Location (this leaf is called schema in older RFC7895) is not mandatory to support in YANG library and nodes may not include it. Another alternative presumably used also by ODL itself is the <get-schema> RPC. The key difference is that the YANG module definition is sent directly over the NETCONF channel, not requiring separate file servers and clients. So this is maybe one more reason that the ONAP DMI plugin currently doesn’t need the location attribute.
Location is not needed for any plugin and could only lead to ambiguity therefore will NOT be included in this request
DMI URI
DMI URI format to follow below pattern Sandeep Shah
Inconsistent use of "Operation" and/or HTTP Methods to distinguish write operations
Currently this page proposes to use "Operation=update" request body parameter for restconf "Replace" and "Patch" operations and use the HTTP (RESTFul) operation to distinguish between them. It also proposes to use PUT HTTP for Read and Delete operations Basically a very confusing an unintuitive use of HTTP operations to distinguish ambiguous operations that instead easily could be defined by just using the 'operation' field in the request body.
Proposal Toine: For Consistent (restful) design I would suggest to think as the operation to DMI-Plugin (always with body) as "creating a new order to do something" toward DMI-Plugin. Ie always a HTTP POST (or PUT?) operation. The "operation " in the body can simple be extended to include both "update" and "patch" as required. If the 'operation' is NOT supplied "read" wil be assumed as the default operation
version of the dmi interface is the target resource URI is the query parameter list
<cmHandle>
mandatory
unique (string) identifier of a yang tree instance.
<data|operations|dmiAction>
mandatory
yang data, rpc operation or a (non-modeled) dmi action
{datastore}
mandatory
mandatory datastore
<resourcePath>
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
If the cmhandle metadata indicates that data is not synched in CPS then the request is forwarded to the dmiPlugin
RESTCONF/NETCONF relationship
Image Added
REST Data API
The DMI APIs for data access are similar to corresponding NCMP APIs. The following list is a summary of the main differences:
The URI prefix is /dmi instead of /ncmp.
For non-passthrough datastores, the resource path will be converted from cpsPath to RESTConfPath
The body for each request will contain additional information and any data provided on the NCMP interface (write operations) will be embedded in a larger JSON structure as described in example below.
Since all requests will have a message body, in some cases the HTTP method will be different to allow passing data. Thus POST can be used, the actual operation will be read from the body.
Excerpt
Request Format for Data Access
Code Block
language
xml
title
request body
{
“operation”: “<operation>”,
Datastore
If the cmhandle metadata indicates that data is not synched in CPS then the request is forwarded to the dmi-plugin
RESTCONF/NETCONF relationship
Image Removed
REST Data API
The DMI APIs for data access are similar to corresponding NCMP APIs. The following list is a summary of the main differences:
The URI prefix is /dmi instead of /ncmp.
For non-passthrough datastores, the resource path will be converted from cpsPath to RESTConfPath
The body for each request will contain additional information and any data provided on the NCMP interface (write operations) will be embedded in a larger JSON structure as described in example below.
Since all requests will have a message body, in some cases the HTTP method will be different to allow passing data. Thus PUT is used instead of GET and DELETE.
Request Format for Data Access
Code Block
language
xml
title
request body
{
“operation”: “<operation>”, // Valid operations are: “create”, “read”, “update” and “delete”.
// For update, replace and patch is distinguished by the HTTP method (PUT or PATCH).
“data-type”: “<mime-type>”, // Indicates format for the embedded data.
// Shall use MIME type syntax, e g “application/yang-data+json”.
// Shall only be present for create and update operations.
“data”: { // Embedded data. Must be valid JSON object.
<data>
//Validoperationsare:“create”,“read”,
// Shall only be present for create and update operations.
},
“additionalProperties”: {
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
This presentation illustrates the API methods #1, #3 and #4 detailed below
// e.g. "application/yang.data"
“data”: { // Embedded data as a String.
<data> // required for create and update operations. Optional filter-data for read-operations
},
“cmHandleProperties”: { // Additional properties for CM handle previously added by DMI plugin and stored in NCMP.
<properties>
}
}
Expand
title
API details
Below table shows the proposed interface, actual implementation might deviate from this but can be accessed from
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
Scenario : Get all cmhandles from NCMP for a given dmi-plugin. May be used for conciliation Method : GET URI : {ncmp-root}/ncmp-dmi/v1/dmi-plugins/{dmi-plugin}/ch Header : Content-Type: application/json Success Response : HTTP/1.1 200 Ok Date: Thu, 26 Jan 2021 20:56:30 GMT Server: example-server { "cmhandles" : [ { "cmhandle" : "node-1", "additionalProperties" : { "subSystem" : "system-001"} }] }
Response: a list yang module references and source for each
Code Block
language
xml
title
Response Body
{ [
{
"name" : "_3gpp-nr-nrm-nrsectorcarrier",
"revision" : "2020-12-09",
"namespace": "urn:3gpp:sa5:_3gpp-nr-nrm-nrnetwork-nrsectorcarrier" },
"yang-source": "module pnf-sw-upgrade {\n namespace \"http://onap.org/pnf-sw-upgrade\";\n prefix upgrade;\n\n import ietf-yang-types {\n prefix yang;\n }
\n\n revision 2019-12-03 {\n description\n \"initial version\";\n }\n\n container software-upgrade {\n list upgrade-package {\n key \"id\";\n leaf id {\n type string;\n }
\n\n leaf current-status {\n type enumeration {\n enum \"CREATED\";\n enum \"INITIALIZED\";\n enum \"DOWNLOAD_IN_PROGRESS\";\n enum \"DOWNLOAD_COMPLETED\";\n
enum \"ACTIVATION_IN_PROGRESS\";\n enum \"ACTIVATION_COMPLETED\";\n }\n description\n \"List of possible states of the upgrade\";\n }\n\n leaf state-change-time
{\n type yang:date-and-time;\n mandatory false;\n description\n \"Date and time of the last state change.\";\n }\n\n leaf action {\n type enumeration
{\n enum \"NONE\";\n enum \"PRE_CHECK\";\n enum \"DOWNLOAD_NE_SW\";\n enum \"ACTIVATE_NE_SW\";\n enum \"CANCEL\";\n }\n mandatory false;\n description\n
\"List of possible actions for the upgrade\";\n }\n\n leaf software-version {\n type string;\n description\n \"Possible name or release version of the UP\";\n }
\n\n leaf uri {\n type string;\n description\n \"A URI that points to the directory where the UP can be found.\";\n }\n\n leaf user {\n type string;\n description\n
\"Indicates the user.\";\n }\n\n leaf password {\n type string;\n description\n \"Indicates the password.\";\n }\n\n leaf user-label {\n type string;\n description\n
\"Free-text description of the UP.\";\n }\n\n leaf node-health {\n type string;\n description\n \"Reflect Node Health Status\";\n }\n }\n }\n}"
}, {...} ]
}
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.