aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cps-application/src/main/java/org/onap/cps/config/MicroMeterConfig.java89
-rw-r--r--cps-application/src/main/resources/application.yml4
-rw-r--r--cps-application/src/test/groovy/org/onap/cps/config/MicroMeterConfigSpec.groovy28
-rw-r--r--cps-dependencies/pom.xml5
-rw-r--r--cps-ncmp-rest/docs/openapi/components.yaml193
-rw-r--r--cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/util/CmHandleStateMapper.java2
-rw-r--r--cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy6
-rw-r--r--cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/util/CmHandleStateMapperSpec.groovy8
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/DataStoreSyncState.java (renamed from cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/DataStoreSyncState.java)2
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/models/CmHandleState.java (renamed from cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/models/CmHandleState.java)2
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/models/CompositeState.java4
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/models/CompositeStateBuilder.java4
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/models/LockReasonCategory.java (renamed from cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/models/LockReasonCategory.java)2
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cache/AdminCacheConfig.java49
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cmnotificationsubscription/dmi/DmiOutEventConsumer.java2
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cmnotificationsubscription/ncmp/CmSubscriptionHandlerImpl.java2
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cmnotificationsubscription/ncmp/NcmpInEventConsumer.java2
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/DmiDataOperations.java2
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/utils/DmiDataOperationsHelper.java2
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryService.java3
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImpl.java3
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationService.java5
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CompositeStateUtils.java3
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/DataSyncWatchdog.java2
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleOperationsUtils.java6
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncService.java2
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncTasks.java4
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/CmHandleStateMonitor.java100
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCmHandleStateHandler.java2
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCmHandleStateHandlerImpl.java16
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCreatorHelper.java2
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/inventory/models/CompositeStateBuilderSpec.groovy4
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/inventory/models/CompositeStateSpec.groovy4
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/cache/AdminCacheConfigSpec.groovy57
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/DmiDataOperationsSpec.groovy6
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/utils/DmiDataOperationsHelperSpec.groovy4
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiOperationsBaseSpec.groovy2
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImplSpec.groovy3
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServiceSpec.groovy3
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImplSpec.groovy2
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/NetworkCmProxyInventoryFacadeSpec.groovy5
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/models/YangModelCmHandleSpec.groovy4
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/DataSyncWatchdogSpec.groovy4
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/ModuleOperationsUtilsSpec.groovy10
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncServiceSpec.groovy4
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncTasksSpec.groovy8
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/lcm/CmHandleStateMonitorSpec.groovy92
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCmHandleStateHandlerImplSpec.groovy19
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/sync/lcm/LcmEventsCreatorSpec.groovy8
-rw-r--r--cps-ri/pom.xml5
-rw-r--r--docker-compose/docker-compose.yml2
-rw-r--r--docs/api/swagger/ncmp/openapi-inventory.yaml12
-rw-r--r--docs/api/swagger/ncmp/openapi.yaml395
-rwxr-xr-xdocs/conf.py1
-rw-r--r--docs/index.rst4
-rw-r--r--docs/ncmp-data-operation.rst12
-rw-r--r--integration-test/src/test/groovy/org/onap/cps/integration/base/CpsIntegrationSpecBase.groovy9
-rw-r--r--integration-test/src/test/groovy/org/onap/cps/integration/base/FunctionalSpecBase.groovy34
-rw-r--r--integration-test/src/test/groovy/org/onap/cps/integration/functional/cps/DataServiceIntegrationSpec.groovy73
-rw-r--r--integration-test/src/test/groovy/org/onap/cps/integration/functional/cps/QueryServiceIntegrationSpec.groovy8
-rw-r--r--integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/CmHandleCreateSpec.groovy4
-rw-r--r--integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/CmHandleUpgradeSpec.groovy4
-rw-r--r--integration-test/src/test/groovy/org/onap/cps/integration/performance/base/CpsPerfTestBase.groovy4
-rw-r--r--integration-test/src/test/groovy/org/onap/cps/integration/performance/cps/DeletePerfTest.groovy5
-rw-r--r--integration-test/src/test/resources/data/bookstore/bookstoreData.xml14
-rw-r--r--k6-tests/ncmp/common/utils.js2
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),