Catalog alignment
[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
21 package org.openecomp.sdc.be.model.jsonjanusgraph.operations;
22
23
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;
36
37 import java.util.ArrayList;
38 import java.util.HashMap;
39 import java.util.LinkedList;
40 import java.util.List;
41 import java.util.Map;
42
43 import static java.util.Collections.emptyMap;
44
45 /**
46  * Created by yavivi on 26/01/2018.
47  */
48 @Component
49 public class ExternalReferencesOperation extends BaseOperation {
50
51     @Autowired
52     private IdMapper idMapper;
53
54     @Autowired
55     private OperationUtils operationUtils;
56
57
58     /**
59      * Constructor
60      */
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;
66     }
67
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();
71         return addResult;
72     }
73
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();
77         return result;
78     }
79
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();
83         return updateResult;
84     }
85
86     public Either<String, ActionStatus> addExternalReference(String assetUuid, String componentInstanceName, String objectType, String reference) {
87
88         //Get Container vertex
89         Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
90         if (vertexById.isRight()){
91             return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
92         }
93
94         GraphVertex serviceVertex = vertexById.left().value();
95
96         final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
97         if (compInstanceUniqueId == null) {
98             return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
99         }
100
101         //Get the external references map vertex
102         final Either<GraphVertex, JanusGraphOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
103
104         //Check whether data vertex found
105         GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
106
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());
113         } else {
114             externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
115             externalReferencesFullData.computeIfAbsent(compInstanceUniqueId, k -> new MapComponentInstanceExternalRefs());
116         }
117
118         boolean isAdded = addExternalRef(externalReferencesFullData, compInstanceUniqueId, objectType, reference);
119         updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
120
121         return isAdded ? Either.left(reference) : Either.right(ActionStatus.EXT_REF_ALREADY_EXIST);
122     }
123
124     public Either<String, ActionStatus> deleteExternalReference(String assetUuid, String componentInstanceName, String objectType, String reference){
125         //Get Service vertex
126         Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
127         if (vertexById.isRight()){
128             return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
129         }
130         GraphVertex serviceVertex = vertexById.left().value();
131
132         final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
133         if (compInstanceUniqueId == null) {
134             return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
135         }
136
137         //Get the external references map vertex
138         final Either<GraphVertex, JanusGraphOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
139
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);
148             }
149         }
150
151         if (refDeleted) {
152             return Either.left(reference);
153         } else {
154             return Either.right(ActionStatus.EXT_REF_NOT_FOUND);
155         }
156     }
157
158     public Either<String, ActionStatus> updateExternalReference(String assetUuid, String componentInstanceName, String objectType, String oldRef, String newRef) {
159         //Get Service vertex
160         Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
161         if (vertexById.isRight()){
162             return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
163         }
164
165         GraphVertex serviceVertex = vertexById.left().value();
166
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);
171         }
172
173         //Get the external references map vertex
174         final Either<GraphVertex, JanusGraphOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
175
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);
184             }
185         }
186         if (refReplaced) {
187             return Either.left(newRef);
188         } else {
189             return Either.right(ActionStatus.EXT_REF_NOT_FOUND);
190         }
191     }
192
193     public Either<Map<String, List<String>>, ActionStatus> getExternalReferences(String assetUuid, String objectType) {
194         //Get Service vertex
195         Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
196         if (vertexById.isRight()){
197             return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
198         }
199
200         GraphVertex serviceVertex = vertexById.left().value();
201
202         Map<String, List<String>> result = new HashMap();
203
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(
212                         s -> {
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);
217                         }
218                 );
219                 return Either.left(result);
220             }
221         }
222         //No external References Node found on this asset
223         return Either.left(new HashMap<>());
224     }
225
226     public void addAllExternalReferences(String containerUniqueId,
227                                          String compInstanceUniqueId,
228                                          Map<String, List<String>> instanceExternalReferences) {
229
230         GraphVertex serviceVertex = janusGraphDao.getVertexById(containerUniqueId)
231                 .left()
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();
237         } else {
238             externalReferencesFullData = new HashMap<>();
239         }
240         externalReferencesFullData.put(compInstanceUniqueId, new MapComponentInstanceExternalRefs(instanceExternalReferences));
241         updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
242     }
243
244     public Map<String, List<String>> getAllExternalReferences(String containerUniqueId,
245                                                               String compInstanceUniqueId) {
246         GraphVertex serviceVertex = janusGraphDao.getVertexById(containerUniqueId)
247             .left()
248             .on(operationUtils::onJanusGraphOperationFailure);
249
250         Either<GraphVertex, JanusGraphOperationStatus> dataVertex = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
251         if (dataVertex.isRight()) {
252             return new HashMap<>();
253         }
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();
260         }
261         return emptyMap();
262     }
263
264     public Either<List<String>, ActionStatus> getExternalReferences(String assetUuid, String componentInstanceName, String objectType) {
265         //Get Service vertex
266         Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(assetUuid);
267         if (vertexById.isRight()){
268             return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
269         }
270
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);
275         }
276
277         //Get the external references map vertex
278         final Either<GraphVertex, JanusGraphOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
279
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));
286             }
287         }
288
289         //No external References Node found on this asset
290         return Either.left(new LinkedList());
291     }
292
293     public IdMapper getIdMapper() {
294         return idMapper;
295     }
296
297     public void setIdMapper(IdMapper idMapper) {
298         this.idMapper = idMapper;
299     }
300
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<>();
305     }
306
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);
310     }
311
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);
315     }
316
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);
320     }
321 }