diff options
Diffstat (limited to 'cps-ncmp-service/src')
18 files changed, 319 insertions, 210 deletions
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/NetworkCmProxyInventoryFacade.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/NetworkCmProxyInventoryFacade.java index 64bec06fec..9bfb775d55 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/NetworkCmProxyInventoryFacade.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/NetworkCmProxyInventoryFacade.java @@ -1,10 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2021 highstreet technologies GmbH - * Modifications Copyright (C) 2021-2024 Nordix Foundation - * Modifications Copyright (C) 2021 Pantheon.tech - * Modifications Copyright (C) 2021-2022 Bell Canada - * Modifications Copyright (C) 2023 TechMahindra Ltd. + * Copyright (C) 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. @@ -24,47 +20,18 @@ package org.onap.cps.ncmp.api.inventory; -import static org.onap.cps.ncmp.impl.inventory.CmHandleQueryParametersValidator.validateCmHandleQueryParameters; - import java.util.Collection; -import java.util.Collections; import java.util.Map; -import lombok.RequiredArgsConstructor; import org.onap.cps.api.model.ModuleDefinition; import org.onap.cps.api.model.ModuleReference; -import org.onap.cps.ncmp.api.exceptions.CmHandleNotFoundException; import org.onap.cps.ncmp.api.inventory.models.CmHandleQueryApiParameters; import org.onap.cps.ncmp.api.inventory.models.CmHandleQueryServiceParameters; import org.onap.cps.ncmp.api.inventory.models.CompositeState; import org.onap.cps.ncmp.api.inventory.models.DmiPluginRegistration; import org.onap.cps.ncmp.api.inventory.models.DmiPluginRegistrationResponse; import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle; -import org.onap.cps.ncmp.impl.inventory.CmHandleQueryService; -import org.onap.cps.ncmp.impl.inventory.CmHandleRegistrationService; -import org.onap.cps.ncmp.impl.inventory.InventoryPersistence; -import org.onap.cps.ncmp.impl.inventory.ParameterizedCmHandleQueryService; -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.utils.AlternateIdMatcher; -import org.onap.cps.ncmp.impl.utils.YangDataConverter; -import org.onap.cps.utils.JsonObjectMapper; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class NetworkCmProxyInventoryFacade { - - private final CmHandleRegistrationService cmHandleRegistrationService; - private final CmHandleQueryService cmHandleQueryService; - private final ParameterizedCmHandleQueryService parameterizedCmHandleQueryService; - private final InventoryPersistence inventoryPersistence; - private final JsonObjectMapper jsonObjectMapper; - private final TrustLevelManager trustLevelManager; - private final AlternateIdMatcher alternateIdMatcher; - +public interface NetworkCmProxyInventoryFacade { /** * Registration of Created, Removed, Updated or Upgraded CM Handles. @@ -72,9 +39,7 @@ public class NetworkCmProxyInventoryFacade { * @param dmiPluginRegistration Dmi Plugin Registration details * @return dmiPluginRegistrationResponse */ - public DmiPluginRegistrationResponse updateDmiRegistration(final DmiPluginRegistration dmiPluginRegistration) { - return cmHandleRegistrationService.updateDmiRegistration(dmiPluginRegistration); - } + DmiPluginRegistrationResponse updateDmiRegistration(final DmiPluginRegistration dmiPluginRegistration); /** * Get all cm handle references by DMI plugin identifier. @@ -84,10 +49,8 @@ public class NetworkCmProxyInventoryFacade { * cm handle id (false) or alternate id (true) * @return collection of cm handle references */ - public Collection<String> getAllCmHandleReferencesByDmiPluginIdentifier(final String dmiPluginIdentifier, - final boolean outputAlternateId) { - return cmHandleQueryService.getCmHandleReferencesByDmiPluginIdentifier(dmiPluginIdentifier, outputAlternateId); - } + Collection<String> getAllCmHandleReferencesByDmiPluginIdentifier(final String dmiPluginIdentifier, + final boolean outputAlternateId); /** * Get all cm handle IDs by various properties. @@ -97,14 +60,9 @@ public class NetworkCmProxyInventoryFacade { * cm handle id (false) or alternate id (true) * @return collection of cm handle references */ - public Collection<String> executeParameterizedCmHandleIdSearch( - final CmHandleQueryServiceParameters cmHandleQueryServiceParameters, final boolean outputAlternateId) { - validateCmHandleQueryParameters(cmHandleQueryServiceParameters, InventoryQueryConditions.ALL_CONDITION_NAMES); - - return parameterizedCmHandleQueryService.queryCmHandleIdsForInventory(cmHandleQueryServiceParameters, - outputAlternateId); - } - + Collection<String> executeParameterizedCmHandleIdSearch(final CmHandleQueryServiceParameters + cmHandleQueryServiceParameters, + final boolean outputAlternateId); /** * Retrieve module references for the given cm handle reference. @@ -112,14 +70,7 @@ public class NetworkCmProxyInventoryFacade { * @param cmHandleReference cm handle or alternate id identifier * @return a collection of modules names and revisions */ - public Collection<ModuleReference> getYangResourcesModuleReferences(final String cmHandleReference) { - try { - final String cmHandleId = alternateIdMatcher.getCmHandleId(cmHandleReference); - return inventoryPersistence.getYangResourcesModuleReferences(cmHandleId); - } catch (final CmHandleNotFoundException cmHandleNotFoundException) { - return Collections.emptyList(); - } - } + Collection<ModuleReference> getYangResourcesModuleReferences(final String cmHandleReference); /** * Retrieve module definitions for the given cm handle. @@ -127,14 +78,7 @@ public class NetworkCmProxyInventoryFacade { * @param cmHandleReference cm handle or alternate id identifier * @return a collection of module definition (moduleName, revision and yang resource content) */ - public Collection<ModuleDefinition> getModuleDefinitionsByCmHandleReference(final String cmHandleReference) { - try { - final String cmHandleId = alternateIdMatcher.getCmHandleId(cmHandleReference); - return inventoryPersistence.getModuleDefinitionsByCmHandleId(cmHandleId); - } catch (final CmHandleNotFoundException cmHandleNotFoundException) { - return Collections.emptyList(); - } - } + Collection<ModuleDefinition> getModuleDefinitionsByCmHandleReference(final String cmHandleReference); /** * Get module definitions for the given parameters. @@ -144,16 +88,9 @@ public class NetworkCmProxyInventoryFacade { * @param moduleRevision the revision of the module * @return list of module definitions (module name, revision, yang resource content) */ - public Collection<ModuleDefinition> getModuleDefinitionsByCmHandleAndModule(final String cmHandleReference, - final String moduleName, - final String moduleRevision) { - try { - final String cmHandleId = alternateIdMatcher.getCmHandleId(cmHandleReference); - return inventoryPersistence.getModuleDefinitionsByCmHandleAndModule(cmHandleId, moduleName, moduleRevision); - } catch (final CmHandleNotFoundException cmHandleNotFoundException) { - return Collections.emptyList(); - } - } + Collection<ModuleDefinition> getModuleDefinitionsByCmHandleAndModule(final String cmHandleReference, + final String moduleName, + final String moduleRevision); /** * Retrieve cm handles with details for the given query parameters. @@ -161,16 +98,7 @@ public class NetworkCmProxyInventoryFacade { * @param cmHandleQueryApiParameters cm handle query parameters * @return cm handles with details */ - public Collection<NcmpServiceCmHandle> executeCmHandleSearch( - final CmHandleQueryApiParameters cmHandleQueryApiParameters) { - final CmHandleQueryServiceParameters cmHandleQueryServiceParameters = jsonObjectMapper.convertToValueType( - cmHandleQueryApiParameters, CmHandleQueryServiceParameters.class); - validateCmHandleQueryParameters(cmHandleQueryServiceParameters, CmHandleQueryConditions.ALL_CONDITION_NAMES); - final Collection<NcmpServiceCmHandle> ncmpServiceCmHandles = - parameterizedCmHandleQueryService.queryCmHandles(cmHandleQueryServiceParameters); - trustLevelManager.applyEffectiveTrustLevels(ncmpServiceCmHandles); - return ncmpServiceCmHandles; - } + Collection<NcmpServiceCmHandle> executeCmHandleSearch(final CmHandleQueryApiParameters cmHandleQueryApiParameters); /** * Retrieve cm handle ids for the given query parameters. @@ -179,14 +107,8 @@ public class NetworkCmProxyInventoryFacade { * @param outputAlternateId boolean for cm handle reference type either cmHandleId (false) or AlternateId (true) * @return cm handle ids */ - public Collection<String> executeCmHandleIdSearch(final CmHandleQueryApiParameters cmHandleQueryApiParameters, - final boolean outputAlternateId) { - final CmHandleQueryServiceParameters cmHandleQueryServiceParameters = jsonObjectMapper.convertToValueType( - cmHandleQueryApiParameters, CmHandleQueryServiceParameters.class); - validateCmHandleQueryParameters(cmHandleQueryServiceParameters, CmHandleQueryConditions.ALL_CONDITION_NAMES); - return parameterizedCmHandleQueryService.queryCmHandleReferenceIds(cmHandleQueryServiceParameters, - outputAlternateId); - } + Collection<String> executeCmHandleIdSearch(final CmHandleQueryApiParameters cmHandleQueryApiParameters, + final boolean outputAlternateId); /** * Set the data sync enabled flag, along with the data sync state @@ -195,9 +117,7 @@ public class NetworkCmProxyInventoryFacade { * @param cmHandleId cm handle id * @param dataSyncEnabledTargetValue data sync enabled flag */ - public void setDataSyncEnabled(final String cmHandleId, final Boolean dataSyncEnabledTargetValue) { - cmHandleRegistrationService.setDataSyncEnabled(cmHandleId, dataSyncEnabledTargetValue); - } + void setDataSyncEnabled(final String cmHandleId, final Boolean dataSyncEnabledTargetValue); /** * Retrieve cm handle details for a given cm handle reference. @@ -205,13 +125,7 @@ public class NetworkCmProxyInventoryFacade { * @param cmHandleReference cm handle or alternate identifier * @return cm handle details */ - public NcmpServiceCmHandle getNcmpServiceCmHandle(final String cmHandleReference) { - final String cmHandleId = alternateIdMatcher.getCmHandleId(cmHandleReference); - final NcmpServiceCmHandle ncmpServiceCmHandle = YangDataConverter.toNcmpServiceCmHandle( - inventoryPersistence.getYangModelCmHandle(cmHandleId)); - trustLevelManager.applyEffectiveTrustLevel(ncmpServiceCmHandle); - return ncmpServiceCmHandle; - } + NcmpServiceCmHandle getNcmpServiceCmHandle(final String cmHandleReference); /** * Get cm handle public properties for a given cm handle or alternate id. @@ -219,11 +133,7 @@ public class NetworkCmProxyInventoryFacade { * @param cmHandleReference cm handle or alternate identifier * @return cm handle public properties */ - public Map<String, String> getCmHandlePublicProperties(final String cmHandleReference) { - final String cmHandleId = alternateIdMatcher.getCmHandleId(cmHandleReference); - final YangModelCmHandle yangModelCmHandle = inventoryPersistence.getYangModelCmHandle(cmHandleId); - return YangDataConverter.toPropertiesMap(yangModelCmHandle.getPublicProperties()); - } + Map<String, String> getCmHandlePublicProperties(final String cmHandleReference); /** * Get cm handle composite state for a given cm handle id. @@ -231,9 +141,5 @@ public class NetworkCmProxyInventoryFacade { * @param cmHandleReference cm handle or alternate identifier * @return cm handle state */ - public CompositeState getCmHandleCompositeState(final String cmHandleReference) { - final String cmHandleId = alternateIdMatcher.getCmHandleId(cmHandleReference); - return inventoryPersistence.getYangModelCmHandle(cmHandleId).getCompositeState(); - } - + CompositeState getCmHandleCompositeState(final String cmHandleReference); } diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/NetworkCmProxyInventoryFacadeImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/NetworkCmProxyInventoryFacadeImpl.java new file mode 100644 index 0000000000..118c2bba70 --- /dev/null +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/NetworkCmProxyInventoryFacadeImpl.java @@ -0,0 +1,169 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 highstreet technologies GmbH + * Modifications Copyright (C) 2021-2024 Nordix Foundation + * Modifications Copyright (C) 2021 Pantheon.tech + * Modifications Copyright (C) 2021-2022 Bell Canada + * Modifications Copyright (C) 2023 TechMahindra Ltd. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.ncmp.impl; + +import static org.onap.cps.ncmp.impl.inventory.CmHandleQueryParametersValidator.validateCmHandleQueryParameters; + +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import lombok.RequiredArgsConstructor; +import org.onap.cps.api.model.ModuleDefinition; +import org.onap.cps.api.model.ModuleReference; +import org.onap.cps.ncmp.api.exceptions.CmHandleNotFoundException; +import org.onap.cps.ncmp.api.inventory.NetworkCmProxyInventoryFacade; +import org.onap.cps.ncmp.api.inventory.models.CmHandleQueryApiParameters; +import org.onap.cps.ncmp.api.inventory.models.CmHandleQueryServiceParameters; +import org.onap.cps.ncmp.api.inventory.models.CompositeState; +import org.onap.cps.ncmp.api.inventory.models.DmiPluginRegistration; +import org.onap.cps.ncmp.api.inventory.models.DmiPluginRegistrationResponse; +import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle; +import org.onap.cps.ncmp.impl.inventory.CmHandleQueryService; +import org.onap.cps.ncmp.impl.inventory.CmHandleRegistrationService; +import org.onap.cps.ncmp.impl.inventory.InventoryPersistence; +import org.onap.cps.ncmp.impl.inventory.ParameterizedCmHandleQueryService; +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.utils.AlternateIdMatcher; +import org.onap.cps.ncmp.impl.utils.YangDataConverter; +import org.onap.cps.utils.JsonObjectMapper; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class NetworkCmProxyInventoryFacadeImpl implements NetworkCmProxyInventoryFacade { + + private final CmHandleRegistrationService cmHandleRegistrationService; + private final CmHandleQueryService cmHandleQueryService; + private final ParameterizedCmHandleQueryService parameterizedCmHandleQueryService; + private final InventoryPersistence inventoryPersistence; + private final JsonObjectMapper jsonObjectMapper; + private final TrustLevelManager trustLevelManager; + private final AlternateIdMatcher alternateIdMatcher; + + @Override + public DmiPluginRegistrationResponse updateDmiRegistration(final DmiPluginRegistration dmiPluginRegistration) { + return cmHandleRegistrationService.updateDmiRegistration(dmiPluginRegistration); + } + + @Override + public Collection<String> getAllCmHandleReferencesByDmiPluginIdentifier(final String dmiPluginIdentifier, + final boolean outputAlternateId) { + return cmHandleQueryService.getCmHandleReferencesByDmiPluginIdentifier(dmiPluginIdentifier, outputAlternateId); + } + + @Override + public Collection<String> executeParameterizedCmHandleIdSearch( + final CmHandleQueryServiceParameters cmHandleQueryServiceParameters, final boolean outputAlternateId) { + validateCmHandleQueryParameters(cmHandleQueryServiceParameters, InventoryQueryConditions.ALL_CONDITION_NAMES); + + return parameterizedCmHandleQueryService.queryCmHandleIdsForInventory(cmHandleQueryServiceParameters, + outputAlternateId); + } + + @Override + public Collection<ModuleReference> getYangResourcesModuleReferences(final String cmHandleReference) { + try { + final String cmHandleId = alternateIdMatcher.getCmHandleId(cmHandleReference); + return inventoryPersistence.getYangResourcesModuleReferences(cmHandleId); + } catch (final CmHandleNotFoundException cmHandleNotFoundException) { + return Collections.emptyList(); + } + } + + @Override + public Collection<ModuleDefinition> getModuleDefinitionsByCmHandleReference(final String cmHandleReference) { + try { + final String cmHandleId = alternateIdMatcher.getCmHandleId(cmHandleReference); + return inventoryPersistence.getModuleDefinitionsByCmHandleId(cmHandleId); + } catch (final CmHandleNotFoundException cmHandleNotFoundException) { + return Collections.emptyList(); + } + } + + @Override + public Collection<ModuleDefinition> getModuleDefinitionsByCmHandleAndModule(final String cmHandleReference, + final String moduleName, + final String moduleRevision) { + try { + final String cmHandleId = alternateIdMatcher.getCmHandleId(cmHandleReference); + return inventoryPersistence.getModuleDefinitionsByCmHandleAndModule(cmHandleId, moduleName, moduleRevision); + } catch (final CmHandleNotFoundException cmHandleNotFoundException) { + return Collections.emptyList(); + } + } + + @Override + public Collection<NcmpServiceCmHandle> executeCmHandleSearch( + final CmHandleQueryApiParameters cmHandleQueryApiParameters) { + final CmHandleQueryServiceParameters cmHandleQueryServiceParameters = jsonObjectMapper.convertToValueType( + cmHandleQueryApiParameters, CmHandleQueryServiceParameters.class); + validateCmHandleQueryParameters(cmHandleQueryServiceParameters, CmHandleQueryConditions.ALL_CONDITION_NAMES); + final Collection<NcmpServiceCmHandle> ncmpServiceCmHandles = + parameterizedCmHandleQueryService.queryCmHandles(cmHandleQueryServiceParameters); + trustLevelManager.applyEffectiveTrustLevels(ncmpServiceCmHandles); + return ncmpServiceCmHandles; + } + + @Override + public Collection<String> executeCmHandleIdSearch(final CmHandleQueryApiParameters cmHandleQueryApiParameters, + final boolean outputAlternateId) { + final CmHandleQueryServiceParameters cmHandleQueryServiceParameters = jsonObjectMapper.convertToValueType( + cmHandleQueryApiParameters, CmHandleQueryServiceParameters.class); + validateCmHandleQueryParameters(cmHandleQueryServiceParameters, CmHandleQueryConditions.ALL_CONDITION_NAMES); + return parameterizedCmHandleQueryService.queryCmHandleReferenceIds(cmHandleQueryServiceParameters, + outputAlternateId); + } + + @Override + public void setDataSyncEnabled(final String cmHandleId, final Boolean dataSyncEnabledTargetValue) { + cmHandleRegistrationService.setDataSyncEnabled(cmHandleId, dataSyncEnabledTargetValue); + } + + @Override + public NcmpServiceCmHandle getNcmpServiceCmHandle(final String cmHandleReference) { + final String cmHandleId = alternateIdMatcher.getCmHandleId(cmHandleReference); + final NcmpServiceCmHandle ncmpServiceCmHandle = YangDataConverter.toNcmpServiceCmHandle( + inventoryPersistence.getYangModelCmHandle(cmHandleId)); + trustLevelManager.applyEffectiveTrustLevel(ncmpServiceCmHandle); + return ncmpServiceCmHandle; + } + + @Override + public Map<String, String> getCmHandlePublicProperties(final String cmHandleReference) { + final String cmHandleId = alternateIdMatcher.getCmHandleId(cmHandleReference); + final YangModelCmHandle yangModelCmHandle = inventoryPersistence.getYangModelCmHandle(cmHandleId); + return YangDataConverter.toPropertiesMap(yangModelCmHandle.getPublicProperties()); + } + + @Override + public CompositeState getCmHandleCompositeState(final String cmHandleReference) { + final String cmHandleId = alternateIdMatcher.getCmHandleId(cmHandleReference); + return inventoryPersistence.getYangModelCmHandle(cmHandleId).getCompositeState(); + } + +} diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cache/HazelcastCacheConfig.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cache/HazelcastCacheConfig.java index 770dde1c08..75007e2e35 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cache/HazelcastCacheConfig.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/cache/HazelcastCacheConfig.java @@ -23,6 +23,7 @@ package org.onap.cps.ncmp.impl.cache; import com.hazelcast.config.Config; import com.hazelcast.config.MapConfig; import com.hazelcast.config.NamedConfig; +import com.hazelcast.config.NearCacheConfig; import com.hazelcast.config.QueueConfig; import com.hazelcast.config.RestEndpointGroup; import com.hazelcast.config.SetConfig; @@ -94,6 +95,21 @@ public class HazelcastCacheConfig { return mapConfig; } + protected static MapConfig createMapConfigWithTimeToLiveInSeconds(final String configName, + final int timeToLiveInSeconds) { + final MapConfig mapConfig = new MapConfig(configName); + mapConfig.setBackupCount(1); + mapConfig.setTimeToLiveSeconds(timeToLiveInSeconds); + return mapConfig; + } + + protected static MapConfig createNearCacheMapConfig(final String configName) { + final MapConfig mapConfig = new MapConfig(configName); + mapConfig.setBackupCount(1); + mapConfig.setNearCacheConfig(new NearCacheConfig(configName)); + return mapConfig; + } + protected static QueueConfig createQueueConfig(final String configName) { final QueueConfig commonQueueConfig = new QueueConfig(configName); commonQueueConfig.setBackupCount(1); diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/policyexecutor/PolicyExecutor.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/policyexecutor/PolicyExecutor.java index af4331893d..38105329d1 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/policyexecutor/PolicyExecutor.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/policyexecutor/PolicyExecutor.java @@ -26,9 +26,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import java.net.UnknownHostException; import java.time.Duration; import java.time.temporal.ChronoUnit; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.concurrent.TimeoutException; import lombok.RequiredArgsConstructor; @@ -68,6 +68,10 @@ public class PolicyExecutor { @Value("${ncmp.policy-executor.httpclient.all-services.readTimeoutInSeconds:30}") private long readTimeoutInSeconds; + private static final String CHANGE_REQUEST_FORMAT = "cm-legacy"; + private static final String PERMISSION_BASE_PATH = "operation-permission"; + private static final String REQUEST_PATH = "permissions"; + @Qualifier("policyExecutorWebClient") private final WebClient policyExecutorWebClient; @@ -110,38 +114,33 @@ public class PolicyExecutor { } } - private Map<String, Object> getSingleRequestAsMap(final YangModelCmHandle yangModelCmHandle, - final OperationType operationType, - final String resourceIdentifier, - final String changeRequestAsJson) { - final Map<String, Object> data = new HashMap<>(4); - data.put("cmHandleId", yangModelCmHandle.getId()); - data.put("resourceIdentifier", resourceIdentifier); - data.put("targetIdentifier", yangModelCmHandle.getAlternateId()); + private Map<String, Object> getSingleOperationAsMap(final YangModelCmHandle yangModelCmHandle, + final OperationType operationType, + final String resourceIdentifier, + final String changeRequestAsJson) { + final Map<String, Object> operationAsMap = new HashMap<>(5); + operationAsMap.put("operation", operationType.getOperationName()); + operationAsMap.put("entityHandleId", yangModelCmHandle.getId()); + operationAsMap.put("resourceIdentifier", resourceIdentifier); + operationAsMap.put("targetIdentifier", yangModelCmHandle.getAlternateId()); if (!OperationType.DELETE.equals(operationType)) { try { final Object changeRequestAsObject = objectMapper.readValue(changeRequestAsJson, Object.class); - data.put("cmChangeRequest", changeRequestAsObject); + operationAsMap.put("changeRequest", changeRequestAsObject); } catch (final JsonProcessingException e) { throw new NcmpException("Cannot convert Change Request data to Object", "Invalid Json: " + changeRequestAsJson); } } - final Map<String, Object> request = new HashMap<>(2); - request.put("schema", getAssociatedPolicyDataSchemaName(operationType)); - request.put("data", data); - return request; - } - - private static String getAssociatedPolicyDataSchemaName(final OperationType operationType) { - return "urn:cps:org.onap.cps.ncmp.policy-executor.ncmp-" + operationType.getOperationName() + "-schema:1.0.0"; + return operationAsMap; } - private Object createBodyAsObject(final List<Object> requests) { - final Map<String, Object> bodyAsMap = new HashMap<>(2); - bodyAsMap.put("decisionType", "allow"); - bodyAsMap.put("requests", requests); - return bodyAsMap; + private Object createBodyAsObject(final Map<String, Object> operationAsMap) { + final Collection<Map<String, Object>> operations = Collections.singletonList(operationAsMap); + final Map<String, Object> permissionRequestAsMap = new HashMap<>(2); + permissionRequestAsMap.put("changeRequestFormat", CHANGE_REQUEST_FORMAT); + permissionRequestAsMap.put("operations", operations); + return permissionRequestAsMap; } private ResponseEntity<JsonNode> getPolicyExecutorResponse(final YangModelCmHandle yangModelCmHandle, @@ -149,17 +148,16 @@ public class PolicyExecutor { final String authorization, final String resourceIdentifier, final String changeRequestAsJson) { - final Map<String, Object> requestAsMap = getSingleRequestAsMap(yangModelCmHandle, + final Map<String, Object> operationAsMap = getSingleOperationAsMap(yangModelCmHandle, operationType, resourceIdentifier, changeRequestAsJson); - final Object bodyAsObject = createBodyAsObject(Collections.singletonList(requestAsMap)); + final Object bodyAsObject = createBodyAsObject(operationAsMap); final UrlTemplateParameters urlTemplateParameters = RestServiceUrlTemplateBuilder.newInstance() - .fixedPathSegment("execute") - .createUrlTemplateParameters(String.format("%s:%s", serverAddress, serverPort), - "policy-executor/api"); + .fixedPathSegment(REQUEST_PATH) + .createUrlTemplateParameters(String.format("%s:%s", serverAddress, serverPort), PERMISSION_BASE_PATH); return policyExecutorWebClient.post() .uri(urlTemplateParameters.urlTemplate(), urlTemplateParameters.urlVariables()) @@ -172,23 +170,23 @@ public class PolicyExecutor { } private static void processSuccessResponse(final JsonNode responseBody) { - final String decisionId = responseBody.path("decisionId").asText("unknown id"); - final String decision = responseBody.path("decision").asText("unknown"); + final String id = responseBody.path("id").asText("unknown id"); + final String permissionResult = responseBody.path("permissionResult").asText("unknown"); final String messageFromPolicyExecutor = responseBody.path("message").asText(); - processDecision(decisionId, decision, messageFromPolicyExecutor, NO_ERROR); + processDecision(id, permissionResult, messageFromPolicyExecutor, NO_ERROR); } - private static void processDecision(final String decisionId, - final String decision, + private static void processDecision(final String id, + final String permissionResult, final String details, final Throwable optionalCauseOfError) { - log.trace("Policy Executor decision id: {} ", decisionId); - if ("allow".equals(decision)) { + log.trace("Policy Executor Decision id: {} ", id); + if ("allow".equals(permissionResult)) { log.trace("Operation allowed."); } else { - log.warn("Policy Executor decision: {}", decision); + log.warn("Policy Executor permission result: {}", permissionResult); log.warn("Policy Executor message: {}", details); - final String message = "Operation not allowed. Decision id " + decisionId + " : " + decision; + final String message = "Operation not allowed. Decision id " + id + " : " + permissionResult; throw new PolicyExecutorException(message, details, optionalCauseOfError); } } @@ -196,6 +194,7 @@ public class PolicyExecutor { private void processException(final RuntimeException runtimeException) { if (runtimeException instanceof WebClientResponseException) { final WebClientResponseException webClientResponseException = (WebClientResponseException) runtimeException; + log.warn("HTTP Error Message: {}", webClientResponseException.getMessage()); final int httpStatusCode = webClientResponseException.getStatusCode().value(); processFallbackResponse("Policy Executor returned HTTP Status code " + httpStatusCode + ".", webClientResponseException); diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImpl.java index 5610013863..c1291632de 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImpl.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImpl.java @@ -26,6 +26,7 @@ import static org.onap.cps.ncmp.impl.inventory.NcmpPersistence.NCMP_DATASPACE_NA import static org.onap.cps.ncmp.impl.inventory.NcmpPersistence.NCMP_DMI_REGISTRY_ANCHOR; import static org.onap.cps.ncmp.impl.inventory.NcmpPersistence.NCMP_DMI_REGISTRY_PARENT; +import com.hazelcast.map.IMap; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -59,10 +60,10 @@ public class CmHandleQueryServiceImpl implements CmHandleQueryService { private final CpsQueryService cpsQueryService; @Qualifier(TrustLevelCacheConfig.TRUST_LEVEL_PER_DMI_PLUGIN) - private final Map<String, TrustLevel> trustLevelPerDmiPlugin; + private final IMap<String, TrustLevel> trustLevelPerDmiPlugin; @Qualifier(TrustLevelCacheConfig.TRUST_LEVEL_PER_CM_HANDLE) - private final Map<String, TrustLevel> trustLevelPerCmHandleId; + private final IMap<String, TrustLevel> trustLevelPerCmHandleId; private final CpsValidator cpsValidator; diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationService.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationService.java index daac63fce4..281d64edb4 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationService.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationService.java @@ -319,7 +319,8 @@ public class CmHandleRegistrationService { // CPS-1239 Robustness cleaning of in progress cache private void removeDeletedCmHandleFromModuleSyncMap(final String cmHandleId) { - if (moduleSyncStartedOnCmHandles.remove(cmHandleId) != null) { + if (moduleSyncStartedOnCmHandles.containsKey(cmHandleId)) { + moduleSyncStartedOnCmHandles.removeAsync(cmHandleId); log.debug("{} removed from in progress map", cmHandleId); } } diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncTasks.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncTasks.java index c97b284bf1..0d618cfa40 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncTasks.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncTasks.java @@ -125,7 +125,8 @@ public class ModuleSyncTasks { } private void removeResetCmHandleFromModuleSyncMap(final String resetCmHandleId) { - if (moduleSyncStartedOnCmHandles.remove(resetCmHandleId) != null) { + if (moduleSyncStartedOnCmHandles.containsKey(resetCmHandleId)) { + moduleSyncStartedOnCmHandles.removeAsync(resetCmHandleId); log.info("{} removed from in progress map", resetCmHandleId); } } diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncWatchdog.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncWatchdog.java index 74bef43d0b..3f2bb4f4ef 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncWatchdog.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/ModuleSyncWatchdog.java @@ -139,8 +139,7 @@ public class ModuleSyncWatchdog { log.info("nextBatchCandidates size : {}", nextBatchCandidates.size()); for (final String cmHandleId : nextBatchCandidates) { final boolean alreadyAddedToInProgressMap = VALUE_FOR_HAZELCAST_IN_PROGRESS_MAP.equals( - moduleSyncStartedOnCmHandles.putIfAbsent(cmHandleId, VALUE_FOR_HAZELCAST_IN_PROGRESS_MAP, - SynchronizationCacheConfig.MODULE_SYNC_STARTED_TTL_SECS, TimeUnit.SECONDS)); + moduleSyncStartedOnCmHandles.putIfAbsent(cmHandleId, VALUE_FOR_HAZELCAST_IN_PROGRESS_MAP)); if (alreadyAddedToInProgressMap) { log.info("module sync for {} already in progress by other instance", cmHandleId); } else { diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/SynchronizationCacheConfig.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/SynchronizationCacheConfig.java index 671e791ac2..def8f37eb7 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/SynchronizationCacheConfig.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/sync/SynchronizationCacheConfig.java @@ -43,7 +43,8 @@ public class SynchronizationCacheConfig extends HazelcastCacheConfig { public static final int DATA_SYNC_SEMAPHORE_TTL_SECS = 1800; private static final QueueConfig commonQueueConfig = createQueueConfig("defaultQueueConfig"); - private static final MapConfig moduleSyncStartedConfig = createMapConfig("moduleSyncStartedConfig"); + private static final MapConfig moduleSyncStartedConfig = + createMapConfigWithTimeToLiveInSeconds("moduleSyncStartedConfig", MODULE_SYNC_STARTED_TTL_SECS); private static final MapConfig dataSyncSemaphoresConfig = createMapConfig("dataSyncSemaphoresConfig"); private static final SetConfig moduleSetTagsBeingProcessedConfig = createSetConfig("moduleSetTagsBeingProcessedConfig"); diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/DmiPluginTrustLevelWatchDog.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/DmiPluginTrustLevelWatchDog.java index aca485f53d..044e2b5553 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/DmiPluginTrustLevelWatchDog.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/DmiPluginTrustLevelWatchDog.java @@ -20,8 +20,8 @@ package org.onap.cps.ncmp.impl.inventory.trustlevel; +import com.hazelcast.map.IMap; import java.util.Collection; -import java.util.Map; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.onap.cps.ncmp.api.inventory.models.TrustLevel; @@ -43,7 +43,7 @@ public class DmiPluginTrustLevelWatchDog { private final TrustLevelManager trustLevelManager; @Qualifier(TrustLevelCacheConfig.TRUST_LEVEL_PER_DMI_PLUGIN) - private final Map<String, TrustLevel> trustLevelPerDmiPlugin; + private final IMap<String, TrustLevel> trustLevelPerDmiPlugin; /** * This class monitors the trust level of all DMI plugin by checking the health status diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelCacheConfig.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelCacheConfig.java index f9ad3ff937..a11dec7ba6 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelCacheConfig.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelCacheConfig.java @@ -34,7 +34,7 @@ public class TrustLevelCacheConfig extends HazelcastCacheConfig { public static final String TRUST_LEVEL_PER_CM_HANDLE = "trustLevelPerCmHandle"; private static final MapConfig trustLevelPerCmHandleIdCacheConfig = - createMapConfig("trustLevelPerCmHandleCacheConfig"); + createNearCacheMapConfig("trustLevelPerCmHandleCacheConfig"); private static final MapConfig trustLevelPerDmiPluginCacheConfig = createMapConfig("trustLevelPerDmiPluginCacheConfig"); diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManager.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManager.java index b61e53854e..6e896620c6 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManager.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManager.java @@ -64,7 +64,7 @@ public class TrustLevelManager { public void registerDmiPlugin(final DmiPluginRegistration dmiPluginRegistration) { final String dmiServiceName = DmiServiceNameResolver.resolveDmiServiceName(RequiredDmiService.DATA, dmiPluginRegistration); - trustLevelPerDmiPlugin.put(dmiServiceName, TrustLevel.COMPLETE); + trustLevelPerDmiPlugin.putAsync(dmiServiceName, TrustLevel.COMPLETE); } /** @@ -73,24 +73,22 @@ public class TrustLevelManager { * @param cmHandlesToBeCreated a list of cmHandles being created */ public void registerCmHandles(final Map<String, TrustLevel> cmHandlesToBeCreated) { + final Map<String, TrustLevel> trustLevelPerCmHandleIdForCache = new HashMap<>(); for (final Map.Entry<String, TrustLevel> entry : cmHandlesToBeCreated.entrySet()) { final String cmHandleId = entry.getKey(); - if (trustLevelPerCmHandleId.containsKey(cmHandleId)) { - log.warn("Cm handle: {} already registered", cmHandleId); - } else { - TrustLevel initialTrustLevel = entry.getValue(); - if (initialTrustLevel == null) { - initialTrustLevel = TrustLevel.COMPLETE; - } - trustLevelPerCmHandleId.put(cmHandleId, initialTrustLevel); - if (TrustLevel.NONE.equals(initialTrustLevel)) { - cmAvcEventPublisher.publishAvcEvent(cmHandleId, + TrustLevel initialTrustLevel = entry.getValue(); + if (initialTrustLevel == null) { + initialTrustLevel = TrustLevel.COMPLETE; + } + trustLevelPerCmHandleIdForCache.put(cmHandleId, initialTrustLevel); + if (TrustLevel.NONE.equals(initialTrustLevel)) { + cmAvcEventPublisher.publishAvcEvent(cmHandleId, AVC_CHANGED_ATTRIBUTE_NAME, AVC_NO_OLD_VALUE, initialTrustLevel.name()); - } } } + trustLevelPerCmHandleId.putAllAsync(trustLevelPerCmHandleIdForCache); } /** @@ -105,7 +103,7 @@ public class TrustLevelManager { final Collection<String> affectedCmHandleIds, final TrustLevel newDmiTrustLevel) { final TrustLevel oldDmiTrustLevel = trustLevelPerDmiPlugin.get(dmiServiceName); - trustLevelPerDmiPlugin.put(dmiServiceName, newDmiTrustLevel); + trustLevelPerDmiPlugin.putAsync(dmiServiceName, newDmiTrustLevel); for (final String affectedCmHandleId : affectedCmHandleIds) { final TrustLevel cmHandleTrustLevel = trustLevelPerCmHandleId.get(affectedCmHandleId); final TrustLevel oldEffectiveTrustLevel = cmHandleTrustLevel.getEffectiveTrustLevel(oldDmiTrustLevel); @@ -131,7 +129,7 @@ public class TrustLevelManager { final TrustLevel oldEffectiveTrustLevel = oldCmHandleTrustLevel.getEffectiveTrustLevel(dmiTrustLevel); final TrustLevel newEffectiveTrustLevel = newCmHandleTrustLevel.getEffectiveTrustLevel(dmiTrustLevel); - trustLevelPerCmHandleId.put(cmHandleId, newCmHandleTrustLevel); + trustLevelPerCmHandleId.putAsync(cmHandleId, newCmHandleTrustLevel); sendAvcNotificationIfRequired(cmHandleId, oldEffectiveTrustLevel, newEffectiveTrustLevel); } @@ -174,10 +172,11 @@ public class TrustLevelManager { * @param cmHandleIds cm handle ids to be removed from the cache */ public void removeCmHandles(final Collection<String> cmHandleIds) { - for (final String cmHandleId : cmHandleIds) { - if (trustLevelPerCmHandleId.remove(cmHandleId) == null) { - log.debug("Removed Cm handle: {} is not in trust level cache", cmHandleId); - } + final Set<String> cmHandlesToRemove = trustLevelPerCmHandleId.keySet().stream() + .filter(cmHandleIds::contains) + .collect(Collectors.toSet()); + for (final String cmHandleId : cmHandlesToRemove) { + trustLevelPerCmHandleId.removeAsync(cmHandleId); } } diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/policyexecutor/PolicyExecutorSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/policyexecutor/PolicyExecutorSpec.groovy index 33dcf5d623..9423246134 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/policyexecutor/PolicyExecutorSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/data/policyexecutor/PolicyExecutorSpec.groovy @@ -75,7 +75,7 @@ class PolicyExecutorSpec extends Specification { def 'Permission check with "allow" decision.'() { given: 'allow response' - mockResponse([decision:'allow'], HttpStatus.OK) + mockResponse([permissionResult:'allow'], HttpStatus.OK) when: 'permission is checked for an operation' objectUnderTest.checkPermission(new YangModelCmHandle(), operationType, 'my credentials','my resource',someValidJson) then: 'system logs the operation is allowed' @@ -88,7 +88,7 @@ class PolicyExecutorSpec extends Specification { def 'Permission check with "other" decision (not allowed).'() { given: 'other response' - mockResponse([decision:'other', decisionId:123, message:'I dont like Mondays' ], HttpStatus.OK) + mockResponse([permissionResult:'other', id:123, message:'I dont like Mondays' ], HttpStatus.OK) when: 'permission is checked for an operation' objectUnderTest.checkPermission(new YangModelCmHandle(), PATCH, 'my credentials','my resource',someValidJson) then: 'Policy Executor exception is thrown' diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImplSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImplSpec.groovy index d19081cee5..7ac2b2cded 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImplSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImplSpec.groovy @@ -21,6 +21,9 @@ package org.onap.cps.ncmp.impl.inventory +import com.hazelcast.config.Config +import com.hazelcast.core.Hazelcast +import com.hazelcast.instance.impl.HazelcastInstanceFactory import org.onap.cps.api.CpsDataService import org.onap.cps.api.CpsQueryService import org.onap.cps.impl.utils.CpsValidator @@ -39,11 +42,17 @@ class CmHandleQueryServiceImplSpec extends Specification { def mockCpsQueryService = Mock(CpsQueryService) def mockCpsDataService = Mock(CpsDataService) - def trustLevelPerDmiPlugin = [:] - def trustLevelPerCmHandleId = [ 'PNFDemo': TrustLevel.COMPLETE, 'PNFDemo2': TrustLevel.NONE, 'PNFDemo4': TrustLevel.NONE ] + def trustLevelPerDmiPlugin = HazelcastInstanceFactory + .getOrCreateHazelcastInstance(new Config('hazelcastInstanceName')) + .getMap('trustLevelPerDmiPlugin') + def trustLevelPerCmHandleId = HazelcastInstanceFactory + .getOrCreateHazelcastInstance(new Config('hazelcastInstanceName')) + .getMap('trustLevelPerCmHandleId') def mockCpsValidator = Mock(CpsValidator) - def objectUnderTest = new CmHandleQueryServiceImpl(mockCpsDataService, mockCpsQueryService, trustLevelPerDmiPlugin, trustLevelPerCmHandleId, mockCpsValidator) + + def objectUnderTest = new CmHandleQueryServiceImpl(mockCpsDataService, mockCpsQueryService, + trustLevelPerDmiPlugin, trustLevelPerCmHandleId, mockCpsValidator) def static sampleDataNodes = [new DataNode(xpath: "/dmi-registry/cm-handles[@id='ch-1']"), new DataNode(xpath: "/dmi-registry/cm-handles[@id='ch-2']")] @@ -56,6 +65,16 @@ class CmHandleQueryServiceImplSpec extends Specification { def static pnfDemo4 = createDataNode('PNFDemo4') def static pnfDemo5 = createDataNode('PNFDemo5') + def setup() { + trustLevelPerCmHandleId.put("PNFDemo", TrustLevel.COMPLETE) + trustLevelPerCmHandleId.put("PNFDemo2", TrustLevel.NONE) + trustLevelPerCmHandleId.put("PNFDemo4", TrustLevel.NONE) + } + + def cleanupSpec() { + Hazelcast.getHazelcastInstanceByName('hazelcastInstanceName').shutdown() + } + def 'Query CmHandles with public properties query pair.'() { given: 'the DataNodes queried for a given cpsPath are returned from the persistence service.' mockResponses() diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServiceSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServiceSpec.groovy index 67778fc0a3..faa193ea33 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServiceSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServiceSpec.groovy @@ -64,7 +64,7 @@ class CmHandleRegistrationServiceSpec extends Specification { def objectUnderTest = Spy(new CmHandleRegistrationService( mockNetworkCmProxyDataServicePropertyHandler, mockInventoryPersistence, mockCpsDataService, mockLcmEventsCmHandleStateHandler, - mockModuleSyncStartedOnCmHandles, mockTrustLevelManager, mockAlternateIdChecker)) + mockModuleSyncStartedOnCmHandles as IMap<String, Object>, mockTrustLevelManager, mockAlternateIdChecker)) def setup() { // always accept all cm handles @@ -86,14 +86,14 @@ class CmHandleRegistrationServiceSpec extends Specification { mockInventoryPersistence.getYangModelCmHandle('cmhandle-3') >> new YangModelCmHandle(id: 'cmhandle-3', moduleSetTag: '', compositeState: new CompositeState(cmHandleState: CmHandleState.READY)) and: 'cm handle is in READY state' mockCmHandleQueries.cmHandleHasState('cmhandle-3', CmHandleState.READY) >> true + and: 'cm handle to be removed is in progress map' + mockModuleSyncStartedOnCmHandles.containsKey('cmhandle-2') >> true when: 'registration is processed' objectUnderTest.updateDmiRegistration(dmiRegistration) then: 'cm-handles are removed first' 1 * objectUnderTest.processRemovedCmHandles(*_) and: 'de-registered cm handle entry is removed from in progress map' - 1 * mockModuleSyncStartedOnCmHandles.remove('cmhandle-2') - then: 'cm-handles are created' - 1 * objectUnderTest.processCreatedCmHandles(*_) + 1 * mockModuleSyncStartedOnCmHandles.removeAsync('cmhandle-2') then: 'cm-handles are updated' 1 * objectUnderTest.processUpdatedCmHandles(*_) 1 * mockNetworkCmProxyDataServicePropertyHandler.updateCmHandleProperties(*_) >> [] @@ -310,6 +310,9 @@ class CmHandleRegistrationServiceSpec extends Specification { given: 'a registration with three cm-handles to be deleted' def dmiPluginRegistration = new DmiPluginRegistration(dmiPlugin: 'my-server', removedCmHandles: ['cmhandle1', 'cmhandle2', 'cmhandle3']) + and: 'cm handles to be deleted in the progress map' + mockModuleSyncStartedOnCmHandles.containsKey("cmhandle1") >> true + mockModuleSyncStartedOnCmHandles.containsKey("cmhandle3") >> true and: 'cm-handle deletion fails on batch' mockInventoryPersistence.deleteDataNodes(_) >> { throw new RuntimeException("Failed") } and: 'cm-handle deletion is successful for 1st and 3rd; failed for 2nd' @@ -321,11 +324,12 @@ class CmHandleRegistrationServiceSpec extends Specification { and: 'a response is received for all cm-handles' response.removedCmHandles.size() == 3 and: 'successfully de-registered cm handle 1 is removed from in progress map' - 1 * mockModuleSyncStartedOnCmHandles.remove('cmhandle1') + 1 * mockModuleSyncStartedOnCmHandles.removeAsync('cmhandle1') and: 'successfully de-registered cm handle 3 is removed from in progress map even though it was already being removed' - 1 * mockModuleSyncStartedOnCmHandles.remove('cmhandle3') >> 'already in progress' + 1 * mockModuleSyncStartedOnCmHandles.removeAsync('cmhandle3') and: 'failed de-registered cm handle entries should NOT be removed from in progress map' - 0 * mockModuleSyncStartedOnCmHandles.remove('cmhandle2') + 0 * mockModuleSyncStartedOnCmHandles.containsKey('cmhandle2') + 0 * mockModuleSyncStartedOnCmHandles.removeAsync('cmhandle2') and: '1st and 3rd cm-handle deletes successfully' with(response.removedCmHandles[0]) { assert it.status == Status.SUCCESS @@ -349,7 +353,6 @@ class CmHandleRegistrationServiceSpec extends Specification { }) and: 'No cm handles state updates for "upgraded cm handles"' 1 * mockLcmEventsCmHandleStateHandler.updateCmHandleStateBatch([:]) - } def 'Remove CmHandle Error Handling: Schema Set Deletion failed'() { diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/NetworkCmProxyInventoryFacadeSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/NetworkCmProxyInventoryFacadeSpec.groovy index ae2554762f..c62a87f5c3 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/NetworkCmProxyInventoryFacadeSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/NetworkCmProxyInventoryFacadeSpec.groovy @@ -24,7 +24,7 @@ package org.onap.cps.ncmp.impl.inventory import com.fasterxml.jackson.databind.ObjectMapper -import org.onap.cps.ncmp.api.inventory.NetworkCmProxyInventoryFacade +import org.onap.cps.api.model.ConditionProperties import org.onap.cps.ncmp.api.inventory.models.CmHandleQueryApiParameters import org.onap.cps.ncmp.api.inventory.models.CmHandleQueryServiceParameters import org.onap.cps.ncmp.api.inventory.models.CompositeState @@ -32,12 +32,12 @@ import org.onap.cps.ncmp.api.inventory.models.ConditionApiProperties import org.onap.cps.ncmp.api.inventory.models.DmiPluginRegistration import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle import org.onap.cps.ncmp.api.inventory.models.TrustLevel +import org.onap.cps.ncmp.impl.NetworkCmProxyInventoryFacadeImpl import org.onap.cps.ncmp.impl.inventory.models.CmHandleState import org.onap.cps.ncmp.impl.inventory.models.LockReasonCategory import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle import org.onap.cps.ncmp.impl.inventory.trustlevel.TrustLevelManager import org.onap.cps.ncmp.impl.utils.AlternateIdMatcher -import org.onap.cps.api.model.ConditionProperties import org.onap.cps.utils.JsonObjectMapper import spock.lang.Specification @@ -50,7 +50,7 @@ class NetworkCmProxyInventoryFacadeSpec extends Specification { def mockInventoryPersistence = Mock(InventoryPersistence) def mockTrustLevelManager = Mock(TrustLevelManager) def mockAlternateIdMatcher = Mock(AlternateIdMatcher) - def objectUnderTest = new NetworkCmProxyInventoryFacade(mockCmHandleRegistrationService, mockCmHandleQueryService, mockParameterizedCmHandleQueryService, mockInventoryPersistence, spiedJsonObjectMapper, mockTrustLevelManager, mockAlternateIdMatcher) + def objectUnderTest = new NetworkCmProxyInventoryFacadeImpl(mockCmHandleRegistrationService, mockCmHandleQueryService, mockParameterizedCmHandleQueryService, mockInventoryPersistence, spiedJsonObjectMapper, mockTrustLevelManager, mockAlternateIdMatcher) def 'Update DMI Registration'() { given: 'an (updated) dmi plugin registration' diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/trustlevel/DmiPluginTrustLevelWatchDogSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/trustlevel/DmiPluginTrustLevelWatchDogSpec.groovy index 32f4503005..097387c038 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/trustlevel/DmiPluginTrustLevelWatchDogSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/trustlevel/DmiPluginTrustLevelWatchDogSpec.groovy @@ -20,6 +20,9 @@ package org.onap.cps.ncmp.impl.inventory.trustlevel +import com.hazelcast.config.Config +import com.hazelcast.core.Hazelcast +import com.hazelcast.instance.impl.HazelcastInstanceFactory import org.onap.cps.ncmp.api.inventory.models.TrustLevel import org.onap.cps.ncmp.impl.dmi.DmiRestClient import org.onap.cps.ncmp.impl.inventory.CmHandleQueryService @@ -32,11 +35,16 @@ class DmiPluginTrustLevelWatchDogSpec extends Specification { def mockDmiRestClient = Mock(DmiRestClient) def mockCmHandleQueryService = Mock(CmHandleQueryService) def mockTrustLevelManager = Mock(TrustLevelManager) - def trustLevelPerDmiPlugin = [:] - + def trustLevelPerDmiPlugin = HazelcastInstanceFactory + .getOrCreateHazelcastInstance(new Config('hazelcastInstanceName')) + .getMap('trustLevelPerDmiPlugin') def objectUnderTest = new DmiPluginTrustLevelWatchDog(mockDmiRestClient, mockCmHandleQueryService, mockTrustLevelManager, trustLevelPerDmiPlugin) + def cleanupSpec() { + Hazelcast.getHazelcastInstanceByName('hazelcastInstanceName').shutdown() + } + def 'watch dmi plugin health status for #dmiHealhStatus'() { given: 'the cache has been initialised and "knows" about dmi-1' trustLevelPerDmiPlugin.put('dmi-1', dmiOldTrustLevel) diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManagerSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManagerSpec.groovy index 1088ca8e06..1ab517cdcf 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManagerSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManagerSpec.groovy @@ -77,19 +77,6 @@ class TrustLevelManagerSpec extends Specification { assert trustLevelPerCmHandleId.get('ch-2') == TrustLevel.COMPLETE } - def 'Initial cm handle registration where a cm handle is already in the cache'() { - given: 'a trusted cm handle' - def cmHandleModelsToBeCreated = ['ch-1': TrustLevel.NONE] - and: 'the cm handle id already in the cache' - trustLevelPerCmHandleId.put('ch-1', TrustLevel.COMPLETE) - when: 'method to register to the cache is called' - objectUnderTest.registerCmHandles(cmHandleModelsToBeCreated) - then: 'no notification sent' - 0 * mockAttributeValueChangeEventPublisher.publishAvcEvent(*_) - and: 'cm handle cache is not updated' - assert trustLevelPerCmHandleId.get('ch-1') == TrustLevel.COMPLETE - } - def 'Initial cm handle registration with a cm handle that is not trusted'() { given: 'a not trusted cm handle' def cmHandleModelsToBeCreated = ['ch-2': TrustLevel.NONE] |