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
+    }
+
 }