From 43d380143c3896537a4aecd36145e8c8ca3231c8 Mon Sep 17 00:00:00 2001 From: JvD_Ericsson Date: Thu, 8 May 2025 15:39:02 +0100 Subject: [PATCH] TEIV-Adapter: Sync with device data Issue-ID: SMO-187 Change-Id: I3b10457357b92f04f3056a3da00fbffaa49ba683 Signed-off-by: JvD_Ericsson --- .../ncmp_to_teiv_adapter/NcmpToTeivIngestion.java | 61 +++++++++++++++++----- .../models/GNBCUCPFunction.java | 3 +- .../models/ManagedElement.java | 3 +- 3 files changed, 51 insertions(+), 16 deletions(-) diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/NcmpToTeivIngestion.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/NcmpToTeivIngestion.java index 59ec39a..43f0b3e 100644 --- a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/NcmpToTeivIngestion.java +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/NcmpToTeivIngestion.java @@ -28,7 +28,6 @@ import org.oran.smo.ncmp_to_teiv_adapter.models.ManagedElementWrapper; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; - import java.io.IOException; import java.util.HashMap; import java.util.List; @@ -78,10 +77,20 @@ public class NcmpToTeivIngestion { ManagedElementWrapper wrapper = ncmpPollingClient.getAllManagedElementsFromNcmp(cmHandle); Map json = wrapper.toTeivCloudEventPayload(); try { - String payload = objectMapper.writeValueAsString(json); - CloudEvent event = CloudEventFactory.createEvent(payload, "merge"); - log.info("Sending CloudEvent with payload: {}", payload); - kafkaEventProducer.sendCloudEvent(event); + sendCloudEvent(json, "merge"); + + if (addedCmHandles.containsKey(cmHandle)) { + Map previousJson = (Map) addedCmHandles.get(cmHandle); + + Map toDeleteJson = new HashMap<>(); + toDeleteJson.put("entities", List.of(findMissingItems(extractEntities(previousJson), extractEntities(json), + "entities"))); + toDeleteJson.put("relationships", List.of(findMissingItems(extractRelationships(previousJson), + extractRelationships(json), "relationships"))); + + sendCloudEvent(toDeleteJson, "delete"); + } + addedCmHandles.put(cmHandle, json); } catch (JsonProcessingException e) { log.error("Error processing data from cmHandle {}. Event not sent. Error message: {}", cmHandle, e @@ -89,13 +98,34 @@ public class NcmpToTeivIngestion { } } + private Map>> extractEntities(Map json) { + return (Map>>) ((List) json.get("entities")).get(0); + } + + private Map>> extractRelationships(Map json) { + return (Map>>) ((List) json.get("relationships")).get(0); + } + + private Map findMissingItems(Map>> previousItems, + Map>> currentItems, String itemType) { + Map missingItems = new HashMap<>(); + for (String key : previousItems.keySet()) { + List> currentList = currentItems.getOrDefault(key, List.of()); + List> previousList = previousItems.get(key); + + List> missing = previousList.stream().filter(item -> !currentList.contains(item)).toList(); + if (!missing.isEmpty()) { + missingItems.put(key, missing); + log.info("Missing {} for key {}: {}", itemType, key, missing); + } + } + return missingItems; + } + private void removeCmHandle(String cmHandle) { try { Object json = addedCmHandles.get(cmHandle); - String payload = objectMapper.writeValueAsString(json); - CloudEvent event = CloudEventFactory.createEvent(payload, "delete"); - log.info("Sending CloudEvent with payload: {}", payload); - kafkaEventProducer.sendCloudEvent(event); + sendCloudEvent((Map) json, "delete"); addedCmHandles.remove(cmHandle); } catch (JsonProcessingException e) { log.error("Error processing data from cmHandle {}. Event not sent. Error message: {}", cmHandle, e @@ -103,16 +133,19 @@ public class NcmpToTeivIngestion { } } + private void sendCloudEvent(Map json, String eventType) throws JsonProcessingException { + String payload = objectMapper.writeValueAsString(json); + CloudEvent event = CloudEventFactory.createEvent(payload, eventType); + log.info("Sending CloudEvent with payload: {}", payload); + kafkaEventProducer.sendCloudEvent(event); + } + private void sendSampleOCUCPEvent() throws IOException { String content = readResourceFile("sample-responses/_3gpp-common-managed-element-ocucp.json"); ManagedElementWrapper wrapper = objectMapper.readValue(content, ManagedElementWrapper.class); Map toJson = wrapper.toTeivCloudEventPayload(); try { - String payload = objectMapper.writeValueAsString(toJson); - CloudEvent event = CloudEventFactory.createEvent(payload, "merge"); - log.info("Sending CloudEvent with payload: {}", payload); - kafkaEventProducer.sendCloudEvent(event); - addedCmHandles.put("pynts-o-cu-cp-1", toJson); + sendCloudEvent(toJson, "merge"); } catch (JsonProcessingException e) { log.error("Error processing ocucp data. Event not sent. Error message: {}", e.getMessage()); } diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBCUCPFunction.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBCUCPFunction.java index 6c3b9fe..8131d03 100644 --- a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBCUCPFunction.java +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBCUCPFunction.java @@ -72,7 +72,8 @@ public class GNBCUCPFunction extends AbstractFunction { String gnbcucpFunctionFdn = "urn:oran:smo:teiv:" + getId(); String managedElementFdn = "urn:oran:smo:teiv:" + managedElementId; return Map.of("id", String.format("urn:oran:smo:teiv:%s_MANAGES_%s", managedElementId, getId()), "aSide", - managedElementFdn, "bSide", gnbcucpFunctionFdn, "sourceIds", List.of(managedElementFdn, gnbcucpFunctionFdn)); + managedElementFdn, "bSide", gnbcucpFunctionFdn, "sourceIds", List.of(managedElementFdn, + gnbcucpFunctionFdn)); } @Override diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/ManagedElement.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/ManagedElement.java index a3c552b..aa34457 100644 --- a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/ManagedElement.java +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/ManagedElement.java @@ -77,7 +77,8 @@ public class ManagedElement extends AbstractEntity { if (!entityMap.containsKey(ranFunctionType)) { entityMap.put(ranFunctionType, new ArrayList<>()); } - entityMap.get(ranFunctionType).add(ranFunction.addTeivEntitiesAndRelationships(entityMap, relationshipMap, getId())); + entityMap.get(ranFunctionType).add(ranFunction.addTeivEntitiesAndRelationships(entityMap, relationshipMap, + getId())); } private void addRelationshipWithRanFunction(AbstractFunction ranFunction, Map> relationshipMap) { -- 2.16.6