Merge "Distributed datastore solution for Data Sync Watchdog"
authorToine Siebelink <toine.siebelink@est.tech>
Mon, 22 Aug 2022 16:56:45 +0000 (16:56 +0000)
committerGerrit Code Review <gerrit@onap.org>
Mon, 22 Aug 2022 16:56:45 +0000 (16:56 +0000)
1  2 
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/CmHandleQueries.java
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/inventory/CmHandleQueriesSpec.groovy

@@@ -22,6 -22,7 +22,7 @@@ package org.onap.cps.ncmp.api.inventory
  
  import static org.onap.cps.ncmp.api.impl.utils.YangDataConverter.convertYangModelCmHandleToNcmpServiceCmHandle;
  import static org.onap.cps.spi.FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS;
+ import static org.onap.cps.spi.FetchDescendantsOption.OMIT_DESCENDANTS;
  
  import java.util.Collection;
  import java.util.Collections;
@@@ -65,7 -66,7 +66,7 @@@ public class CmHandleQueries 
              final String cpsPath = "//public-properties[@name=\"" + publicPropertyQueryPair.getKey()
                  + "\" and @value=\"" + publicPropertyQueryPair.getValue() + "\"]";
  
-             final Collection<DataNode> dataNodes = getCmHandleDataNodesByCpsPath(cpsPath, INCLUDE_ALL_DESCENDANTS);
+             final Collection<DataNode> dataNodes = queryCmHandleDataNodesByCpsPath(cpsPath, INCLUDE_ALL_DESCENDANTS);
              if (cmHandleIdToNcmpServiceCmHandles == null) {
                  cmHandleIdToNcmpServiceCmHandles = collectDataNodesToNcmpServiceCmHandles(dataNodes);
              } else {
@@@ -91,7 -92,7 +92,7 @@@
          final Map<String, NcmpServiceCmHandle> firstQuery,
          final Map<String, NcmpServiceCmHandle> secondQuery) {
          if (firstQuery == NO_QUERY_TO_EXECUTE && secondQuery == NO_QUERY_TO_EXECUTE) {
 -            return Collections.emptyMap();
 +            return NO_QUERY_TO_EXECUTE;
          } else if (firstQuery == NO_QUERY_TO_EXECUTE) {
              return secondQuery;
          } else if (secondQuery == NO_QUERY_TO_EXECUTE) {
       * @param cmHandleState cm handle state
       * @return a list of cm handles
       */
-     public List<DataNode> getCmHandlesByState(final CmHandleState cmHandleState) {
-         return getCmHandleDataNodesByCpsPath("//state[@cm-handle-state=\"" + cmHandleState + "\"]",
+     public List<DataNode> queryCmHandlesByState(final CmHandleState cmHandleState) {
+         return queryCmHandleDataNodesByCpsPath("//state[@cm-handle-state=\"" + cmHandleState + "\"]",
              INCLUDE_ALL_DESCENDANTS);
      }
  
       * @param cpsPath cps path for which the cmHandle is requested
       * @return a list of data nodes representing the cm handles.
       */
-     public List<DataNode> getCmHandleDataNodesByCpsPath(final String cpsPath,
-                                                         final FetchDescendantsOption fetchDescendantsOption) {
+     public List<DataNode> queryCmHandleDataNodesByCpsPath(final String cpsPath,
+                                                           final FetchDescendantsOption fetchDescendantsOption) {
          return cpsDataPersistenceService.queryDataNodes(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR,
              cpsPath + ANCESTOR_CM_HANDLES, fetchDescendantsOption);
      }
  
      /**
-      * Method which returns cm handles by the cm handle id and state.
+      * Method to check the state of a cm handle with given id.
+      *
       * @param cmHandleId cm handle id
-      * @param cmHandleState cm handle state
-      * @return a list of cm handles
+      * @param requiredCmHandleState the required state of the cm handle
+      * @return a boolean, true if the state is equal to the required state
       */
-     public List<DataNode> getCmHandlesByIdAndState(final String cmHandleId, final CmHandleState cmHandleState) {
-         return getCmHandleDataNodesByCpsPath("//cm-handles[@id='" + cmHandleId + "']/state[@cm-handle-state=\""
-                 + cmHandleState + "\"]", FetchDescendantsOption.OMIT_DESCENDANTS);
+     public boolean cmHandleHasState(final String cmHandleId, final CmHandleState requiredCmHandleState) {
+         final DataNode stateDataNode = getCmHandleState(cmHandleId);
+         final String cmHandleStateAsString = (String) stateDataNode.getLeaves().get("cm-handle-state");
+         return CmHandleState.valueOf(cmHandleStateAsString).equals(requiredCmHandleState);
      }
  
      /**
       * @param dataStoreSyncState sync state
       * @return a list of cm handles
       */
-     public List<DataNode> getCmHandlesByOperationalSyncState(final DataStoreSyncState dataStoreSyncState) {
-         return getCmHandleDataNodesByCpsPath("//state/datastores" + "/operational[@sync-state=\""
+     public List<DataNode> queryCmHandlesByOperationalSyncState(final DataStoreSyncState dataStoreSyncState) {
+         return queryCmHandleDataNodesByCpsPath("//state/datastores" + "/operational[@sync-state=\""
                  + dataStoreSyncState + "\"]", FetchDescendantsOption.OMIT_DESCENDANTS);
      }
  
          return convertYangModelCmHandleToNcmpServiceCmHandle(YangDataConverter
              .convertCmHandleToYangModel(dataNode, dataNode.getLeaves().get("id").toString()));
      }
+     private DataNode getCmHandleState(final String cmHandleId) {
+         final String xpath = "/dmi-registry/cm-handles[@id='" + cmHandleId + "']/state";
+         return cpsDataPersistenceService.getDataNode(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR,
+                 xpath, OMIT_DESCENDANTS);
+     }
  }
  
  
@@@ -82,7 -82,7 +82,7 @@@ class CmHandleQueriesSpec extends Speci
              'the first query contains entries and second query is null'  | ['PNFDemo': pnfDemoCmHandle, 'PNFDemo2': pnfDemo2CmHandle] | null                                                       || ['PNFDemo': pnfDemoCmHandle, 'PNFDemo2': pnfDemo2CmHandle]
              'the second query contains entries and first query is null'  | null                                                       | ['PNFDemo': pnfDemoCmHandle, 'PNFDemo3': pnfDemo3CmHandle] || ['PNFDemo': pnfDemoCmHandle, 'PNFDemo3': pnfDemo3CmHandle]
              'both queries are empty'                                     | [:]                                                        | [:]                                                        || [:]
 -            'both queries are null'                                      | null                                                       | null                                                       || [:]
 +            'both queries are null'                                      | null                                                       | null                                                       || null
      }
  
      def 'Get Cm Handles By State'() {
              cpsDataPersistenceService.queryDataNodes('NCMP-Admin', 'ncmp-dmi-registry',
                  '//state[@cm-handle-state="ADVISED"]/ancestor::cm-handles', INCLUDE_ALL_DESCENDANTS) >> sampleDataNodes
          when: 'cm handles are fetched by state'
-             def result = objectUnderTest.getCmHandlesByState(cmHandleState)
+             def result = objectUnderTest.queryCmHandlesByState(cmHandleState)
          then: 'the returned result matches the result from the persistence service'
              assert result == sampleDataNodes
      }
  
-     def 'Get Cm Handles By State and Cm-Handle Id'() {
+     def 'Get Cm Handles state by Cm-Handle Id'() {
          given: 'a cm handle state to query'
              def cmHandleState = CmHandleState.READY
          and: 'cps data service returns a list of data nodes'
-             cpsDataPersistenceService.queryDataNodes('NCMP-Admin', 'ncmp-dmi-registry',
-                 '//cm-handles[@id=\'some-cm-handle\']/state[@cm-handle-state="'+ 'READY'+'"]/ancestor::cm-handles', OMIT_DESCENDANTS) >> sampleDataNodes
+             cpsDataPersistenceService.getDataNode('NCMP-Admin', 'ncmp-dmi-registry',
+                 '/dmi-registry/cm-handles[@id=\'some-cm-handle\']/state', OMIT_DESCENDANTS) >> new DataNode(leaves: ['cm-handle-state': 'READY'])
          when: 'cm handles are fetched by state and id'
-             def result = objectUnderTest.getCmHandlesByIdAndState('some-cm-handle', cmHandleState)
+             def result = objectUnderTest.getCmHandleState('some-cm-handle')
          then: 'the returned result is a list of data nodes returned by cps data service'
-             assert result == sampleDataNodes
+             assert result == new DataNode(leaves: ['cm-handle-state': 'READY'])
      }
  
-     def 'Get Cm Handles By Operational Sync State : UNSYNCHRONIZED'() {
+     def 'Retrieve Cm Handles By Operational Sync State : UNSYNCHRONIZED'() {
          given: 'a cm handle state to query'
              def cmHandleState = CmHandleState.READY
          and: 'cps data service returns a list of data nodes'
              cpsDataPersistenceService.queryDataNodes('NCMP-Admin', 'ncmp-dmi-registry',
                  '//state/datastores/operational[@sync-state="'+'UNSYNCHRONIZED'+'"]/ancestor::cm-handles', OMIT_DESCENDANTS) >> sampleDataNodes
          when: 'cm handles are fetched by the UNSYNCHRONIZED operational sync state'
-             def result = objectUnderTest.getCmHandlesByOperationalSyncState(DataStoreSyncState.UNSYNCHRONIZED)
+             def result = objectUnderTest.queryCmHandlesByOperationalSyncState(DataStoreSyncState.UNSYNCHRONIZED)
          then: 'the returned result is a list of data nodes returned by cps data service'
              assert result == sampleDataNodes
      }
                  cpsPath + '/ancestor::cm-handles', INCLUDE_ALL_DESCENDANTS)
                  >> Arrays.asList(cmHandleDataNode)
          when: 'get cm handles by cps path is invoked'
-             def result = objectUnderTest.getCmHandleDataNodesByCpsPath(cpsPath, INCLUDE_ALL_DESCENDANTS)
+             def result = objectUnderTest.queryCmHandleDataNodesByCpsPath(cpsPath, INCLUDE_ALL_DESCENDANTS)
          then: 'the returned result is a list of data nodes returned by cps data service'
              assert result.contains(cmHandleDataNode)
      }