diff options
66 files changed, 986 insertions, 397 deletions
diff --git a/cps-application/src/main/java/org/onap/cps/config/MicroMeterConfig.java b/cps-application/src/main/java/org/onap/cps/config/MicroMeterConfig.java index 22194f3ad8..39ed6ef5a7 100644 --- a/cps-application/src/main/java/org/onap/cps/config/MicroMeterConfig.java +++ b/cps-application/src/main/java/org/onap/cps/config/MicroMeterConfig.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2023 Nordix Foundation. + * Copyright (C) 2023-2025 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,17 +20,100 @@ package org.onap.cps.config; +import com.hazelcast.map.IMap; import io.micrometer.core.aop.TimedAspect; +import io.micrometer.core.instrument.Gauge; import io.micrometer.core.instrument.MeterRegistry; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration +@RequiredArgsConstructor public class MicroMeterConfig { + private static final String TAG = "state"; + private static final String CMHANDLE_STATE_GAUGE = "cmHandlesByState"; + final IMap<String, Integer> cmHandlesByState; + + @Bean + public TimedAspect timedAspect(final MeterRegistry meterRegistry) { + return new TimedAspect(meterRegistry); + } + + /** + * Register gauge metric for cm handles with state 'advised'. + * + * @param meterRegistry meter registry + * @return cm handle state gauge + */ + @Bean + public Gauge advisedCmHandles(final MeterRegistry meterRegistry) { + return Gauge.builder(CMHANDLE_STATE_GAUGE, cmHandlesByState, + value -> cmHandlesByState.get("advisedCmHandlesCount")) + .tag(TAG, "ADVISED") + .description("Current number of cmhandles in advised state") + .register(meterRegistry); + } + + /** + * Register gauge metric for cm handles with state 'ready'. + * + * @param meterRegistry meter registry + * @return cm handle state gauge + */ + @Bean + public Gauge readyCmHandles(final MeterRegistry meterRegistry) { + return Gauge.builder(CMHANDLE_STATE_GAUGE, cmHandlesByState, + value -> cmHandlesByState.get("readyCmHandlesCount")) + .tag(TAG, "READY") + .description("Current number of cmhandles in ready state") + .register(meterRegistry); + } + + /** + * Register gauge metric for cm handles with state 'locked'. + * + * @param meterRegistry meter registry + * @return cm handle state gauge + */ + @Bean + public Gauge lockedCmHandles(final MeterRegistry meterRegistry) { + return Gauge.builder(CMHANDLE_STATE_GAUGE, cmHandlesByState, + value -> cmHandlesByState.get("lockedCmHandlesCount")) + .tag(TAG, "LOCKED") + .description("Current number of cmhandles in locked state") + .register(meterRegistry); + } + + /** + * Register gauge metric for cm handles with state 'deleting'. + * + * @param meterRegistry meter registry + * @return cm handle state gauge + */ + @Bean + public Gauge deletingCmHandles(final MeterRegistry meterRegistry) { + return Gauge.builder(CMHANDLE_STATE_GAUGE, cmHandlesByState, + value -> cmHandlesByState.get("deletingCmHandlesCount")) + .tag(TAG, "DELETING") + .description("Current number of cmhandles in deleting state") + .register(meterRegistry); + } + + /** + * Register gauge metric for cm handles with state 'deleted'. + * + * @param meterRegistry meter registry + * @return cm handle state gauge + */ @Bean - public TimedAspect timedAspect(final MeterRegistry registry) { - return new TimedAspect(registry); + public Gauge deletedCmHandles(final MeterRegistry meterRegistry) { + return Gauge.builder(CMHANDLE_STATE_GAUGE, cmHandlesByState, + value -> cmHandlesByState.get("deletedCmHandlesCount")) + .tag(TAG, "DELETED") + .description("Current number of cmhandles in deleted state") + .register(meterRegistry); } } diff --git a/cps-application/src/main/resources/application.yml b/cps-application/src/main/resources/application.yml index d7e39f7fae..573db1fb10 100644 --- a/cps-application/src/main/resources/application.yml +++ b/cps-application/src/main/resources/application.yml @@ -1,8 +1,8 @@ # ============LICENSE_START======================================================= # Copyright (C) 2021 Pantheon.tech # Modifications Copyright (C) 2021-2022 Bell Canada -# Modifications Copyright (C) 2021-2024 Nordix Foundation # Modifications Copyright (C) 2024 TechMahindra Ltd +# Modifications Copyright (C) 2021-2025 Nordix Foundation # ================================================================================ # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -172,7 +172,7 @@ management: endpoints: web: exposure: - include: info,health,loggers,prometheus + include: info,health,loggers,prometheus,metrics endpoint: health: show-details: always diff --git a/cps-application/src/test/groovy/org/onap/cps/config/MicroMeterConfigSpec.groovy b/cps-application/src/test/groovy/org/onap/cps/config/MicroMeterConfigSpec.groovy index 61bc2cf027..67ca64624a 100644 --- a/cps-application/src/test/groovy/org/onap/cps/config/MicroMeterConfigSpec.groovy +++ b/cps-application/src/test/groovy/org/onap/cps/config/MicroMeterConfigSpec.groovy @@ -1,6 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2023 Nordix Foundation. + * Copyright (C) 2023-2025 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,16 +20,36 @@ package org.onap.cps.config +import com.hazelcast.map.IMap import io.micrometer.core.instrument.simple.SimpleMeterRegistry import spock.lang.Specification class MicroMeterConfigSpec extends Specification { - def objectUnderTest = new MicroMeterConfig() + def cmHandlesByState = Mock(IMap) + def objectUnderTest = new MicroMeterConfig(cmHandlesByState) + def simpleMeterRegistry = new SimpleMeterRegistry() - def 'Creating a tined aspect.'() { + def 'Creating a timed aspect.'() { expect: ' a timed aspect can be created' - assert objectUnderTest.timedAspect(new SimpleMeterRegistry()) != null + assert objectUnderTest.timedAspect(simpleMeterRegistry) != null + } + + def 'Creating gauges for cm handle states.'() { + given: 'cache returns value for each state' + cmHandlesByState.get(_) >> 1 + when: 'gauges for each state are created' + objectUnderTest.advisedCmHandles(simpleMeterRegistry) + objectUnderTest.readyCmHandles(simpleMeterRegistry) + objectUnderTest.lockedCmHandles(simpleMeterRegistry) + objectUnderTest.deletingCmHandles(simpleMeterRegistry) + objectUnderTest.deletedCmHandles(simpleMeterRegistry) + then: 'each state has the correct value when queried' + def states = ["ADVISED", "READY", "LOCKED", "DELETING", "DELETED"] + states.each { state -> + def gaugeValue = simpleMeterRegistry.get("cmHandlesByState").tag("state",state).gauge().value() + assert gaugeValue == 1 + } } } diff --git a/cps-dependencies/pom.xml b/cps-dependencies/pom.xml index e9962351f0..5783ef7fcd 100644 --- a/cps-dependencies/pom.xml +++ b/cps-dependencies/pom.xml @@ -178,11 +178,6 @@ <version>1.9.0</version> </dependency> <dependency> - <groupId>io.hypersistence</groupId> - <artifactId>hypersistence-utils-hibernate-63</artifactId> - <version>3.7.3</version> - </dependency> - <dependency> <groupId>io.opentelemetry.instrumentation</groupId> <artifactId>opentelemetry-instrumentation-bom-alpha</artifactId> <version>${version.opentelemetry-instrumentation-bom}</version> diff --git a/cps-ncmp-rest/docs/openapi/components.yaml b/cps-ncmp-rest/docs/openapi/components.yaml index 637a1386f4..a449c633c8 100644 --- a/cps-ncmp-rest/docs/openapi/components.yaml +++ b/cps-ncmp-rest/docs/openapi/components.yaml @@ -142,7 +142,7 @@ components: example: "COMPLETE" alternateId: type: string - example: "my-alternate-id" + example: "Subnetwork=Europe,ManagedElement=X123" dataProducerIdentifier: type: string example: "my-data-producer-identifier" @@ -192,13 +192,16 @@ components: content: type: string example: | - module stores { + module _3gpp-nr-nrm-gnbdufunction { yang-version 1.1; - namespace 'org:onap:ccsdk:sample'; - prefix book-store; + namespace 'urn:3gpp:sa5:_3gpp-nr-nrm-gnbdufunction'; + prefix gnbdu3gpp; revision '2020-09-15' { description - 'Sample Model'; + 'Defines the YANG mapping of the GNBDUFunction Information + Object Class (IOC) that is part of the NR Network Resource Model (NRM). + Copyright 2024, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TSDSI, + TTA, TTC). All rights reserved.'; } } @@ -260,7 +263,7 @@ components: example: my-module-set-tag alternateId: type: string - example: my-alternate-id + example: "Subnetwork=Europe,ManagedElement=X123" dataProducerIdentifier: type: string example: my-data-producer-identifier @@ -270,7 +273,7 @@ components: type: object additionalProperties: type: string - example: 'Book Type' + example: '3gpp Type' CmHandleCompositeState: type: object properties: @@ -358,10 +361,10 @@ components: example: 'ncmp-datastore:passthrough-operational' options: type: string - example: '(fields=schemas/schema)' + example: '(fields=NRCellDU/attributes/cellLocalId)' resourceIdentifier: type: string - example: 'parent/child' + example: 'NRCellDU/attributes/cellLocalId' targetIds: type: array items: @@ -372,84 +375,78 @@ components: examples: dataSampleRequest: summary: Sample request - description: Sample request body + description: Sample request body for GNBDUFunction configuration value: - test:bookstore: - bookstore-name: Chapters - categories: - - code: '01' - name: SciFi - books: - - authors: - - Iain M. Banks - - Ursula K. Le Guin - - code: '02' - name: kids - books: - - authors: - - Philip Pullman + gnbdu3gpp:GNBDUFunction: + gNBId: 12345 + gNBIdLength: 32 + gNBDUId: 67890 + gNBDUName: "DU-1" + rimRSReportConf: + reportIndicator: "enabled" + reportInterval: 1000 + nrofRIMRSReportInfo: 5 + maxPropagationDelay: 32767 + RimRSReportInfoList: + - detectedSetID: 1 + propagationDelay: 20 + functionalityOfRIMRS: "RS1" + - detectedSetID: 2 + propagationDelay: 15 + functionalityOfRIMRS: "RS2" dataSamplePatchRequest: summary: Sample patch request - description: Sample patch request body + description: Sample patch request to modify GNBDUFunction value: ietf-restconf:yang-patch: patch-id: patch-1 edit: - edit-id: edit1 - operation: merge - target: / + operation: replace + target: /gnbdu3gpp:GNBDUFunction value: - test:bookstore: - bookstore-name: Chapters - categories: - - code: '01' - name: Science - books: - - authors: - - Author1 - - Author2 - - code: '02' - name: Arts - books: - - authors: - - Author3 + gnbdu3gpp:GNBDUFunction: + gNBId: 54321 + gNBIdLength: 32 + gNBDUId: 98765 + gNBDUName: "DU-2" + rimRSReportConf: + reportIndicator: "disabled" + reportInterval: 2000 + nrofRIMRSReportInfo: 3 + maxPropagationDelay: 20000 - edit-id: edit2 operation: merge - target: / + target: /gnbdu3gpp:GNBDUFunction value: - test:bookstore: - bookstore-name: Novels - categories: - - code: '03' - name: History - books: - - authors: - - Iain M. Banks - - Ursula K. Le Guin - - code: '04' - name: Fiction - books: - - authors: - - Philip Pullman + gnbdu3gpp:GNBDUFunction: + configurable5QISetRef: "/5QISet-001" + dynamic5QISetRef: "/Dynamic5QISet-001" dataSampleResponse: summary: Sample response - description: Sample response for selecting 'sample 1'. + description: Sample response with GNBDUFunction configuration value: - bookstore: - categories: - - code: '01' - books: - - authors: - - Iain M. Banks - - Ursula K. Le Guin - name: SciFi - - code: '02' - books: - - authors: - - Philip Pullman - name: kids + gnbdu3gpp:GNBDUFunction: + gNBId: 12345 + gNBIdLength: 32 + gNBDUId: 67890 + gNBDUName: "DU-1" + rimRSReportConf: + reportIndicator: "enabled" + reportInterval: 1000 + nrofRIMRSReportInfo: 5 + maxPropagationDelay: 32767 + RimRSReportInfoList: + - detectedSetID: 1 + propagationDelay: 20 + functionalityOfRIMRS: "RS1" + - detectedSetID: 2 + propagationDelay: 15 + functionalityOfRIMRS: "RS2" + configurable5QISetRef: "/5QISet-001" + dynamic5QISetRef: "/Dynamic5QISet-001" allCmHandleQueryParameters: value: @@ -571,16 +568,25 @@ components: cpsPathInQuery: name: cps-path in: query - description: For more details on cps path, please refer https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html + description: | + The `cps-path` parameter allows referencing elements in the GNBDUFunctionConfig data model. + For more details on cps path, please refer to: + [CPS Path Documentation](https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html). + Example paths: + - Root GNBDUFunction: `/GNBDUFunction` + - Specific gNB ID: `/GNBDUFunction[@gNBId='1001']` + - RIM-RS Reporting Config: `/GNBDUFunction[@gNBId='1001']/rimRSReportConf` required: false schema: type: string - default: / + default: "/GNBDUFunction" examples: - container cps path: - value: //bookstore - list attributes cps path: - value: //categories[@code=1] + GNBDUFunction Root: + value: "//GNBDUFunction" + Specific gNB ID: + value: "//GNBDUFunction[@gNBId='1001']" + RIM-RS Reporting Config: + value: "//GNBDUFunction[@gNBId='1001']/rimRSReportConf" dmiPluginIdentifierInQuery: name: dmi-plugin-identifier in: query @@ -592,37 +598,50 @@ components: resourceIdentifierInQuery: name: resourceIdentifier in: query - description: The format of resource identifier depend on the associated DMI Plugin implementation. For ONAP DMI Plugin it will be RESTConf paths but it can really be anything. + description: | + The `resourceIdentifier` parameter specifies the target resource in the GNBDUFunctionConfig model. + For ONAP DMI Plugin, the format will follow RESTConf paths. Examples: + - All GNBDUFunctions: `/GNBDUFunction` + - Specific GNBDUFunction by gNBId: `/GNBDUFunction[@gNBId='1001']` + - RIM-RS Reporting Configuration: `/GNBDUFunction[@gNBId='1001']/rimRSReportConf` required: true schema: type: string examples: sample 1: value: - resourceIdentifier: \shops\bookstore + resourceIdentifier: \GNBDUFunction sample 2: value: - resourceIdentifier: \shops\bookstore\categories[@code=1] + resourceIdentifier: \GNBDUFunction[@gNBId='1001'] sample 3: value: - resourceIdentifier: parent=shops,child=bookstore + resourceIdentifier: \GNBDUFunction[@gNBId='1001']\rimRSReportConf + sample 4: + value: + resourceIdentifier: parent=GNBDUFunction,child=gNBId:1001 optionsParamInQuery: name: options in: query - description: options parameter in query, it is mandatory to wrap key(s)=value(s) in parenthesis'()'. The format of options parameter depend on the associated DMI Plugin implementation. + description: | + The `options` parameter specifies additional query options. It is mandatory to wrap key(s)=value(s) in parentheses `()`. + Examples for GNBDUFunctionConfig queries: + - Limit depth of returned sub-tree: `(depth=2)` + - Select specific fields: `(fields=gNBId,gNBDUName)` + - Combine options: `(depth=3,fields=gNBId,gNBDUName)` required: false schema: type: string examples: - sample 1: + Limit Depth: value: - options: (depth=3) - sample 2: + options: (depth=2) + Select Specific Fields: value: - options: (fields=book) - sample 3: + options: (fields=gNBId,gNBDUName) + Combine Depth and Fields: value: - options: (depth=2,fields=book/authors) + options: (depth=3,fields=gNBId,gNBDUName) topicParamInQuery: name: topic in: query diff --git a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/util/CmHandleStateMapper.java b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/util/CmHandleStateMapper.java index 4abcb72308..809b991edc 100644 --- a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/util/CmHandleStateMapper.java +++ b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/util/CmHandleStateMapper.java @@ -20,7 +20,7 @@ package org.onap.cps.ncmp.rest.util; -import static org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory.LOCKED_MISBEHAVING; +import static org.onap.cps.ncmp.api.inventory.models.LockReasonCategory.LOCKED_MISBEHAVING; import org.mapstruct.Mapper; import org.mapstruct.Mapping; diff --git a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy index be7f449326..c3aca5a99b 100644 --- a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy +++ b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy @@ -37,9 +37,9 @@ import org.onap.cps.ncmp.api.inventory.models.CompositeState import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle import org.onap.cps.ncmp.api.inventory.models.TrustLevel import org.onap.cps.ncmp.impl.data.NetworkCmProxyFacade -import org.onap.cps.ncmp.impl.inventory.DataStoreSyncState -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState -import org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState +import org.onap.cps.ncmp.api.inventory.models.CmHandleState +import org.onap.cps.ncmp.api.inventory.models.LockReasonCategory import org.onap.cps.ncmp.impl.utils.AlternateIdMatcher import org.onap.cps.ncmp.rest.model.DataOperationDefinition import org.onap.cps.ncmp.rest.model.DataOperationRequest diff --git a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/util/CmHandleStateMapperSpec.groovy b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/util/CmHandleStateMapperSpec.groovy index 24f45ad8a1..c01b9508b1 100644 --- a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/util/CmHandleStateMapperSpec.groovy +++ b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/util/CmHandleStateMapperSpec.groovy @@ -22,8 +22,8 @@ package org.onap.cps.ncmp.rest.util import org.mapstruct.factory.Mappers import org.onap.cps.ncmp.api.inventory.models.CompositeStateBuilder -import org.onap.cps.ncmp.impl.inventory.DataStoreSyncState -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState +import org.onap.cps.ncmp.api.inventory.models.CmHandleState import org.onap.cps.ncmp.rest.model.CmHandleCompositeState import spock.lang.Specification @@ -31,8 +31,8 @@ import java.time.OffsetDateTime import java.time.ZoneOffset import java.time.format.DateTimeFormatter -import static org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory.LOCKED_MISBEHAVING -import static org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory.MODULE_SYNC_FAILED +import static org.onap.cps.ncmp.api.inventory.models.LockReasonCategory.LOCKED_MISBEHAVING +import static org.onap.cps.ncmp.api.inventory.models.LockReasonCategory.MODULE_SYNC_FAILED class CmHandleStateMapperSpec extends Specification { diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/DataStoreSyncState.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/DataStoreSyncState.java index a260ce9cbe..c980d7fa24 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/DataStoreSyncState.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/DataStoreSyncState.java @@ -18,7 +18,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.ncmp.impl.inventory; +package org.onap.cps.ncmp.api.inventory; public enum DataStoreSyncState { SYNCHRONIZED, UNSYNCHRONIZED, NONE_REQUESTED diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/models/CmHandleState.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/models/CmHandleState.java index 9a4b3e2a83..ecd6116051 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/models/CmHandleState.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/models/CmHandleState.java @@ -18,7 +18,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.ncmp.impl.inventory.models; +package org.onap.cps.ncmp.api.inventory.models; public enum CmHandleState { ADVISED, READY, LOCKED, DELETING, DELETED diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/models/CompositeState.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/models/CompositeState.java index ca4fde2b62..d873f66ff5 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/models/CompositeState.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/models/CompositeState.java @@ -29,9 +29,7 @@ import lombok.Data; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import org.onap.cps.ncmp.impl.inventory.DataStoreSyncState; -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState; -import org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory; +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState; /** * State Model to store state corresponding to the Yang resource dmi-registry model. diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/models/CompositeStateBuilder.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/models/CompositeStateBuilder.java index a8d9018489..8a71713223 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/models/CompositeStateBuilder.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/models/CompositeStateBuilder.java @@ -22,12 +22,10 @@ package org.onap.cps.ncmp.api.inventory.models; import org.onap.cps.api.model.DataNode; +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState; import org.onap.cps.ncmp.api.inventory.models.CompositeState.DataStores; import org.onap.cps.ncmp.api.inventory.models.CompositeState.LockReason; import org.onap.cps.ncmp.api.inventory.models.CompositeState.Operational; -import org.onap.cps.ncmp.impl.inventory.DataStoreSyncState; -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState; -import org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory; public class CompositeStateBuilder { diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/models/LockReasonCategory.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/models/LockReasonCategory.java index 1003aeca2d..884e066f24 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/models/LockReasonCategory.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/models/LockReasonCategory.java @@ -18,7 +18,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.ncmp.impl.inventory.models; +package org.onap.cps.ncmp.api.inventory.models; public enum LockReasonCategory { MODULE_SYNC_FAILED, diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cache/AdminCacheConfig.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cache/AdminCacheConfig.java new file mode 100644 index 0000000000..a29799b13f --- /dev/null +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cache/AdminCacheConfig.java @@ -0,0 +1,49 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2025 Nordix Foundation + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.ncmp.impl.cache; + +import com.hazelcast.config.MapConfig; +import com.hazelcast.map.IMap; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class AdminCacheConfig extends HazelcastCacheConfig { + + private static final MapConfig adminCacheMapConfig = createMapConfig("adminCacheMapConfig"); + + /** + * Distributed instance admin cache map for cm handles by state for use of gauge metrics. + * + * @return configured map of cm handles by state. + */ + @Bean + public IMap<String, Integer> cmHandlesByState() { + final IMap<String, Integer> cmHandlesByState = getOrCreateHazelcastInstance(adminCacheMapConfig).getMap( + "cmHandlesByState"); + cmHandlesByState.putIfAbsent("advisedCmHandlesCount", 0); + cmHandlesByState.putIfAbsent("readyCmHandlesCount", 0); + cmHandlesByState.putIfAbsent("lockedCmHandlesCount", 0); + cmHandlesByState.putIfAbsent("deletingCmHandlesCount", 0); + cmHandlesByState.putIfAbsent("deletedCmHandlesCount", 0); + return cmHandlesByState; + } +} diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cmnotificationsubscription/dmi/DmiOutEventConsumer.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cmnotificationsubscription/dmi/DmiOutEventConsumer.java index 20c7c7b13d..98c66afe30 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cmnotificationsubscription/dmi/DmiOutEventConsumer.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cmnotificationsubscription/dmi/DmiOutEventConsumer.java @@ -38,12 +38,14 @@ import org.onap.cps.ncmp.impl.cmnotificationsubscription.ncmp.NcmpOutEventProduc import org.onap.cps.ncmp.impl.cmnotificationsubscription_1_0_0.dmi_to_ncmp.Data; import org.onap.cps.ncmp.impl.cmnotificationsubscription_1_0_0.dmi_to_ncmp.DmiOutEvent; import org.onap.cps.ncmp.impl.cmnotificationsubscription_1_0_0.ncmp_to_client.NcmpOutEvent; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Component; @Component @Slf4j @RequiredArgsConstructor +@ConditionalOnProperty(name = "notification.enabled", havingValue = "true", matchIfMissing = true) public class DmiOutEventConsumer { private final DmiCacheHandler dmiCacheHandler; diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cmnotificationsubscription/ncmp/CmSubscriptionHandlerImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cmnotificationsubscription/ncmp/CmSubscriptionHandlerImpl.java index 8dcf5a5e85..1b368dde6c 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cmnotificationsubscription/ncmp/CmSubscriptionHandlerImpl.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cmnotificationsubscription/ncmp/CmSubscriptionHandlerImpl.java @@ -46,10 +46,12 @@ import org.onap.cps.ncmp.impl.cmnotificationsubscription_1_0_0.client_to_ncmp.Pr import org.onap.cps.ncmp.impl.cmnotificationsubscription_1_0_0.ncmp_to_client.NcmpOutEvent; import org.onap.cps.ncmp.impl.cmnotificationsubscription_1_0_0.ncmp_to_dmi.DmiInEvent; import org.onap.cps.ncmp.impl.inventory.InventoryPersistence; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor +@ConditionalOnProperty(name = "notification.enabled", havingValue = "true", matchIfMissing = true) public class CmSubscriptionHandlerImpl implements CmSubscriptionHandler { private static final Pattern SUBSCRIPTION_KEY_FROM_XPATH_PATTERN = Pattern.compile( diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cmnotificationsubscription/ncmp/NcmpInEventConsumer.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cmnotificationsubscription/ncmp/NcmpInEventConsumer.java index cba64e0e94..17b1de6d08 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cmnotificationsubscription/ncmp/NcmpInEventConsumer.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cmnotificationsubscription/ncmp/NcmpInEventConsumer.java @@ -29,12 +29,14 @@ import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.onap.cps.ncmp.impl.cmnotificationsubscription_1_0_0.client_to_ncmp.NcmpInEvent; import org.onap.cps.ncmp.impl.cmnotificationsubscription_1_0_0.client_to_ncmp.Predicate; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Component; @Component @Slf4j @RequiredArgsConstructor +@ConditionalOnProperty(name = "notification.enabled", havingValue = "true", matchIfMissing = true) public class NcmpInEventConsumer { private final CmSubscriptionHandler cmSubscriptionHandler; diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/DmiDataOperations.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/DmiDataOperations.java index 60f5c2c04b..189239ceb2 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/DmiDataOperations.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/DmiDataOperations.java @@ -40,6 +40,7 @@ import org.onap.cps.ncmp.api.data.models.CmResourceAddress; import org.onap.cps.ncmp.api.data.models.DataOperationRequest; import org.onap.cps.ncmp.api.data.models.OperationType; import org.onap.cps.ncmp.api.exceptions.DmiClientRequestException; +import org.onap.cps.ncmp.api.inventory.models.CmHandleState; import org.onap.cps.ncmp.impl.data.models.DmiDataOperation; import org.onap.cps.ncmp.impl.data.models.DmiDataOperationRequest; import org.onap.cps.ncmp.impl.data.models.DmiOperationCmHandle; @@ -48,7 +49,6 @@ import org.onap.cps.ncmp.impl.data.utils.DmiDataOperationsHelper; import org.onap.cps.ncmp.impl.dmi.DmiProperties; import org.onap.cps.ncmp.impl.dmi.DmiRestClient; import org.onap.cps.ncmp.impl.inventory.InventoryPersistence; -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState; import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle; import org.onap.cps.ncmp.impl.models.DmiRequestBody; import org.onap.cps.ncmp.impl.utils.http.RestServiceUrlTemplateBuilder; diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/utils/DmiDataOperationsHelper.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/utils/DmiDataOperationsHelper.java index a0d89644e4..cb435f4a84 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/utils/DmiDataOperationsHelper.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/utils/DmiDataOperationsHelper.java @@ -38,11 +38,11 @@ import org.onap.cps.events.EventsPublisher; import org.onap.cps.ncmp.api.NcmpResponseStatus; import org.onap.cps.ncmp.api.data.models.DataOperationDefinition; import org.onap.cps.ncmp.api.data.models.DataOperationRequest; +import org.onap.cps.ncmp.api.inventory.models.CmHandleState; import org.onap.cps.ncmp.config.CpsApplicationContext; import org.onap.cps.ncmp.impl.data.models.DmiDataOperation; import org.onap.cps.ncmp.impl.data.models.DmiOperationCmHandle; import org.onap.cps.ncmp.impl.dmi.DmiServiceNameOrganizer; -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState; import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryService.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryService.java index 2ba1b2ab5d..9447f13b68 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryService.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryService.java @@ -24,7 +24,8 @@ import java.util.Collection; import java.util.Map; import org.onap.cps.api.model.DataNode; import org.onap.cps.api.parameters.FetchDescendantsOption; -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState; +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState; +import org.onap.cps.ncmp.api.inventory.models.CmHandleState; public interface CmHandleQueryService { diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImpl.java index 5610013863..59d0f9704e 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImpl.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImpl.java @@ -39,8 +39,9 @@ import org.onap.cps.api.model.DataNode; import org.onap.cps.api.parameters.FetchDescendantsOption; import org.onap.cps.cpspath.parser.CpsPathUtil; import org.onap.cps.impl.utils.CpsValidator; +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState; +import org.onap.cps.ncmp.api.inventory.models.CmHandleState; import org.onap.cps.ncmp.api.inventory.models.TrustLevel; -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState; import org.onap.cps.ncmp.impl.inventory.models.ModelledDmiServiceLeaves; import org.onap.cps.ncmp.impl.inventory.models.PropertyType; import org.onap.cps.ncmp.impl.inventory.trustlevel.TrustLevelCacheConfig; diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationService.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationService.java index ed5e703eef..fc215c9c01 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationService.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationService.java @@ -28,9 +28,9 @@ import static org.onap.cps.ncmp.api.NcmpResponseStatus.CM_HANDLES_NOT_FOUND; import static org.onap.cps.ncmp.api.NcmpResponseStatus.CM_HANDLES_NOT_READY; import static org.onap.cps.ncmp.api.NcmpResponseStatus.CM_HANDLE_ALREADY_EXIST; import static org.onap.cps.ncmp.api.NcmpResponseStatus.CM_HANDLE_INVALID_ID; +import static org.onap.cps.ncmp.api.inventory.models.LockReasonCategory.MODULE_UPGRADE; import static org.onap.cps.ncmp.impl.inventory.NcmpPersistence.NCMP_DMI_REGISTRY_PARENT; import static org.onap.cps.ncmp.impl.inventory.NcmpPersistence.NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME; -import static org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory.MODULE_UPGRADE; import com.google.common.collect.Lists; import com.hazelcast.map.IMap; @@ -52,14 +52,15 @@ import org.onap.cps.api.exceptions.AlreadyDefinedException; import org.onap.cps.api.exceptions.CpsException; import org.onap.cps.api.exceptions.DataNodeNotFoundException; import org.onap.cps.api.exceptions.DataValidationException; +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState; import org.onap.cps.ncmp.api.inventory.models.CmHandleRegistrationResponse; +import org.onap.cps.ncmp.api.inventory.models.CmHandleState; import org.onap.cps.ncmp.api.inventory.models.CompositeState; import org.onap.cps.ncmp.api.inventory.models.CompositeStateBuilder; import org.onap.cps.ncmp.api.inventory.models.DmiPluginRegistration; import org.onap.cps.ncmp.api.inventory.models.DmiPluginRegistrationResponse; import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle; import org.onap.cps.ncmp.api.inventory.models.TrustLevel; -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState; import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle; import org.onap.cps.ncmp.impl.inventory.sync.ModuleOperationsUtils; import org.onap.cps.ncmp.impl.inventory.sync.lcm.LcmEventsCmHandleStateHandler; diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CompositeStateUtils.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CompositeStateUtils.java index 685d204633..e9a617d1f6 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CompositeStateUtils.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CompositeStateUtils.java @@ -23,8 +23,9 @@ package org.onap.cps.ncmp.impl.inventory; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState; +import org.onap.cps.ncmp.api.inventory.models.CmHandleState; import org.onap.cps.ncmp.api.inventory.models.CompositeState; -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState; /** * It will have all the utility method responsible for handling the composite state. diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/DataSyncWatchdog.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/DataSyncWatchdog.java index c3973236f0..af78d95742 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/DataSyncWatchdog.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/DataSyncWatchdog.java @@ -29,8 +29,8 @@ import java.util.function.Consumer; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.onap.cps.api.CpsDataService; +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState; import org.onap.cps.ncmp.api.inventory.models.CompositeState; -import org.onap.cps.ncmp.impl.inventory.DataStoreSyncState; import org.onap.cps.ncmp.impl.inventory.InventoryPersistence; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleOperationsUtils.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleOperationsUtils.java index 2895d9b77c..994ca80287 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleOperationsUtils.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleOperationsUtils.java @@ -36,12 +36,12 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.onap.cps.api.model.DataNode; import org.onap.cps.api.parameters.FetchDescendantsOption; +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState; +import org.onap.cps.ncmp.api.inventory.models.CmHandleState; import org.onap.cps.ncmp.api.inventory.models.CompositeState; +import org.onap.cps.ncmp.api.inventory.models.LockReasonCategory; import org.onap.cps.ncmp.impl.data.DmiDataOperations; import org.onap.cps.ncmp.impl.inventory.CmHandleQueryService; -import org.onap.cps.ncmp.impl.inventory.DataStoreSyncState; -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState; -import org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory; import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle; import org.onap.cps.ncmp.impl.utils.YangDataConverter; import org.onap.cps.utils.JsonObjectMapper; diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncService.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncService.java index a46fb62085..3f92dc73f0 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncService.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncService.java @@ -43,7 +43,7 @@ import org.onap.cps.api.exceptions.SchemaSetNotFoundException; import org.onap.cps.api.model.ModuleReference; import org.onap.cps.api.parameters.CascadeDeleteAllowed; import org.onap.cps.ncmp.api.exceptions.NcmpException; -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState; +import org.onap.cps.ncmp.api.inventory.models.CmHandleState; import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle; import org.onap.cps.utils.ContentType; import org.onap.cps.utils.JsonObjectMapper; diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncTasks.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncTasks.java index 9450805eaf..5f289c2c01 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncTasks.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncTasks.java @@ -29,10 +29,10 @@ import java.util.concurrent.atomic.AtomicInteger; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.onap.cps.api.exceptions.DataNodeNotFoundException; +import org.onap.cps.ncmp.api.inventory.models.CmHandleState; import org.onap.cps.ncmp.api.inventory.models.CompositeState; +import org.onap.cps.ncmp.api.inventory.models.LockReasonCategory; import org.onap.cps.ncmp.impl.inventory.InventoryPersistence; -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState; -import org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory; import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle; import org.onap.cps.ncmp.impl.inventory.sync.lcm.LcmEventsCmHandleStateHandler; import org.springframework.stereotype.Component; diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/CmHandleStateMonitor.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/CmHandleStateMonitor.java new file mode 100644 index 0000000000..31270ca9fc --- /dev/null +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/CmHandleStateMonitor.java @@ -0,0 +1,100 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2025 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.ncmp.impl.inventory.sync.lcm; + +import com.hazelcast.map.EntryProcessor; +import com.hazelcast.map.IMap; +import java.util.Collection; +import java.util.Map; +import lombok.RequiredArgsConstructor; +import org.onap.cps.ncmp.api.inventory.models.CmHandleState; +import org.onap.cps.ncmp.api.inventory.models.CompositeState; +import org.onap.cps.ncmp.impl.inventory.sync.lcm.LcmEventsCmHandleStateHandlerImpl.CmHandleTransitionPair; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class CmHandleStateMonitor { + + private static final String METRIC_POSTFIX = "CmHandlesCount"; + final IMap<String, Integer> cmHandlesByState; + + /** + * Asynchronously update the cm handle state metrics. + * + * @param cmHandleTransitionPairs cm handle transition pairs + */ + @Async + public void updateCmHandleStateMetrics(final Collection<CmHandleTransitionPair> + cmHandleTransitionPairs) { + cmHandleTransitionPairs.forEach(this::updateMetricWithStateChange); + } + + private void updateMetricWithStateChange(final CmHandleTransitionPair cmHandleTransitionPair) { + final CmHandleState targetCmHandleState = cmHandleTransitionPair.getTargetYangModelCmHandle() + .getCompositeState().getCmHandleState(); + if (isNew(cmHandleTransitionPair.getCurrentYangModelCmHandle().getCompositeState())) { + updateTargetStateCount(targetCmHandleState); + } else { + final CmHandleState previousCmHandleState = cmHandleTransitionPair.getCurrentYangModelCmHandle() + .getCompositeState().getCmHandleState(); + updatePreviousStateCount(previousCmHandleState); + updateTargetStateCount(targetCmHandleState); + } + } + + private void updatePreviousStateCount(final CmHandleState previousCmHandleState) { + final String keyName = previousCmHandleState.name().toLowerCase() + METRIC_POSTFIX; + cmHandlesByState.executeOnKey(keyName, new DecreasingEntryProcessor()); + } + + private void updateTargetStateCount(final CmHandleState targetCmHandleState) { + final String keyName = targetCmHandleState.name().toLowerCase() + METRIC_POSTFIX; + cmHandlesByState.executeOnKey(keyName, new IncreasingEntryProcessor()); + } + + private boolean isNew(final CompositeState existingCompositeState) { + return (existingCompositeState == null); + } + + static class DecreasingEntryProcessor implements EntryProcessor<String, Integer, Void> { + @Override + public Void process(final Map.Entry<String, Integer> entry) { + final int currentValue = entry.getValue(); + if (currentValue > 0) { + entry.setValue(currentValue - 1); + } + return null; + } + } + + static class IncreasingEntryProcessor implements EntryProcessor<String, Integer, Void> { + @Override + public Void process(final Map.Entry<String, Integer> entry) { + final int currentValue = entry.getValue(); + entry.setValue(currentValue + 1); + return null; + } + } + + +}
\ No newline at end of file diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCmHandleStateHandler.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCmHandleStateHandler.java index de3df6b9da..69409bbbca 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCmHandleStateHandler.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCmHandleStateHandler.java @@ -22,7 +22,7 @@ package org.onap.cps.ncmp.impl.inventory.sync.lcm; import java.util.Collection; import java.util.Map; -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState; +import org.onap.cps.ncmp.api.inventory.models.CmHandleState; import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle; /** diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCmHandleStateHandlerImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCmHandleStateHandlerImpl.java index e9bd37219a..5ca19886fa 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCmHandleStateHandlerImpl.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCmHandleStateHandlerImpl.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2022-2024 Nordix Foundation + * Copyright (C) 2022-2025 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,10 +20,10 @@ package org.onap.cps.ncmp.impl.inventory.sync.lcm; -import static org.onap.cps.ncmp.impl.inventory.models.CmHandleState.ADVISED; -import static org.onap.cps.ncmp.impl.inventory.models.CmHandleState.DELETED; -import static org.onap.cps.ncmp.impl.inventory.models.CmHandleState.LOCKED; -import static org.onap.cps.ncmp.impl.inventory.models.CmHandleState.READY; +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.ADVISED; +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.DELETED; +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.LOCKED; +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.READY; import io.micrometer.core.annotation.Timed; import java.util.ArrayList; @@ -37,10 +37,10 @@ import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import org.onap.cps.ncmp.api.inventory.models.CmHandleState; import org.onap.cps.ncmp.api.inventory.models.CompositeState; import org.onap.cps.ncmp.impl.inventory.CompositeStateUtils; import org.onap.cps.ncmp.impl.inventory.InventoryPersistence; -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState; import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle; import org.springframework.stereotype.Service; @@ -51,6 +51,7 @@ public class LcmEventsCmHandleStateHandlerImpl implements LcmEventsCmHandleState private final InventoryPersistence inventoryPersistence; private final LcmEventsCmHandleStateHandlerAsyncHelper lcmEventsCmHandleStateHandlerAsyncHelper; + private final CmHandleStateMonitor cmHandleStateMonitor; @Override @Timed(value = "cps.ncmp.cmhandle.state.update.batch", @@ -60,6 +61,7 @@ public class LcmEventsCmHandleStateHandlerImpl implements LcmEventsCmHandleState prepareCmHandleTransitionBatch(cmHandleStatePerCmHandle); persistCmHandleBatch(cmHandleTransitionPairs); lcmEventsCmHandleStateHandlerAsyncHelper.publishLcmEventBatchAsynchronously(cmHandleTransitionPairs); + cmHandleStateMonitor.updateCmHandleStateMetrics(cmHandleTransitionPairs); } @Override @@ -168,7 +170,7 @@ public class LcmEventsCmHandleStateHandlerImpl implements LcmEventsCmHandleState @Getter @Setter @NoArgsConstructor - static class CmHandleTransitionPair { + public static class CmHandleTransitionPair { private YangModelCmHandle currentYangModelCmHandle; private YangModelCmHandle targetYangModelCmHandle; diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCreatorHelper.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCreatorHelper.java index 348894d1b4..e4fb5c3ce8 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCreatorHelper.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCreatorHelper.java @@ -20,7 +20,7 @@ package org.onap.cps.ncmp.impl.inventory.sync.lcm; -import static org.onap.cps.ncmp.impl.inventory.models.CmHandleState.DELETED; +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.DELETED; import static org.onap.cps.ncmp.impl.inventory.sync.lcm.LcmEventType.CREATE; import static org.onap.cps.ncmp.impl.inventory.sync.lcm.LcmEventType.DELETE; import static org.onap.cps.ncmp.impl.inventory.sync.lcm.LcmEventType.UPDATE; diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/inventory/models/CompositeStateBuilderSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/inventory/models/CompositeStateBuilderSpec.groovy index b01f4dfa0e..4d42e62025 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/inventory/models/CompositeStateBuilderSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/inventory/models/CompositeStateBuilderSpec.groovy @@ -22,9 +22,7 @@ package org.onap.cps.ncmp.api.inventory.models -import org.onap.cps.ncmp.impl.inventory.DataStoreSyncState -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState -import org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState import org.onap.cps.api.model.DataNode import org.onap.cps.api.model.DataNodeBuilder import spock.lang.Specification diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/inventory/models/CompositeStateSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/inventory/models/CompositeStateSpec.groovy index f6e4c8870e..4ee05104ee 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/inventory/models/CompositeStateSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/inventory/models/CompositeStateSpec.groovy @@ -21,9 +21,7 @@ package org.onap.cps.ncmp.api.inventory.models import com.fasterxml.jackson.databind.ObjectMapper -import org.onap.cps.ncmp.impl.inventory.DataStoreSyncState -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState -import org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState import spock.lang.Specification import java.time.OffsetDateTime diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/cache/AdminCacheConfigSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/cache/AdminCacheConfigSpec.groovy new file mode 100644 index 0000000000..9b9603369d --- /dev/null +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/cache/AdminCacheConfigSpec.groovy @@ -0,0 +1,57 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2025 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.ncmp.impl.cache + +import com.hazelcast.core.Hazelcast +import com.hazelcast.map.IMap +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.context.ContextConfiguration; +import spock.lang.Specification; + +@SpringBootTest +@ContextConfiguration(classes = [AdminCacheConfig]) +class AdminCacheConfigSpec extends Specification { + + @Autowired + IMap<String, Integer> cmHandlesByState + + def cleanupSpec() { + Hazelcast.getHazelcastInstanceByName('cps-and-ncmp-hazelcast-instance-test-config').shutdown() + } + + def 'Hazelcast cache for cm handle by state gauge'() { + expect: 'system is able to create an instance of the cm handle by state cache' + assert null != cmHandlesByState + and: 'there is at least 1 instance' + assert Hazelcast.allHazelcastInstances.size() > 0 + and: 'Hazelcast cache instance for cm handle by state is present' + assert Hazelcast.getHazelcastInstanceByName('cps-and-ncmp-hazelcast-instance-test-config').getMap('cmHandlesByState') != null + and: 'the cache already contains 5 entries, an entry for each state' + def cmHandleByState = Hazelcast.getHazelcastInstanceByName('cps-and-ncmp-hazelcast-instance-test-config').getMap('cmHandlesByState') + assert cmHandleByState.size() == 5 + assert cmHandleByState.containsKey('advisedCmHandlesCount') + assert cmHandleByState.containsKey('lockedCmHandlesCount') + assert cmHandleByState.containsKey('readyCmHandlesCount') + assert cmHandleByState.containsKey('deletingCmHandlesCount') + assert cmHandleByState.containsKey('deletedCmHandlesCount') + } +} diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/DmiDataOperationsSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/DmiDataOperationsSpec.groovy index f1447f4eb5..01a08e7bb5 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/DmiDataOperationsSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/DmiDataOperationsSpec.groovy @@ -22,21 +22,21 @@ package org.onap.cps.ncmp.impl.data import com.fasterxml.jackson.databind.ObjectMapper +import org.onap.cps.api.exceptions.DataNodeNotFoundException +import org.onap.cps.api.exceptions.DataValidationException import org.onap.cps.events.EventsPublisher import org.onap.cps.ncmp.api.data.models.CmResourceAddress import org.onap.cps.ncmp.api.data.models.DataOperationRequest import org.onap.cps.ncmp.api.exceptions.DmiClientRequestException +import org.onap.cps.ncmp.api.inventory.models.CmHandleState import org.onap.cps.ncmp.config.CpsApplicationContext import org.onap.cps.ncmp.events.async1_0_0.DataOperationEvent import org.onap.cps.ncmp.impl.data.policyexecutor.PolicyExecutor import org.onap.cps.ncmp.impl.dmi.DmiOperationsBaseSpec import org.onap.cps.ncmp.impl.dmi.DmiProperties -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState import org.onap.cps.ncmp.impl.utils.AlternateIdMatcher import org.onap.cps.ncmp.impl.utils.http.UrlTemplateParameters import org.onap.cps.ncmp.utils.TestUtils -import org.onap.cps.api.exceptions.DataNodeNotFoundException -import org.onap.cps.api.exceptions.DataValidationException import org.onap.cps.utils.JsonObjectMapper import org.spockframework.spring.SpringBean import org.springframework.beans.factory.annotation.Autowired diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/utils/DmiDataOperationsHelperSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/utils/DmiDataOperationsHelperSpec.groovy index 77e2c4fa25..33b8490e5e 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/utils/DmiDataOperationsHelperSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/utils/DmiDataOperationsHelperSpec.groovy @@ -42,8 +42,8 @@ import org.springframework.util.LinkedMultiValueMap import java.time.Duration -import static org.onap.cps.ncmp.impl.inventory.models.CmHandleState.ADVISED -import static org.onap.cps.ncmp.impl.inventory.models.CmHandleState.READY +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.ADVISED +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.READY import static org.onap.cps.ncmp.utils.events.CloudEventMapper.toTargetEvent @ContextConfiguration(classes = [EventsPublisher, CpsApplicationContext]) diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiOperationsBaseSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiOperationsBaseSpec.groovy index d00d3ab8f6..1edee4e355 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiOperationsBaseSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiOperationsBaseSpec.groovy @@ -23,7 +23,7 @@ package org.onap.cps.ncmp.impl.dmi import com.fasterxml.jackson.databind.ObjectMapper import org.onap.cps.ncmp.api.inventory.models.CompositeState import org.onap.cps.ncmp.impl.inventory.InventoryPersistence -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState +import org.onap.cps.ncmp.api.inventory.models.CmHandleState import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle import org.spockframework.spring.SpringBean import spock.lang.Shared diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImplSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImplSpec.groovy index 1c8a19a3bd..811e4ea526 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImplSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImplSpec.groovy @@ -27,8 +27,9 @@ import com.hazelcast.instance.impl.HazelcastInstanceFactory import org.onap.cps.api.CpsDataService import org.onap.cps.api.CpsQueryService import org.onap.cps.impl.utils.CpsValidator +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState import org.onap.cps.ncmp.api.inventory.models.TrustLevel -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState +import org.onap.cps.ncmp.api.inventory.models.CmHandleState import org.onap.cps.api.model.DataNode import spock.lang.Specification diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServiceSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServiceSpec.groovy index 0706a1e19f..ff190cc1ca 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServiceSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServiceSpec.groovy @@ -25,13 +25,14 @@ import com.hazelcast.map.IMap import org.onap.cps.api.CpsDataService import org.onap.cps.api.CpsModuleService import org.onap.cps.ncmp.api.exceptions.DmiRequestException +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState import org.onap.cps.ncmp.api.inventory.models.CmHandleRegistrationResponse import org.onap.cps.ncmp.api.inventory.models.CompositeState import org.onap.cps.ncmp.api.inventory.models.DmiPluginRegistration import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle import org.onap.cps.ncmp.api.inventory.models.TrustLevel import org.onap.cps.ncmp.api.inventory.models.UpgradedCmHandles -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState +import org.onap.cps.ncmp.api.inventory.models.CmHandleState import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle import org.onap.cps.ncmp.impl.inventory.sync.lcm.LcmEventsCmHandleStateHandler import org.onap.cps.ncmp.impl.inventory.trustlevel.TrustLevelManager diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImplSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImplSpec.groovy index c1a8589c48..619da70bf2 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImplSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImplSpec.groovy @@ -31,7 +31,7 @@ import org.onap.cps.api.exceptions.DataValidationException import org.onap.cps.impl.utils.CpsValidator import org.onap.cps.ncmp.api.exceptions.CmHandleNotFoundException import org.onap.cps.ncmp.api.inventory.models.CompositeState -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState +import org.onap.cps.ncmp.api.inventory.models.CmHandleState import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle import org.onap.cps.ncmp.impl.utils.YangDataConverter import org.onap.cps.api.parameters.CascadeDeleteAllowed diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/NetworkCmProxyInventoryFacadeSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/NetworkCmProxyInventoryFacadeSpec.groovy index c62a87f5c3..eff8082a0d 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/NetworkCmProxyInventoryFacadeSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/NetworkCmProxyInventoryFacadeSpec.groovy @@ -25,6 +25,7 @@ package org.onap.cps.ncmp.impl.inventory import com.fasterxml.jackson.databind.ObjectMapper import org.onap.cps.api.model.ConditionProperties +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState import org.onap.cps.ncmp.api.inventory.models.CmHandleQueryApiParameters import org.onap.cps.ncmp.api.inventory.models.CmHandleQueryServiceParameters import org.onap.cps.ncmp.api.inventory.models.CompositeState @@ -33,8 +34,8 @@ import org.onap.cps.ncmp.api.inventory.models.DmiPluginRegistration import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle import org.onap.cps.ncmp.api.inventory.models.TrustLevel import org.onap.cps.ncmp.impl.NetworkCmProxyInventoryFacadeImpl -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState -import org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory +import org.onap.cps.ncmp.api.inventory.models.CmHandleState +import org.onap.cps.ncmp.api.inventory.models.LockReasonCategory import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle import org.onap.cps.ncmp.impl.inventory.trustlevel.TrustLevelManager import org.onap.cps.ncmp.impl.utils.AlternateIdMatcher diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/models/YangModelCmHandleSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/models/YangModelCmHandleSpec.groovy index 4908379a4e..63ab0a9740 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/models/YangModelCmHandleSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/models/YangModelCmHandleSpec.groovy @@ -20,10 +20,12 @@ package org.onap.cps.ncmp.impl.inventory.models +import org.onap.cps.ncmp.api.inventory.models.CmHandleState import org.onap.cps.ncmp.api.inventory.models.CompositeState import org.onap.cps.ncmp.api.inventory.models.CompositeStateBuilder +import org.onap.cps.ncmp.api.inventory.models.LockReasonCategory import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle -import org.onap.cps.ncmp.impl.inventory.DataStoreSyncState +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState import spock.lang.Specification import static org.onap.cps.ncmp.impl.models.RequiredDmiService.DATA diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/DataSyncWatchdogSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/DataSyncWatchdogSpec.groovy index 2ee5226dc2..ae6cb120a5 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/DataSyncWatchdogSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/DataSyncWatchdogSpec.groovy @@ -23,9 +23,9 @@ package org.onap.cps.ncmp.impl.inventory.sync import com.hazelcast.map.IMap import org.onap.cps.api.CpsDataService import org.onap.cps.ncmp.api.inventory.models.CompositeState -import org.onap.cps.ncmp.impl.inventory.DataStoreSyncState +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState import org.onap.cps.ncmp.impl.inventory.InventoryPersistence -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState +import org.onap.cps.ncmp.api.inventory.models.CmHandleState import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle import spock.lang.Specification diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/ModuleOperationsUtilsSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/ModuleOperationsUtilsSpec.groovy index f116e0e1dd..fdd7e47875 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/ModuleOperationsUtilsSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/ModuleOperationsUtilsSpec.groovy @@ -30,8 +30,8 @@ import org.onap.cps.ncmp.api.inventory.models.CompositeState import org.onap.cps.ncmp.api.inventory.models.CompositeStateBuilder import org.onap.cps.ncmp.impl.data.DmiDataOperations import org.onap.cps.ncmp.impl.inventory.CmHandleQueryService -import org.onap.cps.ncmp.impl.inventory.DataStoreSyncState -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState +import org.onap.cps.ncmp.api.inventory.models.CmHandleState import org.onap.cps.api.parameters.FetchDescendantsOption import org.onap.cps.api.model.DataNode import org.onap.cps.utils.JsonObjectMapper @@ -42,9 +42,9 @@ import org.springframework.http.ResponseEntity import spock.lang.Specification import java.util.stream.Collectors -import static org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory.MODULE_SYNC_FAILED -import static org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory.MODULE_UPGRADE -import static org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory.MODULE_UPGRADE_FAILED +import static org.onap.cps.ncmp.api.inventory.models.LockReasonCategory.MODULE_SYNC_FAILED +import static org.onap.cps.ncmp.api.inventory.models.LockReasonCategory.MODULE_UPGRADE +import static org.onap.cps.ncmp.api.inventory.models.LockReasonCategory.MODULE_UPGRADE_FAILED class ModuleOperationsUtilsSpec extends Specification{ diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncServiceSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncServiceSpec.groovy index 44cbe25b43..67cc4edd83 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncServiceSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncServiceSpec.groovy @@ -28,7 +28,7 @@ import org.onap.cps.ncmp.api.exceptions.NcmpException import org.onap.cps.ncmp.api.inventory.models.CompositeStateBuilder import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle import org.onap.cps.ncmp.impl.inventory.CmHandleQueryService -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState +import org.onap.cps.ncmp.api.inventory.models.CmHandleState import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle import org.onap.cps.ncmp.impl.inventory.sync.ModuleSyncService.ModuleDelta import org.onap.cps.api.parameters.CascadeDeleteAllowed @@ -38,7 +38,7 @@ import org.onap.cps.utils.JsonObjectMapper import spock.lang.Specification import static org.onap.cps.ncmp.impl.inventory.NcmpPersistence.NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME -import static org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory.MODULE_UPGRADE +import static org.onap.cps.ncmp.api.inventory.models.LockReasonCategory.MODULE_UPGRADE class ModuleSyncServiceSpec extends Specification { diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncTasksSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncTasksSpec.groovy index c7fe45db90..556ed0b63c 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncTasksSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncTasksSpec.groovy @@ -32,7 +32,7 @@ import com.hazelcast.map.IMap import org.onap.cps.ncmp.api.inventory.models.CompositeState import org.onap.cps.ncmp.api.inventory.models.CompositeStateBuilder import org.onap.cps.ncmp.impl.inventory.InventoryPersistence -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState +import org.onap.cps.ncmp.api.inventory.models.CmHandleState import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle import org.onap.cps.ncmp.impl.inventory.sync.lcm.LcmEventsCmHandleStateHandler import org.onap.cps.api.exceptions.DataNodeNotFoundException @@ -40,9 +40,9 @@ import org.slf4j.LoggerFactory import spock.lang.Specification import java.util.concurrent.atomic.AtomicInteger -import static org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory.MODULE_SYNC_FAILED -import static org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory.MODULE_UPGRADE -import static org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory.MODULE_UPGRADE_FAILED +import static org.onap.cps.ncmp.api.inventory.models.LockReasonCategory.MODULE_SYNC_FAILED +import static org.onap.cps.ncmp.api.inventory.models.LockReasonCategory.MODULE_UPGRADE +import static org.onap.cps.ncmp.api.inventory.models.LockReasonCategory.MODULE_UPGRADE_FAILED class ModuleSyncTasksSpec extends Specification { diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/lcm/CmHandleStateMonitorSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/lcm/CmHandleStateMonitorSpec.groovy new file mode 100644 index 0000000000..9fd40b9605 --- /dev/null +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/lcm/CmHandleStateMonitorSpec.groovy @@ -0,0 +1,92 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2025 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.ncmp.impl.inventory.sync.lcm + +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.ADVISED +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.READY + +import com.hazelcast.core.Hazelcast +import com.hazelcast.map.IMap +import org.onap.cps.ncmp.api.inventory.models.CompositeState +import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle +import org.onap.cps.ncmp.impl.inventory.sync.lcm.CmHandleStateMonitor.DecreasingEntryProcessor +import org.onap.cps.ncmp.impl.inventory.sync.lcm.CmHandleStateMonitor.IncreasingEntryProcessor +import spock.lang.Shared +import spock.lang.Specification; + +class CmHandleStateMonitorSpec extends Specification { + + def cmHandlesByState = Mock(IMap) + def objectUnderTest = new CmHandleStateMonitor(cmHandlesByState) + + @Shared + def entryProcessingMap = Hazelcast.newHazelcastInstance().getMap('entryProcessingMap') + + def setup() { + entryProcessingMap.put('zeroCmHandlesCount', 0) + entryProcessingMap.put('tenCmHandlesCount', 10) + } + + def cleanupSpec() { + Hazelcast.shutdownAll() + } + + def 'Update cm handle state metric'() { + given: 'a collection of cm handle state pair' + def cmHandleTransitionPair = new LcmEventsCmHandleStateHandlerImpl.CmHandleTransitionPair() + cmHandleTransitionPair.currentYangModelCmHandle = new YangModelCmHandle(compositeState: new CompositeState(cmHandleState: ADVISED)) + cmHandleTransitionPair.targetYangModelCmHandle = new YangModelCmHandle(compositeState: new CompositeState(cmHandleState: READY)) + when: 'method to update cm handle state metrics is called' + objectUnderTest.updateCmHandleStateMetrics([cmHandleTransitionPair]) + then: 'cm handle by state cache map is called once for current and target state for entry processing' + 1 * cmHandlesByState.executeOnKey('advisedCmHandlesCount', _) + 1 * cmHandlesByState.executeOnKey('readyCmHandlesCount', _) + } + + def 'Updating cm handle state metric with no previous state'() { + given: 'a collection of cm handle state pair wherein current state is null' + def cmHandleTransitionPair = new LcmEventsCmHandleStateHandlerImpl.CmHandleTransitionPair() + cmHandleTransitionPair.currentYangModelCmHandle = new YangModelCmHandle(compositeState: null) + cmHandleTransitionPair.targetYangModelCmHandle = new YangModelCmHandle(compositeState: new CompositeState(cmHandleState: ADVISED)) + when: 'method to update cm handle state metrics is called' + objectUnderTest.updateCmHandleStateMetrics([cmHandleTransitionPair]) + then: 'cm handle by state cache map is called only once' + 1 * cmHandlesByState.executeOnKey(_, _) + } + + def 'Applying decreasing entry processor to a key on map where #scenario'() { + when: 'decreasing entry processor is applied to subtract 1 to the value' + entryProcessingMap.executeOnKey(key, new DecreasingEntryProcessor()) + then: 'the new value is as expected' + assert entryProcessingMap.get(key) == expectedValue + where: 'the following data is used' + scenario | key || expectedValue + 'current value of count is zero'| 'zeroCmHandlesCount'|| 0 + 'current value of count is >0' | 'tenCmHandlesCount' || 9 + } + + def 'Applying increasing entry processor to a key on map'() { + when: 'increasing entry processor is applied to add 1 to the value' + entryProcessingMap.executeOnKey('tenCmHandlesCount', new IncreasingEntryProcessor()) + then: 'the new value is as expected' + assert entryProcessingMap.get('tenCmHandlesCount') == 11 + } +} diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCmHandleStateHandlerImplSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCmHandleStateHandlerImplSpec.groovy index 4b676e1b4c..62db2e34ad 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCmHandleStateHandlerImplSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCmHandleStateHandlerImplSpec.groovy @@ -1,6 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2022-2024 Nordix Foundation + * Copyright (C) 2022-2025 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,7 +25,7 @@ import ch.qos.logback.classic.Logger import ch.qos.logback.classic.spi.ILoggingEvent import ch.qos.logback.core.read.ListAppender import org.onap.cps.ncmp.api.inventory.models.CompositeState -import org.onap.cps.ncmp.impl.inventory.DataStoreSyncState +import org.onap.cps.ncmp.api.inventory.DataStoreSyncState import org.onap.cps.ncmp.impl.inventory.InventoryPersistence import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle import org.slf4j.LoggerFactory @@ -33,12 +33,12 @@ import spock.lang.Specification import static java.util.Collections.EMPTY_LIST import static java.util.Collections.EMPTY_MAP -import static org.onap.cps.ncmp.impl.inventory.models.CmHandleState.ADVISED -import static org.onap.cps.ncmp.impl.inventory.models.CmHandleState.DELETED -import static org.onap.cps.ncmp.impl.inventory.models.CmHandleState.DELETING -import static org.onap.cps.ncmp.impl.inventory.models.CmHandleState.LOCKED -import static org.onap.cps.ncmp.impl.inventory.models.CmHandleState.READY -import static org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory.MODULE_SYNC_FAILED +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.ADVISED +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.DELETED +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.DELETING +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.LOCKED +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.READY +import static org.onap.cps.ncmp.api.inventory.models.LockReasonCategory.MODULE_SYNC_FAILED class LcmEventsCmHandleStateHandlerImplSpec extends Specification { @@ -56,9 +56,10 @@ class LcmEventsCmHandleStateHandlerImplSpec extends Specification { def mockInventoryPersistence = Mock(InventoryPersistence) def mockLcmEventsCreator = Mock(LcmEventsCreator) def mockLcmEventsService = Mock(LcmEventsService) + def mockCmHandleStateMonitor = Mock(CmHandleStateMonitor) def lcmEventsCmHandleStateHandlerAsyncHelper = new LcmEventsCmHandleStateHandlerAsyncHelper(mockLcmEventsCreator, mockLcmEventsService) - def objectUnderTest = new LcmEventsCmHandleStateHandlerImpl(mockInventoryPersistence, lcmEventsCmHandleStateHandlerAsyncHelper) + def objectUnderTest = new LcmEventsCmHandleStateHandlerImpl(mockInventoryPersistence, lcmEventsCmHandleStateHandlerAsyncHelper, mockCmHandleStateMonitor) def cmHandleId = 'cmhandle-id-1' def compositeState diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCreatorSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCreatorSpec.groovy index e0a552ea99..c63e3d9c8e 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCreatorSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCreatorSpec.groovy @@ -24,12 +24,12 @@ import org.mapstruct.factory.Mappers import org.onap.cps.ncmp.api.inventory.models.CompositeState import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle import org.onap.cps.ncmp.events.lcm.v1.Values -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState +import org.onap.cps.ncmp.api.inventory.models.CmHandleState import spock.lang.Specification -import static org.onap.cps.ncmp.impl.inventory.models.CmHandleState.ADVISED -import static org.onap.cps.ncmp.impl.inventory.models.CmHandleState.DELETING -import static org.onap.cps.ncmp.impl.inventory.models.CmHandleState.READY +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.ADVISED +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.DELETING +import static org.onap.cps.ncmp.api.inventory.models.CmHandleState.READY class LcmEventsCreatorSpec extends Specification { diff --git a/cps-ri/pom.xml b/cps-ri/pom.xml index f18c2505fd..2492cb837e 100644 --- a/cps-ri/pom.xml +++ b/cps-ri/pom.xml @@ -73,11 +73,6 @@ <groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-annotations</artifactId>
</dependency>
- <!-- Add Hibernate support for Postgres datatype JSONB and Postgres arrays -->
- <dependency>
- <groupId>io.hypersistence</groupId>
- <artifactId>hypersistence-utils-hibernate-63</artifactId>
- </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml index d2eff8da2b..1e3b9ab96f 100644 --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -190,7 +190,7 @@ services: - monitoring grafana: - image: grafana/grafana-oss:latest + image: grafana/grafana:latest container_name: ${GRAFANA_CONTAINER_NAME:-grafana} depends_on: prometheus: diff --git a/docs/api/swagger/ncmp/openapi-inventory.yaml b/docs/api/swagger/ncmp/openapi-inventory.yaml index 0b9f5b9414..d565f9c558 100644 --- a/docs/api/swagger/ncmp/openapi-inventory.yaml +++ b/docs/api/swagger/ncmp/openapi-inventory.yaml @@ -248,7 +248,7 @@ components: example: updatedCmHandles: - cmHandle: my-cm-handle - alternateId: my-alternate-id + alternateId: "Subnetwork=Europe,ManagedElement=X123" dataProducerIdentifier: my-data-producer-identifier publicCmHandleProperties: key: my-property @@ -257,7 +257,7 @@ components: moduleSetTag: my-module-set-tag trustLevel: COMPLETE - cmHandle: my-cm-handle - alternateId: my-alternate-id + alternateId: "Subnetwork=Europe,ManagedElement=X123" dataProducerIdentifier: my-data-producer-identifier publicCmHandleProperties: key: my-property @@ -267,7 +267,7 @@ components: trustLevel: COMPLETE createdCmHandles: - cmHandle: my-cm-handle - alternateId: my-alternate-id + alternateId: "Subnetwork=Europe,ManagedElement=X123" dataProducerIdentifier: my-data-producer-identifier publicCmHandleProperties: key: my-property @@ -276,7 +276,7 @@ components: moduleSetTag: my-module-set-tag trustLevel: COMPLETE - cmHandle: my-cm-handle - alternateId: my-alternate-id + alternateId: "Subnetwork=Europe,ManagedElement=X123" dataProducerIdentifier: my-data-producer-identifier publicCmHandleProperties: key: my-property @@ -332,7 +332,7 @@ components: RestInputCmHandle: example: cmHandle: my-cm-handle - alternateId: my-alternate-id + alternateId: "Subnetwork=Europe,ManagedElement=X123" dataProducerIdentifier: my-data-producer-identifier publicCmHandleProperties: key: my-property @@ -364,7 +364,7 @@ components: example: COMPLETE type: string alternateId: - example: my-alternate-id + example: "Subnetwork=Europe,ManagedElement=X123" type: string dataProducerIdentifier: example: my-data-producer-identifier diff --git a/docs/api/swagger/ncmp/openapi.yaml b/docs/api/swagger/ncmp/openapi.yaml index 55adf40615..4e369f5dce 100644 --- a/docs/api/swagger/ncmp/openapi.yaml +++ b/docs/api/swagger/ncmp/openapi.yaml @@ -29,19 +29,25 @@ paths: schema: example: my-cm-handle-reference type: string - - description: The format of resource identifier depend on the associated DMI - Plugin implementation. For ONAP DMI Plugin it will be RESTConf paths but - it can really be anything. + - description: | + The `resourceIdentifier` parameter specifies the target resource in the GNBDUFunctionConfig model. + For ONAP DMI Plugin, the format will follow RESTConf paths. Examples: + - All GNBDUFunctions: `/GNBDUFunction` + - Specific GNBDUFunction by gNBId: `/GNBDUFunction[@gNBId='1001']` + - RIM-RS Reporting Configuration: `/GNBDUFunction[@gNBId='1001']/rimRSReportConf` examples: sample 1: value: - resourceIdentifier: \shops\bookstore + resourceIdentifier: "\GNBDUFunction" sample 2: value: - resourceIdentifier: "\\shops\\bookstore\\categories[@code=1]" + resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']" sample 3: value: - resourceIdentifier: "parent=shops,child=bookstore" + resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']\\rimRSReportConf" + sample 4: + value: + resourceIdentifier: "parent=GNBDUFunction,child=gNBId:1001" in: query name: resourceIdentifier required: true @@ -140,37 +146,46 @@ paths: schema: example: my-cm-handle-reference type: string - - description: The format of resource identifier depend on the associated DMI - Plugin implementation. For ONAP DMI Plugin it will be RESTConf paths but - it can really be anything. + - description: | + The `resourceIdentifier` parameter specifies the target resource in the GNBDUFunctionConfig model. + For ONAP DMI Plugin, the format will follow RESTConf paths. Examples: + - All GNBDUFunctions: `/GNBDUFunction` + - Specific GNBDUFunction by gNBId: `/GNBDUFunction[@gNBId='1001']` + - RIM-RS Reporting Configuration: `/GNBDUFunction[@gNBId='1001']/rimRSReportConf` examples: sample 1: value: - resourceIdentifier: \shops\bookstore + resourceIdentifier: "\GNBDUFunction" sample 2: value: - resourceIdentifier: "\\shops\\bookstore\\categories[@code=1]" + resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']" sample 3: value: - resourceIdentifier: "parent=shops,child=bookstore" + resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']\\rimRSReportConf" + sample 4: + value: + resourceIdentifier: "parent=GNBDUFunction,child=gNBId:1001" in: query name: resourceIdentifier required: true schema: type: string - - description: "options parameter in query, it is mandatory to wrap key(s)=value(s)\ - \ in parenthesis'()'. The format of options parameter depend on the associated\ - \ DMI Plugin implementation." + - description: | + The `options` parameter specifies additional query options. It is mandatory to wrap key(s)=value(s) in parentheses `()`. + Examples for GNBDUFunctionConfig queries: + - Limit depth of returned sub-tree: `(depth=2)` + - Select specific fields: `(fields=gNBId,gNBDUName)` + - Combine options: `(depth=3,fields=gNBId,gNBDUName)` examples: - sample 1: + Limit Depth: value: - options: (depth=3) - sample 2: + options: (depth=2) + Select Specific Fields: value: - options: (fields=book) - sample 3: + options: "(fields=gNBId,gNBDUName)" + Combine Depth and Fields: value: - options: "(depth=2,fields=book/authors)" + options: "(depth=3,fields=gNBId,gNBDUName)" in: query name: options required: false @@ -275,19 +290,25 @@ paths: schema: example: my-cm-handle-reference type: string - - description: The format of resource identifier depend on the associated DMI - Plugin implementation. For ONAP DMI Plugin it will be RESTConf paths but - it can really be anything. + - description: | + The `resourceIdentifier` parameter specifies the target resource in the GNBDUFunctionConfig model. + For ONAP DMI Plugin, the format will follow RESTConf paths. Examples: + - All GNBDUFunctions: `/GNBDUFunction` + - Specific GNBDUFunction by gNBId: `/GNBDUFunction[@gNBId='1001']` + - RIM-RS Reporting Configuration: `/GNBDUFunction[@gNBId='1001']/rimRSReportConf` examples: sample 1: value: - resourceIdentifier: \shops\bookstore + resourceIdentifier: "\GNBDUFunction" sample 2: value: - resourceIdentifier: "\\shops\\bookstore\\categories[@code=1]" + resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']" sample 3: value: - resourceIdentifier: "parent=shops,child=bookstore" + resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']\\rimRSReportConf" + sample 4: + value: + resourceIdentifier: "parent=GNBDUFunction,child=gNBId:1001" in: query name: resourceIdentifier required: true @@ -389,19 +410,25 @@ paths: schema: example: my-cm-handle-reference type: string - - description: The format of resource identifier depend on the associated DMI - Plugin implementation. For ONAP DMI Plugin it will be RESTConf paths but - it can really be anything. + - description: | + The `resourceIdentifier` parameter specifies the target resource in the GNBDUFunctionConfig model. + For ONAP DMI Plugin, the format will follow RESTConf paths. Examples: + - All GNBDUFunctions: `/GNBDUFunction` + - Specific GNBDUFunction by gNBId: `/GNBDUFunction[@gNBId='1001']` + - RIM-RS Reporting Configuration: `/GNBDUFunction[@gNBId='1001']/rimRSReportConf` examples: sample 1: value: - resourceIdentifier: \shops\bookstore + resourceIdentifier: "\GNBDUFunction" sample 2: value: - resourceIdentifier: "\\shops\\bookstore\\categories[@code=1]" + resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']" sample 3: value: - resourceIdentifier: "parent=shops,child=bookstore" + resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']\\rimRSReportConf" + sample 4: + value: + resourceIdentifier: "parent=GNBDUFunction,child=gNBId:1001" in: query name: resourceIdentifier required: true @@ -508,19 +535,25 @@ paths: schema: example: my-cm-handle-reference type: string - - description: The format of resource identifier depend on the associated DMI - Plugin implementation. For ONAP DMI Plugin it will be RESTConf paths but - it can really be anything. + - description: | + The `resourceIdentifier` parameter specifies the target resource in the GNBDUFunctionConfig model. + For ONAP DMI Plugin, the format will follow RESTConf paths. Examples: + - All GNBDUFunctions: `/GNBDUFunction` + - Specific GNBDUFunction by gNBId: `/GNBDUFunction[@gNBId='1001']` + - RIM-RS Reporting Configuration: `/GNBDUFunction[@gNBId='1001']/rimRSReportConf` examples: sample 1: value: - resourceIdentifier: \shops\bookstore + resourceIdentifier: "\GNBDUFunction" sample 2: value: - resourceIdentifier: "\\shops\\bookstore\\categories[@code=1]" + resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']" sample 3: value: - resourceIdentifier: "parent=shops,child=bookstore" + resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']\\rimRSReportConf" + sample 4: + value: + resourceIdentifier: "parent=GNBDUFunction,child=gNBId:1001" in: query name: resourceIdentifier required: true @@ -721,31 +754,43 @@ paths: schema: example: my-cm-handle type: string - - description: "For more details on cps path, please refer https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html" + - description: | + The `cps-path` parameter allows referencing elements in the GNBDUFunctionConfig data model. + For more details on cps path, please refer to: + [CPS Path Documentation](https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html). + Example paths: + - Root GNBDUFunction: `/GNBDUFunction` + - Specific gNB ID: `/GNBDUFunction[@gNBId='1001']` + - RIM-RS Reporting Config: `/GNBDUFunction[@gNBId='1001']/rimRSReportConf` examples: - container cps path: - value: //bookstore - list attributes cps path: - value: "//categories[@code=1]" + GNBDUFunction Root: + value: //GNBDUFunction + Specific gNB ID: + value: "//GNBDUFunction[@gNBId='1001']" + RIM-RS Reporting Config: + value: "//GNBDUFunction[@gNBId='1001']/rimRSReportConf" in: query name: cps-path required: false schema: - default: / - type: string - - description: "options parameter in query, it is mandatory to wrap key(s)=value(s)\ - \ in parenthesis'()'. The format of options parameter depend on the associated\ - \ DMI Plugin implementation." + default: /GNBDUFunction + type: string + - description: | + The `options` parameter specifies additional query options. It is mandatory to wrap key(s)=value(s) in parentheses `()`. + Examples for GNBDUFunctionConfig queries: + - Limit depth of returned sub-tree: `(depth=2)` + - Select specific fields: `(fields=gNBId,gNBDUName)` + - Combine options: `(depth=3,fields=gNBId,gNBDUName)` examples: - sample 1: + Limit Depth: value: - options: (depth=3) - sample 2: + options: (depth=2) + Select Specific Fields: value: - options: (fields=book) - sample 3: + options: "(fields=gNBId,gNBDUName)" + Combine Depth and Fields: value: - options: "(depth=2,fields=book/authors)" + options: "(depth=3,fields=gNBId,gNBDUName)" in: query name: options required: false @@ -1353,83 +1398,77 @@ paths: components: examples: dataSampleResponse: - description: Sample response for selecting 'sample 1'. + description: Sample response with GNBDUFunction configuration summary: Sample response value: - bookstore: - categories: - - code: "01" - books: - - authors: - - Iain M. Banks - - Ursula K. Le Guin - name: SciFi - - code: "02" - books: - - authors: - - Philip Pullman - name: kids + gnbdu3gpp:GNBDUFunction: + gNBId: 12345 + gNBIdLength: 32 + gNBDUId: 67890 + gNBDUName: DU-1 + rimRSReportConf: + reportIndicator: enabled + reportInterval: 1000 + nrofRIMRSReportInfo: 5 + maxPropagationDelay: 32767 + RimRSReportInfoList: + - detectedSetID: 1 + propagationDelay: 20 + functionalityOfRIMRS: RS1 + - detectedSetID: 2 + propagationDelay: 15 + functionalityOfRIMRS: RS2 + configurable5QISetRef: /5QISet-001 + dynamic5QISetRef: /Dynamic5QISet-001 dataSampleRequest: - description: Sample request body + description: Sample request body for GNBDUFunction configuration summary: Sample request value: - test:bookstore: - bookstore-name: Chapters - categories: - - code: "01" - name: SciFi - books: - - authors: - - Iain M. Banks - - Ursula K. Le Guin - - code: "02" - name: kids - books: - - authors: - - Philip Pullman + gnbdu3gpp:GNBDUFunction: + gNBId: 12345 + gNBIdLength: 32 + gNBDUId: 67890 + gNBDUName: DU-1 + rimRSReportConf: + reportIndicator: enabled + reportInterval: 1000 + nrofRIMRSReportInfo: 5 + maxPropagationDelay: 32767 + RimRSReportInfoList: + - detectedSetID: 1 + propagationDelay: 20 + functionalityOfRIMRS: RS1 + - detectedSetID: 2 + propagationDelay: 15 + functionalityOfRIMRS: RS2 dataSamplePatchRequest: - description: Sample patch request body + description: Sample patch request to modify GNBDUFunction summary: Sample patch request value: ietf-restconf:yang-patch: patch-id: patch-1 edit: - edit-id: edit1 - operation: merge - target: / + operation: replace + target: /gnbdu3gpp:GNBDUFunction value: - test:bookstore: - bookstore-name: Chapters - categories: - - code: "01" - name: Science - books: - - authors: - - Author1 - - Author2 - - code: "02" - name: Arts - books: - - authors: - - Author3 + gnbdu3gpp:GNBDUFunction: + gNBId: 54321 + gNBIdLength: 32 + gNBDUId: 98765 + gNBDUName: DU-2 + rimRSReportConf: + reportIndicator: disabled + reportInterval: 2000 + nrofRIMRSReportInfo: 3 + maxPropagationDelay: 20000 - edit-id: edit2 operation: merge - target: / + target: /gnbdu3gpp:GNBDUFunction value: - test:bookstore: - bookstore-name: Novels - categories: - - code: "03" - name: History - books: - - authors: - - Iain M. Banks - - Ursula K. Le Guin - - code: "04" - name: Fiction - books: - - authors: - - Philip Pullman + gnbdu3gpp:GNBDUFunction: + configurable5QISetRef: /5QISet-001 + dynamic5QISetRef: /Dynamic5QISet-001 pubPropCmHandleQueryParameters: value: cmHandleQueryParameters: @@ -1494,38 +1533,47 @@ components: example: my-cm-handle-reference type: string resourceIdentifierInQuery: - description: The format of resource identifier depend on the associated DMI - Plugin implementation. For ONAP DMI Plugin it will be RESTConf paths but it - can really be anything. + description: | + The `resourceIdentifier` parameter specifies the target resource in the GNBDUFunctionConfig model. + For ONAP DMI Plugin, the format will follow RESTConf paths. Examples: + - All GNBDUFunctions: `/GNBDUFunction` + - Specific GNBDUFunction by gNBId: `/GNBDUFunction[@gNBId='1001']` + - RIM-RS Reporting Configuration: `/GNBDUFunction[@gNBId='1001']/rimRSReportConf` examples: sample 1: value: - resourceIdentifier: \shops\bookstore + resourceIdentifier: "\GNBDUFunction" sample 2: value: - resourceIdentifier: "\\shops\\bookstore\\categories[@code=1]" + resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']" sample 3: value: - resourceIdentifier: "parent=shops,child=bookstore" + resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']\\rimRSReportConf" + sample 4: + value: + resourceIdentifier: "parent=GNBDUFunction,child=gNBId:1001" in: query name: resourceIdentifier required: true schema: type: string optionsParamInQuery: - description: "options parameter in query, it is mandatory to wrap key(s)=value(s)\ - \ in parenthesis'()'. The format of options parameter depend on the associated\ - \ DMI Plugin implementation." + description: | + The `options` parameter specifies additional query options. It is mandatory to wrap key(s)=value(s) in parentheses `()`. + Examples for GNBDUFunctionConfig queries: + - Limit depth of returned sub-tree: `(depth=2)` + - Select specific fields: `(fields=gNBId,gNBDUName)` + - Combine options: `(depth=3,fields=gNBId,gNBDUName)` examples: - sample 1: + Limit Depth: value: - options: (depth=3) - sample 2: + options: (depth=2) + Select Specific Fields: value: - options: (fields=book) - sample 3: + options: "(fields=gNBId,gNBDUName)" + Combine Depth and Fields: value: - options: "(depth=2,fields=book/authors)" + options: "(depth=3,fields=gNBId,gNBDUName)" in: query name: options required: false @@ -1588,17 +1636,26 @@ components: example: my-cm-handle type: string cpsPathInQuery: - description: "For more details on cps path, please refer https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html" + description: | + The `cps-path` parameter allows referencing elements in the GNBDUFunctionConfig data model. + For more details on cps path, please refer to: + [CPS Path Documentation](https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html). + Example paths: + - Root GNBDUFunction: `/GNBDUFunction` + - Specific gNB ID: `/GNBDUFunction[@gNBId='1001']` + - RIM-RS Reporting Config: `/GNBDUFunction[@gNBId='1001']/rimRSReportConf` examples: - container cps path: - value: //bookstore - list attributes cps path: - value: "//categories[@code=1]" + GNBDUFunction Root: + value: //GNBDUFunction + Specific gNB ID: + value: "//GNBDUFunction[@gNBId='1001']" + RIM-RS Reporting Config: + value: "//GNBDUFunction[@gNBId='1001']/rimRSReportConf" in: query name: cps-path required: false schema: - default: / + default: /GNBDUFunction type: string moduleNameInQuery: description: Filter for a module name.This is an optional parameter @@ -1731,24 +1788,24 @@ components: DataOperationRequest: example: operations: - - resourceIdentifier: parent/child + - resourceIdentifier: NRCellDU/attributes/cellLocalId targetIds: - "[\"da310eecdb8d44c2acc0ddaae01174b1\",\"c748c58f8e0b438f9fd1f28370b17d47\"\ ]" - "[\"da310eecdb8d44c2acc0ddaae01174b1\",\"c748c58f8e0b438f9fd1f28370b17d47\"\ ]" datastore: ncmp-datastore:passthrough-operational - options: (fields=schemas/schema) + options: (fields=NRCellDU/attributes/cellLocalId) operationId: "12" operation: read - - resourceIdentifier: parent/child + - resourceIdentifier: NRCellDU/attributes/cellLocalId targetIds: - "[\"da310eecdb8d44c2acc0ddaae01174b1\",\"c748c58f8e0b438f9fd1f28370b17d47\"\ ]" - "[\"da310eecdb8d44c2acc0ddaae01174b1\",\"c748c58f8e0b438f9fd1f28370b17d47\"\ ]" datastore: ncmp-datastore:passthrough-operational - options: (fields=schemas/schema) + options: (fields=NRCellDU/attributes/cellLocalId) operationId: "12" operation: read properties: @@ -1761,14 +1818,14 @@ components: type: object DataOperationDefinition: example: - resourceIdentifier: parent/child + resourceIdentifier: NRCellDU/attributes/cellLocalId targetIds: - "[\"da310eecdb8d44c2acc0ddaae01174b1\",\"c748c58f8e0b438f9fd1f28370b17d47\"\ ]" - "[\"da310eecdb8d44c2acc0ddaae01174b1\",\"c748c58f8e0b438f9fd1f28370b17d47\"\ ]" datastore: ncmp-datastore:passthrough-operational - options: (fields=schemas/schema) + options: (fields=NRCellDU/attributes/cellLocalId) operationId: "12" operation: read properties: @@ -1782,10 +1839,10 @@ components: example: ncmp-datastore:passthrough-operational type: string options: - example: (fields=schemas/schema) + example: (fields=NRCellDU/attributes/cellLocalId) type: string resourceIdentifier: - example: parent/child + example: NRCellDU/attributes/cellLocalId type: string targetIds: items: @@ -1816,13 +1873,16 @@ components: example: moduleName: my-module-name content: | - module stores { + module _3gpp-nr-nrm-gnbdufunction { yang-version 1.1; - namespace 'org:onap:ccsdk:sample'; - prefix book-store; + namespace 'urn:3gpp:sa5:_3gpp-nr-nrm-gnbdufunction'; + prefix gnbdu3gpp; revision '2020-09-15' { description - 'Sample Model'; + 'Defines the YANG mapping of the GNBDUFunction Information + Object Class (IOC) that is part of the NR Network Resource Model (NRM). + Copyright 2024, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TSDSI, + TTA, TTC). All rights reserved.'; } } revision: 2020-09-15 @@ -1835,15 +1895,16 @@ components: type: string content: example: | - module stores { - yang-version 1.1; - namespace 'org:onap:ccsdk:sample'; - prefix book-store; - revision '2020-09-15' { - description - 'Sample Model'; - } - } + module _3gpp-nr-nrm-gnbdufunction { + yang-version 1.1; + namespace 'urn:3gpp:sa5:_3gpp-nr-nrm-gnbdufunction'; + prefix gnbdu3gpp; + revision '2020-09-15' { + description + 'Defines the YANG mapping of the GNBDUFunction Information + Object Class (IOC) that is part of the NR Network Resource Model (NRM). + Copyright 2024, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TSDSI, + TTA, TTC). All rights reserved.'; type: string title: Module definitions type: object @@ -1919,11 +1980,11 @@ components: RestOutputCmHandle: example: cmHandle: my-cm-handle1 - alternateId: my-alternate-id + alternateId: "Subnetwork=Europe,ManagedElement=X123" dataProducerIdentifier: my-data-producer-identifier publicCmHandleProperties: - - key: Book Type - - key: Book Type + - key: 3gpp Type + - key: 3gpp Type state: dataSyncEnabled: false dataSyncState: @@ -1947,7 +2008,7 @@ components: publicCmHandleProperties: items: additionalProperties: - example: Book Type + example: 3gpp Type type: string type: object type: array @@ -1961,7 +2022,7 @@ components: example: my-module-set-tag type: string alternateId: - example: my-alternate-id + example: "Subnetwork=Europe,ManagedElement=X123" type: string dataProducerIdentifier: example: my-data-producer-identifier @@ -1971,7 +2032,7 @@ components: CmHandlePublicProperties: items: additionalProperties: - example: Book Type + example: 3gpp Type type: string type: object type: array @@ -2050,13 +2111,13 @@ components: RestOutputCmHandlePublicProperties: example: publicCmHandleProperties: - - key: Book Type - - key: Book Type + - key: 3gpp Type + - key: 3gpp Type properties: publicCmHandleProperties: items: additionalProperties: - example: Book Type + example: 3gpp Type type: string type: object type: array diff --git a/docs/conf.py b/docs/conf.py index 5d7a79941d..364efe8f1d 100755 --- a/docs/conf.py +++ b/docs/conf.py @@ -59,7 +59,6 @@ spelling_lang = "en_GB" intersphinx_mapping = {} intersphinx_mapping['onap-cps-ncmp-dmi-plugin'] = ('{}/onap-cps-ncmp-dmi-plugin/en/%s'.format(doc_url) % branch, None) -intersphinx_mapping['onap-cps-cps-temporal'] = ('{}/onap-cps-cps-temporal/en/%s'.format(doc_url) % branch, None) linkcheck_ignore = [ 'http://localhost', diff --git a/docs/index.rst b/docs/index.rst index 573bd54122..aa5fc827c0 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -32,7 +32,3 @@ DMI-Plugin * :ref:`DMI-Plugin<onap-cps-ncmp-dmi-plugin:master_index>` -CPS Temporal -============ - -* :ref:`CPS-Temporal<onap-cps-cps-temporal:master_index>` diff --git a/docs/ncmp-data-operation.rst b/docs/ncmp-data-operation.rst index f2f3a476bb..10c3bfaca5 100644 --- a/docs/ncmp-data-operation.rst +++ b/docs/ncmp-data-operation.rst @@ -109,13 +109,15 @@ DMI Service 1 (POST): `http://{dmi-host-name}:{dmi-port}/dmi/v1/data?topic=my-to { "id": "ec2e9495679a43c58659c07d87025e72", "cmHandleProperties": { - "neType": "RadioNode" + "id": "123", + "attributes":{"userLabel":"test"} } }, { "id": "0df4d39af6514d99b816758148389cfd", "cmHandleProperties": { - "neType": "RadioNode" + "id": "123", + "attributes":{"userLabel":"test"} } } ] @@ -137,13 +139,15 @@ DMI Service 2 (POST) : `http://{dmi-host-name}:{dmi-port}/dmi/v1/data?topic=my-t { "id": "836bb62201f34a7aa056a47bd95a81ed", "cmHandleProperties": { - "neType": "RadioNode" + "id": "123", + "attributes":{"userLabel":"test"} } }, { "id": "202acb75b4a54e43bb1ff8c0c17a8e08", "cmHandleProperties": { - "neType": "RadioNode" + "id": "123", + "attributes":{"userLabel":"test"} } } ] diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/base/CpsIntegrationSpecBase.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/base/CpsIntegrationSpecBase.groovy index 16b4460492..fa65d9d873 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/base/CpsIntegrationSpecBase.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/base/CpsIntegrationSpecBase.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2023-2024 Nordix Foundation - * Modifications Copyright (C) 2024 TechMahindra Ltd. + * Modifications Copyright (C) 2024-2025 TechMahindra Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. @@ -38,7 +38,7 @@ import org.onap.cps.ncmp.impl.data.NetworkCmProxyFacade import org.onap.cps.ncmp.impl.data.NetworkCmProxyQueryService import org.onap.cps.ncmp.impl.inventory.InventoryPersistence import org.onap.cps.ncmp.impl.inventory.ParameterizedCmHandleQueryService -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState +import org.onap.cps.ncmp.api.inventory.models.CmHandleState import org.onap.cps.ncmp.impl.inventory.sync.ModuleSyncService import org.onap.cps.ncmp.impl.inventory.sync.ModuleSyncWatchdog import org.onap.cps.ncmp.impl.utils.AlternateIdMatcher @@ -46,6 +46,7 @@ import org.onap.cps.ri.repository.DataspaceRepository import org.onap.cps.ri.utils.SessionManager import org.onap.cps.api.exceptions.DataspaceNotFoundException import org.onap.cps.api.model.DataNode +import static org.onap.cps.utils.ContentType.* import org.onap.cps.utils.JsonObjectMapper import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Value @@ -229,10 +230,10 @@ abstract class CpsIntegrationSpecBase extends Specification { return true } - def addAnchorsWithData(numberOfAnchors, dataspaceName, schemaSetName, anchorNamePrefix, data) { + def addAnchorsWithData(numberOfAnchors, dataspaceName, schemaSetName, anchorNamePrefix, data, contentType) { (1..numberOfAnchors).each { cpsAnchorService.createAnchor(dataspaceName, schemaSetName, anchorNamePrefix + it) - cpsDataService.saveData(dataspaceName, anchorNamePrefix + it, data.replace("Easons", "Easons-"+it.toString()), OffsetDateTime.now()) + cpsDataService.saveData(dataspaceName, anchorNamePrefix + it, data.replace("Easons", "Easons-"+it.toString()), OffsetDateTime.now(), contentType) } } diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/base/FunctionalSpecBase.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/base/FunctionalSpecBase.groovy index 6929a2b678..50aef181d4 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/base/FunctionalSpecBase.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/base/FunctionalSpecBase.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2023-2024 Nordix Foundation - * Modifications Copyright (C) 2022-2023 TechMahindra Ltd. + * Modifications Copyright (C) 2022-2025 TechMahindra Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. @@ -22,28 +22,35 @@ package org.onap.cps.integration.base import java.time.OffsetDateTime +import static org.onap.cps.utils.ContentType.JSON +import static org.onap.cps.utils.ContentType.XML abstract class FunctionalSpecBase extends CpsIntegrationSpecBase { def static FUNCTIONAL_TEST_DATASPACE_1 = 'functionalTestDataspace1' def static FUNCTIONAL_TEST_DATASPACE_2 = 'functionalTestDataspace2' def static FUNCTIONAL_TEST_DATASPACE_3 = 'functionalTestDataspace3' - def static NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_DATA = 2 + def static FUNCTIONAL_TEST_DATASPACE_4 = 'functionalTestDataspace4' + def static NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_JSON_DATA = 2 + def static NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_XML_DATA = 1 def static NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_DELTA_DATA = 1 def static BOOKSTORE_ANCHOR_1 = 'bookstoreAnchor1' def static BOOKSTORE_ANCHOR_2 = 'bookstoreAnchor2' def static BOOKSTORE_ANCHOR_3 = 'bookstoreSourceAnchor1' def static BOOKSTORE_ANCHOR_4 = 'copyOfSourceAnchor1' def static BOOKSTORE_ANCHOR_5 = 'bookstoreAnchorForDeltaReport1' + def static BOOKSTORE_ANCHOR_6 = 'bookstoreAnchorXml1' def static initialized = false def static bookstoreJsonData = readResourceDataFile('bookstore/bookstoreData.json') + def static bookstoreXmlData = readResourceDataFile('bookstore/bookstoreData.xml') def static bookstoreJsonDataForDeltaReport = readResourceDataFile('bookstore/bookstoreDataForDeltaReport.json') def setup() { if (!initialized) { setupBookstoreInfraStructure() addBookstoreData() + addXmlData() addDeltaData() initialized = true } @@ -53,20 +60,26 @@ abstract class FunctionalSpecBase extends CpsIntegrationSpecBase { cpsDataspaceService.createDataspace(FUNCTIONAL_TEST_DATASPACE_1) cpsDataspaceService.createDataspace(FUNCTIONAL_TEST_DATASPACE_2) cpsDataspaceService.createDataspace(FUNCTIONAL_TEST_DATASPACE_3) + cpsDataspaceService.createDataspace(FUNCTIONAL_TEST_DATASPACE_4) createStandardBookStoreSchemaSet(FUNCTIONAL_TEST_DATASPACE_1) createStandardBookStoreSchemaSet(FUNCTIONAL_TEST_DATASPACE_2) createStandardBookStoreSchemaSet(FUNCTIONAL_TEST_DATASPACE_3) + createStandardBookStoreSchemaSet(FUNCTIONAL_TEST_DATASPACE_4) } def addBookstoreData() { - addAnchorsWithData(NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_DATA, FUNCTIONAL_TEST_DATASPACE_1, BOOKSTORE_SCHEMA_SET, 'bookstoreAnchor', bookstoreJsonData) - addAnchorsWithData(NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_DATA, FUNCTIONAL_TEST_DATASPACE_2, BOOKSTORE_SCHEMA_SET, 'bookstoreAnchor', bookstoreJsonData) + addAnchorsWithData(NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_JSON_DATA, FUNCTIONAL_TEST_DATASPACE_1, BOOKSTORE_SCHEMA_SET, 'bookstoreAnchor', bookstoreJsonData, JSON) + addAnchorsWithData(NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_JSON_DATA, FUNCTIONAL_TEST_DATASPACE_2, BOOKSTORE_SCHEMA_SET, 'bookstoreAnchor', bookstoreJsonData, JSON) + } + + def addXmlData() { + addAnchorsWithData(NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_XML_DATA, FUNCTIONAL_TEST_DATASPACE_4, BOOKSTORE_SCHEMA_SET, 'bookstoreAnchorXml', bookstoreXmlData, XML) } def addDeltaData() { - addAnchorsWithData(NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_DELTA_DATA, FUNCTIONAL_TEST_DATASPACE_3, BOOKSTORE_SCHEMA_SET, 'bookstoreSourceAnchor', bookstoreJsonData) - addAnchorsWithData(NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_DELTA_DATA, FUNCTIONAL_TEST_DATASPACE_3, BOOKSTORE_SCHEMA_SET, 'copyOfSourceAnchor', bookstoreJsonData) - addAnchorsWithData(NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_DELTA_DATA, FUNCTIONAL_TEST_DATASPACE_3, BOOKSTORE_SCHEMA_SET, 'bookstoreAnchorForDeltaReport', bookstoreJsonDataForDeltaReport) + addAnchorsWithData(NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_DELTA_DATA, FUNCTIONAL_TEST_DATASPACE_3, BOOKSTORE_SCHEMA_SET, 'bookstoreSourceAnchor', bookstoreJsonData, JSON) + addAnchorsWithData(NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_DELTA_DATA, FUNCTIONAL_TEST_DATASPACE_3, BOOKSTORE_SCHEMA_SET, 'copyOfSourceAnchor', bookstoreJsonData, JSON) + addAnchorsWithData(NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_DELTA_DATA, FUNCTIONAL_TEST_DATASPACE_3, BOOKSTORE_SCHEMA_SET, 'bookstoreAnchorForDeltaReport', bookstoreJsonDataForDeltaReport, JSON) } def restoreBookstoreDataAnchor(anchorNumber) { @@ -76,4 +89,11 @@ abstract class FunctionalSpecBase extends CpsIntegrationSpecBase { cpsDataService.saveData(FUNCTIONAL_TEST_DATASPACE_1, anchorName, bookstoreJsonData.replace('Easons', 'Easons-'+anchorNumber.toString()), OffsetDateTime.now()) } + def restoreBookstoreXmlDataAnchor(anchorNumber) { + def anchorName = 'bookstoreAnchorXml' + anchorNumber + cpsAnchorService.deleteAnchor(FUNCTIONAL_TEST_DATASPACE_4, anchorName) + cpsAnchorService.createAnchor(FUNCTIONAL_TEST_DATASPACE_4, BOOKSTORE_SCHEMA_SET, anchorName) + cpsDataService.saveData(FUNCTIONAL_TEST_DATASPACE_4, anchorName, bookstoreXmlData, OffsetDateTime.now(), XML) + } + } diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/functional/cps/DataServiceIntegrationSpec.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/functional/cps/DataServiceIntegrationSpec.groovy index 653a295944..4823d58af9 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/functional/cps/DataServiceIntegrationSpec.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/functional/cps/DataServiceIntegrationSpec.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2023-2024 Nordix Foundation - * Modifications Copyright (C) 2023-2024 TechMahindra Ltd. + * Modifications Copyright (C) 2023-2025 TechMahindra Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. @@ -43,12 +43,14 @@ class DataServiceIntegrationSpec extends FunctionalSpecBase { CpsDataService objectUnderTest def originalCountBookstoreChildNodes + def originalCountXmlBookstoreChildNodes def originalCountBookstoreTopLevelListNodes def setup() { objectUnderTest = cpsDataService originalCountBookstoreChildNodes = countDataNodesInBookstore() originalCountBookstoreTopLevelListNodes = countTopLevelListDataNodesInBookstore() + originalCountXmlBookstoreChildNodes = countXmlDataNodesInBookstore() } def 'Read bookstore top-level container(s) using #fetchDescendantsOption.'() { @@ -277,6 +279,17 @@ class DataServiceIntegrationSpec extends FunctionalSpecBase { assert originalCountBookstoreChildNodes == countDataNodesInBookstore() } + def 'Add and Delete list (element) XML data nodes.'() { + given: 'a new (categories) data nodes in XML' + def xml = '<categories><code>new1</code><name>SciFii</name></categories>' + and: 'saving the new list element' + objectUnderTest.saveListElements(FUNCTIONAL_TEST_DATASPACE_4, BOOKSTORE_ANCHOR_6, '/bookstore', xml, now, ContentType.XML) + when: 'deleting the new list element' + objectUnderTest.deleteListOrListElement(FUNCTIONAL_TEST_DATASPACE_4, BOOKSTORE_ANCHOR_6, '/bookstore/categories[@code="new1"]', now) + then: 'the original number of data nodes is restored' + assert originalCountXmlBookstoreChildNodes == countXmlDataNodesInBookstore() + } + def 'Add and Delete a batch of list element data nodes.'() { given: 'two new (categories) data nodes in a single batch' def json = '{"categories": [ {"code":"new1"}, {"code":"new2"} ] }' @@ -361,6 +374,29 @@ class DataServiceIntegrationSpec extends FunctionalSpecBase { 'new code, new child' | 'new' | ', "books" : [ { "title": "New Book" } ]' || 2 } + def 'Replace XML list content #scenario.'() { + given: 'the XML bookstore categories 1 exists and has at least 1 child' + assert countDataNodesInTree(objectUnderTest.getDataNodes(FUNCTIONAL_TEST_DATASPACE_4, BOOKSTORE_ANCHOR_6, '/bookstore/categories[@code=1]', DIRECT_CHILDREN_ONLY)) > 1 + when: 'the XML categories list is replaced with just category "1" and a new child' + def xmlData = '''<bookstore xmlns="org:onap:cps:sample"> + <categories> + <code>1</code> + <books> + <title>New Book</title> + </books> + </categories> + </bookstore>''' + objectUnderTest.replaceListContent(FUNCTIONAL_TEST_DATASPACE_4, BOOKSTORE_ANCHOR_6, '/bookstore', xmlData, now, ContentType.XML) + then: 'the replaced XML category has one child' + assert 2 == countDataNodesInTree(objectUnderTest.getDataNodes(FUNCTIONAL_TEST_DATASPACE_4, BOOKSTORE_ANCHOR_6, '/bookstore/categories[@code=1]', DIRECT_CHILDREN_ONLY)) + when: 'attempting to retrieve a non-existent category' + objectUnderTest.getDataNodes(FUNCTIONAL_TEST_DATASPACE_4, BOOKSTORE_ANCHOR_6, '/bookstore/categories[@code="2"]', DIRECT_CHILDREN_ONLY) + then: 'a datanode not found exception occurs' + thrown(DataNodeNotFoundException) + cleanup: + restoreBookstoreDataAnchor(1) + } + def 'Update data node leaves for node that has no leaves (yet).'() { given: 'new (webinfo) datanode without leaves' def json = '{"webinfo": {} }' @@ -430,6 +466,37 @@ class DataServiceIntegrationSpec extends FunctionalSpecBase { restoreBookstoreDataAnchor(2) } + def 'Update bookstore top-level XML container data node.'() { + given: 'Updated xml for bookstore data' + def xml = '<categories><code>1</code><name>Gothic</name></categories>' + when: 'updating the data node' + objectUnderTest.updateDataNodeAndDescendants(FUNCTIONAL_TEST_DATASPACE_4, BOOKSTORE_ANCHOR_6, '/bookstore', xml, now, ContentType.XML) + then: 'the updated data nodes are retrieved' + def result = objectUnderTest.getDataNodes(FUNCTIONAL_TEST_DATASPACE_4, BOOKSTORE_ANCHOR_6, '/bookstore/categories[@code=1]', DIRECT_CHILDREN_ONLY) + and: 'the leaf values are updated as expected' + assert result.leaves.'name'[0] == 'Gothic' + cleanup: + restoreBookstoreXmlDataAnchor(1) + } + + def 'Update multiple XML data node leaves.'() { + given: 'XML for bookstore data with updated lang and price leaves' + def xmlData = '''<books> + <title>2001: A Space Odyssey</title> + <lang>english</lang> + <authors>Iain M. Banks</authors> + <editions>1994</editions> + <price>995</price> + </books> ''' + when: 'updating node leaves' + objectUnderTest.updateNodeLeaves(FUNCTIONAL_TEST_DATASPACE_4, BOOKSTORE_ANCHOR_6, '/bookstore/categories[@code=1]', xmlData, now, ContentType.XML) + then: 'the updated data nodes are retrieved' + def result = cpsDataService.getDataNodes(FUNCTIONAL_TEST_DATASPACE_4, BOOKSTORE_ANCHOR_6, '/bookstore/categories[@code=1]/books[@title="2001: A Space Odyssey"]', INCLUDE_ALL_DESCENDANTS) + and: 'the leaf values are updated as expected' + assert result[0].leaves['lang'] == 'english' + assert result[0].leaves['price'] == 995 + } + def 'Order of leaf-list elements is preserved when "ordered-by user" is set in the YANG model.'() { given: 'Updated json for bookstore data' def jsonData = "{'book-store:books':{'title':'Matilda', 'authors': ['beta', 'alpha', 'gamma', 'delta']}}" @@ -648,4 +715,8 @@ class DataServiceIntegrationSpec extends FunctionalSpecBase { def countTopLevelListDataNodesInBookstore() { return countDataNodesInTree(objectUnderTest.getDataNodes(FUNCTIONAL_TEST_DATASPACE_1, BOOKSTORE_ANCHOR_1, '/', INCLUDE_ALL_DESCENDANTS)) } + + def countXmlDataNodesInBookstore() { + return countDataNodesInTree(objectUnderTest.getDataNodes(FUNCTIONAL_TEST_DATASPACE_4, BOOKSTORE_ANCHOR_6, '/bookstore', INCLUDE_ALL_DESCENDANTS)) + } } diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/functional/cps/QueryServiceIntegrationSpec.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/functional/cps/QueryServiceIntegrationSpec.groovy index 85faee3d87..e4d75aa378 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/functional/cps/QueryServiceIntegrationSpec.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/functional/cps/QueryServiceIntegrationSpec.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2023-2024 Nordix Foundation - * Modifications Copyright (C) 2023 TechMahindra Ltd + * Modifications Copyright (C) 2023-2025 TechMahindra Ltd * ================================================================================ * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. @@ -297,7 +297,7 @@ class QueryServiceIntegrationSpec extends FunctionalSpecBase { and: 'correct anchors are queried' assert result.anchorName.toSet() == [BOOKSTORE_ANCHOR_1, BOOKSTORE_ANCHOR_2].toSet() and: 'the correct number of nodes is returned' - assert result.size() == expectedXpathsPerAnchor.size() * NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_DATA + assert result.size() == expectedXpathsPerAnchor.size() * NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_JSON_DATA and: 'the queried nodes have expected xpaths' assert result.xpath.toSet() == expectedXpathsPerAnchor.toSet() where: 'the following data is used' @@ -319,7 +319,7 @@ class QueryServiceIntegrationSpec extends FunctionalSpecBase { then: 'the correct dataspace was queried' assert result.dataspace.toSet() == [FUNCTIONAL_TEST_DATASPACE_1].toSet() and: 'correct number of datanodes are returned' - assert countDataNodesInTree(result) == expectedNumberOfNodesPerAnchor * NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_DATA + assert countDataNodesInTree(result) == expectedNumberOfNodesPerAnchor * NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_JSON_DATA where: 'the following data is used' scenario | fetchDescendantsOption || expectedNumberOfNodesPerAnchor 'no' | OMIT_DESCENDANTS || 1 @@ -333,7 +333,7 @@ class QueryServiceIntegrationSpec extends FunctionalSpecBase { then: 'the correct dataspace was queried' assert result.dataspace.toSet() == [FUNCTIONAL_TEST_DATASPACE_1].toSet() and: 'correct number of datanodes are returned' - assert countDataNodesInTree(result) == expectedNumberOfNodesPerAnchor * NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_DATA + assert countDataNodesInTree(result) == expectedNumberOfNodesPerAnchor * NUMBER_OF_ANCHORS_PER_DATASPACE_WITH_BOOKSTORE_JSON_DATA where: 'the following data is used' scenario | fetchDescendantsOption || expectedNumberOfNodesPerAnchor 'no' | OMIT_DESCENDANTS || 1 diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/CmHandleCreateSpec.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/CmHandleCreateSpec.groovy index e9fac48676..6f063fb222 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/CmHandleCreateSpec.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/CmHandleCreateSpec.groovy @@ -30,8 +30,8 @@ import org.onap.cps.ncmp.api.inventory.models.CmHandleRegistrationResponse import org.onap.cps.ncmp.api.inventory.models.DmiPluginRegistration import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle import org.onap.cps.ncmp.events.lcm.v1.LcmEvent -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState -import org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory +import org.onap.cps.ncmp.api.inventory.models.CmHandleState +import org.onap.cps.ncmp.api.inventory.models.LockReasonCategory import spock.util.concurrent.PollingConditions import java.time.Duration diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/CmHandleUpgradeSpec.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/CmHandleUpgradeSpec.groovy index 5ce5658c1b..11a4f2c6a7 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/CmHandleUpgradeSpec.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/CmHandleUpgradeSpec.groovy @@ -25,8 +25,8 @@ import org.onap.cps.ncmp.impl.NetworkCmProxyInventoryFacadeImpl import org.onap.cps.ncmp.api.inventory.models.CmHandleRegistrationResponse import org.onap.cps.ncmp.api.inventory.models.DmiPluginRegistration import org.onap.cps.ncmp.api.inventory.models.UpgradedCmHandles -import org.onap.cps.ncmp.impl.inventory.models.CmHandleState -import org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory +import org.onap.cps.ncmp.api.inventory.models.CmHandleState +import org.onap.cps.ncmp.api.inventory.models.LockReasonCategory import spock.util.concurrent.PollingConditions class CmHandleUpgradeSpec extends CpsIntegrationSpecBase { diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/performance/base/CpsPerfTestBase.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/performance/base/CpsPerfTestBase.groovy index c0d86bc521..963873343d 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/performance/base/CpsPerfTestBase.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/performance/base/CpsPerfTestBase.groovy @@ -1,6 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2023-2024 Nordix Foundation + * Modifications Copyright (C) 2025 TechMahindra Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. @@ -23,6 +24,7 @@ package org.onap.cps.integration.performance.base import org.onap.cps.integration.ResourceMeter import org.onap.cps.rest.utils.MultipartFileUtil import org.onap.cps.api.parameters.FetchDescendantsOption +import org.onap.cps.utils.ContentType import org.springframework.web.multipart.MultipartFile class CpsPerfTestBase extends PerfTestBase { @@ -63,7 +65,7 @@ class CpsPerfTestBase extends PerfTestBase { def addOpenRoadData() { def data = generateOpenRoadData(OPENROADM_DEVICES_PER_ANCHOR) resourceMeter.start() - addAnchorsWithData(OPENROADM_ANCHORS, CPS_PERFORMANCE_TEST_DATASPACE, LARGE_SCHEMA_SET, 'openroadm', data) + addAnchorsWithData(OPENROADM_ANCHORS, CPS_PERFORMANCE_TEST_DATASPACE, LARGE_SCHEMA_SET, 'openroadm', data, ContentType.JSON) resourceMeter.stop() def durationInSeconds = resourceMeter.getTotalTimeInSeconds() recordAndAssertResourceUsage('Creating openroadm anchors with large data tree', 100, durationInSeconds, 600, resourceMeter.getTotalMemoryUsageInMB()) 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 17e1eb6193..c68806bdff 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,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2023-2024 Nordix Foundation + * Modifications Copyright (C) 2025 TechMahindra Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. @@ -21,7 +22,7 @@ package org.onap.cps.integration.performance.cps import org.onap.cps.api.exceptions.DataNodeNotFoundException - +import org.onap.cps.utils.ContentType import java.time.OffsetDateTime import org.onap.cps.api.CpsDataService import org.onap.cps.integration.performance.base.CpsPerfTestBase @@ -36,7 +37,7 @@ class DeletePerfTest extends CpsPerfTestBase { when: 'multiple anchors with a node with a large number of descendants is created' resourceMeter.start() def data = generateOpenRoadData(300) - addAnchorsWithData(10, CPS_PERFORMANCE_TEST_DATASPACE, LARGE_SCHEMA_SET, 'delete', data) + addAnchorsWithData(10, CPS_PERFORMANCE_TEST_DATASPACE, LARGE_SCHEMA_SET, 'delete', data, ContentType.JSON) resourceMeter.stop() def setupDurationInSeconds = resourceMeter.getTotalTimeInSeconds() then: 'setup duration is within expected time and memory used is within limit' diff --git a/integration-test/src/test/resources/data/bookstore/bookstoreData.xml b/integration-test/src/test/resources/data/bookstore/bookstoreData.xml new file mode 100644 index 0000000000..b2733550df --- /dev/null +++ b/integration-test/src/test/resources/data/bookstore/bookstoreData.xml @@ -0,0 +1,14 @@ +<?xml version='1.0' encoding='UTF-8'?> +<bookstore xmlns="org:onap:cps:sample"> + <categories> + <code>1</code> + <name>SciFi</name> + <books> + <title>2001: A Space Odyssey</title> + <lang>en</lang> + <authors>Iain M. Banks</authors> + <editions>1994</editions> + <price>895</price> + </books> + </categories> +</bookstore>
\ No newline at end of file diff --git a/k6-tests/ncmp/common/utils.js b/k6-tests/ncmp/common/utils.js index 8e68edd438..6a1faa7ccb 100644 --- a/k6-tests/ncmp/common/utils.js +++ b/k6-tests/ncmp/common/utils.js @@ -89,7 +89,7 @@ export function makeCustomSummaryReport(testResults, scenarioConfig) { '#,Test Name,Unit,Fs Requirement,Current Expectation,Actual', makeSummaryCsvLine('0', 'HTTP request failures for all tests', 'rate of failed requests', 'http_req_failed', 0, testResults, scenarioConfig), makeSummaryCsvLine('1', 'Registration of CM-handles', 'CM-handles/second', 'cmhandles_created_per_second', 50, testResults, scenarioConfig), - makeSummaryCsvLine('2', 'De-registration of CM-handles', 'CM-handles/second', 'cmhandles_deleted_per_second', 100, testResults, scenarioConfig), + makeSummaryCsvLine('2', 'De-registration of CM-handles', 'CM-handles/second', 'cmhandles_deleted_per_second', 120, testResults, scenarioConfig), makeSummaryCsvLine('3a', 'CM-handle ID search with No filter', 'milliseconds', 'id_search_nofilter_duration', 300, testResults, scenarioConfig), makeSummaryCsvLine('3b', 'CM-handle ID search with Module filter', 'milliseconds', 'id_search_module_duration', 300, testResults, scenarioConfig), makeSummaryCsvLine('3c', 'CM-handle ID search with Property filter', 'milliseconds', 'id_search_property_duration', 750, testResults, scenarioConfig), |