2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
20 package org.openecomp.sdc.be.model.jsonjanusgraph.operations;
22 import static java.util.Collections.emptyMap;
24 import fj.data.Either;
25 import java.util.ArrayList;
26 import java.util.HashMap;
27 import java.util.LinkedList;
28 import java.util.List;
30 import org.openecomp.sdc.be.dao.api.ActionStatus;
31 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
32 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
33 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphDao;
34 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
35 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
36 import org.openecomp.sdc.be.datatypes.elements.MapComponentInstanceExternalRefs;
37 import org.openecomp.sdc.be.model.jsonjanusgraph.utils.IdMapper;
38 import org.openecomp.sdc.be.model.operations.impl.OperationUtils;
39 import org.springframework.beans.factory.annotation.Autowired;
40 import org.springframework.stereotype.Component;
43 * Created by yavivi on 26/01/2018.
46 public class ExternalReferencesOperation extends BaseOperation {
49 private IdMapper idMapper;
51 private OperationUtils operationUtils;
56 public ExternalReferencesOperation(JanusGraphDao janusGraphDao, NodeTypeOperation nto, TopologyTemplateOperation tto, IdMapper idMapper) {
57 this.janusGraphDao = janusGraphDao;
58 this.topologyTemplateOperation = tto;
59 this.nodeTypeOperation = nto;
60 this.idMapper = idMapper;
63 public Either<String, ActionStatus> addExternalReferenceWithCommit(String serviceUuid, String componentInstanceName, String objectType,
65 Either<String, ActionStatus> addResult = addExternalReference(serviceUuid, componentInstanceName, objectType, reference);
66 janusGraphDao.commit();
70 public Either<String, ActionStatus> deleteExternalReferenceWithCommit(String serviceUuid, String componentInstanceName, String objectType,
72 Either<String, ActionStatus> result = deleteExternalReference(serviceUuid, componentInstanceName, objectType, reference);
73 janusGraphDao.commit();
77 public Either<String, ActionStatus> updateExternalReferenceWithCommit(String serviceVertexUuid, String componentInstanceName, String objectType,
78 String oldRef, String newRef) {
79 Either<String, ActionStatus> updateResult = updateExternalReference(serviceVertexUuid, componentInstanceName, objectType, oldRef, newRef);
80 janusGraphDao.commit();
84 public Either<String, ActionStatus> addExternalReference(String assetUuid, String componentInstanceName, String objectType, String reference) {
85 //Get Container vertex
86 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
87 if (vertexById.isRight()) {
88 return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
90 GraphVertex serviceVertex = vertexById.left().value();
91 final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
92 if (compInstanceUniqueId == null) {
93 return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
95 //Get the external references map vertex
96 final Either<GraphVertex, JanusGraphOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
97 //Check whether data vertex found
98 GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
99 //instanceId -> externalRefsMap
100 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData;
101 if (externalRefsVertex == null) {
102 //External Refs vertex does not exist, create its map.
103 externalReferencesFullData = new HashMap<>();
104 externalReferencesFullData.put(compInstanceUniqueId, new MapComponentInstanceExternalRefs());
106 externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
107 externalReferencesFullData.computeIfAbsent(compInstanceUniqueId, k -> new MapComponentInstanceExternalRefs());
109 boolean isAdded = addExternalRef(externalReferencesFullData, compInstanceUniqueId, objectType, reference);
110 updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
111 return isAdded ? Either.left(reference) : Either.right(ActionStatus.EXT_REF_ALREADY_EXIST);
114 public Either<String, ActionStatus> deleteExternalReference(String assetUuid, String componentInstanceName, String objectType, String reference) {
116 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
117 if (vertexById.isRight()) {
118 return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
120 GraphVertex serviceVertex = vertexById.left().value();
121 final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
122 if (compInstanceUniqueId == null) {
123 return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
125 //Get the external references map vertex
126 final Either<GraphVertex, JanusGraphOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
127 //Check whether data vertex found
128 GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
129 boolean refDeleted = false;
130 if (externalRefsVertex != null) {
131 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex
133 if (externalReferencesFullData != null) {
134 refDeleted = deleteExternalRef(externalReferencesFullData, compInstanceUniqueId, objectType, reference);
135 updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
139 return Either.left(reference);
141 return Either.right(ActionStatus.EXT_REF_NOT_FOUND);
145 public Either<String, ActionStatus> updateExternalReference(String assetUuid, String componentInstanceName, String objectType, String oldRef,
148 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
149 if (vertexById.isRight()) {
150 return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
152 GraphVertex serviceVertex = vertexById.left().value();
153 //Map instance_name -> uuid
154 final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
155 if (compInstanceUniqueId == null) {
156 return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
158 //Get the external references map vertex
159 final Either<GraphVertex, JanusGraphOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
160 //Check whether data vertex found
161 GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
162 boolean refReplaced = false;
163 if (externalRefsVertex != null) {
164 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex
166 if (externalReferencesFullData != null) {
167 refReplaced = updateExternalRef(externalReferencesFullData, compInstanceUniqueId, objectType, oldRef, newRef);
168 updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
172 return Either.left(newRef);
174 return Either.right(ActionStatus.EXT_REF_NOT_FOUND);
178 public Either<Map<String, List<String>>, ActionStatus> getExternalReferences(String assetUuid, String objectType) {
180 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
181 if (vertexById.isRight()) {
182 return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
184 GraphVertex serviceVertex = vertexById.left().value();
185 Map<String, List<String>> result = new HashMap();
186 //Get the external references map vertex
187 final Either<GraphVertex, JanusGraphOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
188 //Check whether data vertex found
189 GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
190 if (externalRefsVertex != null) {
191 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex
193 if (externalReferencesFullData != null) {
194 externalReferencesFullData.entrySet().forEach(s -> {
195 List<String> externalRefsByObjectType = externalReferencesFullData.get(s.getKey()).getExternalRefsByObjectType(objectType);
196 List<String> refList = externalRefsByObjectType == null ? new ArrayList<>() : externalRefsByObjectType;
197 String key = idMapper.mapUniqueIdToComponentNameTo(s.getKey(), serviceVertex);
198 result.put(key, refList);
200 return Either.left(result);
203 //No external References Node found on this asset
204 return Either.left(new HashMap<>());
207 public void addAllExternalReferences(String containerUniqueId, String compInstanceUniqueId,
208 Map<String, List<String>> instanceExternalReferences) {
209 GraphVertex serviceVertex = janusGraphDao.getVertexById(containerUniqueId).left().on(operationUtils::onJanusGraphOperationFailure);
210 Either<GraphVertex, JanusGraphOperationStatus> dataVertex = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
211 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData;
212 if (dataVertex.isLeft()) {
213 externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) dataVertex.left().value().getJson();
215 externalReferencesFullData = new HashMap<>();
217 externalReferencesFullData.put(compInstanceUniqueId, new MapComponentInstanceExternalRefs(instanceExternalReferences));
218 updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
221 public Map<String, List<String>> getAllExternalReferences(String containerUniqueId, String compInstanceUniqueId) {
222 GraphVertex serviceVertex = janusGraphDao.getVertexById(containerUniqueId).left().on(operationUtils::onJanusGraphOperationFailure);
223 Either<GraphVertex, JanusGraphOperationStatus> dataVertex = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
224 if (dataVertex.isRight()) {
225 return new HashMap<>();
227 GraphVertex externalRefsVertex = dataVertex.left().value();
228 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData =
229 externalRefsVertex == null ? null : (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
230 if (externalReferencesFullData != null) {
231 return externalReferencesFullData.getOrDefault(compInstanceUniqueId, new MapComponentInstanceExternalRefs())
232 .getComponentInstanceExternalRefs();
237 public Either<List<String>, ActionStatus> getExternalReferences(String assetUuid, String componentInstanceName, String objectType) {
239 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
240 if (vertexById.isRight()) {
241 return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
243 GraphVertex serviceVertex = vertexById.left().value();
244 final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
245 if (compInstanceUniqueId == null) {
246 return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
248 //Get the external references map vertex
249 final Either<GraphVertex, JanusGraphOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
250 //Check whether data vertex found
251 GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
252 if (externalRefsVertex != null) {
253 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex
255 if (externalReferencesFullData != null) {
256 return Either.left(getExternalReferencesByObjectId(externalReferencesFullData, compInstanceUniqueId, objectType));
259 //No external References Node found on this asset
260 return Either.left(new LinkedList());
263 public IdMapper getIdMapper() {
267 public void setIdMapper(IdMapper idMapper) {
268 this.idMapper = idMapper;
271 private List<String> getExternalReferencesByObjectId(Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData,
272 String componentInstanceId, String objectType) {
273 MapComponentInstanceExternalRefs externalRefsMap = externalReferencesFullData.get(componentInstanceId);
274 List<String> externalRefsByObjectType = externalRefsMap.getExternalRefsByObjectType(objectType);
275 return externalRefsByObjectType != null ? externalRefsByObjectType : new LinkedList<>();
278 private boolean updateExternalRef(Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData, String componentInstanceId,
279 String objectType, String oldRef, String newRef) {
280 MapComponentInstanceExternalRefs externalRefsMap = externalReferencesFullData.get(componentInstanceId);
281 return externalRefsMap.replaceExternalRef(objectType, oldRef, newRef);
284 private boolean deleteExternalRef(Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData, String componentInstanceId,
285 String objectType, String reference) {
286 MapComponentInstanceExternalRefs externalRefsMap = externalReferencesFullData.get(componentInstanceId);
287 return externalRefsMap.deleteExternalRef(objectType, reference);
290 private boolean addExternalRef(Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData, String componentInstanceId,
291 String objectType, String reference) {
292 MapComponentInstanceExternalRefs externalRefsMap = externalReferencesFullData.get(componentInstanceId);
293 return externalRefsMap.addExternalRef(objectType, reference);