X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=integration-test%2Fsrc%2Ftest%2Fgroovy%2Forg%2Fonap%2Fcps%2Fintegration%2Fperformance%2Fcps%2FDeletePerfTest.groovy;h=f76c3c51595821ace629575d7cffef5687bfd234;hb=42caeaf4c870f7ab7ae8ee6216dfc389fcccc92d;hp=db36b8809b4a6fdb079b5df7dda205c550018106;hpb=4adc3d8bf9a6d4a75ecdc32b654749abbb22ff1d;p=cps.git diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/DeletePerfTest.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/DeletePerfTest.groovy index db36b8809..f76c3c515 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/DeletePerfTest.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/DeletePerfTest.groovy @@ -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. @@ -20,6 +20,8 @@ package org.onap.cps.integration.performance.cps +import org.onap.cps.spi.exceptions.DataNodeNotFoundException + import java.time.OffsetDateTime import org.onap.cps.api.CpsDataService import org.onap.cps.integration.performance.base.CpsPerfTestBase @@ -32,139 +34,159 @@ class DeletePerfTest extends CpsPerfTestBase { def 'Create test data (please note, subsequent tests depend on this running first).'() { when: 'multiple anchors with a node with a large number of descendants is created' - stopWatch.start() - def data = generateOpenRoadData(50) - addAnchorsWithData(9, CPS_PERFORMANCE_TEST_DATASPACE, LARGE_SCHEMA_SET, 'delete', data) - stopWatch.stop() - def setupDurationInMillis = stopWatch.getTotalTimeMillis() - then: 'setup duration is under 40 seconds' - recordAndAssertPerformance('Delete test setup', 40_000, setupDurationInMillis) + resourceMeter.start() + def data = generateOpenRoadData(300) + addAnchorsWithData(10, CPS_PERFORMANCE_TEST_DATASPACE, LARGE_SCHEMA_SET, 'delete', data) + resourceMeter.stop() + def setupDurationInSeconds = resourceMeter.getTotalTimeInSeconds() + then: 'setup duration is within expected time and memory used is within limit' + recordAndAssertResourceUsage('Delete test setup', 100, setupDurationInSeconds, 800, resourceMeter.getTotalMemoryUsageInMB()) } - def 'Delete 10 container nodes'() { + def 'Delete 100 container nodes'() { + given: 'a list of xpaths to delete' + def xpathsToDelete = (1..100).collect { + "/openroadm-devices/openroadm-device[@device-id='C201-7-1A-" + it + "']/org-openroadm-device" + } when: 'child nodes are deleted' - stopWatch.start() - (1..10).each { - def childPath = "/openroadm-devices/openroadm-device[@device-id='C201-7-1A-" + it + "']/org-openroadm-device" - objectUnderTest.deleteDataNode(CPS_PERFORMANCE_TEST_DATASPACE, 'delete1', childPath, OffsetDateTime.now()) + resourceMeter.start() + xpathsToDelete.each { + objectUnderTest.deleteDataNode(CPS_PERFORMANCE_TEST_DATASPACE, 'delete1', it, OffsetDateTime.now()) } - stopWatch.stop() - def deleteDurationInMillis = stopWatch.getTotalTimeMillis() - then: 'delete duration is under 300 milliseconds' - recordAndAssertPerformance('Delete 10 containers', 300, deleteDurationInMillis) + resourceMeter.stop() + def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds() + then: 'delete duration is within expected time and memory used is within limit' + recordAndAssertResourceUsage('Delete 100 containers', 2.2, deleteDurationInSeconds, 20, resourceMeter.getTotalMemoryUsageInMB()) } - def 'Batch delete 50 container nodes'() { + def 'Batch delete 100 container nodes'() { given: 'a list of xpaths to delete' - def xpathsToDelete = (1..50).collect { + def xpathsToDelete = (1..100).collect { "/openroadm-devices/openroadm-device[@device-id='C201-7-1A-" + it + "']/org-openroadm-device" } when: 'child nodes are deleted' - stopWatch.start() + resourceMeter.start() objectUnderTest.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, 'delete2', xpathsToDelete, OffsetDateTime.now()) - stopWatch.stop() - def deleteDurationInMillis = stopWatch.getTotalTimeMillis() - then: 'delete duration is under 300 milliseconds' - recordAndAssertPerformance('Batch delete 50 containers', 300, deleteDurationInMillis) + resourceMeter.stop() + def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds() + then: 'delete duration is within expected time and memory used is within limit' + recordAndAssertResourceUsage('Batch delete 100 containers', 0.7, deleteDurationInSeconds, 2, resourceMeter.getTotalMemoryUsageInMB()) } - def 'Delete 20 list elements'() { + def 'Delete 100 list elements'() { + given: 'a list of xpaths to delete' + def xpathsToDelete = (1..100).collect { + "/openroadm-devices/openroadm-device[@device-id='C201-7-1A-" + it + "']" + } when: 'list elements are deleted' - stopWatch.start() - (1..20).each { - def listElementXpath = "/openroadm-devices/openroadm-device[@device-id='C201-7-1A-1']/org-openroadm-device/degree[@degree-number=" + it + "]" - objectUnderTest.deleteDataNode(CPS_PERFORMANCE_TEST_DATASPACE, 'delete3', listElementXpath, OffsetDateTime.now()) + resourceMeter.start() + xpathsToDelete.each { + objectUnderTest.deleteDataNode(CPS_PERFORMANCE_TEST_DATASPACE, 'delete3', it, OffsetDateTime.now()) } - stopWatch.stop() - def deleteDurationInMillis = stopWatch.getTotalTimeMillis() - then: 'delete duration is under 300 milliseconds' - recordAndAssertPerformance('Delete 20 lists elements', 300, deleteDurationInMillis) + resourceMeter.stop() + def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds() + then: 'delete duration is within expected time and memory used is within limit' + recordAndAssertResourceUsage('Delete 100 lists elements', 2.1, deleteDurationInSeconds, 20, resourceMeter.getTotalMemoryUsageInMB()) } - def 'Batch delete 1000 list elements'() { + def 'Batch delete 100 list elements'() { given: 'a list of xpaths to delete' - def xpathsToDelete = [] - for (int childIndex = 1; childIndex <= 50; childIndex++) { - xpathsToDelete.addAll((1..20).collect { - "/openroadm-devices/openroadm-device[@device-id='C201-7-1A-${childIndex}']/org-openroadm-device/degree[@degree-number=${it}]".toString() - }) + def xpathsToDelete = (1..100).collect { + "/openroadm-devices/openroadm-device[@device-id='C201-7-1A-" + it + "']" } when: 'list elements are deleted' - stopWatch.start() + resourceMeter.start() objectUnderTest.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, 'delete4', xpathsToDelete, OffsetDateTime.now()) - stopWatch.stop() - def deleteDurationInMillis = stopWatch.getTotalTimeMillis() - then: 'delete duration is under 300 milliseconds' - recordAndAssertPerformance('Batch delete 1000 lists elements', 300, deleteDurationInMillis) + resourceMeter.stop() + def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds() + then: 'delete duration is within expected time and memory used is within limit' + recordAndAssertResourceUsage('Batch delete 100 lists elements', 0.7, deleteDurationInSeconds, 2, resourceMeter.getTotalMemoryUsageInMB()) } - def 'Delete 10 whole lists'() { + def 'Delete 100 whole lists'() { + given: 'a list of xpaths to delete' + def xpathsToDelete = (1..100).collect { + "/openroadm-devices/openroadm-device[@device-id='C201-7-1A-" + it + "']/org-openroadm-device/degree" + } when: 'lists are deleted' - stopWatch.start() - (1..10).each { - def childPath = "/openroadm-devices/openroadm-device[@device-id='C201-7-1A-" + it + "']/org-openroadm-device/degree" - objectUnderTest.deleteDataNode(CPS_PERFORMANCE_TEST_DATASPACE, 'delete5', childPath, OffsetDateTime.now()) + resourceMeter.start() + xpathsToDelete.each { + objectUnderTest.deleteDataNode(CPS_PERFORMANCE_TEST_DATASPACE, 'delete5', it, OffsetDateTime.now()) } - stopWatch.stop() - def deleteDurationInMillis = stopWatch.getTotalTimeMillis() - then: 'delete duration is under 300 milliseconds' - recordAndAssertPerformance('Delete 10 whole lists', 300, deleteDurationInMillis) + resourceMeter.stop() + def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds() + then: 'delete duration is within expected time and memory used is within limit' + recordAndAssertResourceUsage('Delete 100 whole lists', 4, deleteDurationInSeconds, 20, resourceMeter.getTotalMemoryUsageInMB()) } - def 'Batch delete 30 whole lists'() { + def 'Batch delete 100 whole lists'() { given: 'a list of xpaths to delete' - def xpathsToDelete = (1..30).collect { + def xpathsToDelete = (1..100).collect { "/openroadm-devices/openroadm-device[@device-id='C201-7-1A-" + it + "']/org-openroadm-device/degree" } when: 'lists are deleted' - stopWatch.start() + resourceMeter.start() objectUnderTest.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, 'delete6', xpathsToDelete, OffsetDateTime.now()) - stopWatch.stop() - def deleteDurationInMillis = stopWatch.getTotalTimeMillis() - then: 'delete duration is under 300 milliseconds' - recordAndAssertPerformance('Batch delete 30 whole lists', 300, deleteDurationInMillis) + resourceMeter.stop() + def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds() + then: 'delete duration is within expected time and memory used is within limit' + recordAndAssertResourceUsage('Batch delete 100 whole lists', 3, deleteDurationInSeconds, 3, resourceMeter.getTotalMemoryUsageInMB()) } def 'Delete 1 large data node'() { when: 'parent node is deleted' - stopWatch.start() + resourceMeter.start() objectUnderTest.deleteDataNode(CPS_PERFORMANCE_TEST_DATASPACE, 'delete7', '/openroadm-devices', OffsetDateTime.now()) - stopWatch.stop() - def deleteDurationInMillis = stopWatch.getTotalTimeMillis() - then: 'delete duration is under 300 milliseconds' - recordAndAssertPerformance('Delete one large node', 300, deleteDurationInMillis) + resourceMeter.stop() + def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds() + then: 'delete duration is within expected time and memory used is within limit' + recordAndAssertResourceUsage('Delete one large node', 2, deleteDurationInSeconds, 1, resourceMeter.getTotalMemoryUsageInMB()) } def 'Delete root node with many descendants'() { when: 'root node is deleted' - stopWatch.start() + resourceMeter.start() objectUnderTest.deleteDataNode(CPS_PERFORMANCE_TEST_DATASPACE, 'delete8', '/', OffsetDateTime.now()) - stopWatch.stop() - def deleteDurationInMillis = stopWatch.getTotalTimeMillis() - then: 'delete duration is under 300 milliseconds' - recordAndAssertPerformance('Delete root node', 300, deleteDurationInMillis) + resourceMeter.stop() + def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds() + then: 'delete duration is within expected time and memory used is within limit' + recordAndAssertResourceUsage('Delete root node', 2, deleteDurationInSeconds, 1, resourceMeter.getTotalMemoryUsageInMB()) } def 'Delete data nodes for an anchor'() { when: 'data nodes are deleted' - stopWatch.start() + resourceMeter.start() objectUnderTest.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, 'delete9', OffsetDateTime.now()) - stopWatch.stop() - def deleteDurationInMillis = stopWatch.getTotalTimeMillis() - then: 'delete duration is under 300 milliseconds' - recordAndAssertPerformance('Delete data nodes for anchor', 300, deleteDurationInMillis) + resourceMeter.stop() + def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds() + then: 'delete duration is within expected time and memory used is within limit' + recordAndAssertResourceUsage('Delete data nodes for anchor', 1.9, deleteDurationInSeconds, 1, resourceMeter.getTotalMemoryUsageInMB()) + } + + def 'Batch delete 100 non-existing nodes'() { + given: 'a list of xpaths to delete' + def xpathsToDelete = (1..100).collect { "/path/to/non-existing/node[@id='" + it + "']" } + when: 'child nodes are deleted' + resourceMeter.start() + try { + objectUnderTest.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, 'delete10', xpathsToDelete, OffsetDateTime.now()) + } catch (DataNodeNotFoundException ignored) {} + resourceMeter.stop() + def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds() + then: 'delete duration is within expected time and memory used is within limit' + recordAndAssertResourceUsage('Batch delete 100 non-existing', 1, deleteDurationInSeconds, 3, resourceMeter.getTotalMemoryUsageInMB()) } def 'Clean up test data'() { given: 'a list of anchors to delete' - def anchorNames = (1..9).collect {'delete' + it} + def anchorNames = (1..10).collect {'delete' + it} when: 'data nodes are deleted' - stopWatch.start() - cpsAdminService.deleteAnchors(CPS_PERFORMANCE_TEST_DATASPACE, anchorNames) - stopWatch.stop() - def deleteDurationInMillis = stopWatch.getTotalTimeMillis() - then: 'delete duration is under 1000 milliseconds' - recordAndAssertPerformance('Delete test cleanup', 1000, deleteDurationInMillis) + resourceMeter.start() + cpsAnchorService.deleteAnchors(CPS_PERFORMANCE_TEST_DATASPACE, anchorNames) + resourceMeter.stop() + def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds() + then: 'delete duration is within expected time and memory used is within limit' + recordAndAssertResourceUsage('Delete test cleanup', 10, deleteDurationInSeconds, 1, resourceMeter.getTotalMemoryUsageInMB()) } }