Correctly report trust level if DMI is down 53/138853/4
authordanielhanrahan <daniel.hanrahan@est.tech>
Mon, 26 Aug 2024 13:20:25 +0000 (14:20 +0100)
committerdanielhanrahan <daniel.hanrahan@est.tech>
Thu, 29 Aug 2024 10:28:11 +0000 (11:28 +0100)
Current trust level should factor in both CM-handle
and DMI trust levels (effective trust level).

Issue-ID: CPS-2375
Signed-off-by: danielhanrahan <daniel.hanrahan@est.tech>
Change-Id: Ib531633a0e79af2bf9cf73d2b0b02d7a58777458

cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/NetworkCmProxyInventoryFacade.java
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/ParameterizedCmHandleQueryService.java
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/ParameterizedCmHandleQueryServiceImpl.java
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManager.java
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/NetworkCmProxyInventoryFacadeSpec.groovy
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/ParameterizedCmHandleQueryServiceSpec.groovy
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManagerSpec.groovy

index 1acd937..e678159 100644 (file)
@@ -26,6 +26,7 @@ package org.onap.cps.ncmp.api.inventory;
 
 import static org.onap.cps.ncmp.impl.inventory.CmHandleQueryParametersValidator.validateCmHandleQueryParameters;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Map;
 import lombok.RequiredArgsConstructor;
@@ -44,6 +45,7 @@ import org.onap.cps.ncmp.impl.inventory.models.CmHandleQueryConditions;
 import org.onap.cps.ncmp.impl.inventory.models.InventoryQueryConditions;
 import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle;
 import org.onap.cps.ncmp.impl.inventory.trustlevel.TrustLevelManager;
+import org.onap.cps.ncmp.impl.models.RequiredDmiService;
 import org.onap.cps.ncmp.impl.utils.AlternateIdMatcher;
 import org.onap.cps.ncmp.impl.utils.YangDataConverter;
 import org.onap.cps.spi.model.ModuleDefinition;
@@ -143,9 +145,13 @@ public class NetworkCmProxyInventoryFacade {
         final CmHandleQueryServiceParameters cmHandleQueryServiceParameters = jsonObjectMapper.convertToValueType(
             cmHandleQueryApiParameters, CmHandleQueryServiceParameters.class);
         validateCmHandleQueryParameters(cmHandleQueryServiceParameters, CmHandleQueryConditions.ALL_CONDITION_NAMES);
-        final Collection<NcmpServiceCmHandle> ncmpServiceCmHandles =
+        final Collection<YangModelCmHandle> yangModelCmHandles =
             parameterizedCmHandleQueryService.queryCmHandles(cmHandleQueryServiceParameters);
-        ncmpServiceCmHandles.forEach(this::applyCurrentTrustLevel);
+        final Collection<NcmpServiceCmHandle> ncmpServiceCmHandles = new ArrayList<>(yangModelCmHandles.size());
+        for (final YangModelCmHandle yangModelCmHandle : yangModelCmHandles) {
+            final NcmpServiceCmHandle ncmpServiceCmHandle = toNcmpServiceCmHandleWithTrustLevel(yangModelCmHandle);
+            ncmpServiceCmHandles.add(ncmpServiceCmHandle);
+        }
         return ncmpServiceCmHandles;
     }
 
