Reformat catalog-model
[sdc.git] / catalog-model / src / main / java / org / openecomp / sdc / be / model / jsonjanusgraph / operations / ExternalReferencesOperation.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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=========================================================
19  */
20 package org.openecomp.sdc.be.model.jsonjanusgraph.operations;
21
22 import static java.util.Collections.emptyMap;
23
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;
29 import java.util.Map;
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.jsongraph.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;
41
42 /**
43  * Created by yavivi on 26/01/2018.
44  */
45 @Component
46 public class ExternalReferencesOperation extends BaseOperation {
47
48     @Autowired
49     private IdMapper idMapper;
50     @Autowired
51     private OperationUtils operationUtils;
52
53     /**
54      * Constructor
55      */
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;
61     }
62
63     public Either<String, ActionStatus> addExternalReferenceWithCommit(String serviceUuid, String componentInstanceName, String objectType,
64                                                                        String reference) {
65         Either<String, ActionStatus> addResult = addExternalReference(serviceUuid, componentInstanceName, objectType, reference);
66         janusGraphDao.commit();
67         return addResult;
68     }
69
70     public Either<String, ActionStatus> deleteExternalReferenceWithCommit(String serviceUuid, String componentInstanceName, String objectType,
71                                                                           String reference) {
72         Either<String, ActionStatus> result = deleteExternalReference(serviceUuid, componentInstanceName, objectType, reference);
73         janusGraphDao.commit();
74         return result;
75     }
76
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();
81         return updateResult;
82     }
83
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);
89         }
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);
94         }
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());
105         } else {
106             externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
107             externalReferencesFullData.computeIfAbsent(compInstanceUniqueId, k -> new MapComponentInstanceExternalRefs());
108         }
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);
112     }
113
114     public Either<String, ActionStatus> deleteExternalReference(String assetUuid, String componentInstanceName, String objectType, String reference) {
115         //Get Service vertex
116         Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
117         if (vertexById.isRight()) {
118             return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
119         }
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);
124         }
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
132                 .getJson();
133             if (externalReferencesFullData != null) {
134                 refDeleted = deleteExternalRef(externalReferencesFullData, compInstanceUniqueId, objectType, reference);
135                 updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
136             }
137         }
138         if (refDeleted) {
139             return Either.left(reference);
140         } else {
141             return Either.right(ActionStatus.EXT_REF_NOT_FOUND);
142         }
143     }
144
145     public Either<String, ActionStatus> updateExternalReference(String assetUuid, String componentInstanceName, String objectType, String oldRef,
146                                                                 String newRef) {
147         //Get Service vertex
148         Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
149         if (vertexById.isRight()) {
150             return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
151         }
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);
157         }
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
165                 .getJson();
166             if (externalReferencesFullData != null) {
167                 refReplaced = updateExternalRef(externalReferencesFullData, compInstanceUniqueId, objectType, oldRef, newRef);
168                 updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
169             }
170         }
171         if (refReplaced) {
172             return Either.left(newRef);
173         } else {
174             return Either.right(ActionStatus.EXT_REF_NOT_FOUND);
175         }
176     }
177
178     public Either<Map<String, List<String>>, ActionStatus> getExternalReferences(String assetUuid, String objectType) {
179         //Get Service vertex
180         Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
181         if (vertexById.isRight()) {
182             return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
183         }
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
192                 .getJson();
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);
199                 });
200                 return Either.left(result);
201             }
202         }
203         //No external References Node found on this asset
204         return Either.left(new HashMap<>());
205     }
206
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();
214         } else {
215             externalReferencesFullData = new HashMap<>();
216         }
217         externalReferencesFullData.put(compInstanceUniqueId, new MapComponentInstanceExternalRefs(instanceExternalReferences));
218         updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
219     }
220
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<>();
226         }
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();
233         }
234         return emptyMap();
235     }
236
237     public Either<List<String>, ActionStatus> getExternalReferences(String assetUuid, String componentInstanceName, String objectType) {
238         //Get Service vertex
239         Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
240         if (vertexById.isRight()) {
241             return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
242         }
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);
247         }
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
254                 .getJson();
255             if (externalReferencesFullData != null) {
256                 return Either.left(getExternalReferencesByObjectId(externalReferencesFullData, compInstanceUniqueId, objectType));
257             }
258         }
259         //No external References Node found on this asset
260         return Either.left(new LinkedList());
261     }
262
263     public IdMapper getIdMapper() {
264         return idMapper;
265     }
266
267     public void setIdMapper(IdMapper idMapper) {
268         this.idMapper = idMapper;
269     }
270
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<>();
276     }
277
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);
282     }
283
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);
288     }
289
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);
294     }
295 }