2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2023 Nordix Foundation
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the 'License');
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an 'AS IS' BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.cps.integration.performance.cps
23 import org.onap.cps.spi.exceptions.DataNodeNotFoundException
25 import java.time.OffsetDateTime
26 import org.onap.cps.api.CpsDataService
27 import org.onap.cps.integration.performance.base.CpsPerfTestBase
29 class DeletePerfTest extends CpsPerfTestBase {
31 CpsDataService objectUnderTest
33 def setup() { objectUnderTest = cpsDataService }
35 def 'Create test data (please note, subsequent tests depend on this running first).'() {
36 when: 'multiple anchors with a node with a large number of descendants is created'
38 def data = generateOpenRoadData(300)
39 addAnchorsWithData(10, CPS_PERFORMANCE_TEST_DATASPACE, LARGE_SCHEMA_SET, 'delete', data)
41 def setupDurationInSeconds = resourceMeter.getTotalTimeInSeconds()
42 then: 'setup duration is within expected time and memory used is within limit'
43 recordAndAssertResourceUsage('Delete test setup', 200, setupDurationInSeconds, 200, resourceMeter.getTotalMemoryUsageInMB())
46 def 'Delete 100 container nodes'() {
47 given: 'a list of xpaths to delete'
48 def xpathsToDelete = (1..100).collect {
49 "/openroadm-devices/openroadm-device[@device-id='C201-7-1A-" + it + "']/org-openroadm-device"
51 when: 'child nodes are deleted'
54 objectUnderTest.deleteDataNode(CPS_PERFORMANCE_TEST_DATASPACE, 'delete1', it, OffsetDateTime.now())
57 def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds()
58 then: 'delete duration is within expected time and memory used is within limit'
59 recordAndAssertResourceUsage('Delete 100 containers', 2, deleteDurationInSeconds, 30, resourceMeter.getTotalMemoryUsageInMB())
62 def 'Batch delete 100 container nodes'() {
63 given: 'a list of xpaths to delete'
64 def xpathsToDelete = (1..100).collect {
65 "/openroadm-devices/openroadm-device[@device-id='C201-7-1A-" + it + "']/org-openroadm-device"
67 when: 'child nodes are deleted'
69 objectUnderTest.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, 'delete2', xpathsToDelete, OffsetDateTime.now())
71 def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds()
72 then: 'delete duration is within expected time and memory used is within limit'
73 recordAndAssertResourceUsage('Batch delete 100 containers', 0.5, deleteDurationInSeconds, 5, resourceMeter.getTotalMemoryUsageInMB())
76 def 'Delete 100 list elements'() {
77 given: 'a list of xpaths to delete'
78 def xpathsToDelete = (1..100).collect {
79 "/openroadm-devices/openroadm-device[@device-id='C201-7-1A-" + it + "']"
81 when: 'list elements are deleted'
84 objectUnderTest.deleteDataNode(CPS_PERFORMANCE_TEST_DATASPACE, 'delete3', it, OffsetDateTime.now())
87 def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds()
88 then: 'delete duration is within expected time and memory used is within limit'
89 recordAndAssertResourceUsage('Delete 100 lists elements', 2, deleteDurationInSeconds, 20, resourceMeter.getTotalMemoryUsageInMB())
92 def 'Batch delete 100 list elements'() {
93 given: 'a list of xpaths to delete'
94 def xpathsToDelete = (1..100).collect {
95 "/openroadm-devices/openroadm-device[@device-id='C201-7-1A-" + it + "']"
97 when: 'list elements are deleted'
99 objectUnderTest.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, 'delete4', xpathsToDelete, OffsetDateTime.now())
101 def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds()
102 then: 'delete duration is within expected time and memory used is within limit'
103 recordAndAssertResourceUsage('Batch delete 100 lists elements', 0.5, deleteDurationInSeconds, 2, resourceMeter.getTotalMemoryUsageInMB())
106 def 'Delete 100 whole lists'() {
107 given: 'a list of xpaths to delete'
108 def xpathsToDelete = (1..100).collect {
109 "/openroadm-devices/openroadm-device[@device-id='C201-7-1A-" + it + "']/org-openroadm-device/degree"
111 when: 'lists are deleted'
112 resourceMeter.start()
113 xpathsToDelete.each {
114 objectUnderTest.deleteDataNode(CPS_PERFORMANCE_TEST_DATASPACE, 'delete5', it, OffsetDateTime.now())
117 def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds()
118 then: 'delete duration is within expected time and memory used is within limit'
119 recordAndAssertResourceUsage('Delete 100 whole lists', 5, deleteDurationInSeconds, 30, resourceMeter.getTotalMemoryUsageInMB())
122 def 'Batch delete 100 whole lists'() {
123 given: 'a list of xpaths to delete'
124 def xpathsToDelete = (1..100).collect {
125 "/openroadm-devices/openroadm-device[@device-id='C201-7-1A-" + it + "']/org-openroadm-device/degree"
127 when: 'lists are deleted'
128 resourceMeter.start()
129 objectUnderTest.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, 'delete6', xpathsToDelete, OffsetDateTime.now())
131 def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds()
132 then: 'delete duration is within expected time and memory used is within limit'
133 recordAndAssertResourceUsage('Batch delete 100 whole lists', 4, deleteDurationInSeconds, 5, resourceMeter.getTotalMemoryUsageInMB())
136 def 'Delete 1 large data node'() {
137 when: 'parent node is deleted'
138 resourceMeter.start()
139 objectUnderTest.deleteDataNode(CPS_PERFORMANCE_TEST_DATASPACE, 'delete7', '/openroadm-devices', OffsetDateTime.now())
141 def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds()
142 then: 'delete duration is within expected time and memory used is within limit'
143 recordAndAssertResourceUsage('Delete one large node', 2, deleteDurationInSeconds, 2, resourceMeter.getTotalMemoryUsageInMB())
146 def 'Delete root node with many descendants'() {
147 when: 'root node is deleted'
148 resourceMeter.start()
149 objectUnderTest.deleteDataNode(CPS_PERFORMANCE_TEST_DATASPACE, 'delete8', '/', OffsetDateTime.now())
151 def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds()
152 then: 'delete duration is within expected time and memory used is within limit'
153 recordAndAssertResourceUsage('Delete root node', 2, deleteDurationInSeconds, 2, resourceMeter.getTotalMemoryUsageInMB())
156 def 'Delete data nodes for an anchor'() {
157 when: 'data nodes are deleted'
158 resourceMeter.start()
159 objectUnderTest.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, 'delete9', OffsetDateTime.now())
161 def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds()
162 then: 'delete duration is within expected time and memory used is within limit'
163 recordAndAssertResourceUsage('Delete data nodes for anchor', 2, deleteDurationInSeconds, 2, resourceMeter.getTotalMemoryUsageInMB())
166 def 'Batch delete 100 non-existing nodes'() {
167 given: 'a list of xpaths to delete'
168 def xpathsToDelete = (1..100).collect { "/path/to/non-existing/node[@id='" + it + "']" }
169 when: 'child nodes are deleted'
170 resourceMeter.start()
172 objectUnderTest.deleteDataNodes(CPS_PERFORMANCE_TEST_DATASPACE, 'delete10', xpathsToDelete, OffsetDateTime.now())
173 } catch (DataNodeNotFoundException ignored) {}
175 def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds()
176 then: 'delete duration is within expected time and memory used is within limit'
177 recordAndAssertResourceUsage('Batch delete 100 non-existing', 7, deleteDurationInSeconds, 5, resourceMeter.getTotalMemoryUsageInMB())
180 def 'Clean up test data'() {
181 given: 'a list of anchors to delete'
182 def anchorNames = (1..10).collect {'delete' + it}
183 when: 'data nodes are deleted'
184 resourceMeter.start()
185 cpsAdminService.deleteAnchors(CPS_PERFORMANCE_TEST_DATASPACE, anchorNames)
187 def deleteDurationInSeconds = resourceMeter.getTotalTimeInSeconds()
188 then: 'delete duration is within expected time and memory used is within limit'
189 recordAndAssertResourceUsage('Delete test cleanup', 10, deleteDurationInSeconds, 2, resourceMeter.getTotalMemoryUsageInMB())