- CPS-731Getting issue details... STATUS
Scope
It should be able to query all cm handles with a given set of public cm handle properties.
Requirements
- We want all cm-Handles where both things are true.
- If name is empty silently ignore, if value is empty (edge case test?)
- Those properties also need to exist.
- If query body does not follow supported structure return 400.
- Empty query will return all cm-Handles.
A/C:
- Demo - with "and" behavior
- CI Test - two attributes
Issues/Decisions
Issue | Notes | Decision | |
---|---|---|---|
1 | Does request body need to declare "publicCmHandleProperties"? | Do we need to explicitly declare "publicCmHandleProperties"? Will there be another possible variation to this in the future? { "publicCmHandleProperties" : { "Colour": "red", "Size": "large" } } | Yes |
2 | Are public properties always stored (in postgress) in the format of "name" : x, "value": y? (does NOT affect implementation) | In the fragment table there are example that follow this format { "name": "Colour", "value": "red" }, { "name": "Size", "value": "large" } | Yes. But all this is hidden when using CpsPath type query |
3 | Will there only ever be 1 kv pairs in public properties (in the DB)? | Yes, as each property is stored in a separate list-item Fragment But all this is hidden when using CpsPath type query | |
4 | Does the order matter? | Does { "publicCmHandleProperties" : { "Colour" : "green", "Size" : "small" } } == { "publicCmHandleProperties" : { "Size" : "small" "Colour" : "green", } } | No But all this is hidden when using CpsPath type query |
5 | Should search be case sensitive? | depend on CPSPath functionality - may be case-sensitive https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html | Yes, that is the currently implement as such CpsPath type query. Given it is mostly machine-to-machine type queries this is good enough and performs better |
6 | What format should the response take? | We have two options currently:
[ "cmHandle1", "cmHandle2", ..., "cmHandleN" ] 2. Return CM Handle Objects
Contact Tony Finnerty & kieran mccarthy regarding this. | |
7 | what if we have valid entries and one entry is empty? | We would return all cm handles and others that match would be included in this list anyway. → To avoid this should we first check the entries int map for empty entries as further processing is unnecessary in this case. |
Analysis/Implementation Proposal
High level Jiras:
- - CPS-901Getting issue details... STATUS
- - CPS-902Getting issue details... STATUS
- - CPS-903Getting issue details... STATUS
- - CPS-904Getting issue details... STATUS
Possible High-Level Implementation Steps:
Match all xpaths using CPS Path Query
Iterate over the list and retrieve all attributes
- Iterate over the attributes and collect those instances that match
- Return collected list of cm handles
Interface Proposal
# | URI | Design Notes | Comment(s) |
---|---|---|---|
1 | POST /ncmp/v1/data/ch/searches | Scenario : Request received to return all cm handles matching properties given Request Body { "publicCmHandleProperties" : { "Colour" : "green", "Size" : "small" } } Response Body Example 1 [ "cmHandle1", "cmHandle2", ..., "cmHandleN" ] |
Below is a sample yaml for OpenAPI.
Testing
Edge Cases
- Null name, Value
- Empty name, Value
- no key value pairs at all
Manual Testing
# | Scenario | Screenshot | cURL Command | REST |
---|---|---|---|---|
1 | Both properties match (CM Handles Returned that Match) | curl --location --request POST 'http://localhost:8883/ncmp/v1/data/ch/searches' \ | { | |
2 | One property doesn't match (Nothing Returned) | curl --location --request POST 'http://localhost:8883/ncmp/v1/data/ch/searches' \ | { | |
3 | unknown properties given - NO cm handles returned | { "publicCmHandleProperties": { | ||
4 | Invalid Return 400 (BAD_REQUEST) | curl --location --request POST 'http://localhost:8883/ncmp/v1/data/ch/searches' \ | { | |
5 | No properties given - all cm handles returned (that contain public properties) | { | ||
6 | Return 400 (BAD_REQUEST) | curl --location --request POST 'http://localhost:8883/ncmp/v1/data/ch/searches' \ | { | |
7 | empty value |
Future Example (Out-of-scope)
POST /ncmp/v1/data/ch/searches
{ "publicCmHandleProperties" : { "publicPropertyName-1" : "publicPropertyValue-1", "publicPropertyName-2" : "publicPropertyValue-2" }, "modules": [ { "moduleName": "", (Mandatory) "revision": "" (Optional) } ] }
Modules in the example are to demonstrate future intentions but is out of scope for this user story.
References
CPS Swagger: http://localhost:8883/swagger-ui/index.html?configUrl=%2Fv3%2Fapi-docs%2Fswagger-config
https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html
https://www.freeformatter.com/xpath-tester.html#ad-output
//public-properties[@name='Contact' and @value='xyz']/ancestor::cm-handles
org.onap.cps.spi.impl.CpsDataPersistenceQueryDataNodeSpec#Query for attribute by cps path of type ancestor with #scenario.