/*
* ============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.
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Optional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
-import org.onap.cps.api.CpsAdminService;
+import org.apache.commons.lang3.tuple.ImmutableTriple;
+import org.onap.cps.api.CpsAnchorService;
import org.onap.cps.api.CpsDataService;
import org.onap.cps.api.CpsModuleService;
import org.onap.cps.ncmp.api.impl.inventory.CmHandleQueries;
import org.onap.cps.ncmp.api.impl.inventory.CmHandleState;
-import org.onap.cps.ncmp.api.impl.inventory.CompositeState;
-import org.onap.cps.ncmp.api.impl.inventory.LockReasonCategory;
import org.onap.cps.ncmp.api.impl.operations.DmiModelOperations;
import org.onap.cps.ncmp.api.impl.utils.YangDataConverter;
import org.onap.cps.ncmp.api.impl.yangmodels.YangModelCmHandle;
private final DmiModelOperations dmiModelOperations;
private final CpsModuleService cpsModuleService;
- private final CpsAdminService cpsAdminService;
private final CmHandleQueries cmHandleQueries;
private final CpsDataService cpsDataService;
+ private final CpsAnchorService cpsAnchorService;
private final JsonObjectMapper jsonObjectMapper;
- private final Map<String, Collection<ModuleReference>> moduleSetTagCache;
private static final Map<String, String> NO_NEW_MODULES = Collections.emptyMap();
/**
*/
public void syncAndCreateOrUpgradeSchemaSetAndAnchor(final YangModelCmHandle yangModelCmHandle) {
- final String moduleSetTag;
- final String cmHandleId = yangModelCmHandle.getId();
- final CompositeState compositeState = yangModelCmHandle.getCompositeState();
- final boolean inUpgrade = isInUpgrade(compositeState);
-
- if (inUpgrade) {
- moduleSetTag = extractModuleSetTag(compositeState);
- } else {
- moduleSetTag = yangModelCmHandle.getModuleSetTag();
- }
+ final boolean inUpgrade = ModuleOperationsUtils.inUpgradeOrUpgradeFailed(yangModelCmHandle.getCompositeState());
- final Collection<ModuleReference> moduleReferencesFromCache = moduleSetTagCache.get(moduleSetTag);
+ final ImmutableTriple<String, Map<String, String>, Collection<ModuleReference>>
+ allModuleReferencesAndNewModuleNameByModuleSetTag
+ = getAllModuleReferencesAndNewYangResourcesByModuleSetTag(yangModelCmHandle, inUpgrade);
- if (moduleReferencesFromCache == null) {
- final Optional<DataNode> optionalExistingCmHandleWithSameModuleSetTag
- = getFirstReadyDataNodeWithModuleSetTag(moduleSetTag);
-
- if (optionalExistingCmHandleWithSameModuleSetTag.isPresent()) {
- final String existingCmHandleAnchorName
- = optionalExistingCmHandleWithSameModuleSetTag.get().getAnchorName();
- createOrUpgradeSchemaSetUsingModuleSetTag(cmHandleId, moduleSetTag, existingCmHandleAnchorName);
- } else {
- syncAndCreateSchemaSet(yangModelCmHandle, moduleSetTag);
- }
- } else {
- cpsModuleService.createOrUpgradeSchemaSetFromModules(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME,
- cmHandleId, NO_NEW_MODULES, moduleReferencesFromCache);
- }
- if (!inUpgrade) {
- cpsAdminService.createAnchor(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, cmHandleId, cmHandleId);
- }
- setCmHandleModuleSetTag(yangModelCmHandle, moduleSetTag);
- }
+ final String moduleSetTag = allModuleReferencesAndNewModuleNameByModuleSetTag.getLeft();
+ final Map<String, String> newYangResources = allModuleReferencesAndNewModuleNameByModuleSetTag.getMiddle();
+ final Collection<ModuleReference> allModuleReferences
+ = allModuleReferencesAndNewModuleNameByModuleSetTag.getRight();
+ final String cmHandleId = yangModelCmHandle.getId();
- private void syncAndCreateSchemaSet(final YangModelCmHandle yangModelCmHandle, final String moduleSetTag) {
- final Collection<ModuleReference> allModuleReferencesFromCmHandle =
- dmiModelOperations.getModuleReferences(yangModelCmHandle);
- final Collection<ModuleReference> identifiedNewModuleReferencesFromCmHandle = cpsModuleService
- .identifyNewModuleReferences(allModuleReferencesFromCmHandle);
- final Map<String, String> newModuleNameToContentMap;
- if (identifiedNewModuleReferencesFromCmHandle.isEmpty()) {
- newModuleNameToContentMap = NO_NEW_MODULES;
+ if (inUpgrade) {
+ cpsModuleService.upgradeSchemaSetFromModules(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, cmHandleId,
+ newYangResources, allModuleReferences);
+ setCmHandleModuleSetTag(yangModelCmHandle, moduleSetTag);
} else {
- newModuleNameToContentMap = dmiModelOperations.getNewYangResourcesFromDmi(yangModelCmHandle,
- identifiedNewModuleReferencesFromCmHandle);
+ cpsModuleService.createSchemaSetFromModules(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, cmHandleId,
+ newYangResources, allModuleReferences);
+ cpsAnchorService.createAnchor(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, cmHandleId, cmHandleId);
}
- cpsModuleService.createOrUpgradeSchemaSetFromModules(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME,
- yangModelCmHandle.getId(), newModuleNameToContentMap, allModuleReferencesFromCmHandle);
- moduleSetTagCache.put(moduleSetTag, allModuleReferencesFromCmHandle);
}
/**
}
}
- private Optional<DataNode> getFirstReadyDataNodeWithModuleSetTag(final String moduleSetTag) {
- final List<DataNode> dataNodes = StringUtils.isNotBlank(moduleSetTag) ? cmHandleQueries
- .queryNcmpRegistryByCpsPath("//cm-handles[@module-set-tag='" + moduleSetTag + "']",
- FetchDescendantsOption.OMIT_DESCENDANTS) : Collections.emptyList();
- return dataNodes.stream().filter(dataNode -> {
- final String cmHandleId = YangDataConverter.extractCmHandleIdFromXpath(dataNode.getXpath());
- return cmHandleQueries.cmHandleHasState(cmHandleId, CmHandleState.READY);
- }).findFirst();
+ private ImmutableTriple<String, Map<String, String>, Collection<ModuleReference>>
+ getAllModuleReferencesAndNewYangResourcesByModuleSetTag(final YangModelCmHandle yangModelCmHandle,
+ final boolean inUpgrade) {
+ final String moduleSetTag = getModuleSetTag(yangModelCmHandle, inUpgrade);
+ final Collection<ModuleReference> allModuleReferences;
+ final Map<String, String> newYangResources;
+
+ final YangModelCmHandle cmHandleWithSameModuleSetTag = getAnyReadyCmHandleByModuleSetTag(moduleSetTag);
+ if (cmHandleWithSameModuleSetTag == null) {
+ allModuleReferences = dmiModelOperations.getModuleReferences(yangModelCmHandle);
+ newYangResources = getNewModuleNameToContentMap(yangModelCmHandle, allModuleReferences);
+ } else {
+ log.info("Found other cm handle having same module set tag: {}", moduleSetTag);
+ allModuleReferences = cpsModuleService.getYangResourcesModuleReferences(
+ NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, cmHandleWithSameModuleSetTag.getId());
+ newYangResources = NO_NEW_MODULES;
+ }
+ return ImmutableTriple.of(moduleSetTag, newYangResources, allModuleReferences);
+ }
+
+ private YangModelCmHandle getAnyReadyCmHandleByModuleSetTag(final String moduleSetTag) {
+ if (StringUtils.isBlank(moduleSetTag)) {
+ return null;
+ }
+ final String escapedModuleSetTag = moduleSetTag.replace("'", "''");
+ final List<DataNode> dataNodes = cmHandleQueries.queryNcmpRegistryByCpsPath(
+ NCMP_DMI_REGISTRY_PARENT + "/cm-handles[@module-set-tag='" + escapedModuleSetTag + "']",
+ FetchDescendantsOption.DIRECT_CHILDREN_ONLY);
+ return dataNodes.stream().map(YangDataConverter::convertCmHandleToYangModel)
+ .filter(cmHandle -> cmHandle.getCompositeState().getCmHandleState() == CmHandleState.READY)
+ .findFirst().orElse(null);
}
private void setCmHandleModuleSetTag(final YangModelCmHandle upgradedCmHandle, final String moduleSetTag) {
jsonObjectMapper.asJsonString(dmiRegistryProperties), OffsetDateTime.now());
}
- private void createOrUpgradeSchemaSetUsingModuleSetTag(final String schemaSetName,
- final String moduleSetTag,
- final String existingCmHandleAnchorName) {
- log.info("Found cm handle having module set tag: {}", moduleSetTag);
- final Collection<ModuleReference> moduleReferencesFromExistingCmHandle =
- cpsModuleService.getYangResourcesModuleReferences(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME,
- existingCmHandleAnchorName);
- cpsModuleService.createOrUpgradeSchemaSetFromModules(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME,
- schemaSetName, NO_NEW_MODULES, moduleReferencesFromExistingCmHandle);
- moduleSetTagCache.put(moduleSetTag, moduleReferencesFromExistingCmHandle);
+ private Map<String, String> getNewModuleNameToContentMap(final YangModelCmHandle yangModelCmHandle,
+ final Collection<ModuleReference> moduleReferences) {
+ final Collection<ModuleReference> identifiedNewModuleReferences = cpsModuleService
+ .identifyNewModuleReferences(moduleReferences);
+ return dmiModelOperations.getNewYangResourcesFromDmi(yangModelCmHandle, identifiedNewModuleReferences);
}
- private static String extractModuleSetTag(final CompositeState compositeState) {
- return compositeState.getLockReason().getDetails().split(":")[1].trim();
+ private String getModuleSetTag(final YangModelCmHandle yangModelCmHandle, final boolean inUpgrade) {
+ if (inUpgrade) {
+ return ModuleOperationsUtils.getUpgradedModuleSetTagFromLockReason(
+ yangModelCmHandle.getCompositeState().getLockReason());
+ }
+ return yangModelCmHandle.getModuleSetTag();
}
- private static boolean isInUpgrade(final CompositeState compositeState) {
- return compositeState.getLockReason() != null && LockReasonCategory.MODULE_UPGRADE.equals(
- compositeState.getLockReason().getLockReasonCategory());
- }
}