824bb83ec99cf8cc87b556a4bd54fa19c6243590
[sdc.git] /
1 package org.openecomp.sdc.asdctool.impl.migration.v1707;
2
3 import java.util.EnumMap;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7 import java.util.Map.Entry;
8 import java.util.stream.Collectors;
9
10 import org.apache.commons.collections.MapUtils;
11 import org.openecomp.sdc.asdctool.impl.migration.Migration;
12 import org.openecomp.sdc.be.dao.cassandra.ArtifactCassandraDao;
13 import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
14 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
15 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
16 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
17 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
18 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
19 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
20 import org.openecomp.sdc.be.model.LifecycleStateEnum;
21 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
22 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
23 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
24 import org.openecomp.sdc.be.resources.data.ESArtifactData;
25 import org.openecomp.sdc.be.tosca.ToscaError;
26 import org.openecomp.sdc.be.tosca.ToscaExportHandler;
27 import org.openecomp.sdc.be.tosca.ToscaRepresentation;
28 import org.openecomp.sdc.common.util.GeneralUtility;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31 import org.springframework.beans.factory.annotation.Autowired;
32 import org.springframework.stereotype.Component;
33
34 import fj.data.Either;
35
36 @Component("toscaTemplateRegeneration")
37 public class ToscaTemplateRegeneration implements Migration {
38
39         private static Logger LOGGER = LoggerFactory.getLogger(ToscaTemplateRegeneration.class);
40         
41         @Autowired
42         protected ArtifactCassandraDao artifactCassandraDao;
43         
44         @Autowired
45         private ToscaExportHandler toscaExportUtils;
46
47         @Autowired
48     private ToscaOperationFacade toscaOperationFacade;
49     
50         @Override
51         public boolean migrate() {
52                 boolean result = true;
53                 Either<Map<GraphVertex, org.openecomp.sdc.be.model.Component>, StorageOperationStatus> getAllCertifiedComponentsRes;
54                 try{
55                         getAllCertifiedComponentsRes = getAllCertifiedComponents();
56                         if(getAllCertifiedComponentsRes.isRight()){
57                                 result = false;
58                         }
59                         if(result && MapUtils.isNotEmpty(getAllCertifiedComponentsRes.left().value())){
60                                 result = regenerateToscaTemplateArtifacts(getAllCertifiedComponentsRes.left().value());
61                         }
62                 } catch(Exception e){
63                         LOGGER.error("The exception {} has been occured upon tosca template regeneration migration. ", e);
64                         result = false;
65                 } finally {
66                         if(result){
67                                 toscaOperationFacade.commit();
68                         } else {
69                                 toscaOperationFacade.rollback();
70                         }
71                 }
72                 return result;
73         }
74
75         private boolean regenerateToscaTemplateArtifacts(Map<GraphVertex, org.openecomp.sdc.be.model.Component> components) {
76                 boolean result = true;
77                 
78                 Map<GraphVertex, org.openecomp.sdc.be.model.Component> filteredComponents = components.entrySet()
79                                 .stream()
80                                 .filter(e -> e.getValue().getToscaArtifacts()!=null && e.getValue().getToscaArtifacts().containsKey(ToscaExportHandler.ASSET_TOSCA_TEMPLATE))
81                                 .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));
82                 
83                 for(Entry<GraphVertex, org.openecomp.sdc.be.model.Component> currComponent : filteredComponents.entrySet()){
84                         result = regenerateToscaTemplateArtifact(currComponent);
85                         if(!result){
86                                 break;
87                         }
88                 }
89                 return result;
90         }
91         
92         @SuppressWarnings("unchecked")
93         private boolean regenerateToscaTemplateArtifact(Map.Entry<GraphVertex, org.openecomp.sdc.be.model.Component> parent) {
94                 boolean result = true;
95                 Either<GraphVertex, TitanOperationStatus> toscaDataVertexRes = null;
96                 ArtifactDataDefinition data = null;
97                 LOGGER.debug("tosca artifact generation");
98                 Either<ToscaRepresentation, ToscaError> exportComponent = toscaExportUtils.exportComponent(parent.getValue());
99                 if (exportComponent.isRight()) {
100                         LOGGER.debug("Failed export tosca yaml for component {} error {}", parent.getValue().getUniqueId(), exportComponent.right().value());
101                         result = false;
102                 }
103                 if(result){
104                         LOGGER.debug("Tosca yaml exported for component {} ", parent.getValue().getUniqueId());
105                         toscaDataVertexRes = toscaOperationFacade.getTitanDao().getChildVertex(parent.getKey(), EdgeLabelEnum.TOSCA_ARTIFACTS, JsonParseFlagEnum.ParseJson);
106                         if(toscaDataVertexRes.isRight()){
107                                 LOGGER.debug("Failed to fetch tosca data vertex {} for component {}. Status is {}", EdgeLabelEnum.TOSCA_ARTIFACTS, parent.getValue().getUniqueId(), exportComponent.right().value());
108                                 result = false;
109                         }
110                 }
111                 if(result){
112                         data = parent.getValue().getToscaArtifacts().get(ToscaExportHandler.ASSET_TOSCA_TEMPLATE);
113                         data.setArtifactChecksum(GeneralUtility.calculateMD5ByByteArray(exportComponent.left().value().getMainYaml().getBytes()));
114                         
115                         ((Map<String, ArtifactDataDefinition>) toscaDataVertexRes.left().value().getJson()).put(ToscaExportHandler.ASSET_TOSCA_TEMPLATE, data);
116                         
117                         Either<GraphVertex, TitanOperationStatus>  updateVertexRes = toscaOperationFacade.getTitanDao().updateVertex(toscaDataVertexRes.left().value());
118                         if(updateVertexRes.isRight()){
119                                 result = false;
120                         }
121                 }
122                 if(result){
123                         ESArtifactData artifactData = new ESArtifactData(data.getEsId(), exportComponent.left().value().getMainYaml().getBytes());
124                         CassandraOperationStatus status = artifactCassandraDao.saveArtifact(artifactData);
125                         if(status != CassandraOperationStatus.OK){
126                                 result = false;
127                         }
128                 }
129                 return result;
130         }
131
132         public Either<Map<GraphVertex, org.openecomp.sdc.be.model.Component>, StorageOperationStatus> getAllCertifiedComponents() {
133
134                 Map<GraphVertex, org.openecomp.sdc.be.model.Component> components = new HashMap<>();
135                 Map<GraphPropertyEnum, Object> propertiesToMatch = new EnumMap<>(GraphPropertyEnum.class);
136                 propertiesToMatch.put(GraphPropertyEnum.STATE, LifecycleStateEnum.CERTIFIED.name());
137                 Either<List<GraphVertex>, TitanOperationStatus> getVerticiesRes = toscaOperationFacade.getTitanDao().getByCriteria(null, propertiesToMatch,JsonParseFlagEnum.ParseAll);
138
139                 if (getVerticiesRes.isRight() && getVerticiesRes.right().value() != TitanOperationStatus.NOT_FOUND) {
140                         LOGGER.debug("Failed to fetch all certified components. Status is {}", getVerticiesRes.right().value());
141                         return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getVerticiesRes.right().value()));
142                 }
143                 if(getVerticiesRes.isLeft()){
144                         List<GraphVertex> componentVerticies = getVerticiesRes.left().value();
145                         for (GraphVertex componentV : componentVerticies) {
146                                 Either<org.openecomp.sdc.be.model.Component, StorageOperationStatus> getComponentsRes = toscaOperationFacade.getToscaElement(componentV);
147                                 if (getComponentsRes.isRight()) {
148                                         return Either.right(getComponentsRes.right().value());
149                                 }
150                                 components.put(componentV, getComponentsRes.left().value());
151                         }
152                 }
153                 return Either.left(components);
154         }
155         
156         @Override
157         public String description() {
158                 return "toscaTemplateRegeneration";
159         }
160 }