From 912c86dec96e675c2635298cea8869d014938042 Mon Sep 17 00:00:00 2001 From: DylanB95EST Date: Thu, 19 May 2022 14:09:58 +0100 Subject: Module Sync Lock State implementation Implementation of Lock state for module sync watchdog Cm Handle state is locked if any exception is found during sync process Make changes around READY state method in line with the new schema set Add last updated time to composite state Remove running datastore references as this is being done at a later time Issue-ID: CPS-875 Change-Id: I6bd159faefef2fa84dbf536c292ff0a132793381 Signed-off-by: DylanB95EST --- .../rest/mapper/RestOutputCmHandleStateMapper.java | 21 +------------ .../controller/NetworkCmProxyControllerSpec.groovy | 25 +++------------ .../RestOutputCmHandleStateMapperTest.groovy | 36 +++++++--------------- 3 files changed, 17 insertions(+), 65 deletions(-) (limited to 'cps-ncmp-rest') diff --git a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/mapper/RestOutputCmHandleStateMapper.java b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/mapper/RestOutputCmHandleStateMapper.java index ce32068299..5f4b311186 100644 --- a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/mapper/RestOutputCmHandleStateMapper.java +++ b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/mapper/RestOutputCmHandleStateMapper.java @@ -25,7 +25,6 @@ import org.mapstruct.Mapping; import org.mapstruct.Named; import org.mapstruct.NullValueCheckStrategy; import org.mapstruct.NullValuePropertyMappingStrategy; -import org.onap.cps.ncmp.api.inventory.CmHandleState; import org.onap.cps.ncmp.api.inventory.CompositeState; import org.onap.cps.ncmp.rest.model.DataStores; import org.onap.cps.ncmp.rest.model.RestOutputCmHandleState; @@ -36,7 +35,7 @@ import org.onap.cps.ncmp.rest.model.SyncState; public interface RestOutputCmHandleStateMapper { @Mapping(target = "dataSyncState", source = "dataStores", qualifiedByName = "dataStoreToDataSyncState") - @Mapping(target = "cmHandleState", source = "cmhandleState", qualifiedByName = "cmHandleStateEnumToString") + @Mapping(target = "lockReason.reason", source = "lockReason.lockReasonCategory") RestOutputCmHandleState toRestOutputCmHandleState(CompositeState compositeState); /** @@ -54,13 +53,6 @@ public interface RestOutputCmHandleStateMapper { final DataStores dataStores = new DataStores(); - if (compositeStateDataStore.getRunningDataStore() != null) { - final SyncState runningSyncState = new SyncState(); - runningSyncState.setState(compositeStateDataStore.getRunningDataStore().getSyncState()); - runningSyncState.setLastSyncTime(compositeStateDataStore.getRunningDataStore().getLastSyncTime()); - dataStores.setRunning(runningSyncState); - } - if (compositeStateDataStore.getOperationalDataStore() != null) { final SyncState operationalSyncState = new SyncState(); operationalSyncState.setState(compositeStateDataStore.getOperationalDataStore().getSyncState()); @@ -73,15 +65,4 @@ public interface RestOutputCmHandleStateMapper { } - /** - * Converts cmHandleState enum value to equivalent string. - * - * @param cmHandleState cm handle state enum - * @return cm handle state as string - */ - @Named("cmHandleStateEnumToString") - static String toCmHandleState(final CmHandleState cmHandleState) { - return cmHandleState.name(); - } - } diff --git a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy index 3315304258..60ea736d72 100644 --- a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy +++ b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy @@ -37,7 +37,6 @@ import java.time.format.DateTimeFormatter import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.PATCH import static org.onap.cps.ncmp.api.inventory.CompositeState.DataStores -import static org.onap.cps.ncmp.api.inventory.CompositeState.LockReason import static org.onap.cps.ncmp.api.inventory.CompositeState.Operational import static org.onap.cps.ncmp.api.inventory.CompositeState.Running import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete @@ -256,30 +255,20 @@ class NetworkCmProxyControllerSpec extends Specification { given: 'an endpoint and a cm handle' def cmHandleDetailsEndpoint = "$ncmpBasePathV1/ch/some-cm-handle" and: 'an existing ncmp service cm handle' - def cmHandleId = 'some-cm-handle' - def dmiProperties = [ prop:'some DMI property' ] - def publicProperties = [ "public prop":'some public property' ] - def compositeState = new CompositeState(cmhandleState: CmHandleState.ADVISED, - lockReason: LockReason.builder().reason('LOCKED_OTHER').details("lock-misbehaving-details").build(), + def compositeState = new CompositeState(cmHandleState: CmHandleState.ADVISED, lastUpdateTime: formattedDateAndTime.toString(), - dataSyncEnabled: false, dataStores: dataStores()) - def ncmpServiceCmHandle = new NcmpServiceCmHandle(cmHandleId: cmHandleId, dmiProperties: dmiProperties, publicProperties: publicProperties, compositeState: compositeState) + def ncmpServiceCmHandle = new NcmpServiceCmHandle(cmHandleId: 'some-cm-handle', compositeState: compositeState) and: 'the service method is invoked with the cm handle id' 1 * mockNetworkCmProxyDataService.getNcmpServiceCmHandle('some-cm-handle') >> ncmpServiceCmHandle when: 'the cm handle details api is invoked' def response = mvc.perform(get(cmHandleDetailsEndpoint)).andReturn().response then: 'the correct response is returned' response.status == HttpStatus.OK.value() - and: 'the response returns public properties and the correct cm handle states' - response.contentAsString.contains('publicCmHandleProperties') - response.contentAsString.contains('LOCKED_OTHER') - response.contentAsString.contains('lock-misbehaving-details') + and: 'the response returns the correct state and timestamp' + response.contentAsString.contains('some-cm-handle') response.contentAsString.contains('ADVISED') - response.contentAsString.contains('NONE_REQUESTED') response.contentAsString.contains('2022-12-31T20:30:40.000+0000') - and: 'the content does not contain dmi properties' - !response.contentAsString.contains("some DMI property") } def 'Get Cm Handle public properties by Cm Handle id.' () { @@ -387,11 +376,7 @@ class NetworkCmProxyControllerSpec extends Specification { DataStores.builder() .operationalDataStore(Operational.builder() .syncState('NONE_REQUESTED') - .lastSyncTime(formattedDateAndTime.toString()).build()) - .runningDataStore(Running.builder() - .syncState('NONE_REQUESTED') - .lastSyncTime(formattedDateAndTime.toString()).build()) - .build() + .lastSyncTime(formattedDateAndTime.toString()).build()).build() } } diff --git a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/mapper/RestOutputCmHandleStateMapperTest.groovy b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/mapper/RestOutputCmHandleStateMapperTest.groovy index 4560ae4818..22c9fe6056 100644 --- a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/mapper/RestOutputCmHandleStateMapperTest.groovy +++ b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/mapper/RestOutputCmHandleStateMapperTest.groovy @@ -22,7 +22,8 @@ package org.onap.cps.ncmp.rest.mapper import org.mapstruct.factory.Mappers import org.onap.cps.ncmp.api.inventory.CmHandleState -import org.onap.cps.ncmp.api.inventory.CompositeState +import org.onap.cps.ncmp.api.inventory.CompositeStateBuilder +import org.onap.cps.ncmp.api.inventory.LockReasonCategory import org.onap.cps.ncmp.rest.model.RestOutputCmHandleState import spock.lang.Specification @@ -30,10 +31,6 @@ import java.time.OffsetDateTime import java.time.ZoneOffset import java.time.format.DateTimeFormatter -import static org.onap.cps.ncmp.api.inventory.CompositeState.DataStores -import static org.onap.cps.ncmp.api.inventory.CompositeState.LockReason -import static org.onap.cps.ncmp.api.inventory.CompositeState.Operational - class RestOutputCmHandleStateMapperTest extends Specification { def formattedDateAndTime = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ") @@ -42,11 +39,12 @@ class RestOutputCmHandleStateMapperTest extends Specification { def 'Composite State to Rest Output CmHandleState'() { given: 'a composite state model' - def compositeState = new CompositeState(cmhandleState: CmHandleState.ADVISED, - lockReason: LockReason.builder().reason('LOCKED_OTHER').details('locked-other-details').build(), - lastUpdateTime: formattedDateAndTime.toString(), - dataSyncEnabled: false, - dataStores: dataStores()) + def compositeState = new CompositeStateBuilder() + .withCmHandleState(CmHandleState.ADVISED) + .withLastUpdatedTime(formattedDateAndTime.toString()) + .withLockReason(LockReasonCategory.LOCKED_MISBEHAVING, 'locked other details') + .withOperationalDataStores('SYNCHRONIZED', formattedDateAndTime).build() + compositeState.setDataSyncEnabled(false) when: 'mapper is called' def result = objectUnderTest.toRestOutputCmHandleState(compositeState) then: 'result is of the correct type' @@ -54,22 +52,10 @@ class RestOutputCmHandleStateMapperTest extends Specification { and: 'mapped result should have correct values' assert !result.dataSyncEnabled assert result.lastUpdateTime == formattedDateAndTime - assert result.lockReason.reason == 'LOCKED_OTHER' - assert result.lockReason.details == 'locked-other-details' + assert result.lockReason.reason == 'LOCKED_MISBEHAVING' + assert result.lockReason.details == 'locked other details' assert result.cmHandleState == CmHandleState.ADVISED.name() - assert result.dataSyncState.operational != null - assert result.dataSyncState.running != null + assert result.dataSyncState.operational.getState() != null } - def dataStores() { - - return DataStores.builder() - .operationalDataStore(Operational.builder() - .syncState('NONE_REQUESTED') - .lastSyncTime(formattedDateAndTime.toString()).build()) - .runningDataStore(CompositeState.Running.builder() - .syncState('NONE_REQUESTED') - .lastSyncTime(formattedDateAndTime.toString()).build()) - .build() - } } -- cgit 1.2.3-korg