CPS-1152: Spike Conform JSON and dmi-registry Casing Conventions

CPS-1152: Spike Conform JSON and dmi-registry Casing Conventions

https://lf-onap.atlassian.net/browse/CPS-1152

Issue:

NCMP has an inconsistency between the JSON supplied/received and what exists in the database. This is producing issues such as those related to CM Handle querying.

 

Create a CM Handle

Get a CM Handle

Query CM Handle

 

Create a CM Handle

Get a CM Handle

Query CM Handle

URI

POST: http://localhost:8883/ncmpInventory/v1/ch

GET:
http://localhost:8883/ncmp/v1/ch/CmHandle1

POST:
http://localhost:8883/ncmp/v1/ch/searches

JSON BODY

{
    "dmiPlugin": "http://{{WSL IP}}:8783",
    "createdCmHandles": [
        {
            "cmHandle": "CmHandle1",
            "cmHandleProperties": {
                "Books": "Sci-Fi Book"
            },
            "publicCmHandleProperties": {
                "Color": "yellow",
                "Size": "medium",
                "Shape": "circle"
            }
        }
    ]
}

N/A

{
    "cmHandleQueryParameters": [
        {
            "conditionName": "cmHandleWithCpsPath",
            "conditionParameters": [ {"cpsPath": "//state[@cm-handle-state='LOCKED']"} ]
        }
    ]
}

JSON RESPONSE

N/A

{
    "cmHandle": "CmHandle1",
    "publicCmHandleProperties": [
        {
            "Color": "yellow",
            "Shape": "circle",
            "Size": "medium"
        }
    ],
    "state": {
        "cmHandleState": "LOCKED",
        "lockReason": {
            "reason": "LOCKED_MISBEHAVING",
            "details": "some-details"
        },
        "lastUpdateTime": "2022-08-08T10:21:16.123+0000"
    }
}

[
    {
        "cmHandle": "CmHandle1",
        "publicCmHandleProperties": [
            {
                "Shape": "circle",
                "Size": "medium",
                "Color": "yellow"
            }
        ],
        "state": {
            "cmHandleState": "LOCKED",
            "lockReason": {
                "reason": "LOCKED_MISBEHAVING",
                "details": "some-details"
            },
            "lastUpdateTime": "2022-08-08T10:11:15.320+0000"
        }
    }
]

Inconsistencies

  1. cmHandleProperties != additional-properties

  2. publicCmHandleProperties != public-properties

 

  1. cmHandle != id

  2. cmHandleState != cm-handle-state

  3. lockReason != lock-reason

  4. lastUpdateTime != last-update-time

  5. Same as cell left

  1. Same as cell left

Description

Backwards Compatible

Convention Impacts

Overall CPS Convention impact

Consistency between yang model and JSON

Cost

Comments

Description

Backwards Compatible

Convention Impacts

Overall CPS Convention impact

Consistency between yang model and JSON

Cost

Comments

1

Change OpenApi to kebab-casing

No - This would involve changing what is in red above. So changes to cmhandle registration and JSON responses.

Would expect all endpoints to use kebab-casing: dataspace-name, schema-set.
Is what we do have now

Solved

Some endpoints effected

Version management needed

Not backwards compatible is a big issue

2

Change dmi-registry to camelCasing

No - Would involve internal changes. Only changes to CM Handle API.

IEEE Guidelines state yang identifiers should be in kebab casing https://1.ieee802.org/yang-guidelines/

Would expect all endpoints to use camel-casing: dataspaceName, schemaSet.
Not what we do now

Solved

Liquibase updates

Not even considering, too many impacts to codebase and breaks yang convention.

3

Do nothing / Document

Nothing changes

Conforms to conventions 

Would expect all endpoints to use kebab-casing: dataspace-name, schema-set.
Is what we do have now

Inconsistencies not addressed

Describe in RTD

Team recommends 

Foreseen Impacts

Change OpenApi to kebab-casing

We would change components.yaml to kebab-casing

components.yaml example

components.yaml example

components.yaml current
CmHandleCompositeState: type: object properties: cmHandleState: type: string example: ADVISED lockReason: $ref: '#/components/schemas/lock-reason' lastUpdateTime: type: string example: 2022-12-31T20:30:40.000+0000 dataSyncEnabled: type: boolean example: false dataSyncState: $ref: '#/components/schemas/dataStores'
components.yaml future
CmHandleCompositeState: type: object properties: cm-handle-state: type: string example: ADVISED lock-reason: $ref: '#/components/schemas/lock-reason' last-update-time: type: string example: 2022-12-31T20:30:40.000+0000 data-sync-enabled: type: boolean example: false data-sync-state: $ref: '#/components/schemas/dataStores'

