From feb9fb0c0a47f6ccf9e28ea7474def605c6e6a4b Mon Sep 17 00:00:00 2001 From: mpriyank Date: Fri, 5 Aug 2022 16:34:33 +0100 Subject: CmHandleState transition using state handler - Raise LCM Event when state transition happens. - Raised events for ADVISED to READY, ADVISED to LOCKED, LOCKED to ADVISED. - Refactor existing code to raise the events correctly. - Refactored existing test scenarios to comply with the code change. Issue-ID: CPS-1034 Change-Id: Ie548e644f6133304d7fa36c892ca2bec7393c074 Signed-off-by: mpriyank --- .../api/impl/NetworkCmProxyDataServiceImpl.java | 20 ++------- .../api/impl/event/lcm/LcmEventsCreatorHelper.java | 38 +++++++++------- .../ncmp/api/inventory/CompositeStateUtils.java | 2 + .../api/inventory/sync/ModuleSyncWatchdog.java | 50 +++++----------------- 4 files changed, 40 insertions(+), 70 deletions(-) (limited to 'cps-ncmp-service/src/main') 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 8462d687b..0fdecde07 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 @@ -271,17 +271,12 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService List cmHandleRegistrationResponses = new ArrayList<>(); try { cmHandleRegistrationResponses = dmiPluginRegistration.getCreatedCmHandles().stream() - .map(cmHandle -> { - setCompositeStateToAdvised(cmHandle); - return YangModelCmHandle.toYangModelCmHandle( + .map(cmHandle -> + YangModelCmHandle.toYangModelCmHandle( dmiPluginRegistration.getDmiPlugin(), dmiPluginRegistration.getDmiDataPlugin(), dmiPluginRegistration.getDmiModelPlugin(), - cmHandle); - } - ) - .map(this::registerNewCmHandle) - .collect(Collectors.toList()); + cmHandle)).map(this::registerNewCmHandle).collect(Collectors.toList()); } catch (final DataValidationException dataValidationException) { cmHandleRegistrationResponses.add(CmHandleRegistrationResponse.createFailureResponse(dmiPluginRegistration .getCreatedCmHandles().stream() @@ -291,13 +286,6 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService return cmHandleRegistrationResponses; } - private void setCompositeStateToAdvised(final NcmpServiceCmHandle ncmpServiceCmHandle) { - final CompositeState compositeState = new CompositeState(); - compositeState.setCmHandleState(CmHandleState.ADVISED); - compositeState.setLastUpdateTimeNow(); - ncmpServiceCmHandle.setCompositeState(compositeState); - } - protected List parseAndRemoveCmHandlesInDmiRegistration( final List tobeRemovedCmHandles) { final List cmHandleRegistrationResponses = @@ -339,7 +327,7 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService private CmHandleRegistrationResponse registerNewCmHandle(final YangModelCmHandle yangModelCmHandle) { try { - inventoryPersistence.saveCmHandle(yangModelCmHandle); + lcmEventsCmHandleStateHandler.updateCmHandleState(yangModelCmHandle, CmHandleState.ADVISED); return CmHandleRegistrationResponse.createSuccessResponse(yangModelCmHandle.getId()); } catch (final AlreadyDefinedException alreadyDefinedException) { return CmHandleRegistrationResponse.createFailureResponse( diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/event/lcm/LcmEventsCreatorHelper.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/event/lcm/LcmEventsCreatorHelper.java index 1f2cf97fe..40f70b9c6 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/event/lcm/LcmEventsCreatorHelper.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/event/lcm/LcmEventsCreatorHelper.java @@ -99,32 +99,32 @@ public class LcmEventsCreatorHelper { final NcmpServiceCmHandle targetNcmpServiceCmHandle, final NcmpServiceCmHandle existingNcmpServiceCmHandle) { - final boolean isDataSyncFlagEnabledChanged = - isDataSyncEnabledFlagChanged(targetNcmpServiceCmHandle, existingNcmpServiceCmHandle); - final boolean isCmHandleStateChanged = - isCmHandleStateChanged(targetNcmpServiceCmHandle, existingNcmpServiceCmHandle); - final boolean isPublicCmHandlePropertiesEqual = - isPublicCmHandlePropertiesEqual(targetNcmpServiceCmHandle.getPublicProperties(), + final boolean hasDataSyncFlagEnabledChanged = + hasDataSyncEnabledFlagChanged(targetNcmpServiceCmHandle, existingNcmpServiceCmHandle); + final boolean hasCmHandleStateChanged = + hasCmHandleStateChanged(targetNcmpServiceCmHandle, existingNcmpServiceCmHandle); + final boolean arePublicCmHandlePropertiesEqual = + arePublicCmHandlePropertiesEqual(targetNcmpServiceCmHandle.getPublicProperties(), existingNcmpServiceCmHandle.getPublicProperties()); final LcmEventsCreator.CmHandleValuesHolder cmHandleValuesHolder = new LcmEventsCreator.CmHandleValuesHolder(); - if (isDataSyncFlagEnabledChanged || isCmHandleStateChanged || (!isPublicCmHandlePropertiesEqual)) { + if (hasDataSyncFlagEnabledChanged || hasCmHandleStateChanged || (!arePublicCmHandlePropertiesEqual)) { cmHandleValuesHolder.setOldValues(new Values()); cmHandleValuesHolder.setNewValues(new Values()); } else { return cmHandleValuesHolder; } - if (isDataSyncFlagEnabledChanged) { + if (hasDataSyncFlagEnabledChanged) { setDataSyncEnabledFlag(targetNcmpServiceCmHandle, existingNcmpServiceCmHandle, cmHandleValuesHolder); } - if (isCmHandleStateChanged) { + if (hasCmHandleStateChanged) { setCmHandleStateChange(targetNcmpServiceCmHandle, existingNcmpServiceCmHandle, cmHandleValuesHolder); } - if (!isPublicCmHandlePropertiesEqual) { + if (!arePublicCmHandlePropertiesEqual) { setPublicCmHandlePropertiesChange(targetNcmpServiceCmHandle, existingNcmpServiceCmHandle, cmHandleValuesHolder); } @@ -174,21 +174,29 @@ public class LcmEventsCreatorHelper { return ncmpServiceCmHandle.getCompositeState().getDataSyncEnabled(); } - private static boolean isDataSyncEnabledFlagChanged(final NcmpServiceCmHandle targetNcmpServiceCmHandle, + private static boolean hasDataSyncEnabledFlagChanged(final NcmpServiceCmHandle targetNcmpServiceCmHandle, final NcmpServiceCmHandle existingNcmpServiceCmHandle) { - return !targetNcmpServiceCmHandle.getCompositeState().getDataSyncEnabled() - .equals(existingNcmpServiceCmHandle.getCompositeState().getDataSyncEnabled()); + final Boolean targetDataSyncFlag = targetNcmpServiceCmHandle.getCompositeState() == null + ? null : targetNcmpServiceCmHandle.getCompositeState().getDataSyncEnabled(); + final Boolean existingDataSyncFlag = existingNcmpServiceCmHandle.getCompositeState() == null + ? null : existingNcmpServiceCmHandle.getCompositeState().getDataSyncEnabled(); + + if (targetDataSyncFlag == null) { + return existingDataSyncFlag != null; + } + + return !targetDataSyncFlag.equals(existingDataSyncFlag); } - private static boolean isCmHandleStateChanged(final NcmpServiceCmHandle targetNcmpServiceCmHandle, + private static boolean hasCmHandleStateChanged(final NcmpServiceCmHandle targetNcmpServiceCmHandle, final NcmpServiceCmHandle existingNcmpServiceCmHandle) { return targetNcmpServiceCmHandle.getCompositeState().getCmHandleState() != existingNcmpServiceCmHandle.getCompositeState().getCmHandleState(); } - private static boolean isPublicCmHandlePropertiesEqual(final Map targetCmHandleProperties, + private static boolean arePublicCmHandlePropertiesEqual(final Map targetCmHandleProperties, final Map existingCmHandleProperties) { if (targetCmHandleProperties.size() != existingCmHandleProperties.size()) { return false; diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/CompositeStateUtils.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/CompositeStateUtils.java index 54ca68a0e..6fabc9300 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/CompositeStateUtils.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/CompositeStateUtils.java @@ -52,6 +52,7 @@ public class CompositeStateUtils { public static Consumer setCompositeStateToReadyWithInitialDataStoreSyncState() { return compositeState -> { compositeState.setDataSyncEnabled(false); + compositeState.setLastUpdateTimeNow(); compositeState.setCmHandleState(CmHandleState.READY); final CompositeState.Operational operational = getInitialDataStoreSyncState(compositeState.getDataSyncEnabled()); @@ -70,6 +71,7 @@ public class CompositeStateUtils { public static void setDataSyncEnabledFlagWithDataSyncState(final boolean dataSyncEnabled, final CompositeState compositeState) { compositeState.setDataSyncEnabled(dataSyncEnabled); + compositeState.setLastUpdateTimeNow(); final CompositeState.Operational operational = getInitialDataStoreSyncState(dataSyncEnabled); final CompositeState.DataStores dataStores = CompositeState.DataStores.builder().operationalDataStore(operational).build(); diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/sync/ModuleSyncWatchdog.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/sync/ModuleSyncWatchdog.java index 37bd1ed0f..7c2a4fc38 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/sync/ModuleSyncWatchdog.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/sync/ModuleSyncWatchdog.java @@ -23,13 +23,12 @@ package org.onap.cps.ncmp.api.inventory.sync; import java.util.List; import java.util.concurrent.ConcurrentMap; -import java.util.function.Consumer; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.onap.cps.ncmp.api.impl.event.lcm.LcmEventsCmHandleStateHandler; import org.onap.cps.ncmp.api.impl.yangmodels.YangModelCmHandle; import org.onap.cps.ncmp.api.inventory.CmHandleState; import org.onap.cps.ncmp.api.inventory.CompositeState; -import org.onap.cps.ncmp.api.inventory.DataStoreSyncState; import org.onap.cps.ncmp.api.inventory.InventoryPersistence; import org.onap.cps.ncmp.api.inventory.LockReasonCategory; import org.springframework.scheduling.annotation.Scheduled; @@ -48,6 +47,8 @@ public class ModuleSyncWatchdog { private final ConcurrentMap moduleSyncSemaphoreMap; + private final LcmEventsCmHandleStateHandler lcmEventsCmHandleStateHandler; + /** * Execute Cm Handle poll which changes the cm handle state from 'ADVISED' to 'READY'. */ @@ -61,14 +62,13 @@ public class ModuleSyncWatchdog { try { moduleSyncService.deleteSchemaSetIfExists(advisedCmHandle); moduleSyncService.syncAndCreateSchemaSetAndAnchor(advisedCmHandle); - setCompositeStateToReadyWithInitialDataStoreSyncState().accept(compositeState); + lcmEventsCmHandleStateHandler.updateCmHandleState(advisedCmHandle, CmHandleState.READY); updateModuleSyncSemaphoreMap(cmHandleId); } catch (final Exception e) { - setCompositeStateToLocked().accept(compositeState); syncUtils.updateLockReasonDetailsAndAttempts(compositeState, LockReasonCategory.LOCKED_MODULE_SYNC_FAILED, e.getMessage()); + setCmHandleStateLocked(advisedCmHandle, compositeState.getLockReason()); } - inventoryPersistence.saveCmHandleState(cmHandleId, compositeState); log.debug("{} is now in {} state", cmHandleId, compositeState.getCmHandleState().name()); } else { log.debug("{} already processed by another instance", cmHandleId); @@ -87,44 +87,16 @@ public class ModuleSyncWatchdog { final CompositeState compositeState = lockedCmHandle.getCompositeState(); final boolean isReadyForRetry = syncUtils.isReadyForRetry(compositeState); if (isReadyForRetry) { - setCompositeStateToAdvisedAndRetainOldLockReasonDetails(compositeState); - log.debug("Locked cm handle {} is being re-synced", lockedCmHandle.getId()); - inventoryPersistence.saveCmHandleState(lockedCmHandle.getId(), compositeState); + log.debug("Reset cm handle {} state to ADVISED to re-attempt module-sync", lockedCmHandle.getId()); + lcmEventsCmHandleStateHandler.updateCmHandleState(lockedCmHandle, CmHandleState.ADVISED); } } } - private Consumer setCompositeStateToLocked() { - return compositeState -> { - compositeState.setCmHandleState(CmHandleState.LOCKED); - compositeState.setLastUpdateTimeNow(); - }; - } - - private Consumer setCompositeStateToReadyWithInitialDataStoreSyncState() { - return compositeState -> { - compositeState.setDataSyncEnabled(false); - compositeState.setCmHandleState(CmHandleState.READY); - final CompositeState.Operational operational = getDataStoreSyncState(); - final CompositeState.DataStores dataStores = CompositeState.DataStores.builder() - .operationalDataStore(operational) - .build(); - compositeState.setDataStores(dataStores); - }; - } - - private void setCompositeStateToAdvisedAndRetainOldLockReasonDetails(final CompositeState compositeState) { - compositeState.setCmHandleState(CmHandleState.ADVISED); - compositeState.setLastUpdateTimeNow(); - final String oldLockReasonDetails = compositeState.getLockReason().getDetails(); - final CompositeState.LockReason lockReason = CompositeState.LockReason.builder() - .details(oldLockReasonDetails).build(); - compositeState.setLockReason(lockReason); - } - - private CompositeState.Operational getDataStoreSyncState() { - final DataStoreSyncState dataStoreSyncState = DataStoreSyncState.NONE_REQUESTED; - return CompositeState.Operational.builder().dataStoreSyncState(dataStoreSyncState).build(); + private void setCmHandleStateLocked(final YangModelCmHandle advisedCmHandle, + final CompositeState.LockReason lockReason) { + advisedCmHandle.getCompositeState().setLockReason(lockReason); + lcmEventsCmHandleStateHandler.updateCmHandleState(advisedCmHandle, CmHandleState.LOCKED); } private void updateModuleSyncSemaphoreMap(final String cmHandleId) { -- cgit 1.2.3-korg