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=========================================================
21 package org.openecomp.sdc.be.model.jsonjanusgraph.operations;
24 import fj.data.Either;
25 import org.openecomp.sdc.be.dao.api.ActionStatus;
26 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
27 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
28 import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
29 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
30 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
31 import org.openecomp.sdc.be.datatypes.elements.MapComponentInstanceExternalRefs;
32 import org.openecomp.sdc.be.model.jsonjanusgraph.utils.IdMapper;
33 import org.openecomp.sdc.be.model.operations.impl.OperationUtils;
34 import org.springframework.beans.factory.annotation.Autowired;
35 import org.springframework.stereotype.Component;
37 import java.util.ArrayList;
38 import java.util.HashMap;
39 import java.util.LinkedList;
40 import java.util.List;
43 import static java.util.Collections.emptyMap;
46 * Created by yavivi on 26/01/2018.
49 public class ExternalReferencesOperation extends BaseOperation {
52 private IdMapper idMapper;
55 private OperationUtils operationUtils;
61 public ExternalReferencesOperation(JanusGraphDao janusGraphDao, NodeTypeOperation nto, TopologyTemplateOperation tto, IdMapper idMapper){
62 this.janusGraphDao = janusGraphDao;
63 this.topologyTemplateOperation = tto;
64 this.nodeTypeOperation = nto;
65 this.idMapper = idMapper;
68 public Either<String, ActionStatus> addExternalReferenceWithCommit(String serviceUuid, String componentInstanceName, String objectType, String reference) {
69 Either<String, ActionStatus> addResult = addExternalReference(serviceUuid, componentInstanceName, objectType, reference);
70 janusGraphDao.commit();
74 public Either<String, ActionStatus> deleteExternalReferenceWithCommit(String serviceUuid, String componentInstanceName, String objectType, String reference) {
75 Either<String, ActionStatus> result = deleteExternalReference(serviceUuid, componentInstanceName, objectType, reference);
76 janusGraphDao.commit();
80 public Either<String, ActionStatus> updateExternalReferenceWithCommit(String serviceVertexUuid, String componentInstanceName, String objectType, String oldRef, String newRef) {
81 Either<String, ActionStatus> updateResult = updateExternalReference(serviceVertexUuid, componentInstanceName, objectType, oldRef, newRef);
82 janusGraphDao.commit();
86 public Either<String, ActionStatus> addExternalReference(String assetUuid, String componentInstanceName, String objectType, String reference) {
88 //Get Container vertex
89 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
90 if (vertexById.isRight()){
91 return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
94 GraphVertex serviceVertex = vertexById.left().value();
96 final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
97 if (compInstanceUniqueId == null) {
98 return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
101 //Get the external references map vertex
102 final Either<GraphVertex, JanusGraphOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
104 //Check whether data vertex found
105 GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
107 //instanceId -> externalRefsMap
108 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData;
109 if (externalRefsVertex == null) {
110 //External Refs vertex does not exist, create its map.
111 externalReferencesFullData = new HashMap<>();
112 externalReferencesFullData.put(compInstanceUniqueId, new MapComponentInstanceExternalRefs());
114 externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
115 externalReferencesFullData.computeIfAbsent(compInstanceUniqueId, k -> new MapComponentInstanceExternalRefs());
118 boolean isAdded = addExternalRef(externalReferencesFullData, compInstanceUniqueId, objectType, reference);
119 updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
121 return isAdded ? Either.left(reference) : Either.right(ActionStatus.EXT_REF_ALREADY_EXIST);
124 public Either<String, ActionStatus> deleteExternalReference(String assetUuid, String componentInstanceName, String objectType, String reference){
126 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
127 if (vertexById.isRight()){
128 return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
130 GraphVertex serviceVertex = vertexById.left().value();
132 final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
133 if (compInstanceUniqueId == null) {
134 return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
137 //Get the external references map vertex
138 final Either<GraphVertex, JanusGraphOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
140 //Check whether data vertex found
141 GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
142 boolean refDeleted = false;
143 if (externalRefsVertex != null) {
144 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
145 if (externalReferencesFullData != null) {
146 refDeleted = deleteExternalRef(externalReferencesFullData, compInstanceUniqueId, objectType, reference);
147 updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
152 return Either.left(reference);
154 return Either.right(ActionStatus.EXT_REF_NOT_FOUND);
158 public Either<String, ActionStatus> updateExternalReference(String assetUuid, String componentInstanceName, String objectType, String oldRef, String newRef) {
160 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
161 if (vertexById.isRight()){
162 return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
165 GraphVertex serviceVertex = vertexById.left().value();
167 //Map instance_name -> uuid
168 final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
169 if (compInstanceUniqueId == null) {
170 return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
173 //Get the external references map vertex
174 final Either<GraphVertex, JanusGraphOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
176 //Check whether data vertex found
177 GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
178 boolean refReplaced = false;
179 if (externalRefsVertex != null) {
180 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
181 if (externalReferencesFullData != null) {
182 refReplaced = updateExternalRef(externalReferencesFullData, compInstanceUniqueId, objectType, oldRef, newRef);
183 updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
187 return Either.left(newRef);
189 return Either.right(ActionStatus.EXT_REF_NOT_FOUND);
193 public Either<Map<String, List<String>>, ActionStatus> getExternalReferences(String assetUuid, String objectType) {
195 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
196 if (vertexById.isRight()){
197 return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
200 GraphVertex serviceVertex = vertexById.left().value();
202 Map<String, List<String>> result = new HashMap();
204 //Get the external references map vertex
205 final Either<GraphVertex, JanusGraphOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
206 //Check whether data vertex found
207 GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
208 if (externalRefsVertex != null) {
209 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
210 if (externalReferencesFullData != null) {
211 externalReferencesFullData.entrySet().forEach(
213 List<String> externalRefsByObjectType = externalReferencesFullData.get(s.getKey()).getExternalRefsByObjectType(objectType);
214 List<String> refList = externalRefsByObjectType == null ? new ArrayList<>() : externalRefsByObjectType;
215 String key = idMapper.mapUniqueIdToComponentNameTo(s.getKey(), serviceVertex);
216 result.put(key, refList);
219 return Either.left(result);
222 //No external References Node found on this asset
223 return Either.left(new HashMap<>());
226 public void addAllExternalReferences(String containerUniqueId,
227 String compInstanceUniqueId,
228 Map<String, List<String>> instanceExternalReferences) {
230 GraphVertex serviceVertex = janusGraphDao.getVertexById(containerUniqueId)
232 .on(operationUtils::onJanusGraphOperationFailure);
233 Either<GraphVertex, JanusGraphOperationStatus> dataVertex = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
234 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData;
235 if (dataVertex.isLeft()) {
236 externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) dataVertex.left().value().getJson();
238 externalReferencesFullData = new HashMap<>();
240 externalReferencesFullData.put(compInstanceUniqueId, new MapComponentInstanceExternalRefs(instanceExternalReferences));
241 updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
244 public Map<String, List<String>> getAllExternalReferences(String containerUniqueId,
245 String compInstanceUniqueId) {
246 GraphVertex serviceVertex = janusGraphDao.getVertexById(containerUniqueId)
248 .on(operationUtils::onJanusGraphOperationFailure);
250 Either<GraphVertex, JanusGraphOperationStatus> dataVertex = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
251 if (dataVertex.isRight()) {
252 return new HashMap<>();
254 GraphVertex externalRefsVertex = dataVertex.left().value();
255 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = externalRefsVertex == null ? null : (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
256 if (externalReferencesFullData != null) {
257 return externalReferencesFullData
258 .getOrDefault(compInstanceUniqueId, new MapComponentInstanceExternalRefs())
259 .getComponentInstanceExternalRefs();
264 public Either<List<String>, ActionStatus> getExternalReferences(String assetUuid, String componentInstanceName, String objectType) {
266 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
267 if (vertexById.isRight()){
268 return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
271 GraphVertex serviceVertex = vertexById.left().value();
272 final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
273 if (compInstanceUniqueId == null) {
274 return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
277 //Get the external references map vertex
278 final Either<GraphVertex, JanusGraphOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
280 //Check whether data vertex found
281 GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
282 if (externalRefsVertex != null) {
283 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
284 if (externalReferencesFullData != null) {
285 return Either.left(getExternalReferencesByObjectId(externalReferencesFullData, compInstanceUniqueId, objectType));
289 //No external References Node found on this asset
290 return Either.left(new LinkedList());
293 public IdMapper getIdMapper() {
297 public void setIdMapper(IdMapper idMapper) {
298 this.idMapper = idMapper;
301 private List<String> getExternalReferencesByObjectId(Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData, String componentInstanceId, String objectType) {
302 MapComponentInstanceExternalRefs externalRefsMap = externalReferencesFullData.get(componentInstanceId);
303 List<String> externalRefsByObjectType = externalRefsMap.getExternalRefsByObjectType(objectType);
304 return externalRefsByObjectType != null ? externalRefsByObjectType : new LinkedList<>();
307 private boolean updateExternalRef(Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData, String componentInstanceId, String objectType, String oldRef, String newRef) {
308 MapComponentInstanceExternalRefs externalRefsMap = externalReferencesFullData.get(componentInstanceId);
309 return externalRefsMap.replaceExternalRef(objectType, oldRef, newRef);
312 private boolean deleteExternalRef(Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData, String componentInstanceId, String objectType, String reference) {
313 MapComponentInstanceExternalRefs externalRefsMap = externalReferencesFullData.get(componentInstanceId);
314 return externalRefsMap.deleteExternalRef(objectType, reference);
317 private boolean addExternalRef(Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData, String componentInstanceId, String objectType, String reference) {
318 MapComponentInstanceExternalRefs externalRefsMap = externalReferencesFullData.get(componentInstanceId);
319 return externalRefsMap.addExternalRef(objectType, reference);