@@ -180,10 +186,8 @@ public class NetworkCmProxyInventoryFacade {
      * @return cm handle details
      */
     public NcmpServiceCmHandle getNcmpServiceCmHandle(final String cmHandleId) {
-        final NcmpServiceCmHandle ncmpServiceCmHandle = YangDataConverter.toNcmpServiceCmHandle(
-            inventoryPersistence.getYangModelCmHandle(cmHandleId));
-        applyCurrentTrustLevel(ncmpServiceCmHandle);
-        return ncmpServiceCmHandle;
+        final YangModelCmHandle yangModelCmHandle = inventoryPersistence.getYangModelCmHandle(cmHandleId);
+        return toNcmpServiceCmHandleWithTrustLevel(yangModelCmHandle);
     }
 
     /**
@@ -208,10 +212,12 @@ public class NetworkCmProxyInventoryFacade {
         return inventoryPersistence.getYangModelCmHandle(cmHandleId).getCompositeState();
     }
 
-    private void applyCurrentTrustLevel(final NcmpServiceCmHandle ncmpServiceCmHandle) {
-        ncmpServiceCmHandle.setCurrentTrustLevel(trustLevelManager
-            .getEffectiveTrustLevel(ncmpServiceCmHandle.getCmHandleId()));
+    private NcmpServiceCmHandle toNcmpServiceCmHandleWithTrustLevel(final YangModelCmHandle yangModelCmHandle) {
+        final NcmpServiceCmHandle ncmpServiceCmHandle = YangDataConverter.toNcmpServiceCmHandle(yangModelCmHandle);
+        final String dmiServiceName = yangModelCmHandle.resolveDmiServiceName(RequiredDmiService.DATA);
+        ncmpServiceCmHandle.setCurrentTrustLevel(
+                trustLevelManager.getEffectiveTrustLevel(dmiServiceName, ncmpServiceCmHandle.getCmHandleId()));
+        return ncmpServiceCmHandle;
     }
 
-
 }
index e5848c0..03ec30b 100644 (file)
@@ -22,7 +22,7 @@ package org.onap.cps.ncmp.impl.inventory;
 
 import java.util.Collection;
 import org.onap.cps.ncmp.api.inventory.models.CmHandleQueryServiceParameters;
-import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle;
+import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle;
 
 public interface ParameterizedCmHandleQueryService {
     /**
@@ -51,22 +51,14 @@ public interface ParameterizedCmHandleQueryService {
     Collection<String> queryCmHandleIdsForInventory(CmHandleQueryServiceParameters cmHandleQueryServiceParameters);
 
     /**
-     * Query and return cm handle objects that match the given query parameters.
+     * Query and return yang model cm handle objects that match the given query parameters.
      * Supported query types:
      *      public properties
      *      modules
      *      cps-path
      *
      * @param cmHandleQueryServiceParameters the cm handle query parameters
-     * @return collection of cm handles
+     * @return collection of yang model cm handles
      */
-    Collection<NcmpServiceCmHandle> queryCmHandles(CmHandleQueryServiceParameters cmHandleQueryServiceParameters);
-
-    /**
-     * Get all cm handle objects.
-     * Note: it is similar to all the queries above but simply no conditions and hence not 'parameterized'
-     *
-     * @return collection of cm handles
-     */
-    Collection<NcmpServiceCmHandle> getAllCmHandles();
+    Collection<YangModelCmHandle> queryCmHandles(CmHandleQueryServiceParameters cmHandleQueryServiceParameters);
 }
index 34eeacc..84229e2 100644 (file)
@@ -27,7 +27,6 @@ import static org.onap.cps.ncmp.impl.inventory.models.CmHandleQueryConditions.HA
 import static org.onap.cps.ncmp.impl.inventory.models.CmHandleQueryConditions.HAS_ALL_PROPERTIES;
 import static org.onap.cps.ncmp.impl.inventory.models.CmHandleQueryConditions.WITH_CPS_PATH;
 import static org.onap.cps.ncmp.impl.inventory.models.CmHandleQueryConditions.WITH_TRUST_LEVEL;
-import static org.onap.cps.ncmp.impl.utils.YangDataConverter.toNcmpServiceCmHandle;
 import static org.onap.cps.spi.FetchDescendantsOption.DIRECT_CHILDREN_ONLY;
 import static org.onap.cps.spi.FetchDescendantsOption.OMIT_DESCENDANTS;
 
@@ -40,10 +39,8 @@ import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
 import org.onap.cps.cpspath.parser.PathParsingException;
 import org.onap.cps.ncmp.api.inventory.models.CmHandleQueryServiceParameters;
-import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle;
 import org.onap.cps.ncmp.impl.inventory.models.InventoryQueryConditions;
 import org.onap.cps.ncmp.impl.inventory.models.PropertyType;
 import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle;
@@ -54,7 +51,6 @@ import org.onap.cps.spi.model.DataNode;
 import org.springframework.stereotype.Service;
 
 @Service
