TEIV-Adapter: Optimize sync logic 99/14399/1
authorJvD_Ericsson <jeff.van.dam@est.tech>
Mon, 12 May 2025 13:22:54 +0000 (14:22 +0100)
committerJvD_Ericsson <jeff.van.dam@est.tech>
Mon, 12 May 2025 13:22:59 +0000 (14:22 +0100)
now only gets READY devices from NCMP instead of all

Issue-ID: SMO-187
Change-Id: I99b7017a777419ea4b28895a73947e3aa3bdf8ca
Signed-off-by: JvD_Ericsson <jeff.van.dam@est.tech>
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/NcmpPollingClient.java
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/NcmpToTeivIngestion.java

index f065998..89fdad6 100644 (file)
@@ -56,7 +56,7 @@ public class NcmpPollingClient {
     public List<String> getAllCmHandlesFromNcmp() {
         try {
             HttpUrl url = HttpUrl.parse(baseUrl + searchesUrl).newBuilder().build();
-            String requestBody = "{\"conditions\": [{\"name\": \"hasAllModules\"}]}";
+            String requestBody = "{\"cmHandleQueryParameters\":[{\"conditionName\":\"cmHandleWithCpsPath\",\"conditionParameters\":[{\"cpsPath\":\"//state[@cm-handle-state='READY']\"}]}]}";
             RequestBody body = RequestBody.create(requestBody, MediaType.parse("application/json"));
 
             Request request = new Request.Builder().url(url).post(body).addHeader("Content-Type", "application/json")
index 43f0b3e..a4f8827 100644 (file)
@@ -77,20 +77,24 @@ public class NcmpToTeivIngestion {
         ManagedElementWrapper wrapper = ncmpPollingClient.getAllManagedElementsFromNcmp(cmHandle);
         Map<String, Object> json = wrapper.toTeivCloudEventPayload();
         try {
-            sendCloudEvent(json, "merge");
-
             if (addedCmHandles.containsKey(cmHandle)) {
                 Map<String, Object> previousJson = (Map<String, Object>) addedCmHandles.get(cmHandle);
-
                 Map<String, Object> 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");
+                Map<String, Object> missingEntities = findMissingItems(extractEntities(previousJson), extractEntities(json),
+                        "entities");
+                if (!missingEntities.isEmpty()) {
+                    toDeleteJson.put("entities", List.of(missingEntities));
+                }
+                Map<String, Object> missingRelationships = findMissingItems(extractRelationships(previousJson),
+                        extractRelationships(json), "relationships");
+                if (!missingRelationships.isEmpty()) {
+                    toDeleteJson.put("relationships", List.of(missingRelationships));
+                }
+                if (!toDeleteJson.isEmpty()) {
+                    sendCloudEvent(toDeleteJson, "delete");
+                }
             }
-
+            sendCloudEvent(json, "merge");
             addedCmHandles.put(cmHandle, json);
         } catch (JsonProcessingException e) {
             log.error("Error processing data from cmHandle {}. Event not sent. Error message: {}", cmHandle, e
@@ -113,7 +117,8 @@ public class NcmpToTeivIngestion {
             List<Map<String, Object>> currentList = currentItems.getOrDefault(key, List.of());
             List<Map<String, Object>> previousList = previousItems.get(key);
 
-            List<Map<String, Object>> missing = previousList.stream().filter(item -> !currentList.contains(item)).toList();
+            List<Map<String, Object>> missing = previousList.stream().filter(item -> currentList.stream().noneMatch(
+                    currentItem -> currentItem.get("id").equals(item.get("id")))).toList();
             if (!missing.isEmpty()) {
                 missingItems.put(key, missing);
                 log.info("Missing {} for key {}: {}", itemType, key, missing);