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 "/"

    CURL request to update all data trees

    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=node0iyclt1syzfqj28jzo5qc5gks1.node0' \
    --data '{
      "multiple-data-tree:interface-A": {
        "host-name": "host-A",
        "interface": [
          {
            "name": "Interface-A",
            "address": "10.10.10.100",         //Updated Value
            "subnet-mask": "255.255.255.25",   //Updated Value
            "enabled": false
          }
        ],
        "domain": "true"
      },
      "multiple-data-tree:interface-B": {
        "interface": [
          {
            "name": "Interface-B",
            "address": "10.10.10.100",       //Updated Value
            "subnet-mask": "255.255.255.0"
          }
        ]
      }
    }'

    Response: 500 Server Error

    Code Block
    {
        "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."
    }


    On performing Get operation we get the following JSON data

    Code Block
    [
        {
            "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 tree
    CURL request to update first data tree

    Code Block
    curl --location --request PATCH 'http://localhost:8080/cps/api/v1/dataspaces/testDataspace/anchors/sample/nodes?xpath=%2Finterface-A' \
    --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'Authorization: Basic Y3BzdXNlcjpjcHNyMGNrcyE=' --header 'Cookie: JSESSIONID=node0iyclt1syzfqj28jzo5qc5gks1.node0' \
    --data '{
            "int:interface": {
                "name": "Interface-A",
                "address": "10.10.10.200",
                "enabled": true,
                "subnet-mask": "255.255.255.0"
            }
        }'

    Response 200 OK
    Updated data after making get request

    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"
            }
          ]
        }
      }
    ]


  3. Updating the second data tree
    CURL request to update second data tree

    Code Block
    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",
                "subnet-mask": "255.255.255.10"
            }
        }'

    Response 200 OK
    Updated data after making get request

    Code Block
    [
      {
        "int:interface-B": {
          "interface": [
            {
              "name": "Interface-B",
              "address": "10.10.10.200",
              "subnet-mask": "255.255.255.10"
            }
          ]
        }
      }
    ]


Inconsistencies with Patch Operation

When updating multiple data trees with only leaf nodes

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
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
[
  {
    "multiple-data-tree:last-container": {
      "x-leaf": "x-new-value"
    }
  },
  {
    "multiple-data-tree:first-container": {
      "a-leaf": "a-value"
    }
  }
]

When updating list node with xpath set as root node xpath "/", returns Status 200 but data is not updated

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",      		//updated value 
    "interface": [
      {
        "name": "Interface-A",
        "address": "10.10.10.0",   	    //updated value
        "enabled": false,			    //updated value
        "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.

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