This would change generated Java class:

CmHandleCompositeState.java example

CmHandleCompositeState.java example

CmHandleCompositeState.java current
public class CmHandleCompositeState { @JsonProperty("cmHandleState") private String cmHandleState = null; @JsonProperty("lockReason") private LockReason lockReason = null; @JsonProperty("lastUpdateTime") private String lastUpdateTime = null; @JsonProperty("dataSyncEnabled") private Boolean dataSyncEnabled = null; @JsonProperty("dataSyncState") private DataStores dataSyncState = null; public CmHandleCompositeState cmHandleState(String cmHandleState) { this.cmHandleState = cmHandleState; return this; } ...

 

CmHandleCompositeState.java future
public class CmHandleCompositeState {      @JsonProperty("cm-handle-state")      private String cmHandleState = null;       @JsonProperty("lock-reason")      private LockReason lockReason = null;       @JsonProperty("last-update-time")      private String lastUpdateTime = null;       @JsonProperty("data-sync-enabled")      private Boolean dataSyncEnabled = null;       @JsonProperty("data-sync-state")      private DataStores dataSyncState = null;       public CmHandleCompositeState cmHandleState(String cmHandleState) {            this.cmHandleState = cmHandleState;            return this;       } ...

And change JSON payload:

JSON Payload

JSON Payload

[     {         "cmHandle": "CmHandle1",         "publicCmHandleProperties": [             {                 "Shape": "circle",                 "Size": "medium",                 "Color": "yellow"             }         ],         "state": {             "cmHandleState": "LOCKED",             "lockReason": {                 "reason": "LOCKED_MISBEHAVING",                 "details": "some-details"             },             "lastUpdateTime": "2022-08-08T10:11:15.320+0000"         }     } ]
[ { "cm-handle": "CmHandle1", "public-cm-handle-properties": [ { "Size": "medium", "Shape": "circle", "Color": "yellow" } ], "state": { "cm-handle-state": "LOCKED", "lock-reason": { "reason": "LOCKED_MISBEHAVING", "details": "some-details" }, "last-update-time": "2022-08-09T15:24:51.111+0000" } } ]

Change dmi-registry to camelCasing

Change the dmi-registry

dmi-registry

dmi-registry

list cm-handles { key "id"; leaf id { type string; } leaf dmi-service-name { type string; } leaf dmi-data-service-name { type string; } leaf dmi-model-service-name { type string; } list additional-properties { key "name"; leaf name { type string; } leaf value { type string; } } list public-properties { key "name"; leaf name { type string; } leaf value { type string; } } container state { leaf cm-handle-state { type string; } container lock-reason { uses LockReason; } leaf last-update-time { type string; } leaf data-sync-enabled { type boolean; default "false"; } container datastores { uses Datastores; } } } } }
list cm-handles { key "id"; leaf id { type string; } leaf dmiServiceName { type string; } leaf dmiDataServiceName { type string; } leaf dmiModelServiceName { type string; } list additionalProperties { key "name"; leaf name { type string; } leaf value { type string; } } list publicProperties { key "name"; leaf name { type string; } leaf value { type string; } } container state { leaf cmHandleState { type string; } container lockReason { uses LockReason; } leaf lastUpdateTime { type string; } leaf dataSyncEnabled { type boolean; default "false"; } container datastores { uses Datastores; } } } } }

Would involve new Liquibase changeset and updating dmi-registry everywhere.

Java code changes related to CmHandleQueries 

Open Questions

Do we want to match the dmi-registry in its entirety? See below inconsistencies for CM Handle registration body:

Do we want to match the dmi-registry in its entirety? See below inconsistencies for CM Handle registration body:

CM Handle Registration Body

CM Handle Registration Body Conforming to dmi-registry

"cmHandle": "CmHandle1"

"id":"CmHandle1"

"publicCmHandleProperties": [
            {
                "Shape": "circle",
                "Size": "medium",
                "Color": "yellow"
            }

]

"public-properties": [
            {
                "Shape": "circle",
                "Size": "medium",
                "Color": "yellow"
            }

]

"cmHandleProperties": {
                "Books": "Sci-Fi Book"
            }

"additional-properties": {
                "Books": "Sci-Fi Book"
            }