2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2022 Nordix Foundation
4 * Modifications Copyright (C) 2023 TechMahindra Ltd.
5 * ================================================================================
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.onap.cps.ncmp.api.inventory;
24 import static org.onap.cps.ncmp.api.impl.utils.YangDataConverter.convertYangModelCmHandleToNcmpServiceCmHandle;
25 import static org.onap.cps.spi.FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS;
26 import static org.onap.cps.spi.FetchDescendantsOption.OMIT_DESCENDANTS;
28 import java.util.Collection;
29 import java.util.Collections;
30 import java.util.HashMap;
31 import java.util.HashSet;
32 import java.util.List;
35 import java.util.stream.Collectors;
36 import lombok.RequiredArgsConstructor;
37 import org.onap.cps.ncmp.api.impl.utils.YangDataConverter;
38 import org.onap.cps.ncmp.api.inventory.enums.PropertyType;
39 import org.onap.cps.ncmp.api.models.NcmpServiceCmHandle;
40 import org.onap.cps.spi.CpsDataPersistenceService;
41 import org.onap.cps.spi.FetchDescendantsOption;
42 import org.onap.cps.spi.model.DataNode;
43 import org.springframework.stereotype.Component;
45 @RequiredArgsConstructor
47 public class CmHandleQueriesImpl implements CmHandleQueries {
49 private static final String NCMP_DATASPACE_NAME = "NCMP-Admin";
50 private static final String NCMP_DMI_REGISTRY_ANCHOR = "ncmp-dmi-registry";
51 private static final String DESCENDANT_PATH = "//";
53 private final CpsDataPersistenceService cpsDataPersistenceService;
54 private static final Map<String, NcmpServiceCmHandle> NO_QUERY_TO_EXECUTE = null;
55 private static final String ANCESTOR_CM_HANDLES = "/ancestor::cm-handles";
58 public Map<String, NcmpServiceCmHandle> queryCmHandleAdditionalProperties(
59 final Map<String, String> privatePropertyQueryPairs) {
60 return queryCmHandleAnyProperties(privatePropertyQueryPairs, PropertyType.ADDITIONAL);
64 public Map<String, NcmpServiceCmHandle> queryCmHandlePublicProperties(
65 final Map<String, String> publicPropertyQueryPairs) {
66 return queryCmHandleAnyProperties(publicPropertyQueryPairs, PropertyType.PUBLIC);
69 private Map<String, NcmpServiceCmHandle> queryCmHandleAnyProperties(
70 final Map<String, String> propertyQueryPairs,
71 final PropertyType propertyType) {
72 if (propertyQueryPairs.isEmpty()) {
73 return Collections.emptyMap();
75 Map<String, NcmpServiceCmHandle> cmHandleIdToNcmpServiceCmHandles = null;
76 for (final Map.Entry<String, String> publicPropertyQueryPair : propertyQueryPairs.entrySet()) {
77 final String cpsPath = DESCENDANT_PATH + propertyType.getYangContainerName() + "[@name=\""
78 + publicPropertyQueryPair.getKey()
79 + "\" and @value=\"" + publicPropertyQueryPair.getValue() + "\"]";
81 final Collection<DataNode> dataNodes = queryCmHandleDataNodesByCpsPath(cpsPath, INCLUDE_ALL_DESCENDANTS);
82 if (cmHandleIdToNcmpServiceCmHandles == null) {
83 cmHandleIdToNcmpServiceCmHandles = collectDataNodesToNcmpServiceCmHandles(dataNodes);
85 final Collection<String> cmHandleIdsToRetain = dataNodes.parallelStream()
86 .map(dataNode -> dataNode.getLeaves().get("id").toString()).collect(Collectors.toSet());
87 cmHandleIdToNcmpServiceCmHandles.keySet().retainAll(cmHandleIdsToRetain);
89 if (cmHandleIdToNcmpServiceCmHandles.isEmpty()) {
93 return cmHandleIdToNcmpServiceCmHandles;
97 public Map<String, NcmpServiceCmHandle> combineCmHandleQueries(final Map<String, NcmpServiceCmHandle> firstQuery,
98 final Map<String, NcmpServiceCmHandle> secondQuery) {
99 if (firstQuery == NO_QUERY_TO_EXECUTE && secondQuery == NO_QUERY_TO_EXECUTE) {
100 return NO_QUERY_TO_EXECUTE;
101 } else if (firstQuery == NO_QUERY_TO_EXECUTE) {
103 } else if (secondQuery == NO_QUERY_TO_EXECUTE) {
106 firstQuery.keySet().retainAll(secondQuery.keySet());
112 public List<DataNode> queryCmHandlesByState(final CmHandleState cmHandleState) {
113 return queryCmHandleDataNodesByCpsPath("//state[@cm-handle-state=\"" + cmHandleState + "\"]",
114 INCLUDE_ALL_DESCENDANTS);
118 public List<DataNode> queryCmHandleDataNodesByCpsPath(final String cpsPath,
119 final FetchDescendantsOption fetchDescendantsOption) {
120 return cpsDataPersistenceService.queryDataNodes(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR,
121 cpsPath + ANCESTOR_CM_HANDLES, fetchDescendantsOption);
125 public boolean cmHandleHasState(final String cmHandleId, final CmHandleState requiredCmHandleState) {
126 final DataNode stateDataNode = getCmHandleState(cmHandleId);
127 final String cmHandleStateAsString = (String) stateDataNode.getLeaves().get("cm-handle-state");
128 return CmHandleState.valueOf(cmHandleStateAsString).equals(requiredCmHandleState);
132 public List<DataNode> queryCmHandlesByOperationalSyncState(final DataStoreSyncState dataStoreSyncState) {
133 return queryCmHandleDataNodesByCpsPath("//state/datastores" + "/operational[@sync-state=\""
134 + dataStoreSyncState + "\"]", FetchDescendantsOption.OMIT_DESCENDANTS);
137 private Map<String, NcmpServiceCmHandle> collectDataNodesToNcmpServiceCmHandles(
138 final Collection<DataNode> dataNodes) {
139 final Map<String, NcmpServiceCmHandle> cmHandleIdToNcmpServiceCmHandle = new HashMap<>();
140 dataNodes.forEach(dataNode -> {
141 final NcmpServiceCmHandle ncmpServiceCmHandle = createNcmpServiceCmHandle(dataNode);
142 cmHandleIdToNcmpServiceCmHandle.put(ncmpServiceCmHandle.getCmHandleId(), ncmpServiceCmHandle);
144 return cmHandleIdToNcmpServiceCmHandle;
147 private NcmpServiceCmHandle createNcmpServiceCmHandle(final DataNode dataNode) {
148 return convertYangModelCmHandleToNcmpServiceCmHandle(YangDataConverter
149 .convertCmHandleToYangModel(dataNode, dataNode.getLeaves().get("id").toString()));
153 public Set<NcmpServiceCmHandle> getCmHandlesByDmiPluginIdentifier(final String dmiPluginIdentifier) {
154 final Map<String, DataNode> cmHandleAsDataNodePerCmHandleId = new HashMap<>();
155 for (final ModelledDmiServiceLeaves modelledDmiServiceLeaf : ModelledDmiServiceLeaves.values()) {
156 for (final DataNode cmHandleAsDataNode: getCmHandlesByDmiPluginIdentifierAndDmiProperty(
158 modelledDmiServiceLeaf.getLeafName())) {
159 cmHandleAsDataNodePerCmHandleId.put(
160 cmHandleAsDataNode.getLeaves().get("id").toString(), cmHandleAsDataNode);
163 final Set<NcmpServiceCmHandle> ncmpServiceCmHandles = new HashSet<>(cmHandleAsDataNodePerCmHandleId.size());
164 cmHandleAsDataNodePerCmHandleId.values().forEach(
165 cmHandleAsDataNode -> ncmpServiceCmHandles.add(createNcmpServiceCmHandle(cmHandleAsDataNode)));
166 return ncmpServiceCmHandles;
169 private List<DataNode> getCmHandlesByDmiPluginIdentifierAndDmiProperty(final String dmiPluginIdentifier,
170 final String dmiProperty) {
171 return cpsDataPersistenceService.queryDataNodes(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR,
172 "/dmi-registry/cm-handles[@" + dmiProperty + "='" + dmiPluginIdentifier + "']",
176 private DataNode getCmHandleState(final String cmHandleId) {
177 final String xpath = "/dmi-registry/cm-handles[@id='" + cmHandleId + "']/state";
178 return cpsDataPersistenceService.getDataNodes(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR,
179 xpath, OMIT_DESCENDANTS).iterator().next();