diff options
Diffstat (limited to 'cps-ncmp-service/src/main/java/org/onap')
3 files changed, 125 insertions, 1 deletions
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/CmNotificationSubscriptionNcmpInEventConsumer.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/CmNotificationSubscriptionNcmpInEventConsumer.java index d3bde011b3..362fbeb9e2 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/CmNotificationSubscriptionNcmpInEventConsumer.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/CmNotificationSubscriptionNcmpInEventConsumer.java @@ -23,17 +23,23 @@ package org.onap.cps.ncmp.api.impl.events.cmsubscription; import static org.onap.cps.ncmp.api.impl.events.mapper.CloudEventMapper.toTargetEvent; import io.cloudevents.CloudEvent; +import java.util.List; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.onap.cps.ncmp.events.cmnotificationsubscription_merge1_0_0.client_to_ncmp.CmNotificationSubscriptionNcmpInEvent; +import org.onap.cps.ncmp.events.cmnotificationsubscription_merge1_0_0.client_to_ncmp.Predicate; import org.springframework.beans.factory.annotation.Value; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Component; @Component @Slf4j +@RequiredArgsConstructor public class CmNotificationSubscriptionNcmpInEventConsumer { + private final DmiCmNotificationSubscriptionCacheHandler dmiCmNotificationSubscriptionCacheHandler; + @Value("${notification.enabled:true}") private boolean notificationFeatureEnabled; @@ -50,9 +56,12 @@ public class CmNotificationSubscriptionNcmpInEventConsumer { toTargetEvent(cloudEvent, CmNotificationSubscriptionNcmpInEvent.class); log.info("Subscription with name {} to be mapped to hazelcast object...", cmNotificationSubscriptionNcmpInEvent.getData().getSubscriptionId()); + final String subscriptionId = cmNotificationSubscriptionNcmpInEvent.getData().getSubscriptionId(); + final List<Predicate> predicates = cmNotificationSubscriptionNcmpInEvent.getData().getPredicates(); + dmiCmNotificationSubscriptionCacheHandler.add(subscriptionId, predicates); if ("subscriptionCreated".equals(cloudEvent.getType()) && cmNotificationSubscriptionNcmpInEvent != null) { log.info("Subscription for ClientID {} with name {} ...", cloudEvent.getSource(), cmNotificationSubscriptionNcmpInEvent.getData().getSubscriptionId()); } } -} +}
\ No newline at end of file diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/DmiCmNotificationSubscriptionCacheHandler.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/DmiCmNotificationSubscriptionCacheHandler.java new file mode 100644 index 0000000000..2f10b1ce1e --- /dev/null +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/DmiCmNotificationSubscriptionCacheHandler.java @@ -0,0 +1,113 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2024 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.api.impl.events.cmsubscription; + +import static org.onap.cps.ncmp.api.impl.events.cmsubscription.model.CmNotificationSubscriptionStatus.PENDING; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import lombok.RequiredArgsConstructor; +import org.onap.cps.ncmp.api.impl.events.cmsubscription.model.DmiCmNotificationSubscriptionDetails; +import org.onap.cps.ncmp.api.impl.events.cmsubscription.model.DmiCmNotificationSubscriptionPredicate; +import org.onap.cps.ncmp.api.impl.inventory.InventoryPersistence; +import org.onap.cps.ncmp.api.impl.operations.DatastoreType; +import org.onap.cps.ncmp.api.impl.yangmodels.YangModelCmHandle; +import org.onap.cps.ncmp.events.cmnotificationsubscription_merge1_0_0.client_to_ncmp.Predicate; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class DmiCmNotificationSubscriptionCacheHandler { + + private final Map<String, Map<String, DmiCmNotificationSubscriptionDetails>> cmNotificationSubscriptionCache; + private final InventoryPersistence inventoryPersistence; + + /** + * Adds new subscription to the subscription cache. + * + * @param subscriptionId subscription Id + * @param predicates subscription request predicates + */ + public void add(final String subscriptionId, final List<Predicate> predicates) { + cmNotificationSubscriptionCache.put(subscriptionId, createDmiCmNotificationSubscriptionsPerDmi(predicates)); + } + + /** + * Creates map of subscription details per DMI. + * + * @param predicates CM Subscription Create Request Predicates + * @return Map of DmiCmNotificationSubscription per DMI plugin + */ + public Map<String, DmiCmNotificationSubscriptionDetails> createDmiCmNotificationSubscriptionsPerDmi( + final List<Predicate> predicates) { + final Map<String, DmiCmNotificationSubscriptionDetails> dmiCmNotificationSubscriptionDetailsPerDmi = + new HashMap<>(); + for (final Predicate requestPredicate : predicates) { + final List<String> targetFilter = requestPredicate.getTargetFilter(); + final DatastoreType datastoreType = DatastoreType.fromDatastoreName( + requestPredicate.getScopeFilter().getDatastore().toString()); + final Set<String> xpaths = new HashSet<>(requestPredicate.getScopeFilter().getXpathFilter()); + final Map<String, Set<String>> targetCmHandlesByDmiMap = groupTargetCmHandleIdsByDmi(targetFilter); + for (final Map.Entry<String, Set<String>> targetCmHandlesByDmi: targetCmHandlesByDmiMap.entrySet()) { + final DmiCmNotificationSubscriptionPredicate dmiCmNotificationSubscriptionPredicate = + new DmiCmNotificationSubscriptionPredicate(targetCmHandlesByDmi.getValue(), + datastoreType, xpaths); + updateDmiCmNotificationSubscriptionDetailsPerDmi(targetCmHandlesByDmi.getKey(), + dmiCmNotificationSubscriptionPredicate, + dmiCmNotificationSubscriptionDetailsPerDmi); + } + } + return dmiCmNotificationSubscriptionDetailsPerDmi; + } + + private void updateDmiCmNotificationSubscriptionDetailsPerDmi( + final String dmiServiceName, + final DmiCmNotificationSubscriptionPredicate dmiCmNotificationSubscriptionPredicate, + final Map<String, DmiCmNotificationSubscriptionDetails> dmiCmNotificationSubscriptionDetailsPerDmi) { + if (dmiCmNotificationSubscriptionDetailsPerDmi.containsKey(dmiServiceName)) { + dmiCmNotificationSubscriptionDetailsPerDmi.get(dmiServiceName) + .getDmiCmNotificationSubscriptionPredicates().add(dmiCmNotificationSubscriptionPredicate); + } else { + dmiCmNotificationSubscriptionDetailsPerDmi.put(dmiServiceName, + new DmiCmNotificationSubscriptionDetails( + new ArrayList<>(List.of(dmiCmNotificationSubscriptionPredicate)), + PENDING)); + } + } + + private Map<String, Set<String>> groupTargetCmHandleIdsByDmi(final List<String> targetCmHandleIds) { + final Map<String, Set<String>> targetCmHandlesByDmiServiceNames = new HashMap<>(); + final Collection<YangModelCmHandle> yangModelCmHandles = + inventoryPersistence.getYangModelCmHandles(targetCmHandleIds); + + for (final YangModelCmHandle yangModelCmHandle : yangModelCmHandles) { + final String dmiServiceName = yangModelCmHandle.getDmiServiceName(); + targetCmHandlesByDmiServiceNames.putIfAbsent(dmiServiceName, new HashSet<>()); + targetCmHandlesByDmiServiceNames.get(dmiServiceName).add(yangModelCmHandle.getId()); + } + return targetCmHandlesByDmiServiceNames; + } +}
\ No newline at end of file diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/model/DmiCmNotificationSubscriptionDetails.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/model/DmiCmNotificationSubscriptionDetails.java index 4f6caefce7..95757e7240 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/model/DmiCmNotificationSubscriptionDetails.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/model/DmiCmNotificationSubscriptionDetails.java @@ -21,11 +21,13 @@ package org.onap.cps.ncmp.api.impl.events.cmsubscription.model; import java.util.List; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; @Getter @Setter +@AllArgsConstructor public class DmiCmNotificationSubscriptionDetails { private List<DmiCmNotificationSubscriptionPredicate> dmiCmNotificationSubscriptionPredicates; |