diff options
27 files changed, 129 insertions, 88 deletions
diff --git a/cps-application/src/main/resources/application.yml b/cps-application/src/main/resources/application.yml index c10a26fe0b..6eb9e108be 100644 --- a/cps-application/src/main/resources/application.yml +++ b/cps-application/src/main/resources/application.yml @@ -106,6 +106,7 @@ app: cm-subscription-dmi-out: ${CM_SUBSCRIPTION_DMI_OUT_TOPIC:dmi-ncmp-cm-avc-subscription} cm-subscription-ncmp-out: ${CM_SUBSCRIPTION_NCMP_OUT_TOPIC:subscription-response} cm-events-topic: ${NCMP_CM_EVENTS_TOPIC:cm-events} + inventory-events-topic: ncmp-inventory-events lcm: events: topic: ${LCM_EVENTS_TOPIC:ncmp-events} diff --git a/cps-events/src/main/resources/schemas/updatenode/cps-data-updated-event-schema-1.0.0.json b/cps-events/src/main/resources/schemas/cps.dataupdated/cps-data-updated-event-schema-1.0.0.json index a3eaf63fa4..a3eaf63fa4 100644 --- a/cps-events/src/main/resources/schemas/updatenode/cps-data-updated-event-schema-1.0.0.json +++ b/cps-events/src/main/resources/schemas/cps.dataupdated/cps-data-updated-event-schema-1.0.0.json diff --git a/cps-ncmp-events/src/main/resources/schemas/dmidataavc/avc-event-schema-1.0.0.json b/cps-ncmp-events/src/main/resources/schemas/dmi/cm-events/avc-event-schema-1.0.0.json index 474520d142..474520d142 100644 --- a/cps-ncmp-events/src/main/resources/schemas/dmidataavc/avc-event-schema-1.0.0.json +++ b/cps-ncmp-events/src/main/resources/schemas/dmi/cm-events/avc-event-schema-1.0.0.json diff --git a/cps-ncmp-events/src/main/resources/schemas/trustlevel/device-trust-level-event-schema-1.0.0.json b/cps-ncmp-events/src/main/resources/schemas/dmi/device-heartbeat/device-trust-level-event-schema-1.0.0.json index e1796fbc73..e1796fbc73 100644 --- a/cps-ncmp-events/src/main/resources/schemas/trustlevel/device-trust-level-event-schema-1.0.0.json +++ b/cps-ncmp-events/src/main/resources/schemas/dmi/device-heartbeat/device-trust-level-event-schema-1.0.0.json diff --git a/cps-ncmp-events/src/main/resources/schemas/async/data-operation-event-schema-1.0.0.json b/cps-ncmp-events/src/main/resources/schemas/ncmp/async-m2m/data-operation-event-schema-1.0.0.json index c2915187c7..c2915187c7 100644 --- a/cps-ncmp-events/src/main/resources/schemas/async/data-operation-event-schema-1.0.0.json +++ b/cps-ncmp-events/src/main/resources/schemas/ncmp/async-m2m/data-operation-event-schema-1.0.0.json diff --git a/cps-ncmp-events/src/main/resources/schemas/dmi-async-request-response-event-schema-v1.json b/cps-ncmp-events/src/main/resources/schemas/ncmp/async-m2m/dmi-async-request-response-event-schema-v1.json index 2340a4bc4c..4db07bec95 100644 --- a/cps-ncmp-events/src/main/resources/schemas/dmi-async-request-response-event-schema-v1.json +++ b/cps-ncmp-events/src/main/resources/schemas/ncmp/async-m2m/dmi-async-request-response-event-schema-v1.json @@ -6,6 +6,7 @@ "DmiAsyncRequestResponseEvent": { "description": "The payload for NCMP async request response event.", "type": "object", + "javaType" : "org.onap.cps.ncmp.event.model.DmiAsyncRequestResponseEvent", "properties": { "eventId": { "description": "The unique id identifying the event generated by DMI.", diff --git a/cps-ncmp-events/src/main/resources/schemas/ncmp-async-request-response-event-schema-v1.json b/cps-ncmp-events/src/main/resources/schemas/ncmp/async-m2m/ncmp-async-request-response-event-schema-v1.json index 51c2cf4d40..32b7becd05 100644 --- a/cps-ncmp-events/src/main/resources/schemas/ncmp-async-request-response-event-schema-v1.json +++ b/cps-ncmp-events/src/main/resources/schemas/ncmp/async-m2m/ncmp-async-request-response-event-schema-v1.json @@ -6,6 +6,7 @@ "NcmpAsyncRequestResponseEvent": { "description": "The payload for CPS async request response event.", "type": "object", + "javaType" : "org.onap.cps.ncmp.event.model.NcmpAsyncRequestResponseEvent", "properties": { "eventId": { "description": "The unique id identifying the event generated by DMI.", diff --git a/cps-ncmp-events/src/main/resources/schemas/ncmpdataavc/avc-event-schema-1.0.0.json b/cps-ncmp-events/src/main/resources/schemas/ncmp/avc/avc-event-schema-1.0.0.json index d24ec2c737..d24ec2c737 100644 --- a/cps-ncmp-events/src/main/resources/schemas/ncmpdataavc/avc-event-schema-1.0.0.json +++ b/cps-ncmp-events/src/main/resources/schemas/ncmp/avc/avc-event-schema-1.0.0.json diff --git a/cps-ncmp-events/src/main/resources/schemas/cmnotificationsubscription/dmi-in-event-schema-1.0.0.json b/cps-ncmp-events/src/main/resources/schemas/ncmp/avc/dmi-in-event-schema-1.0.0.json index 93ec216e3d..93ec216e3d 100644 --- a/cps-ncmp-events/src/main/resources/schemas/cmnotificationsubscription/dmi-in-event-schema-1.0.0.json +++ b/cps-ncmp-events/src/main/resources/schemas/ncmp/avc/dmi-in-event-schema-1.0.0.json diff --git a/cps-ncmp-events/src/main/resources/schemas/cmnotificationsubscription/dmi-out-event-schema-1.0.0.json b/cps-ncmp-events/src/main/resources/schemas/ncmp/avc/dmi-out-event-schema-1.0.0.json index 0910de1529..0910de1529 100644 --- a/cps-ncmp-events/src/main/resources/schemas/cmnotificationsubscription/dmi-out-event-schema-1.0.0.json +++ b/cps-ncmp-events/src/main/resources/schemas/ncmp/avc/dmi-out-event-schema-1.0.0.json diff --git a/cps-ncmp-events/src/main/resources/schemas/cmnotificationsubscription/ncmp-in-event-schema-1.0.0.json b/cps-ncmp-events/src/main/resources/schemas/ncmp/avc/ncmp-in-event-schema-1.0.0.json index f8b6c2e680..f8b6c2e680 100644 --- a/cps-ncmp-events/src/main/resources/schemas/cmnotificationsubscription/ncmp-in-event-schema-1.0.0.json +++ b/cps-ncmp-events/src/main/resources/schemas/ncmp/avc/ncmp-in-event-schema-1.0.0.json diff --git a/cps-ncmp-events/src/main/resources/schemas/cmnotificationsubscription/ncmp-out-event-schema-1.0.0.json b/cps-ncmp-events/src/main/resources/schemas/ncmp/avc/ncmp-out-event-schema-1.0.0.json index 11dc4e1114..11dc4e1114 100644 --- a/cps-ncmp-events/src/main/resources/schemas/cmnotificationsubscription/ncmp-out-event-schema-1.0.0.json +++ b/cps-ncmp-events/src/main/resources/schemas/ncmp/avc/ncmp-out-event-schema-1.0.0.json diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManager.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManager.java index f68bb3b543..692bf5caee 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManager.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManager.java @@ -193,14 +193,14 @@ public class TrustLevelManager { final TrustLevel newEffectiveTrustLevel) { if (oldEffectiveTrustLevel.equals(newEffectiveTrustLevel)) { log.debug("The Cm Handle: {} has already the same trust level: {}", notificationCandidateCmHandleId, - newEffectiveTrustLevel); + newEffectiveTrustLevel); } else { log.info("The trust level for Cm Handle: {} is now: {} ", notificationCandidateCmHandleId, - newEffectiveTrustLevel); + newEffectiveTrustLevel); cmAvcEventPublisher.publishAvcEvent(notificationCandidateCmHandleId, - AVC_CHANGED_ATTRIBUTE_NAME, - oldEffectiveTrustLevel.name(), - newEffectiveTrustLevel.name()); + AVC_CHANGED_ATTRIBUTE_NAME, + oldEffectiveTrustLevel.name(), + newEffectiveTrustLevel.name()); } } diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/utils/events/CmAvcEventPublisher.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/utils/events/CmAvcEventPublisher.java index 2a9717cc1a..bdc7899724 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/utils/events/CmAvcEventPublisher.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/utils/events/CmAvcEventPublisher.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2023-2024 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. @@ -38,8 +38,8 @@ public class CmAvcEventPublisher { private final EventsPublisher<CloudEvent> eventsPublisher; - @Value("${app.ncmp.avc.cm-events-topic}") - private String avcTopic; + @Value("${app.ncmp.avc.inventory-events-topic}") + private String ncmpInventoryEventsTopicName; /** * Publish attribute value change event. @@ -52,10 +52,10 @@ public class CmAvcEventPublisher { final Map<String, String> extensions = createAvcEventExtensions(eventKey); final CloudEvent avcCloudEvent = - NcmpEvent.builder().type(AvcEvent.class.getTypeName()) - .data(avcEvent).extensions(extensions).build().asCloudEvent(); + NcmpEvent.builder().type(AvcEvent.class.getTypeName()) + .data(avcEvent).extensions(extensions).build().asCloudEvent(); - eventsPublisher.publishCloudEvent(avcTopic, eventKey, avcCloudEvent); + eventsPublisher.publishCloudEvent(ncmpInventoryEventsTopicName, eventKey, avcCloudEvent); } private AvcEvent buildAvcEvent(final String attributeName, @@ -78,4 +78,4 @@ public class CmAvcEventPublisher { extensions.put("correlationid", eventKey); return extensions; } -} +}
\ No newline at end of file diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/utils/events/MessagingBaseSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/utils/events/MessagingBaseSpec.groovy index 377a1a6637..d38d5442f2 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/utils/events/MessagingBaseSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/utils/events/MessagingBaseSpec.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. @@ -29,8 +29,7 @@ import org.springframework.kafka.core.KafkaTemplate import org.springframework.kafka.support.serializer.JsonSerializer import org.springframework.test.context.DynamicPropertyRegistry import org.springframework.test.context.DynamicPropertySource -import org.testcontainers.containers.KafkaContainer -import org.testcontainers.utility.DockerImageName +import org.testcontainers.kafka.ConfluentKafkaContainer import spock.lang.Specification class MessagingBaseSpec extends Specification { @@ -43,7 +42,7 @@ class MessagingBaseSpec extends Specification { kafkaTestContainer.stop() } - static kafkaTestContainer = new KafkaContainer(DockerImageName.parse('registry.nordix.org/onaptest/confluentinc/cp-kafka:6.2.1').asCompatibleSubstituteFor('confluentinc/cp-kafka')) + static kafkaTestContainer = new ConfluentKafkaContainer("confluentinc/cp-kafka:7.8.0") def legacyEventKafkaTemplate = new KafkaTemplate<>(new DefaultKafkaProducerFactory<String, String>(eventProducerConfigProperties(JsonSerializer))) diff --git a/cps-ri/src/main/java/org/onap/cps/ri/CpsDataPersistenceServiceImpl.java b/cps-ri/src/main/java/org/onap/cps/ri/CpsDataPersistenceServiceImpl.java index 52fd7f2be1..ac6fe38ee7 100644 --- a/cps-ri/src/main/java/org/onap/cps/ri/CpsDataPersistenceServiceImpl.java +++ b/cps-ri/src/main/java/org/onap/cps/ri/CpsDataPersistenceServiceImpl.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2021-2024 Nordix Foundation + * Copyright (C) 2021-2025 Nordix Foundation * Modifications Copyright (C) 2021 Pantheon.tech * Modifications Copyright (C) 2020-2022 Bell Canada. * Modifications Copyright (C) 2022-2023 TechMahindra Ltd. @@ -37,6 +37,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.TreeMap; import java.util.stream.Collectors; @@ -230,6 +231,27 @@ public class CpsDataPersistenceServiceImpl implements CpsDataPersistenceService } @Override + public <T> Set<T> queryDataLeaf(final String dataspaceName, final String anchorName, final String cpsPath, + final Class<T> targetClass) { + final CpsPathQuery cpsPathQuery = getCpsPathQuery(cpsPath); + if (!cpsPathQuery.hasAttributeAxis()) { + throw new IllegalArgumentException( + "Only Cps Path Queries with attribute-axis are supported by queryDataLeaf"); + } + + final String attributeName = cpsPathQuery.getAttributeAxisAttributeName(); + final List<DataNode> dataNodes = queryDataNodes(dataspaceName, anchorName, cpsPath, + FetchDescendantsOption.OMIT_DESCENDANTS); + return dataNodes.stream() + .map(dataNode -> { + final Object attributeValue = dataNode.getLeaves().get(attributeName); + return targetClass.isInstance(attributeValue) ? targetClass.cast(attributeValue) : null; + }) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + } + + @Override @Timed(value = "cps.data.persistence.service.datanode.query.anchors", description = "Time taken to query data nodes across all anchors or list of anchors") public List<DataNode> queryDataNodesAcrossAnchors(final String dataspaceName, final String cpsPath, diff --git a/cps-service/src/main/java/org/onap/cps/impl/CpsQueryServiceImpl.java b/cps-service/src/main/java/org/onap/cps/impl/CpsQueryServiceImpl.java index 2687d8faee..508a1b2449 100644 --- a/cps-service/src/main/java/org/onap/cps/impl/CpsQueryServiceImpl.java +++ b/cps-service/src/main/java/org/onap/cps/impl/CpsQueryServiceImpl.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2021-2024 Nordix Foundation + * Copyright (C) 2021-2025 Nordix Foundation * Modifications Copyright (C) 2022-2023 TechMahindra Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -54,7 +54,7 @@ public class CpsQueryServiceImpl implements CpsQueryService { public <T> Set<T> queryDataLeaf(final String dataspaceName, final String anchorName, final String cpsPath, final Class<T> targetClass) { cpsValidator.validateNameCharacters(dataspaceName, anchorName); - throw new UnsupportedOperationException("Query by attribute-axis not implemented yet!"); + return cpsDataPersistenceService.queryDataLeaf(dataspaceName, anchorName, cpsPath, targetClass); } @Override diff --git a/cps-service/src/main/java/org/onap/cps/spi/CpsDataPersistenceService.java b/cps-service/src/main/java/org/onap/cps/spi/CpsDataPersistenceService.java index 5be5b1e2e0..a4f05cdb53 100644 --- a/cps-service/src/main/java/org/onap/cps/spi/CpsDataPersistenceService.java +++ b/cps-service/src/main/java/org/onap/cps/spi/CpsDataPersistenceService.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2020-2024 Nordix Foundation. + * Copyright (C) 2020-2025 Nordix Foundation. * Modifications Copyright (C) 2021 Pantheon.tech * Modifications Copyright (C) 2022 Bell Canada * Modifications Copyright (C) 2022-2023 TechMahindra Ltd. @@ -27,6 +27,7 @@ import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Set; import org.onap.cps.api.model.DataNode; import org.onap.cps.api.parameters.FetchDescendantsOption; import org.onap.cps.api.parameters.PaginationOption; @@ -185,6 +186,17 @@ public interface CpsDataPersistenceService { String cpsPath, FetchDescendantsOption fetchDescendantsOption); /** + * Get data leaf for the given dataspace and anchor by cps path. + * + * @param dataspaceName dataspace name + * @param anchorName anchor name + * @param cpsPath cps path + * @param targetClass class of the expected data type + * @return a collection of data objects of expected type + */ + <T> Set<T> queryDataLeaf(String dataspaceName, String anchorName, String cpsPath, Class<T> targetClass); + + /** * Get a datanode by dataspace name and cps path across all anchors. * * @param dataspaceName dataspace name diff --git a/cps-service/src/test/groovy/org/onap/cps/impl/CpsQueryServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/impl/CpsQueryServiceImplSpec.groovy index 237e4e4592..b15ee72370 100644 --- a/cps-service/src/test/groovy/org/onap/cps/impl/CpsQueryServiceImplSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/impl/CpsQueryServiceImplSpec.groovy @@ -1,6 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2021-2023 Nordix Foundation + * Copyright (C) 2021-2025 Nordix Foundation * Modifications Copyright (C) 2023 TechMahindra Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -73,11 +73,10 @@ class CpsQueryServiceImplSpec extends Specification { 1 * mockCpsDataPersistenceService.countAnchorsForDataspaceAndCpsPath("some-dataspace", "/cps-path") } - // TODO will be implemented in CPS-2416 def 'Query data leaf.'() { when: 'a query for a specific leaf is executed' objectUnderTest.queryDataLeaf('some-dataspace', 'some-anchor', '/cps-path/@id', Object.class) then: 'solution is not implemented yet' - thrown(UnsupportedOperationException) + 1 * mockCpsDataPersistenceService.queryDataLeaf('some-dataspace', 'some-anchor', '/cps-path/@id', Object.class) } } diff --git a/csit/tests/cps-trust-level/cps-trust-level.robot b/csit/tests/cps-trust-level/cps-trust-level.robot index 810bcf4d12..98ec665a6c 100644 --- a/csit/tests/cps-trust-level/cps-trust-level.robot +++ b/csit/tests/cps-trust-level/cps-trust-level.robot @@ -1,6 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2023-2024 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. @@ -46,11 +46,11 @@ Register data node Should Be Equal As Strings ${response.status_code} 200 Verify notification - ${group_id}= Create Consumer auto_offset_reset=earliest - Subscribe Topic topics=cm-events group_id=${group_id} - ${result}= Poll group_id=${group_id} only_value=False poll_attempts=5 - ${headers} Set Variable ${result[0].headers()} - ${payload} Set Variable ${result[0].value()} + ${group_id}= Create Consumer auto_offset_reset=earliest + Subscribe Topic topics=ncmp-inventory-events group_id=${group_id} + ${result}= Poll group_id=${group_id} only_value=False poll_attempts=5 + ${headers} Set Variable ${result[0].headers()} + ${payload} Set Variable ${result[0].value()} FOR ${header_key_value_pair} IN @{headers} Compare Header Values ${header_key_value_pair[0]} ${header_key_value_pair[1]} "ce_specversion" "1.0" Compare Header Values ${header_key_value_pair[0]} ${header_key_value_pair[1]} "ce_source" "NCMP" diff --git a/docker-compose/config/grafana/postgresql-statistics-dashboard.json b/docker-compose/config/grafana/postgresql-statistics-dashboard.json index 491649ea87..642294167e 100644 --- a/docker-compose/config/grafana/postgresql-statistics-dashboard.json +++ b/docker-compose/config/grafana/postgresql-statistics-dashboard.json @@ -107,7 +107,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "pg_static{app=\"$app\"}", + "expr": "pg_static{instance=\"$instance\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -184,7 +184,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "pg_settings_max_connections{app=\"$app\"}", + "expr": "pg_settings_max_connections{instance=\"$instance\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -261,7 +261,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "pg_settings_shared_buffers_bytes{app=\"$app\"}", + "expr": "pg_settings_shared_buffers_bytes{instance=\"$instance\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -338,7 +338,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "pg_settings_effective_cache_size_bytes{app=\"$app\"}", + "expr": "pg_settings_effective_cache_size_bytes{instance=\"$instance\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -415,7 +415,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "pg_settings_maintenance_work_mem_bytes{app=\"$app\"}", + "expr": "pg_settings_maintenance_work_mem_bytes{instance=\"$instance\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -492,7 +492,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "pg_settings_work_mem_bytes{app=\"$app\"}", + "expr": "pg_settings_work_mem_bytes{instance=\"$instance\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -570,7 +570,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "pg_settings_max_wal_size_bytes{app=\"$app\"}", + "expr": "pg_settings_max_wal_size_bytes{instance=\"$instance\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -647,7 +647,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "pg_settings_random_page_cost{app=\"$app\"}", + "expr": "pg_settings_random_page_cost{instance=\"$instance\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -724,7 +724,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "pg_settings_seq_page_cost{app=\"$app\"}", + "expr": "pg_settings_seq_page_cost{instance=\"$instance\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -801,7 +801,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "pg_settings_max_worker_processes{app=\"$app\"}", + "expr": "pg_settings_max_worker_processes{instance=\"$instance\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -878,7 +878,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "pg_settings_max_parallel_workers{app=\"$app\"}", + "expr": "pg_settings_max_parallel_workers{instance=\"$instance\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -989,7 +989,7 @@ { "datasource": "PBFA97CFB590B2093", "editorMode": "code", - "expr": "pg_database_size_bytes{app=\"$app\", datname=\"$db\"}", + "expr": "pg_database_size_bytes{instance=\"$instance\", datname=\"$db\"}", "legendFormat": "size", "range": true, "refId": "A" @@ -1098,7 +1098,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "pg_stat_activity_count{app=\"$app\", datname=\"$db\"}", + "expr": "pg_stat_activity_count{instance=\"$instance\", datname=\"$db\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1191,7 +1191,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_database_xact_commit{app=\"$app\", datname=\"$db\"}[5m])", + "expr": "irate(pg_stat_database_xact_commit{instance=\"$instance\", datname=\"$db\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1201,7 +1201,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_database_xact_rollback{app=\"$app\", datname=\"$db\"}[5m])", + "expr": "irate(pg_stat_database_xact_rollback{instance=\"$instance\", datname=\"$db\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1299,7 +1299,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_database_tup_fetched{app=\"$app\", datname=\"$db\"}[5m])", + "expr": "irate(pg_stat_database_tup_fetched{instance=\"$instance\", datname=\"$db\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1309,7 +1309,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_database_tup_returned{app=\"$app\", datname=\"$db\"}[5m])", + "expr": "irate(pg_stat_database_tup_returned{instance=\"$instance\", datname=\"$db\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1407,7 +1407,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_database_tup_inserted{app=\"$app\", datname=\"$db\"}[5m])", + "expr": "irate(pg_stat_database_tup_inserted{instance=\"$instance\", datname=\"$db\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1417,7 +1417,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_database_tup_updated{app=\"$app\", datname=\"$db\"}[5m])", + "expr": "irate(pg_stat_database_tup_updated{instance=\"$instance\", datname=\"$db\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1427,7 +1427,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_database_tup_deleted{app=\"$app\", datname=\"$db\"}[5m])", + "expr": "irate(pg_stat_database_tup_deleted{instance=\"$instance\", datname=\"$db\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1525,7 +1525,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "pg_stat_activity_max_tx_duration{app=\"$app\", datname=\"$db\"}", + "expr": "pg_stat_activity_max_tx_duration{instance=\"$instance\", datname=\"$db\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1619,7 +1619,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "pg_stat_database_blks_hit{app=\"$app\", datname=\"$db\"} / (pg_stat_database_blks_read{app=\"$app\", datname=\"$db\"} + pg_stat_database_blks_hit{app=\"$app\", datname=\"$db\"})", + "expr": "pg_stat_database_blks_hit{instance=\"$instance\", datname=\"$db\"} / (pg_stat_database_blks_read{instance=\"$instance\", datname=\"$db\"} + pg_stat_database_blks_hit{instance=\"$instance\", datname=\"$db\"})", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1730,7 +1730,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_bgwriter_buffers_backend_total{app=\"$app\"}[5m])", + "expr": "irate(pg_stat_bgwriter_buffers_backend_total{instance=\"$instance\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1740,7 +1740,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_bgwriter_buffers_alloc_total{app=\"$app\"}[5m])", + "expr": "irate(pg_stat_bgwriter_buffers_alloc_total{instance=\"$instance\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1750,7 +1750,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_bgwriter_buffers_backend_fsync_total{app=\"$app\"}[5m])", + "expr": "irate(pg_stat_bgwriter_buffers_backend_fsync_total{instance=\"$instance\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1760,7 +1760,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_bgwriter_buffers_checkpoint_total{app=\"$app\"}[5m])", + "expr": "irate(pg_stat_bgwriter_buffers_checkpoint_total{instance=\"$instance\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1770,7 +1770,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_bgwriter_buffers_clean_total{app=\"$app\"}[5m])", + "expr": "irate(pg_stat_bgwriter_buffers_clean_total{instance=\"$instance\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1863,7 +1863,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_database_conflicts{app=\"$app\", datname=\"$db\"}[5m])", + "expr": "irate(pg_stat_database_conflicts{instance=\"$instance\", datname=\"$db\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1873,7 +1873,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_database_deadlocks{app=\"$app\", datname=\"$db\"}[5m])", + "expr": "irate(pg_stat_database_deadlocks{instance=\"$instance\", datname=\"$db\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1972,7 +1972,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "pg_locks_count{app=\"$app\", datname=\"$db\"}", + "expr": "pg_locks_count{instance=\"$instance\", datname=\"$db\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -2066,7 +2066,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_database_temp_bytes{app=\"$app\", datname=\"$db\"}[5m])", + "expr": "irate(pg_stat_database_temp_bytes{instance=\"$instance\", datname=\"$db\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -2164,7 +2164,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_bgwriter_checkpoint_write_time_total{app=\"$app\"}[5m])", + "expr": "irate(pg_stat_bgwriter_checkpoint_write_time_total{instance=\"$instance\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -2174,7 +2174,7 @@ { "datasource": "PBFA97CFB590B2093", "exemplar": true, - "expr": "irate(pg_stat_bgwriter_checkpoint_sync_time_total{app=\"$app\"}[5m])", + "expr": "irate(pg_stat_bgwriter_checkpoint_sync_time_total{instance=\"$instance\"}[5m])", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -2198,13 +2198,13 @@ "value": "" }, "datasource": "PBFA97CFB590B2093", - "definition": "label_values(pg_up, app)", + "definition": "label_values(pg_up, instance)", "includeAll": false, - "label": "App", - "name": "app", + "label": "instance", + "name": "instance", "options": [], "query": { - "query": "label_values(pg_up, app)", + "query": "label_values(pg_up, instance)", "refId": "StandardVariableQuery" }, "refresh": 1, @@ -2217,13 +2217,13 @@ "value": "cpsdb" }, "datasource": "PBFA97CFB590B2093", - "definition": "label_values(pg_stat_database_tup_fetched{datname!~\"template.*|postgres\",app=\"$app\"},datname)", + "definition": "label_values(pg_stat_database_tup_fetched{datname!~\"template.*|postgres\",instance=\"$instance\"},datname)", "includeAll": false, "label": "Database", "name": "db", "options": [], "query": { - "query": "label_values(pg_stat_database_tup_fetched{datname!~\"template.*|postgres\",app=\"$app\"},datname)", + "query": "label_values(pg_stat_database_tup_fetched{datname!~\"template.*|postgres\",instance=\"$instance\"},datname)", "refId": "StandardVariableQuery" }, "refresh": 1, diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml index 11a2c7912e..33ad108be1 100644 --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -96,7 +96,7 @@ services: ### if kafka is not required comment out zookeeper and kafka ### zookeeper: - image: confluentinc/cp-zookeeper:6.2.1 + image: confluentinc/cp-zookeeper:7.8.0 container_name: ${ZOOKEEPER_CONTAINER_NAME:-zookeeper} ports: - ${ZOOKEEPER_PORT:-2181}:2181 @@ -104,7 +104,7 @@ services: ZOOKEEPER_CLIENT_PORT: 2181 kafka: - image: confluentinc/cp-kafka:6.2.1 + image: confluentinc/cp-kafka:7.8.0 container_name: ${KAFKA_CONTAINER_NAME:-kafka} ports: - ${KAFKA_PORT:-9092}:9092 @@ -151,7 +151,7 @@ services: KAFKA_BOOTSTRAP_SERVER: kafka:29092 NCMP_CONSUMER_GROUP_ID: ncmp-group NCMP_ASYNC_M2M_TOPIC: ncmp-async-m2m - MODULE_INITIAL_PROCESSING_DELAY_MS: 120000 + MODULE_INITIAL_PROCESSING_DELAY_MS: 180000 MODULE_REFERENCES_DELAY_MS: 100 MODULE_RESOURCES_DELAY_MS: 1000 READ_DATA_FOR_CM_HANDLE_DELAY_MS: 300 diff --git a/docs/deployment.rst b/docs/deployment.rst index 2af0dd0cd5..840ab8e116 100644 --- a/docs/deployment.rst +++ b/docs/deployment.rst @@ -22,14 +22,24 @@ set appropriately. For example, given a database with 2GB of memory, 512MB is a CPS and NCMP Configuration ========================== +CPU and Memory Requirements +--------------------------- + +The following are minimum requirements for NCMP: + +* For 20,000 CM-handles: 2 CPUs and 2 GB RAM per instance, with 70% heap allocation. +* For 50,000 CM-handles: 3 CPUs and 3 GB RAM per instance, with 70% heap allocation. + JVM Memory Allocation +^^^^^^^^^^^^^^^^^^^^^ -Allocating 75% of the container's memory to the JVM heap ensures efficient memory management. -This helps the JVM make the best use of the allocated resources while leaving enough memory for other processes. +When running with 2 GB or more memory per instance, allocating 70% of the JVM memory to the heap ensures efficient +memory management. It is not recommended to go above 70%. .. code-block:: yaml - JAVA_TOOL_OPTIONS: "-XX:InitialRAMPercentage=75.0 -XX:MaxRAMPercentage=75.0" + JAVA_TOOL_OPTIONS: "-XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0" + Load balancer configuration =========================== 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 e4d75aa378..d1b445f5a4 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,6 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2023-2024 Nordix Foundation + * Copyright (C) 2023-2025 Nordix Foundation * Modifications Copyright (C) 2023-2025 TechMahindra Ltd * ================================================================================ * Licensed under the Apache License, Version 2.0 (the 'License'); @@ -27,7 +27,6 @@ import org.onap.cps.integration.base.FunctionalSpecBase import org.onap.cps.api.parameters.FetchDescendantsOption import org.onap.cps.api.parameters.PaginationOption import org.onap.cps.api.exceptions.CpsPathException -import spock.lang.Ignore import static org.onap.cps.api.parameters.FetchDescendantsOption.DIRECT_CHILDREN_ONLY import static org.onap.cps.api.parameters.FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS @@ -57,7 +56,6 @@ class QueryServiceIntegrationSpec extends FunctionalSpecBase { 'the AND is used where result does not exist' | '//books[@lang="English" and @price=1000]' || 0 | [] } - @Ignore // TODO will be implemented in CPS-2416 def 'Query data leaf using CPS path for #scenario.'() { when: 'query data leaf for bookstore container' def result = objectUnderTest.queryDataLeaf(FUNCTIONAL_TEST_DATASPACE_1, BOOKSTORE_ANCHOR_1, cpsPath, Object.class) @@ -70,7 +68,6 @@ class QueryServiceIntegrationSpec extends FunctionalSpecBase { 'non-existing path' | '/non-existing/@title' || 0 } - @Ignore def 'Query data leaf with type #leafType using CPS path.'() { given: 'a cps path query for two books, returning only #leafName' def cpsPath = '//books[@title="Matilda" or @title="Good Omens"]/@' + leafName @@ -85,7 +82,6 @@ class QueryServiceIntegrationSpec extends FunctionalSpecBase { 'editions' | List.class || [[1988, 2000], [2006]] } - @Ignore def 'Query data leaf using CPS path with ancestor axis.'() { given: 'a cps path query that will return the names of the categories of two books' def cpsPath = '//books[@title="Matilda" or @title="Good Omens"]/ancestor::categories/@name' diff --git a/integration-test/src/test/java/org/onap/cps/integration/KafkaTestContainer.java b/integration-test/src/test/java/org/onap/cps/integration/KafkaTestContainer.java index ff4aec4175..60c1637c5a 100644 --- a/integration-test/src/test/java/org/onap/cps/integration/KafkaTestContainer.java +++ b/integration-test/src/test/java/org/onap/cps/integration/KafkaTestContainer.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2024 Nordix Foundation. + * Copyright (C) 2024-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,8 +25,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.common.serialization.StringDeserializer; -import org.testcontainers.containers.KafkaContainer; -import org.testcontainers.utility.DockerImageName; +import org.testcontainers.kafka.ConfluentKafkaContainer; /** * The Apache Kafka test container wrapper. @@ -35,14 +34,14 @@ import org.testcontainers.utility.DockerImageName; * Avoid unnecessary resource and time consumption. */ @Slf4j -public class KafkaTestContainer extends KafkaContainer { +public class KafkaTestContainer extends ConfluentKafkaContainer { - private static final String IMAGE_NAME_AND_VERSION = "registry.nordix.org/onaptest/confluentinc/cp-kafka:6.2.1"; + private static final String IMAGE_NAME_AND_VERSION = "confluentinc/cp-kafka:7.8.0"; private static volatile KafkaTestContainer kafkaTestContainer; private KafkaTestContainer() { - super(DockerImageName.parse(IMAGE_NAME_AND_VERSION).asCompatibleSubstituteFor("confluentinc/cp-kafka")); + super(IMAGE_NAME_AND_VERSION); } /** diff --git a/integration-test/src/test/resources/application.yml b/integration-test/src/test/resources/application.yml index 8ede492ad1..e213a70a59 100644 --- a/integration-test/src/test/resources/application.yml +++ b/integration-test/src/test/resources/application.yml @@ -102,6 +102,7 @@ app: cm-subscription-dmi-out: ${CM_SUBSCRIPTION_DMI_OUT_TOPIC:dmi-ncmp-cm-avc-subscription} cm-subscription-ncmp-out: ${CM_SUBSCRIPTION_NCMP_OUT_TOPIC:subscription-response} cm-events-topic: ${NCMP_CM_EVENTS_TOPIC:cm-events} + inventory-events-topic: ncmp-inventory-events lcm: events: topic: ${LCM_EVENTS_TOPIC:ncmp-events} diff --git a/k6-tests/ncmp/common/passthrough-crud.js b/k6-tests/ncmp/common/passthrough-crud.js index 251ddf8890..a3d48fd590 100644 --- a/k6-tests/ncmp/common/passthrough-crud.js +++ b/k6-tests/ncmp/common/passthrough-crud.js @@ -29,7 +29,7 @@ import { export function passthroughRead(useAlternateId) { const cmHandleReference = getRandomCmHandleReference(useAlternateId); - const resourceIdentifier = 'NRCellDU/attributes/cellLocalId'; + const resourceIdentifier = 'ManagedElement=NRNode1/GNBDUFunction=1'; const datastoreName = 'ncmp-datastore:passthrough-operational'; const includeDescendants = true; const url = generatePassthroughUrl(cmHandleReference, datastoreName, resourceIdentifier, includeDescendants); @@ -38,7 +38,7 @@ export function passthroughRead(useAlternateId) { export function passthroughWrite(useAlternateId) { const cmHandleReference = getRandomCmHandleReference(useAlternateId); - const resourceIdentifier = 'NRCellDU/attributes/cellLocalId'; + const resourceIdentifier = 'ManagedElement=NRNode1/GNBDUFunction=1'; const datastoreName = 'ncmp-datastore:passthrough-running'; const includeDescendants = false; const url = generatePassthroughUrl(cmHandleReference, datastoreName, resourceIdentifier, includeDescendants); @@ -54,7 +54,7 @@ export function legacyBatchRead(cmHandleIds) { const payload = JSON.stringify({ "operations": [ { - "resourceIdentifier": "NRCellDU/attributes/cellLocalId", + "resourceIdentifier": "ManagedElement=NRNode1/GNBDUFunction=1", "targetIds": cmHandleIds, "datastore": "ncmp-datastore:passthrough-operational", "options": "(fields=NRCellDU/attributes/cellLocalId)", |