-@Slf4j
 @RequiredArgsConstructor
 public class ParameterizedCmHandleQueryServiceImpl implements ParameterizedCmHandleQueryService {
 
@@ -83,22 +79,18 @@ public class ParameterizedCmHandleQueryServiceImpl implements ParameterizedCmHan
     }
 
     @Override
-    public Collection<NcmpServiceCmHandle> queryCmHandles(
-        final CmHandleQueryServiceParameters cmHandleQueryServiceParameters) {
-
+    public Collection<YangModelCmHandle> queryCmHandles(
+            final CmHandleQueryServiceParameters cmHandleQueryServiceParameters) {
         if (cmHandleQueryServiceParameters.getCmHandleQueryParameters().isEmpty()) {
             return getAllCmHandles();
         }
-
         final Collection<String> cmHandleIds = queryCmHandleIds(cmHandleQueryServiceParameters);
-
-        return getNcmpServiceCmHandles(cmHandleIds);
+        return inventoryPersistence.getYangModelCmHandles(cmHandleIds);
     }
 
-    @Override
-    public Collection<NcmpServiceCmHandle> getAllCmHandles() {
+    private Collection<YangModelCmHandle> getAllCmHandles() {
         final DataNode dataNode = inventoryPersistence.getDataNode(NCMP_DMI_REGISTRY_PARENT).iterator().next();
-        return dataNode.getChildDataNodes().stream().map(this::createNcmpServiceCmHandle).collect(Collectors.toSet());
+        return dataNode.getChildDataNodes().stream().map(YangDataConverter::toYangModelCmHandle).toList();
     }
 
     private Collection<String> queryCmHandlesByDmiPlugin(
@@ -226,22 +218,6 @@ public class ParameterizedCmHandleQueryServiceImpl implements ParameterizedCmHan
         return collectCmHandleIdsFromDataNodes(dataNode.getChildDataNodes());
     }
 
-    private Collection<NcmpServiceCmHandle> getNcmpServiceCmHandles(final Collection<String> cmHandleIds) {
-        final Collection<YangModelCmHandle> yangModelcmHandles
-            = inventoryPersistence.getYangModelCmHandles(cmHandleIds);
-
-        final Collection<NcmpServiceCmHandle> ncmpServiceCmHandles = new ArrayList<>(yangModelcmHandles.size());
-
-        yangModelcmHandles.forEach(yangModelcmHandle ->
-            ncmpServiceCmHandles.add(YangDataConverter.toNcmpServiceCmHandle(yangModelcmHandle))
-        );
-        return ncmpServiceCmHandles;
-    }
-
-    private NcmpServiceCmHandle createNcmpServiceCmHandle(final DataNode dataNode) {
-        return toNcmpServiceCmHandle(YangDataConverter.toYangModelCmHandle(dataNode));
-    }
-
     private Collection<String> executeQueries(final CmHandleQueryServiceParameters cmHandleQueryServiceParameters,
                                               final Function<CmHandleQueryServiceParameters, Collection<String>>...
                                                   queryFunctions) {
index f468127..33310b9 100644 (file)
@@ -138,8 +138,8 @@ public class TrustLevelManager {
      * @param cmHandleId       cm handle id
      * @return TrustLevel      effective trust level
      */
-    public TrustLevel getEffectiveTrustLevel(final String cmHandleId) {
-        final TrustLevel dmiTrustLevel = TrustLevel.COMPLETE; // TODO: CPS-2375
+    public TrustLevel getEffectiveTrustLevel(final String dmiServiceName, final String cmHandleId) {
+        final TrustLevel dmiTrustLevel = trustLevelPerDmiPlugin.get(dmiServiceName);
         final TrustLevel cmHandleTrustLevel = trustLevelPerCmHandle.get(cmHandleId);
         return dmiTrustLevel.getEffectiveTrustLevel(cmHandleTrustLevel);
     }
index 1fed453..b243a74 100644 (file)
@@ -214,7 +214,8 @@ class NetworkCmProxyInventoryFacadeSpec extends Specification {
         and: 'query cm handle method returns two cm handles'
             mockParameterizedCmHandleQueryService.queryCmHandles(
                 spiedJsonObjectMapper.convertToValueType(cmHandleQueryApiParameters, CmHandleQueryServiceParameters.class))
-                >> [new NcmpServiceCmHandle(cmHandleId: 'ch-0'), new NcmpServiceCmHandle(cmHandleId: 'ch-1')]
+                >> [new YangModelCmHandle(id: 'ch-0', dmiProperties: [], publicProperties: []),
+                    new YangModelCmHandle(id: 'ch-1', dmiProperties: [], publicProperties: [])]
         and: 'a trust level for cm handles'
             mockTrustLevelManager.getEffectiveTrustLevel(*_) >> TrustLevel.COMPLETE
         when: 'execute cm handle search is called'
index 013bace..0864420 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  ============LICENSE_START=======================================================
- *  Copyright (C) 2022-2023 Nordix Foundation
+ *  Copyright (C) 2022-2024 Nordix Foundation
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -22,7 +22,6 @@ package org.onap.cps.ncmp.impl.inventory
 
 import org.onap.cps.cpspath.parser.PathParsingException
 import org.onap.cps.ncmp.api.inventory.models.CmHandleQueryServiceParameters
-import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle
 import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle
 import org.onap.cps.spi.FetchDescendantsOption
 import org.onap.cps.spi.exceptions.DataInUseException
@@ -139,10 +138,10 @@ class ParameterizedCmHandleQueryServiceSpec extends Specification {
         and: 'the inventory service is called with teh correct if and returns a yang model cm handle'
             1 * mockInventoryPersistence.getYangModelCmHandles(['ch1']) >>
                 [new YangModelCmHandle(id: 'abc', dmiProperties: [new YangModelCmHandle.Property('name','value')], publicProperties: [])]
-        and: 'the expected cm handle(s) are returned as NCMP Service cm handles'
-            assert result[0] instanceof NcmpServiceCmHandle
+        and: 'the expected cm handle(s) are returned as Yang Model cm handles'
+            assert result[0] instanceof YangModelCmHandle
             assert result.size() == 1
-            assert result[0].dmiProperties == [name:'value']
+            assert result[0].dmiProperties.size() == 1
     }
 
     def 'Query cm handle ids when the query is empty.'() {
@@ -165,7 +164,7 @@ class ParameterizedCmHandleQueryServiceSpec extends Specification {
             def result = objectUnderTest.queryCmHandles(cmHandleQueryParameters)
         then: 'the correct cm handles are returned'
             assert result.size() == 4
-            assert result.cmHandleId.containsAll('PNFDemo1', 'PNFDemo2', 'PNFDemo3', 'PNFDemo4')
+            assert result.id.containsAll('PNFDemo1', 'PNFDemo2', 'PNFDemo3', 'PNFDemo4')
     }
 
     def 'Query CMHandleId with #scenario.' () {
index 95d3db1..84d93e0 100644 (file)
@@ -25,7 +25,6 @@ import org.onap.cps.ncmp.api.inventory.models.TrustLevel
 import org.onap.cps.ncmp.impl.inventory.InventoryPersistence
 import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle
 import org.onap.cps.ncmp.utils.events.CmAvcEventPublisher
-import spock.lang.Ignore
 import spock.lang.Specification
 
 class TrustLevelManagerSpec extends Specification {
@@ -136,15 +135,13 @@ class TrustLevelManagerSpec extends Specification {
             0 * mockAttributeValueChangeEventPublisher.publishAvcEvent(*_)
     }
 
-    @Ignore
-    // TODO: CPS-2375
     def 'Select effective trust level among CmHandle and dmi plugin'() {
         given: 'a non trusted dmi'
             trustLevelPerDmiPlugin.put('my-dmi', TrustLevel.NONE)
         and: 'a trusted CmHandle'
             trustLevelPerCmHandle.put('ch-1', TrustLevel.COMPLETE)
         when: 'effective trust level selected'
-            def effectiveTrustLevel = objectUnderTest.getEffectiveTrustLevel('ch-1')
+            def effectiveTrustLevel = objectUnderTest.getEffectiveTrustLevel('my-dmi', 'ch-1')
         then: 'effective trust level is trusted'
             assert effectiveTrustLevel == TrustLevel.NONE
     }