Remove inefficient saveListElementsBatch API
[cps.git] / integration-test / src / test / groovy / org / onap / cps / integration / performance / cps / WritePerfTest.groovy
index 419ec60..1898f43 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  ============LICENSE_START=======================================================
- *  Copyright (C) 2023 Nordix Foundation
+ *  Copyright (C) 2023-2024 Nordix Foundation
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the 'License');
  *  you may not use this file except in compliance with the License.
@@ -25,59 +25,85 @@ import org.onap.cps.integration.performance.base.CpsPerfTestBase
 
 class WritePerfTest extends CpsPerfTestBase {
 
+    static final def WRITE_TEST_ANCHOR = 'writeTestAnchor'
+
     def 'Writing openroadm data has linear time.'() {
         given: 'an empty anchor exists for openroadm'
-            cpsAdminService.createAnchor(CPS_PERFORMANCE_TEST_DATASPACE, LARGE_SCHEMA_SET, 'writeAnchor')
+            cpsAnchorService.createAnchor(CPS_PERFORMANCE_TEST_DATASPACE, LARGE_SCHEMA_SET, WRITE_TEST_ANCHOR)
         and: 'a list of device nodes to add'
             def jsonData = generateOpenRoadData(totalNodes)
         when: 'device nodes are added'
-            stopWatch.start()
-            cpsDataService.saveData(CPS_PERFORMANCE_TEST_DATASPACE, 'writeAnchor', jsonData, OffsetDateTime.now())
-            stopWatch.stop()
-            def durationInMillis = stopWatch.getTotalTimeMillis()
-        then: 'the operation takes less than #expectedDuration'
-            recordAndAssertPerformance("Writing ${totalNodes} devices", expectedDuration, durationInMillis)
+            resourceMeter.start()
+            cpsDataService.saveData(CPS_PERFORMANCE_TEST_DATASPACE, WRITE_TEST_ANCHOR, jsonData, OffsetDateTime.now())
+            resourceMeter.stop()
+        then: 'the operation takes less than #expectedDuration and memory used is within limit'
+            recordAndAssertResourceUsage("Writing ${totalNodes} devices",
+                    expectedDuration, resourceMeter.getTotalTimeInSeconds(),
+                    memoryLimit, resourceMeter.getTotalMemoryUsageInMB())
         cleanup:
-            cpsDataService.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, 'writeAnchor', OffsetDateTime.now())
-            cpsAdminService.deleteAnchor(CPS_PERFORMANCE_TEST_DATASPACE, 'writeAnchor')
+            cpsDataService.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, WRITE_TEST_ANCHOR, OffsetDateTime.now())
+            cpsAnchorService.deleteAnchor(CPS_PERFORMANCE_TEST_DATASPACE, WRITE_TEST_ANCHOR)
         where:
