summaryrefslogtreecommitdiffstats
path: root/cps-ncmp-service/src/main
diff options
context:
space:
mode:
authorhalil.cakal <halil.cakal@est.tech>2024-02-12 11:41:00 +0000
committerhalil.cakal <halil.cakal@est.tech>2024-02-16 10:10:27 +0000
commit9b86bf1fda03ec67b25077cbc208020948c4d042 (patch)
tree360f9916c5dc80b62e88042e27452b4906816c21 /cps-ncmp-service/src/main
parentcc8fbf61b3fd0c6828caaa2cb784daacc346c56e (diff)
Use DB for checking Alternate IDs
- do NOT use hazelcast cache - introduced AlternateIcChecker - use checks during Inital registration - TODO: remvoe Hazalcast Cache (once perf test are OK) - TODO: use checks during UPDATE registration - TODO: error reporting during registration Issue-Id: CPS-2049 Change-Id: I0adcac52a7a49e26301758eafc4684152ddfcaf5 Signed-off-by: halil.cakal <halil.cakal@est.tech>
Diffstat (limited to 'cps-ncmp-service/src/main')
-rwxr-xr-xcps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java100
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandler.java25
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistence.java12
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistenceImpl.java39
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/utils/AlternateIdChecker.java142
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/utils/CmHandleIdMapper.java95
6 files changed, 250 insertions, 163 deletions
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java
index 05b83b98e4..7622e7cb49 100755
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java
@@ -48,7 +48,6 @@ import java.util.Set;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
import org.onap.cps.api.CpsDataService;
import org.onap.cps.ncmp.api.NcmpResponseStatus;
import org.onap.cps.ncmp.api.NetworkCmProxyCmHandleQueryService;
@@ -66,7 +65,7 @@ import org.onap.cps.ncmp.api.impl.operations.DmiDataOperations;
import org.onap.cps.ncmp.api.impl.operations.OperationType;
import org.onap.cps.ncmp.api.impl.trustlevel.TrustLevel;
import org.onap.cps.ncmp.api.impl.trustlevel.TrustLevelManager;
-import org.onap.cps.ncmp.api.impl.utils.CmHandleIdMapper;
+import org.onap.cps.ncmp.api.impl.utils.AlternateIdChecker;
import org.onap.cps.ncmp.api.impl.utils.CmHandleQueryConditions;
import org.onap.cps.ncmp.api.impl.utils.InventoryQueryConditions;
import org.onap.cps.ncmp.api.impl.utils.YangDataConverter;
@@ -106,37 +105,25 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService
private final IMap<String, Object> moduleSyncStartedOnCmHandles;
private final Map<String, TrustLevel> trustLevelPerDmiPlugin;
private final TrustLevelManager trustLevelManager;
- private final CmHandleIdMapper cmHandleIdMapper;
+ private final AlternateIdChecker alternateIdChecker;
private final Map<String, Collection<ModuleReference>> moduleSetTagCache;
@Override
public DmiPluginRegistrationResponse updateDmiRegistrationAndSyncModule(
final DmiPluginRegistration dmiPluginRegistration) {
- cacheAlternateIds(dmiPluginRegistration.getCreatedCmHandles());
+
dmiPluginRegistration.validateDmiPluginRegistration();
final DmiPluginRegistrationResponse dmiPluginRegistrationResponse = new DmiPluginRegistrationResponse();
setTrustLevelPerDmiPlugin(dmiPluginRegistration);
- if (!dmiPluginRegistration.getRemovedCmHandles().isEmpty()) {
- dmiPluginRegistrationResponse.setRemovedCmHandles(
- parseAndProcessDeletedCmHandlesInRegistration(dmiPluginRegistration.getRemovedCmHandles()));
- }
+ processRemovedCmHandles(dmiPluginRegistration, dmiPluginRegistrationResponse);
- if (!dmiPluginRegistration.getCreatedCmHandles().isEmpty()) {
- dmiPluginRegistrationResponse.setCreatedCmHandles(
- parseAndProcessCreatedCmHandlesInRegistration(dmiPluginRegistration));
- }
- if (!dmiPluginRegistration.getUpdatedCmHandles().isEmpty()) {
- dmiPluginRegistrationResponse.setUpdatedCmHandles(
- networkCmProxyDataServicePropertyHandler
- .updateCmHandleProperties(dmiPluginRegistration.getUpdatedCmHandles()));
- }
- if (dmiPluginRegistration.getUpgradedCmHandles() != null
- && !dmiPluginRegistration.getUpgradedCmHandles().getCmHandles().isEmpty()) {
- dmiPluginRegistrationResponse.setUpgradedCmHandles(
- parseAndProcessUpgradedCmHandlesInRegistration(dmiPluginRegistration));
- }
+ processCreatedCmHandles(dmiPluginRegistration, dmiPluginRegistrationResponse);
+
+ processUpdatedCmHandles(dmiPluginRegistration, dmiPluginRegistrationResponse);
+
+ processUpgradedCmHandles(dmiPluginRegistration, dmiPluginRegistrationResponse);
return dmiPluginRegistrationResponse;
}
@@ -329,21 +316,24 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService
* @return cm-handle registration response for create cm-handle requests.
*/
public List<CmHandleRegistrationResponse> parseAndProcessCreatedCmHandlesInRegistration(
- final DmiPluginRegistration dmiPluginRegistration) {
+ final DmiPluginRegistration dmiPluginRegistration, final Collection<String> acceptedCmHandleIds) {
final List<NcmpServiceCmHandle> cmHandlesToBeCreated = dmiPluginRegistration.getCreatedCmHandles();
final Map<String, TrustLevel> initialTrustLevelPerCmHandleId = new HashMap<>(cmHandlesToBeCreated.size());
final List<YangModelCmHandle> yangModelCmHandles = new ArrayList<>(cmHandlesToBeCreated.size());
cmHandlesToBeCreated
.forEach(cmHandle -> {
- final YangModelCmHandle yangModelCmHandle = YangModelCmHandle.toYangModelCmHandle(
- dmiPluginRegistration.getDmiPlugin(),
- dmiPluginRegistration.getDmiDataPlugin(),
- dmiPluginRegistration.getDmiModelPlugin(),
- cmHandle,
- cmHandle.getModuleSetTag(),
- cmHandle.getAlternateId());
- yangModelCmHandles.add(yangModelCmHandle);
- initialTrustLevelPerCmHandleId.put(cmHandle.getCmHandleId(), cmHandle.getRegistrationTrustLevel());
+ if (acceptedCmHandleIds.contains(cmHandle.getCmHandleId())) {
+ final YangModelCmHandle yangModelCmHandle = YangModelCmHandle.toYangModelCmHandle(
+ dmiPluginRegistration.getDmiPlugin(),
+ dmiPluginRegistration.getDmiDataPlugin(),
+ dmiPluginRegistration.getDmiModelPlugin(),
+ cmHandle,
+ cmHandle.getModuleSetTag(),
+ cmHandle.getAlternateId());
+ yangModelCmHandles.add(yangModelCmHandle);
+ initialTrustLevelPerCmHandleId.put(cmHandle.getCmHandleId(),
+ cmHandle.getRegistrationTrustLevel());
+ }
});
return registerNewCmHandles(yangModelCmHandles, initialTrustLevelPerCmHandleId);
}
@@ -382,17 +372,47 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService
yangModelCmHandles.removeIf(yangModelCmHandle -> notDeletedCmHandles.contains(yangModelCmHandle.getId()));
updateCmHandleStateBatch(yangModelCmHandles, CmHandleState.DELETED);
- removeEntriesFromAlternateIdCache(yangModelCmHandles);
return cmHandleRegistrationResponses;
}
- private void removeEntriesFromAlternateIdCache(final Collection<YangModelCmHandle> yangModelCmHandles) {
- for (final YangModelCmHandle yangModelCmHandle : yangModelCmHandles) {
- cmHandleIdMapper.removeMapping(yangModelCmHandle.getId());
+ private void processRemovedCmHandles(final DmiPluginRegistration dmiPluginRegistration,
+ final DmiPluginRegistrationResponse dmiPluginRegistrationResponse) {
+ if (!dmiPluginRegistration.getRemovedCmHandles().isEmpty()) {
+ dmiPluginRegistrationResponse.setRemovedCmHandles(
+ parseAndProcessDeletedCmHandlesInRegistration(dmiPluginRegistration.getRemovedCmHandles()));
}
}
+ private void processCreatedCmHandles(final DmiPluginRegistration dmiPluginRegistration,
+ final DmiPluginRegistrationResponse dmiPluginRegistrationResponse) {
+ final Collection<String> acceptedCmHandleIds = alternateIdChecker
+ .getIdsOfCmHandlesWithAcceptableAlternateId(dmiPluginRegistration.getCreatedCmHandles());
+ if (!acceptedCmHandleIds.isEmpty()) {
+ dmiPluginRegistrationResponse.setCreatedCmHandles(
+ parseAndProcessCreatedCmHandlesInRegistration(dmiPluginRegistration, acceptedCmHandleIds));
+ }
+ }
+
+ private void processUpdatedCmHandles(final DmiPluginRegistration dmiPluginRegistration,
+ final DmiPluginRegistrationResponse dmiPluginRegistrationResponse) {
+ if (!dmiPluginRegistration.getUpdatedCmHandles().isEmpty()) {
+ dmiPluginRegistrationResponse.setUpdatedCmHandles(
+ networkCmProxyDataServicePropertyHandler
+ .updateCmHandleProperties(dmiPluginRegistration.getUpdatedCmHandles()));
+ }
+ }
+
+ private void processUpgradedCmHandles(final DmiPluginRegistration dmiPluginRegistration,
+ final DmiPluginRegistrationResponse dmiPluginRegistrationResponse) {
+ if (dmiPluginRegistration.getUpgradedCmHandles() != null
+ && !dmiPluginRegistration.getUpgradedCmHandles().getCmHandles().isEmpty()) {
+ dmiPluginRegistrationResponse.setUpgradedCmHandles(
+ parseAndProcessUpgradedCmHandlesInRegistration(dmiPluginRegistration));
+ }
+ }
+
+
protected List<CmHandleRegistrationResponse> parseAndProcessUpgradedCmHandlesInRegistration(
final DmiPluginRegistration dmiPluginRegistration) {
@@ -549,12 +569,6 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService
}
}
- private void cacheAlternateIds(final Collection<NcmpServiceCmHandle> ncmpServiceCmHandles) {
- for (final NcmpServiceCmHandle ncmpServiceCmHandle : ncmpServiceCmHandles) {
- if (!StringUtils.isEmpty(ncmpServiceCmHandle.getAlternateId())) {
- cmHandleIdMapper.addMapping(ncmpServiceCmHandle.getCmHandleId(), ncmpServiceCmHandle.getAlternateId());
- }
- }
- }
+
}
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandler.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandler.java
index 13b3fcafb1..84075a4897 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandler.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandler.java
@@ -45,7 +45,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.onap.cps.api.CpsDataService;
import org.onap.cps.ncmp.api.impl.inventory.InventoryPersistence;
-import org.onap.cps.ncmp.api.impl.utils.CmHandleIdMapper;
+import org.onap.cps.ncmp.api.impl.utils.AlternateIdChecker;
import org.onap.cps.ncmp.api.impl.utils.YangDataConverter;
import org.onap.cps.ncmp.api.impl.yangmodels.YangModelCmHandle;
import org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse;
@@ -67,7 +67,7 @@ public class NetworkCmProxyDataServicePropertyHandler {
private final InventoryPersistence inventoryPersistence;
private final CpsDataService cpsDataService;
private final JsonObjectMapper jsonObjectMapper;
- private final CmHandleIdMapper cmHandleIdMapper;
+ private final AlternateIdChecker alternateIdChecker;
/**
* Iterates over incoming ncmpServiceCmHandles and update the dataNodes based on the updated attributes.
@@ -81,8 +81,8 @@ public class NetworkCmProxyDataServicePropertyHandler {
for (final NcmpServiceCmHandle ncmpServiceCmHandle : ncmpServiceCmHandles) {
final String cmHandleId = ncmpServiceCmHandle.getCmHandleId();
try {
- final DataNode existingCmHandleDataNode = inventoryPersistence.getCmHandleDataNode(cmHandleId)
- .iterator().next();
+ final DataNode existingCmHandleDataNode = inventoryPersistence
+ .getCmHandleDataNodeByCmHandleId(cmHandleId).iterator().next();
updateAlternateId(existingCmHandleDataNode, ncmpServiceCmHandle);
processUpdates(existingCmHandleDataNode, ncmpServiceCmHandle);
cmHandleRegistrationResponses.add(CmHandleRegistrationResponse.createSuccessResponse(cmHandleId));
@@ -105,17 +105,14 @@ public class NetworkCmProxyDataServicePropertyHandler {
private void updateAlternateId(final DataNode existingCmHandleDataNode,
final NcmpServiceCmHandle ncmpServiceCmHandle) {
+ final YangModelCmHandle yangModelCmHandle =
+ YangDataConverter.convertCmHandleToYangModel(existingCmHandleDataNode,
+ ncmpServiceCmHandle.getCmHandleId());
+ final String currentAlternateId = yangModelCmHandle.getAlternateId();
final String newAlternateId = ncmpServiceCmHandle.getAlternateId();
- if (cmHandleIdMapper.addMapping(ncmpServiceCmHandle.getCmHandleId(), newAlternateId)) {
- try {
- final YangModelCmHandle yangModelCmHandle =
- YangDataConverter.convertCmHandleToYangModel(existingCmHandleDataNode,
- ncmpServiceCmHandle.getCmHandleId());
- setAndUpdateAlternateId(yangModelCmHandle, newAlternateId);
- } catch (final Exception e) {
- cmHandleIdMapper.removeMapping(ncmpServiceCmHandle.getCmHandleId());
- throw e;
- }
+ if (alternateIdChecker.canApplyAlternateId(ncmpServiceCmHandle.getCmHandleId(),
+ currentAlternateId, newAlternateId)) {
+ setAndUpdateAlternateId(yangModelCmHandle, newAlternateId);
}
}
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistence.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistence.java
index dcd0368700..e230b3fcb3 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistence.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistence.java
@@ -114,12 +114,20 @@ public interface InventoryPersistence extends NcmpPersistence {
void saveCmHandleBatch(List<YangModelCmHandle> yangModelCmHandles);
/**
- * Get data node of given cm handle.
+ * Get data node with the given cm handle id.
*
* @param cmHandleId cmHandle ID
* @return data node
*/
- Collection<DataNode> getCmHandleDataNode(String cmHandleId);
+ Collection<DataNode> getCmHandleDataNodeByCmHandleId(String cmHandleId);
+
+ /**
+ * Get data node with the given alternate id.
+ *
+ * @param alternateId alternate ID
+ * @return data node
+ */
+ DataNode getCmHandleDataNodeByAlternateId(String alternateId);
/**
* Get collection of data nodes of given cm handles.
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistenceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistenceImpl.java
index 3b70786038..08ab15eaa7 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistenceImpl.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/inventory/InventoryPersistenceImpl.java
@@ -22,6 +22,8 @@
package org.onap.cps.ncmp.api.impl.inventory;
+import static org.onap.cps.spi.FetchDescendantsOption.OMIT_DESCENDANTS;
+
import com.google.common.collect.Lists;
import java.time.OffsetDateTime;
import java.util.ArrayList;
@@ -37,6 +39,7 @@ import org.onap.cps.api.CpsModuleService;
import org.onap.cps.ncmp.api.impl.utils.YangDataConverter;
import org.onap.cps.ncmp.api.impl.yangmodels.YangModelCmHandle;
import org.onap.cps.spi.FetchDescendantsOption;
+import org.onap.cps.spi.exceptions.DataNodeNotFoundException;
import org.onap.cps.spi.exceptions.DataValidationException;
import org.onap.cps.spi.model.DataNode;
import org.onap.cps.spi.model.ModuleDefinition;
@@ -54,6 +57,7 @@ public class InventoryPersistenceImpl extends NcmpPersistenceImpl implements Inv
private final CpsModuleService cpsModuleService;
private final CpsAnchorService cpsAnchorService;
private final CpsValidator cpsValidator;
+ private final CmHandleQueries cmHandleQueries;
/**
* initialize an inventory persistence object.
@@ -66,18 +70,19 @@ public class InventoryPersistenceImpl extends NcmpPersistenceImpl implements Inv
*/
public InventoryPersistenceImpl(final JsonObjectMapper jsonObjectMapper, final CpsDataService cpsDataService,
final CpsModuleService cpsModuleService, final CpsValidator cpsValidator,
- final CpsAnchorService cpsAnchorService) {
+ final CpsAnchorService cpsAnchorService, final CmHandleQueries cmHandleQueries) {
super(jsonObjectMapper, cpsDataService, cpsModuleService, cpsValidator);
this.cpsModuleService = cpsModuleService;
this.cpsAnchorService = cpsAnchorService;
this.cpsValidator = cpsValidator;
+ this.cmHandleQueries = cmHandleQueries;
}
@Override
public CompositeState getCmHandleState(final String cmHandleId) {
final DataNode stateAsDataNode = cpsDataService.getDataNodes(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR,
- createCmHandleXPath(cmHandleId) + "/state", FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS)
+ getXPathForCmHandleById(cmHandleId) + "/state", FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS)
.iterator().next();
cpsValidator.validateNameCharacters(cmHandleId);
return new CompositeStateBuilder().fromDataNode(stateAsDataNode).build();
@@ -87,14 +92,14 @@ public class InventoryPersistenceImpl extends NcmpPersistenceImpl implements Inv
public void saveCmHandleState(final String cmHandleId, final CompositeState compositeState) {
final String cmHandleJsonData = createStateJsonData(jsonObjectMapper.asJsonString(compositeState));
cpsDataService.updateDataNodeAndDescendants(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR,
- createCmHandleXPath(cmHandleId), cmHandleJsonData, OffsetDateTime.now());
+ getXPathForCmHandleById(cmHandleId), cmHandleJsonData, OffsetDateTime.now());
}
@Override
public void saveCmHandleStateBatch(final Map<String, CompositeState> cmHandleStatePerCmHandleId) {
final Map<String, String> cmHandlesJsonDataMap = new HashMap<>();
cmHandleStatePerCmHandleId.forEach((cmHandleId, compositeState) -> cmHandlesJsonDataMap.put(
- createCmHandleXPath(cmHandleId),
+ getXPathForCmHandleById(cmHandleId),
createStateJsonData(jsonObjectMapper.asJsonString(compositeState))));
cpsDataService.updateDataNodesAndDescendants(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR,
cmHandlesJsonDataMap, OffsetDateTime.now());
@@ -103,7 +108,7 @@ public class InventoryPersistenceImpl extends NcmpPersistenceImpl implements Inv
@Override
public YangModelCmHandle getYangModelCmHandle(final String cmHandleId) {
cpsValidator.validateNameCharacters(cmHandleId);
- final DataNode dataNode = getCmHandleDataNode(cmHandleId).iterator().next();
+ final DataNode dataNode = getCmHandleDataNodeByCmHandleId(cmHandleId).iterator().next();
return YangDataConverter.convertCmHandleToYangModel(dataNode, cmHandleId);
}
@@ -158,14 +163,26 @@ public class InventoryPersistenceImpl extends NcmpPersistenceImpl implements Inv
}
@Override
- public Collection<DataNode> getCmHandleDataNode(final String cmHandleId) {
- return this.getDataNode(createCmHandleXPath(cmHandleId));
+ public Collection<DataNode> getCmHandleDataNodeByCmHandleId(final String cmHandleId) {
+ return this.getDataNode(getXPathForCmHandleById(cmHandleId));
+ }
+
+ @Override
+ public DataNode getCmHandleDataNodeByAlternateId(final String alternateId) {
+ final String xPathForCmHandleByAlternateId = getXPathForCmHandleByAlternateId(alternateId);
+ final Collection<DataNode> dataNodes = cmHandleQueries
+ .queryNcmpRegistryByCpsPath(xPathForCmHandleByAlternateId, OMIT_DESCENDANTS);
+ if (dataNodes.isEmpty()) {
+ throw new DataNodeNotFoundException(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR,
+ xPathForCmHandleByAlternateId);
+ }
+ return dataNodes.iterator().next();
}
@Override
public Collection<DataNode> getCmHandleDataNodes(final Collection<String> cmHandleIds) {
final Collection<String> xpaths = new ArrayList<>(cmHandleIds.size());
- cmHandleIds.forEach(cmHandleId -> xpaths.add(createCmHandleXPath(cmHandleId)));
+ cmHandleIds.forEach(cmHandleId -> xpaths.add(getXPathForCmHandleById(cmHandleId)));
return this.getDataNodes(xpaths);
}
@@ -174,10 +191,14 @@ public class InventoryPersistenceImpl extends NcmpPersistenceImpl implements Inv
return cpsAnchorService.queryAnchorNames(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, moduleNamesForQuery);
}
- private static String createCmHandleXPath(final String cmHandleId) {
+ private static String getXPathForCmHandleById(final String cmHandleId) {
return NCMP_DMI_REGISTRY_PARENT + "/cm-handles[@id='" + cmHandleId + "']";
}
+ private static String getXPathForCmHandleByAlternateId(final String alternateId) {
+ return NCMP_DMI_REGISTRY_PARENT + "/cm-handles[@alternate-id='" + alternateId + "']";
+ }
+
private static String createStateJsonData(final String state) {
return "{\"state\":" + state + "}";
}
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/utils/AlternateIdChecker.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/utils/AlternateIdChecker.java
new file mode 100644
index 0000000000..1be1a90853
--- /dev/null
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/utils/AlternateIdChecker.java
@@ -0,0 +1,142 @@
+/*
+ * ============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.utils;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.cps.ncmp.api.impl.inventory.InventoryPersistence;
+import org.onap.cps.ncmp.api.impl.yangmodels.YangModelCmHandle;
+import org.onap.cps.ncmp.api.models.NcmpServiceCmHandle;
+import org.onap.cps.spi.exceptions.DataNodeNotFoundException;
+import org.springframework.stereotype.Service;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class AlternateIdChecker {
+
+ private final InventoryPersistence inventoryPersistence;
+
+ private static final String NO_CURRENT_ALTERNATE_ID = "";
+
+ /**
+ * Check if the alternate can be applied to the given cm handle (id).
+ * Conditions:
+ * - proposed alternate is blank (it wil be ignored)
+ * - proposed alternate is same as current (no change)
+ * - proposed alternate is not in use for a different cm handle (in the DB)
+ *
+ * @param cmHandleId cm handle id
+ * @param proposedAlternateId proposed alternate id
+ * @return true if the new alternate id not in use or equal to current alternate id, false otherwise
+ */
+ public boolean canApplyAlternateId(final String cmHandleId, final String proposedAlternateId) {
+ String currentAlternateId = "";
+ try {
+ final YangModelCmHandle yangModelCmHandle = inventoryPersistence.getYangModelCmHandle(cmHandleId);
+ currentAlternateId = yangModelCmHandle.getAlternateId();
+ } catch (final DataNodeNotFoundException dataNodeNotFoundException) {
+ // work with blank current alternate id
+ }
+ return this.canApplyAlternateId(cmHandleId, currentAlternateId, proposedAlternateId);
+ }
+
+ /**
+ * Check if the alternate can be applied to the given cm handle.
+ * Conditions:
+ * - proposed alternate is blank (it wil be ignored)
+ * - proposed alternate is same as current (no change)
+ * - proposed alternate is not in use for a different cm handle (in the DB)
+ *
+ * @param cmHandleId cm handle id
+ * @param currentAlternateId current alternate id
+ * @param proposedAlternateId new alternate id
+ * @return true if the new alternate id not in use or equal to current alternate id, false otherwise
+ */
+ public boolean canApplyAlternateId(final String cmHandleId,
+ final String currentAlternateId,
+ final String proposedAlternateId) {
+ if (StringUtils.isBlank(currentAlternateId)) {
+ if (alternateIdAlreadyInDb(proposedAlternateId)) {
+ log.warn("Alternate id update ignored, cannot update cm handle {}, alternate id is already "
+ + "assigned to a different cm handle", cmHandleId);
+ return false;
+ }
+ return true;
+ }
+ if (currentAlternateId.equals(proposedAlternateId)) {
+ return true;
+ }
+ log.warn("Alternate id update ignored, cannot update cm handle {}, already has an alternate id of {}",
+ cmHandleId, currentAlternateId);
+ return false;
+ }
+
+ /**
+ * Check all alternate ids of a batch of NEW cm handles.
+ * Includes cross-checks in the batch itself for duplicates. Only the first entry encountered wil be accepted.
+ * This method can only be used for NEW cm handle registrations NOT for updating existing ones
+ *
+ * @param newNcmpServiceCmHandles the proposed new cm handles
+ * @return collection of cm handles ids which are acceptable
+ */
+ public Collection<String> getIdsOfCmHandlesWithAcceptableAlternateId(
+ final Collection<NcmpServiceCmHandle> newNcmpServiceCmHandles) {
+ final Set<String> acceptedAlternateIds = new HashSet<>(newNcmpServiceCmHandles.size());
+ final Collection<String> acceptedCmHandleIds = new ArrayList<>(newNcmpServiceCmHandles.size());
+ for (final NcmpServiceCmHandle ncmpServiceCmHandle : newNcmpServiceCmHandles) {
+ final String cmHandleId = ncmpServiceCmHandle.getCmHandleId();
+ final String proposedAlternateId = ncmpServiceCmHandle.getAlternateId();
+ final boolean isAcceptable;
+ if (StringUtils.isEmpty(proposedAlternateId)) {
+ isAcceptable = true;
+ } else {
+ if (acceptedAlternateIds.contains(proposedAlternateId)) {
+ isAcceptable = false;
+ log.warn("Alternate id update ignored, cannot update cm handle {}, alternate id is already "
+ + "assigned to a different cm handle (in this batch)", cmHandleId);
+ } else {
+ isAcceptable = canApplyAlternateId(cmHandleId, NO_CURRENT_ALTERNATE_ID, proposedAlternateId);
+ }
+ }
+ if (isAcceptable) {
+ acceptedAlternateIds.add(proposedAlternateId);
+ acceptedCmHandleIds.add(cmHandleId);
+ }
+ }
+ return acceptedCmHandleIds;
+ }
+
+ private boolean alternateIdAlreadyInDb(final String alternateId) {
+ try {
+ inventoryPersistence.getCmHandleDataNodeByAlternateId(alternateId);
+ } catch (final DataNodeNotFoundException dataNodeNotFoundException) {
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/utils/CmHandleIdMapper.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/utils/CmHandleIdMapper.java
deleted file mode 100644
index a88adbd110..0000000000
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/utils/CmHandleIdMapper.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * ============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.utils;
-
-import java.util.Map;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.onap.cps.ncmp.api.NetworkCmProxyCmHandleQueryService;
-import org.springframework.stereotype.Service;
-
-@Service
-@Slf4j
-@RequiredArgsConstructor
-public class CmHandleIdMapper {
-
- private final Map<String, String> alternateIdPerCmHandleId;
- private final Map<String, String> cmHandleIdPerAlternateId;
- private final NetworkCmProxyCmHandleQueryService networkCmProxyCmHandleQueryService;
-
- private boolean cacheIsInitialized = false;
-
- public String cmHandleIdToAlternateId(final String cmHandleId) {
- initializeCache();
- return alternateIdPerCmHandleId.get(cmHandleId);
- }
-
- public String alternateIdToCmHandleId(final String alternateId) {
- initializeCache();
- return cmHandleIdPerAlternateId.get(alternateId);
- }
-
- public boolean addMapping(final String cmHandleId, final String alternateId) {
- initializeCache();
- return addMappingWithValidation(cmHandleId, alternateId);
- }
-
-
- private boolean addMappingWithValidation(final String cmHandleId, final String alternateId) {
- if (alternateIdPerCmHandleId.containsKey(cmHandleId)) {
- final String originalAlternateId = alternateIdPerCmHandleId.get(cmHandleId);
- if (!originalAlternateId.equals(alternateId)) {
- log.warn("Alternate id update ignored, cannot update cm handle {}, already has an alternate id of {}",
- cmHandleId, originalAlternateId);
- }
- return false;
- }
- if (StringUtils.isBlank(alternateId)) {
- return false;
- }
- alternateIdPerCmHandleId.put(cmHandleId, alternateId);
- cmHandleIdPerAlternateId.put(alternateId, cmHandleId);
- return true;
- }
-
- public void removeMapping(final String cmHandleId) {
- final String alternateId = alternateIdPerCmHandleId.remove(cmHandleId);
- removeAlternateIdWithValidation(alternateId);
- }
-
- private void removeAlternateIdWithValidation(final String alternateId) {
- if (alternateId != null) {
- cmHandleIdPerAlternateId.remove(alternateId);
- }
- }
-
- private void initializeCache() {
- if (!cacheIsInitialized) {
- networkCmProxyCmHandleQueryService.getAllCmHandles().forEach(cmHandle ->
- addMappingWithValidation(cmHandle.getCmHandleId(), cmHandle.getAlternateId())
- );
- log.info("Alternate ID cache initialized from DB with {} cm handle/alternate id pairs ",
- alternateIdPerCmHandleId.size());
- cacheIsInitialized = true;
- }
- }
-}