Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. Updating all data trees under an anchor with root node xPath "/"

    Code Block
    titleCURL request to update multiple leaves across multiple data trees
    collapsetrue
    curl --location --request PATCH 'http://localhost:8080/cps/api/v1/dataspaces/testDataspace/anchors/sample/nodes?xpath=%2F' --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'Authorization: Basic Y3BzdXNlcjpjcHNyMGNrcyE=' --header 'Cookie: JSESSIONID=node0iyclt1syzfqj28jzo5qc5gks1.node0' \
    --data '{
      "multiple-data-tree:interface-A": {
        "host-name": "host-A",				   //value to be updated
        "interface": [						   //List Data Node
          {
            "name": "Interface-A",
            "address": "10.10.10.100",         //value to be updated
            "subnet-mask": "255.255.255.25",   //value to be updated
            "enabled": false
          }
        ],
        "domain": "true"
      },
      "multiple-data-tree:interface-B": {
        "interface": [						  //List Data Node
          {
            "name": "Interface-B",
            "address": "10.10.10.100",       //value to be updated
            "subnet-mask": "255.255.255.0"
          }
        ]
      }
    }'

    Response: 500 Server Error

    Code Block
    collapsetrue
    {
        "status": "500 INTERNAL_SERVER_ERROR",
        "message": "could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.DataException: could not execute statement",
        "details": "Check logs for details."
    }

    Reason: The following scenario would fail because CPS Patch operation only supports updating multiple leaves under one container node at a time. And here when we try to update multiple leaves present in two different containers the operations fails. 

    On performing Get operation we get the following JSON data, here none of the leaves are updated

    Code Block
    collapsetrue
    [
        {
            "int:interface-A": {
                "domain": "false",
                "host-name": "host",
                "interface": [
                    {
                        "name": "Interface-A",
                        "address": "10.10.10.1",
                        "enabled": false,
                        "subnet-mask": "255.255.255.0"
                    }
                ]
            }
        },
        {
            "int:interface-B": {
                "interface": [
                    {
                        "name": "Interface-B",
                        "address": "10.10.10.1",
                        "subnet-mask": "255.255.255.0"
                    }
                ]
            }
        }
    ]


  2. Updating the first data treedata trees individually, leads to successful updation
    When updating multiple leaves present under individual data nodes the operation successfully executes.

    Code Block
    titleCURL request to update
    first data tree
    leaves under container data node
    collapsetrue
    code
    curl --location --request PATCH 'http://localhost:8080/cps/api/v1/dataspaces/testDataspace/anchors/sample/nodes?xpath=%2Finterface-A%2F' \
    --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'Authorization: Basic Y3BzdXNlcjpjcHNyMGNrcyE=' --header 'Cookie: JSESSIONID=node0iyclt1syzfqj28jzo5qc5gks1.node0' \
    --data '{
            "int:interface-A": {
                "namedomain": "Interface-A",
                "address": "10.10.10.200",			true",			//value to be updated
            "host-name": "Host-A"	    "enabled": true,					//value to be updated
       
             "subnet-mask": "255.255.255.0"
            }
        }'}
      }'

    Response 200 OK

    code
    Code Block
    titleUpdated data after making get request
    collapsetrue
    [
      {
        "int:interface-A": {
          "domain": "falsetrue",			//updated
          "host-name": "hostHost-A",	//updated
          "interface": [
            {
              "name": "Interface-A",
              "address": "10.10.10.200",		//updated
    
              "enabled": true,					//updated
              "subnet-mask": "255.255.255.0"
            }
          ]
        }
      }
    ]
    Updating the second data tree


    Code Block
    titleCURL request to update
    second data treecode
    leaves of one list item in a list data node
    collapsetrue
    curl --location --request PATCH 'http://localhost:8080/cps/api/v1/dataspaces/testDataspace/anchors/sample/nodes?xpath=%2Finterface-B' \
    --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'Authorization: Basic Y3BzdXNlcjpjcHNyMGNrcyE=' --header 'Cookie: JSESSIONID=node0iyclt1syzfqj28jzo5qc5gks1.node0' \
    --data '{
            "int:interface": {
                "name": "Interface-B",
                "address": "10.10.10.200",			//value to be updated
                "subnet-mask": "255.255.255.10"		//value to be updated
            }
        }'

    Response 200 OK

    code
    Code Block
    titleUpdated data after making get request
    collapsetrue
    [
      {
        "int:interface-B": {
          "interface": [
            {
              "name": "Interface-B",
              "address": "10.10.10.200",		//updated
              "subnet-mask": "255.255.255.10"	//updated
            }
          ]
        }
      }
    ]


Inconsistencies with Patch Operation

...

Assuming the following data is in the data base, having one leaf node in each data tree

Code Block
{
  "first-container": {
    "a-leaf": "a-value"
  },
  "last-container": {
    "x-leaf": "x-value"
  }
}

An update operation is performed on both data trees as follows:

Code Block
collapsetrue
curl --location --request PATCH 'http://localhost:8080/cps/api/v1/dataspaces/testDataspace/anchors/multipleDataTree/nodes?xpath=%2F' --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'Authorization: Basic Y3BzdXNlcjpjcHNyMGNrcyE=' --header 'Cookie: JSESSIONID=node0kglnliqz1tzc1g0x6opgrphei0.node0' \
--data '{
  "first-container": {
    "a-leaf": "a-new-value"
  },
  "last-container": {
    "x-leaf": "x-new-value"
  }
}'

On performing a get operation, it is noticed that only first data tree gets updated

Code Block
collapsetrue
[
  {
    "multiple-data-tree:last-container": {
      "x-leaf": "x-new-value"
    }
  },
  {
    "multiple-data-tree:first-container": {
      "a-leaf": "a-value"
    }
  }
]

The same behavior is seen in the first scenario above, where if the leaves are updated and the list is left as it is. Then only the leaf node of second data tree gets updated.

When updating list node and leaf node under one container node, returns Status 200 but list data is not updated

When updating multiple list items under a list node, returns Status 200 but list data is not updated

((Note: This following finding was identified as an issue with list-nodes and not multiple data nodes. It is documented separately CPS-1383: Investigate CPS-Path for modifications of multiple fragments under an anchor.)

Assuming the following data is in the databse

Code Block
{
  "int:interface-A": {
    "domain": "false",
    "host-name": "host",
    "interface": [
      {
        "name": "Interface-A",
        "address": "10.10.10.200",
        "enabled": true,
        "subnet-mask": "255.255.255.0"
      }
    ]
  }
}

When performing update operation with xPath set as root

Code Block
curl --location --request PATCH 'http://localhost:8080/cps/api/v1/dataspaces/testDataspace/anchors/sample/nodes?xpath=%2F' --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'Authorization: Basic Y3BzdXNlcjpjcHNyMGNrcyE=' --header 'Cookie: JSESSIONID=node01ejoiyh1brii5zx8z9mk2r39l1.node0' \
--data '{
  "int:interface-A": {
    "domain": "false",
    "host-name": "New-Host",			//value to be updated 
    "interface": [
      {
        "name": "Interface-A",
        "address": "10.10.10.0",		//value to be updated
        "enabled": false,				//value to be updated
        "subnet-mask": "255.255.255.0"
      }
    ]
  }
}'

Status 200 OK is returned, but on performing the Get operation it is noticed only the leaf nodes get updated and list node remains as it is.

...