-            totalNodes || expectedDuration
-            50         ||   2_500
-            100        ||   4_000
-            200        ||   8_000
-            400        ||  16_000
-//          800        ||  32_000
-//          1600       ||  64_000
-//          3200       || 128_000
+            totalNodes || expectedDuration | memoryLimit
+            50         || 4                | 100
+            100        || 7                | 200
+            200        || 14               | 400
+            400        || 28               | 500
     }
 
     def 'Writing bookstore data has exponential time.'() {
         given: 'an anchor containing a bookstore with a single category'
-            cpsAdminService.createAnchor(CPS_PERFORMANCE_TEST_DATASPACE, BOOKSTORE_SCHEMA_SET, 'writeAnchor')
+            cpsAnchorService.createAnchor(CPS_PERFORMANCE_TEST_DATASPACE, BOOKSTORE_SCHEMA_SET, WRITE_TEST_ANCHOR)
             def parentNodeData = '{"bookstore": { "categories": [{ "code": 1, "name": "Test", "books" : [] }] }}'
-            cpsDataService.saveData(CPS_PERFORMANCE_TEST_DATASPACE, 'writeAnchor', parentNodeData, OffsetDateTime.now())
+            cpsDataService.saveData(CPS_PERFORMANCE_TEST_DATASPACE, WRITE_TEST_ANCHOR, parentNodeData, OffsetDateTime.now())
         and: 'a list of books to add'
             def booksData = '{"books":[' + (1..totalBooks).collect {'{ "title": "' + it + '" }' }.join(',') + ']}'
         when: 'books are added'
-            stopWatch.start()
-            cpsDataService.saveData(CPS_PERFORMANCE_TEST_DATASPACE, 'writeAnchor', '/bookstore/categories[@code=1]', booksData, OffsetDateTime.now())
-            stopWatch.stop()
-            def durationInMillis = stopWatch.getTotalTimeMillis()
-        then: 'the operation takes less than #expectedDuration'
-            recordAndAssertPerformance("Writing ${totalBooks} books", expectedDuration, durationInMillis)
+            resourceMeter.start()
+            cpsDataService.saveData(CPS_PERFORMANCE_TEST_DATASPACE, WRITE_TEST_ANCHOR, '/bookstore/categories[@code=1]', booksData, OffsetDateTime.now())
+            resourceMeter.stop()
+        then: 'the operation takes less than #expectedDuration and memory used is within limit'
+            recordAndAssertResourceUsage("Writing ${totalBooks} books",
+                    expectedDuration, resourceMeter.getTotalTimeInSeconds(),
+                    memoryLimit, resourceMeter.getTotalMemoryUsageInMB())
+        cleanup:
+            cpsDataService.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, WRITE_TEST_ANCHOR, OffsetDateTime.now())
+            cpsAnchorService.deleteAnchor(CPS_PERFORMANCE_TEST_DATASPACE, WRITE_TEST_ANCHOR)
+        where:
+            totalBooks || expectedDuration | memoryLimit
+            800        || 1                | 50
+            1600       || 2                | 100
+            3200       || 6                | 150
+            6400       || 18               | 200
+    }
+
+    def 'Writing openroadm list data using saveListElements.'() {
+        given: 'an anchor and empty container node for openroadm'
+            cpsAnchorService.createAnchor(CPS_PERFORMANCE_TEST_DATASPACE, LARGE_SCHEMA_SET, WRITE_TEST_ANCHOR)
+            cpsDataService.saveData(CPS_PERFORMANCE_TEST_DATASPACE, WRITE_TEST_ANCHOR,
+                    '{ "openroadm-devices": { "openroadm-device": []}}', now)
+        and: 'a list of device nodes to add'
+            def innerNode = readResourceDataFile('openroadm/innerNode.json')
+            def jsonListData = '{ "openroadm-device": [' +
+                    (1..totalNodes).collect { innerNode.replace('NODE_ID_HERE', it.toString()) }.join(',') +
+                    ']}'
+        when: 'device nodes are added'
+            resourceMeter.start()
+            cpsDataService.saveListElements(CPS_PERFORMANCE_TEST_DATASPACE, WRITE_TEST_ANCHOR, '/openroadm-devices', jsonListData, OffsetDateTime.now())
+            resourceMeter.stop()
+        then: 'the operation takes less than #expectedDuration and memory used is within limit'
+            recordAndAssertResourceUsage("Saving list of ${totalNodes} devices",
+                    expectedDuration, resourceMeter.getTotalTimeInSeconds(),
+                    memoryLimit, resourceMeter.getTotalMemoryUsageInMB())
         cleanup:
-            cpsDataService.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, 'writeAnchor', OffsetDateTime.now())
-            cpsAdminService.deleteAnchor(CPS_PERFORMANCE_TEST_DATASPACE, 'writeAnchor')
+            cpsDataService.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, WRITE_TEST_ANCHOR, OffsetDateTime.now())
+            cpsAnchorService.deleteAnchor(CPS_PERFORMANCE_TEST_DATASPACE, WRITE_TEST_ANCHOR)
         where:
-            totalBooks || expectedDuration
-            400        ||     200
-            800        ||     500
-            1600       ||   1_000
-            3200       ||   2_500
-            6400       ||  10_000
-//          12800      ||  30_000
-//          25600      || 120_000
-//          51200      || 600_000
+            totalNodes || expectedDuration | memoryLimit
+            50         || 4                | 200
+            100        || 7                | 200
+            200        || 14               | 250
+            400        || 28               | 250
     }
 
 }