Addresses: - CPS-338Getting issue details... STATUS
Goal
The following operations are expected to be supported by CPS core
- Create a list node (add multiple children) under existing parent node;
adding a list with a single value is already supported - Delete a list node – removing all the data nodes which belong to specified list node;
current implementation allows only removal one entry per request; full xpath to node is required - Replace a list node – the operation which is a combination of delete then create operations
described above
It's an assumption the list node cannot be a root level element, so the parent data node is always expected.
Addressing the List Node
TBD
Single node vs multiple nodes
Data parsing context
On data conversion from String to DataNode object there is an intermediate stage of data being represented as
a NormalizedNode instance which is a Yang Tools library artifact.
The NormalizedNode represents the list node element as a single object. It means the data fragment which
represents the list element with multiple entries can be successfully converted into NormalizedNode.
However the subsequent NormalizedNode to DataNode conversion performed by CPS internal logic supports only
single DataNode object as top level element. The functionality of DataNodeBuilder require to be extended
in order to convert the list element data (fragment) into collection of DataNode objects
Created: - CPS-358Getting issue details... STATUS
Same API/SPI usage context
In current implementation all the non-read operations are taking as input single data node.
In order to support multiple data nodes as input it requires either an existing methods signature update
or new methods which will serve list data node.
Below is an example of SPI method signatures update in order to support backward compatibility
// before void replaceDataNodeTree(@NonNull String dataspaceName, @NonNull String anchorName, @NonNull DataNode dataNode); // after void replaceDataNodeTree(@NonNull String dataspaceName, @NonNull String anchorName, @NonNull DataNode ... dataNode);
cons: despite usage of same methods the actual logic for processing single node significantly differs from the one
which is required to process multiple data nodes, as result
- the logic split will be required within a method itself, adding complexity to both the implementation
and the testing - the invocation logic requires to be updated as well, causing extra complexity to caller logic as well
While benefit of this approach is negligible the suggestion is to provide separate API/SPI methods for operations with list-node elements.
Same REST API usage context
Using same REST API also seems not reasonable.
As example there is a replace (PUT) operation for a data fragment with following inputs (excluding dataspace and anchor):
- parent node xpath
- data fragment as JSON
// xpath=/test-tree // request body: { "branch": {[ "name": "Branch", "nest": { "name": "Nest" } ]} }
The case became uncertain because it's unclear what the action is expected exactly:
- replace an existing data node with xpath /test-tree/branch[@name='Branch']
or throw an exception if record with such xpath does not exist - replace the list node content (assumes all prior entries removal) with provided data
so there should be additional parameter to clarify which exact behavior is requested.
Any additional parameter (even optional one) leads to API/SPI for service level to be modified
in order to handle this extra parameter. It also leads to logic complication as described above.
From client perspective the additional parameter is same impact/effort as new entry point.
Suggested new entry points to be used for list-nodes only like below
/dataspaces/{dataspaceName}/anchor/{anchorName}/list-node
Implementation Proposal
Proposal