You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 7 Next »

Initial Findings

It is found that the current Patch operation in CPS core can only update value of one data tree at a time. So if there are multiple data trees under an anchor and a Patch is performed on all the data trees using root node xPath "/" then only the first data tree gets updated and the remaining data trees remain as it is,

Based on the above outcome, another test to update individual data trees was preformed, and it was found that when a specific data tree is being updated using its specific xPath none of the data trees get updated and a 400 BAD REQUEST is received.

Decisions

To be added

JSON Data Stored in CPS DB using POST operation

The following JSON data was first stored in CPS DB, then to test the GET operation:

{
  "multiple-data-tree:interface-A": {
    "host-name": "host",
    "interface": [
      {
        "name": "Interface-A",
        "address": "10.10.10.1",
        "subnet-mask": "255.255.255.0",
        "enabled": false
      }
    ],
    "domain": "false"
  },
  "multiple-data-tree:interface-B": {
    "interface": [
      {
        "name": "Interface-B",
        "address": "10.10.10.1",
        "subnet-mask": "255.255.255.0"
      }
    ]
  }
}

Analysis of Patch operation (Update node leaves)

Currently after multiple data trees are stored in CPS DB. On performing the Patch operation on the same data, with xpath set as root "/", the first data tree is only updated by the Patch operation. To test this following scenarios were performed:

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

    CURL request to update all data trees

    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

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

    [
        {
            "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

    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

    [
      {
        "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

    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

    [
      {
        "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

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

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

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

[
  {
    "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

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

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.

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





  • No labels