Simplified 'External' lock reason Mapping
Refactored LOCKED_MISBEHAVING -> LOCKED_MODULE_SYNC_FAILED
CompositeStateMapper will change internal reason LOCKED_MODULE_SYNC_FAILED to external reason LOCKED_MISBEHAVING for client payloads
Changed openapi description of lock-reason to reflect only enum currently available LOCKED_MISBEHAVING
Issue-ID: CPS-1099
Signed-off-by: lukegleeson <luke.gleeson@est.tech>
Change-Id: I9cda45f6c30b94684ee1c8ad0c49e35a3a824d52
diff --git a/cps-ncmp-rest/docs/openapi/components.yaml b/cps-ncmp-rest/docs/openapi/components.yaml
index 8249a7a..2cb9d89 100644
--- a/cps-ncmp-rest/docs/openapi/components.yaml
+++ b/cps-ncmp-rest/docs/openapi/components.yaml
@@ -263,10 +263,10 @@
properties:
reason:
type: string
- example: LOCKED_OTHER
+ example: LOCKED_MISBEHAVING
details:
type: string
- example: locked due to module sync
+ example: locked due to failure in module sync
dataStores:
type: object
diff --git a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java
index 3335547..b204871 100755
--- a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java
+++ b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java
@@ -286,7 +286,8 @@
final CompositeState cmHandleState = networkCmProxyDataService.getCmHandleCompositeState(cmHandleId);
final RestOutputCmHandleCompositeState restOutputCmHandleCompositeState =
new RestOutputCmHandleCompositeState();
- restOutputCmHandleCompositeState.setState(cmHandleStateMapper.toCmHandleCompositeState(cmHandleState));
+ restOutputCmHandleCompositeState.setState(
+ cmHandleStateMapper.toCmHandleCompositeStateExternalLockReason(cmHandleState));
return ResponseEntity.ok(restOutputCmHandleCompositeState);
}
@@ -325,7 +326,7 @@
restOutputCmHandle.setCmHandle(ncmpServiceCmHandle.getCmHandleId());
cmHandlePublicProperties.add(ncmpServiceCmHandle.getPublicProperties());
restOutputCmHandle.setPublicCmHandleProperties(cmHandlePublicProperties);
- restOutputCmHandle.setState(cmHandleStateMapper.toCmHandleCompositeState(
+ restOutputCmHandle.setState(cmHandleStateMapper.toCmHandleCompositeStateExternalLockReason(
ncmpServiceCmHandle.getCompositeState()));
return restOutputCmHandle;
}
diff --git a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/mapper/CmHandleStateMapper.java b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/mapper/CmHandleStateMapper.java
index ca109d6..55b64ec 100644
--- a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/mapper/CmHandleStateMapper.java
+++ b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/mapper/CmHandleStateMapper.java
@@ -28,6 +28,7 @@
import org.onap.cps.ncmp.api.inventory.CompositeState;
import org.onap.cps.ncmp.rest.model.CmHandleCompositeState;
import org.onap.cps.ncmp.rest.model.DataStores;
+import org.onap.cps.ncmp.rest.model.LockReason;
import org.onap.cps.ncmp.rest.model.SyncState;
@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS,
@@ -35,8 +36,8 @@
public interface CmHandleStateMapper {
@Mapping(target = "dataSyncState", source = "dataStores", qualifiedByName = "dataStoreToDataSyncState")
- @Mapping(target = "lockReason.reason", source = "lockReason.lockReasonCategory")
- CmHandleCompositeState toCmHandleCompositeState(CompositeState compositeState);
+ @Mapping(target = "lockReason", source = "lockReason", qualifiedByName = "toExternalLockReason")
+ CmHandleCompositeState toCmHandleCompositeStateExternalLockReason(CompositeState compositeState);
/**
* Convert from CompositeState datastore to RestOutput Datastores.
@@ -66,4 +67,21 @@
}
+ /**
+ * Convert Internal Lock Reason to External Lock Reason.
+ *
+ * @param internalLockReason Internal Lock Reason
+ *
+ * @return externalLockReason
+ */
+ @Named("toExternalLockReason")
+ static LockReason toExternalLockReason(CompositeState.LockReason internalLockReason) {
+ final LockReason externalLockReason = new LockReason();
+ if (internalLockReason.getLockReasonCategory() != null) {
+ externalLockReason.setReason("LOCKED_MISBEHAVING");
+ }
+ externalLockReason.setDetails(internalLockReason.getDetails());
+ return externalLockReason;
+ }
+
}
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 729df9c..7b123e8 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
@@ -432,7 +432,7 @@
def compositeStateTestObject() {
new CompositeState(cmHandleState: CmHandleState.ADVISED,
- lockReason: CompositeState.LockReason.builder().lockReasonCategory(LockReasonCategory.LOCKED_MISBEHAVING).details("lock misbehaving details").build(),
+ lockReason: CompositeState.LockReason.builder().lockReasonCategory(LockReasonCategory.LOCKED_MODULE_SYNC_FAILED).details("lock details").build(),
lastUpdateTime: formattedDateAndTime.toString(),
dataSyncEnabled: false,
dataStores: dataStores())
@@ -448,7 +448,7 @@
'"state":',
'"cmHandleState":"ADVISED"',
'"reason":"LOCKED_MISBEHAVING"',
- '"details":"lock misbehaving details"',
+ '"details":"lock details"',
'"lastUpdateTime":"2022-12-31T20:30:40.000+0000"',
'"dataSyncEnabled":false',
'"dataSyncState":',
diff --git a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/mapper/CmHandleStateMapperTest.groovy b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/mapper/CmHandleStateMapperTest.groovy
index 42fda77..677cf66 100644
--- a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/mapper/CmHandleStateMapperTest.groovy
+++ b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/mapper/CmHandleStateMapperTest.groovy
@@ -38,25 +38,40 @@
.format(OffsetDateTime.of(2022, 12, 31, 20, 30, 40, 1, ZoneOffset.UTC))
def objectUnderTest = Mappers.getMapper(CmHandleStateMapper)
- def 'Composite State to Rest Output CmHandleState'() {
+ def 'Composite State to CmHandleCompositeState'() {
given: 'a composite state model'
def compositeState = new CompositeStateBuilder()
.withCmHandleState(CmHandleState.ADVISED)
.withLastUpdatedTime(formattedDateAndTime.toString())
- .withLockReason(LockReasonCategory.LOCKED_MISBEHAVING, 'locked other details')
+ .withLockReason(LockReasonCategory.LOCKED_MODULE_SYNC_FAILED, 'locked details')
.withOperationalDataStores(DataStoreSyncState.SYNCHRONIZED, formattedDateAndTime).build()
compositeState.setDataSyncEnabled(false)
when: 'mapper is called'
- def result = objectUnderTest.toCmHandleCompositeState(compositeState)
+ def result = objectUnderTest.toCmHandleCompositeStateExternalLockReason(compositeState)
then: 'result is of the correct type'
assert result.class == CmHandleCompositeState.class
and: 'mapped result should have correct values'
assert !result.dataSyncEnabled
assert result.lastUpdateTime == formattedDateAndTime
assert result.lockReason.reason == 'LOCKED_MISBEHAVING'
- assert result.lockReason.details == 'locked other details'
+ assert result.lockReason.details == 'locked details'
assert result.cmHandleState == 'ADVISED'
assert result.dataSyncState.operational.getState() != null
}
+ def 'Internal to External Lock Reason Mapping of #scenario'() {
+ given: 'a LOCKED composite state with locked reason of #scenario'
+ def compositeState = new CompositeStateBuilder()
+ .withCmHandleState(CmHandleState.LOCKED)
+ .withLockReason(lockReason, '').build()
+ when: 'the composite state is mapped to a CMHandle composite state'
+ def result = objectUnderTest.toCmHandleCompositeStateExternalLockReason(compositeState)
+ then: 'the composite state contains the expected lock Reason and details'
+ result.getLockReason().getReason() == expectedExternalLockReason
+ where:
+ scenario | lockReason || expectedExternalLockReason
+ 'LOCKED_MODULE_SYNC_FAILED' | LockReasonCategory.LOCKED_MODULE_SYNC_FAILED || 'LOCKED_MISBEHAVING'
+ 'null value' | null || null
+ }
+
}