1 package org.openecomp.sdc.be.model.jsontitan.operations;
5 import org.openecomp.sdc.be.dao.api.ActionStatus;
6 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
7 import org.openecomp.sdc.be.dao.jsongraph.TitanDao;
8 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
9 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
10 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
11 import org.openecomp.sdc.be.datatypes.elements.MapComponentInstanceExternalRefs;
12 import org.openecomp.sdc.be.model.jsontitan.utils.IdMapper;
13 import org.openecomp.sdc.be.model.operations.impl.OperationUtils;
14 import org.springframework.beans.factory.annotation.Autowired;
15 import org.springframework.stereotype.Component;
19 import static java.util.Collections.emptyMap;
22 * Created by yavivi on 26/01/2018.
25 public class ExternalReferencesOperation extends BaseOperation {
28 private IdMapper idMapper;
31 private OperationUtils operationUtils;
37 public ExternalReferencesOperation(TitanDao titanDao, NodeTypeOperation nto, TopologyTemplateOperation tto, IdMapper idMapper){
38 this.titanDao = titanDao;
39 this.topologyTemplateOperation = tto;
40 this.nodeTypeOperation = nto;
41 this.idMapper = idMapper;
44 public Either<String, ActionStatus> addExternalReferenceWithCommit(String serviceUuid, String componentInstanceName, String objectType, String reference) {
45 Either<String, ActionStatus> addResult = addExternalReference(serviceUuid, componentInstanceName, objectType, reference);
50 public Either<String, ActionStatus> deleteExternalReferenceWithCommit(String serviceUuid, String componentInstanceName, String objectType, String reference) {
51 Either<String, ActionStatus> result = deleteExternalReference(serviceUuid, componentInstanceName, objectType, reference);
56 public Either<String, ActionStatus> updateExternalReferenceWithCommit(String serviceVertexUuid, String componentInstanceName, String objectType, String oldRef, String newRef) {
57 Either<String, ActionStatus> updateResult = updateExternalReference(serviceVertexUuid, componentInstanceName, objectType, oldRef, newRef);
62 public Either<String, ActionStatus> addExternalReference(String assetUuid, String componentInstanceName, String objectType, String reference) {
64 //Get Container vertex
65 Either<GraphVertex, TitanOperationStatus> vertexById = titanDao.getVertexById(assetUuid);
66 if (vertexById.isRight()){
67 return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
70 GraphVertex serviceVertex = vertexById.left().value();
72 final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
73 if (compInstanceUniqueId == null) {
74 return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
77 //Get the external references map vertex
78 final Either<GraphVertex, TitanOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
80 //Check whether data vertex found
81 GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
83 //instanceId -> externalRefsMap
84 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData;
85 if (externalRefsVertex == null) {
86 //External Refs vertex does not exist, create its map.
87 externalReferencesFullData = new HashMap<>();
88 externalReferencesFullData.put(compInstanceUniqueId, new MapComponentInstanceExternalRefs());
90 externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
91 externalReferencesFullData.computeIfAbsent(compInstanceUniqueId, k -> new MapComponentInstanceExternalRefs());
94 boolean isAdded = addExternalRef(externalReferencesFullData, compInstanceUniqueId, objectType, reference);
95 updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
97 return isAdded ? Either.left(reference) : Either.right(ActionStatus.EXT_REF_ALREADY_EXIST);
100 public Either<String, ActionStatus> deleteExternalReference(String assetUuid, String componentInstanceName, String objectType, String reference){
102 Either<GraphVertex, TitanOperationStatus> vertexById = titanDao.getVertexById(assetUuid);
103 if (vertexById.isRight()){
104 return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
106 GraphVertex serviceVertex = vertexById.left().value();
108 final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
109 if (compInstanceUniqueId == null) {
110 return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
113 //Get the external references map vertex
114 final Either<GraphVertex, TitanOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
116 //Check whether data vertex found
117 GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
118 boolean refDeleted = false;
119 if (externalRefsVertex != null) {
120 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
121 if (externalReferencesFullData != null) {
122 refDeleted = deleteExternalRef(externalReferencesFullData, compInstanceUniqueId, objectType, reference);
123 updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
128 return Either.left(reference);
130 return Either.right(ActionStatus.EXT_REF_NOT_FOUND);
134 public Either<String, ActionStatus> updateExternalReference(String assetUuid, String componentInstanceName, String objectType, String oldRef, String newRef) {
136 Either<GraphVertex, TitanOperationStatus> vertexById = titanDao.getVertexById(assetUuid);
137 if (vertexById.isRight()){
138 return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
141 GraphVertex serviceVertex = vertexById.left().value();
143 //Map instance_name -> uuid
144 final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
145 if (compInstanceUniqueId == null) {
146 return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
149 //Get the external references map vertex
150 final Either<GraphVertex, TitanOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
152 //Check whether data vertex found
153 GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
154 boolean refReplaced = false;
155 if (externalRefsVertex != null) {
156 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
157 if (externalReferencesFullData != null) {
158 refReplaced = updateExternalRef(externalReferencesFullData, compInstanceUniqueId, objectType, oldRef, newRef);
159 updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
163 return Either.left(newRef);
165 return Either.right(ActionStatus.EXT_REF_NOT_FOUND);
169 public Either<Map<String, List<String>>, ActionStatus> getExternalReferences(String assetUuid, String objectType) {
171 Either<GraphVertex, TitanOperationStatus> vertexById = titanDao.getVertexById(assetUuid);
172 if (vertexById.isRight()){
173 return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
176 GraphVertex serviceVertex = vertexById.left().value();
178 Map<String, List<String>> result = new HashMap();
180 //Get the external references map vertex
181 final Either<GraphVertex, TitanOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
182 //Check whether data vertex found
183 GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
184 if (externalRefsVertex != null) {
185 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
186 if (externalReferencesFullData != null) {
187 externalReferencesFullData.entrySet().forEach(
189 List<String> externalRefsByObjectType = externalReferencesFullData.get(s.getKey()).getExternalRefsByObjectType(objectType);
190 List<String> refList = externalRefsByObjectType == null ? new ArrayList<>() : externalRefsByObjectType;
191 String key = idMapper.mapUniqueIdToComponentNameTo(s.getKey(), serviceVertex);
192 result.put(key, refList);
195 return Either.left(result);
198 //No external References Node found on this asset
199 return Either.left(new HashMap<>());
202 public void addAllExternalReferences(String containerUniqueId,
203 String compInstanceUniqueId,
204 Map<String, List<String>> instanceExternalReferences) {
206 GraphVertex serviceVertex = titanDao.getVertexById(containerUniqueId)
208 .on(operationUtils::onTitanOperationFailure);
209 Either<GraphVertex, TitanOperationStatus> dataVertex = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
210 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData;
211 if (dataVertex.isLeft()) {
212 externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) dataVertex.left().value().getJson();
214 externalReferencesFullData = new HashMap<>();
216 externalReferencesFullData.put(compInstanceUniqueId, new MapComponentInstanceExternalRefs(instanceExternalReferences));
217 updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
220 public Map<String, List<String>> getAllExternalReferences(String containerUniqueId,
221 String compInstanceUniqueId) {
222 GraphVertex serviceVertex = titanDao.getVertexById(containerUniqueId)
224 .on(operationUtils::onTitanOperationFailure);
226 Either<GraphVertex, TitanOperationStatus> dataVertex = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
227 if (dataVertex.isRight()) {
228 return new HashMap<>();
230 GraphVertex externalRefsVertex = dataVertex.left().value();
231 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = externalRefsVertex == null ? null : (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
232 if (externalReferencesFullData != null) {
233 return externalReferencesFullData
234 .getOrDefault(compInstanceUniqueId, new MapComponentInstanceExternalRefs())
235 .getComponentInstanceExternalRefs();
240 public Either<List<String>, ActionStatus> getExternalReferences(String assetUuid, String componentInstanceName, String objectType) {
242 Either<GraphVertex, TitanOperationStatus> vertexById = titanDao.getVertexById(assetUuid);
243 if (vertexById.isRight()){
244 return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
247 GraphVertex serviceVertex = vertexById.left().value();
248 final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
249 if (compInstanceUniqueId == null) {
250 return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
253 //Get the external references map vertex
254 final Either<GraphVertex, TitanOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
256 //Check whether data vertex found
257 GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
258 if (externalRefsVertex != null) {
259 Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
260 if (externalReferencesFullData != null) {
261 return Either.left(getExternalReferencesByObjectId(externalReferencesFullData, compInstanceUniqueId, objectType));
265 //No external References Node found on this asset
266 return Either.left(new LinkedList());
269 public IdMapper getIdMapper() {
273 public void setIdMapper(IdMapper idMapper) {
274 this.idMapper = idMapper;
277 private List<String> getExternalReferencesByObjectId(Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData, String componentInstanceId, String objectType) {
278 MapComponentInstanceExternalRefs externalRefsMap = externalReferencesFullData.get(componentInstanceId);
279 List<String> externalRefsByObjectType = externalRefsMap.getExternalRefsByObjectType(objectType);
280 return externalRefsByObjectType != null ? externalRefsByObjectType : new LinkedList<>();
283 private boolean updateExternalRef(Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData, String componentInstanceId, String objectType, String oldRef, String newRef) {
284 MapComponentInstanceExternalRefs externalRefsMap = externalReferencesFullData.get(componentInstanceId);
285 return externalRefsMap.replaceExternalRef(objectType, oldRef, newRef);
288 private boolean deleteExternalRef(Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData, String componentInstanceId, String objectType, String reference) {
289 MapComponentInstanceExternalRefs externalRefsMap = externalReferencesFullData.get(componentInstanceId);
290 return externalRefsMap.deleteExternalRef(objectType, reference);
293 private boolean addExternalRef(Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData, String componentInstanceId, String objectType, String reference) {
294 MapComponentInstanceExternalRefs externalRefsMap = externalReferencesFullData.get(componentInstanceId);
295 return externalRefsMap.addExternalRef(objectType, reference);