From bb3f8c2eb29c525eb35a43cfabfa05db4a5ef5d2 Mon Sep 17 00:00:00 2001 From: "halil.cakal" Date: Fri, 9 Jun 2023 14:58:00 +0100 Subject: Code to persist or update the yang model subscription into db - Change subscription persistence for subscription registry to handle adding or updating cm handles into db Issue-ID: CPS-1735 Change-Id: Icae609e810b2a097a4a174de1691892526f6b5c0 Signed-off-by: halil.cakal --- .../SubscriptionPersistenceSpec.groovy | 35 ++++++++++++---------- .../ncmp/api/impl/utils/DataNodeHelperSpec.groovy | 17 ++++++++++- 2 files changed, 36 insertions(+), 16 deletions(-) (limited to 'cps-ncmp-service/src/test/groovy/org/onap') diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/subscriptions/SubscriptionPersistenceSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/subscriptions/SubscriptionPersistenceSpec.groovy index a372abe6ff..ec54e8917a 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/subscriptions/SubscriptionPersistenceSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/subscriptions/SubscriptionPersistenceSpec.groovy @@ -34,6 +34,7 @@ class SubscriptionPersistenceSpec extends Specification { private static final String SUBSCRIPTION_DATASPACE_NAME = "NCMP-Admin"; private static final String SUBSCRIPTION_ANCHOR_NAME = "AVC-Subscriptions"; private static final String SUBSCRIPTION_REGISTRY_PARENT = "/subscription-registry"; + private static final String SUBSCRIPTION_REGISTRY_PREDICATES_XPATH = "/subscription-registry/subscription[@clientID='some-client-id' and @subscriptionName='some-subscription-name']/predicates"; def jsonObjectMapper = new JsonObjectMapper(new ObjectMapper()) def mockCpsDataService = Mock(CpsDataService) @@ -45,11 +46,11 @@ class SubscriptionPersistenceSpec extends Specification { def yangModelSubscriptionEvent = new YangModelSubscriptionEvent(clientId: 'some-client-id', subscriptionName: 'some-subscription-name', tagged: true, topic: 'some-topic', predicates: predicates) - def 'save a subscription event' () { - given: 'a data node that does not exist in db' + def 'save a subscription event as yang model into db for the #scenarios' () { + given: 'a blank data node that exist in db' def blankDataNode = new DataNodeBuilder().withDataspace('NCMP-Admin') .withAnchor('AVC-Subscriptions').withXpath('/subscription-registry').build() - and: 'cps data service return non existing data node' + and: 'cps data service return an empty data node' mockCpsDataService.getDataNodes(*_) >> [blankDataNode] when: 'the yangModelSubscriptionEvent is saved into db' objectUnderTest.saveSubscriptionEvent(yangModelSubscriptionEvent) @@ -63,24 +64,28 @@ class SubscriptionPersistenceSpec extends Specification { NO_TIMESTAMP) } - def 'update a subscription event' () { - given: 'a data node exist in db' + def 'add or replace cm handle list element into db' () { + given: 'a data node with child node exist in db' + def leaves1 = [status:'PENDING', cmHandleId:'cmhandle1'] as Map def childDataNode = new DataNodeBuilder().withDataspace('NCMP-Admin') - .withAnchor('AVC-Subscriptions').withXpath('/subscription-registry/subscription').build() + .withAnchor('AVC-Subscriptions').withXpath('/subscription-registry/subscription') + .withLeaves(leaves1).build() def engagedDataNode = new DataNodeBuilder().withDataspace('NCMP-Admin') .withAnchor('AVC-Subscriptions').withXpath('/subscription-registry') .withChildDataNodes([childDataNode]).build() - and: 'cps data service return existing data node' + and: 'cps data service return data node including a child data node' mockCpsDataService.getDataNodes(*_) >> [engagedDataNode] - when: 'the yangModelSubscriptionEvent is saved into db' + and: 'cps data service return data node for querying by xpaths' + mockCpsDataService.getDataNodesForMultipleXpaths(*_) >> [engagedDataNode] + when: 'the yang model subscription event is saved into db' objectUnderTest.saveSubscriptionEvent(yangModelSubscriptionEvent) - then: 'the cpsDataService update operation is called with the correct data' - 1 * mockCpsDataService.updateDataNodeAndDescendants(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_ANCHOR_NAME, - SUBSCRIPTION_REGISTRY_PARENT, - '{"subscription":[{' + - '"topic":"some-topic",' + - '"predicates":{"datastore":"some-datastore","targetCmHandles":[{"cmHandleId":"cmhandle1","status":"PENDING"},{"cmHandleId":"cmhandle2","status":"PENDING"}]},' + - '"clientID":"some-client-id","subscriptionName":"some-subscription-name","isTagged":true}]}', + then: 'the cpsDataService save non-existing cm handle with the correct data' + 1 * mockCpsDataService.saveListElements(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_ANCHOR_NAME, + SUBSCRIPTION_REGISTRY_PREDICATES_XPATH, '{"targetCmHandles":[{"cmHandleId":"cmhandle2","status":"PENDING"}]}', + NO_TIMESTAMP) + and: 'the cpsDataService update existing cm handle with the correct data' + 1 * mockCpsDataService.updateNodeLeaves(SUBSCRIPTION_DATASPACE_NAME, SUBSCRIPTION_ANCHOR_NAME, + SUBSCRIPTION_REGISTRY_PREDICATES_XPATH, '{"targetCmHandles":[{"cmHandleId":"cmhandle1","status":"PENDING"}]}', NO_TIMESTAMP) } diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/utils/DataNodeHelperSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/utils/DataNodeHelperSpec.groovy index e527ae12bb..ee726a908e 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/utils/DataNodeHelperSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/utils/DataNodeHelperSpec.groovy @@ -20,6 +20,7 @@ package org.onap.cps.ncmp.api.impl.utils +import org.onap.cps.ncmp.api.impl.subscriptions.SubscriptionStatus import org.onap.cps.spi.model.DataNodeBuilder class DataNodeHelperSpec extends DataNodeBaseSpec { @@ -51,8 +52,22 @@ class DataNodeHelperSpec extends DataNodeBaseSpec { and: 'the nested data node is flatten and retrieves the leaves ' def leaves = DataNodeHelper.getDataNodeLeaves([dataNode]) when:'cm handle id to status is retrieved' - def result = DataNodeHelper.getCmHandleIdToStatus(leaves); + def result = DataNodeHelper.getCmHandleIdToStatus(leaves) then: 'the result list size is 3' result.size() == 3 + and: 'the result contains expected values' + result[0] as List == ['PENDING', 'CMHandle3'] + result[1] as List == ['ACCEPTED', 'CMHandle2'] + result[2] as List == ['REJECTED', 'CMHandle1'] + } + + def 'Get cm handle id to status map as expected from list of collection' () { + given: 'a list of collection' + def cmHandleCollection = [['PENDING', 'CMHandle3'], ['ACCEPTED', 'CMHandle2'], ['REJECTED', 'CMHandle1']] + when: 'the map is formed up with a method call' + def result = DataNodeHelper.getCmHandleIdToStatusMap(cmHandleCollection) + then: 'the map values are as expected' + result.keySet() == ['CMHandle3', 'CMHandle2', 'CMHandle1'] as Set + result.values() as List == [SubscriptionStatus.PENDING, SubscriptionStatus.ACCEPTED, SubscriptionStatus.REJECTED] } } -- cgit 1.2.3-korg