1 package org.openecomp.sdc.asdctool.impl.migration.v1707;
3 import java.util.EnumMap;
4 import java.util.HashMap;
7 import java.util.Map.Entry;
8 import java.util.stream.Collectors;
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;
34 import fj.data.Either;
36 @Component("toscaTemplateRegeneration")
37 public class ToscaTemplateRegeneration implements Migration {
39 private static Logger LOGGER = LoggerFactory.getLogger(ToscaTemplateRegeneration.class);
42 protected ArtifactCassandraDao artifactCassandraDao;
45 private ToscaExportHandler toscaExportUtils;
48 private ToscaOperationFacade toscaOperationFacade;
51 public boolean migrate() {
52 boolean result = true;
53 Either<Map<GraphVertex, org.openecomp.sdc.be.model.Component>, StorageOperationStatus> getAllCertifiedComponentsRes;
55 getAllCertifiedComponentsRes = getAllCertifiedComponents();
56 if(getAllCertifiedComponentsRes.isRight()){
59 if(result && MapUtils.isNotEmpty(getAllCertifiedComponentsRes.left().value())){
60 result = regenerateToscaTemplateArtifacts(getAllCertifiedComponentsRes.left().value());
63 LOGGER.error("The exception {} has been occured upon tosca template regeneration migration. ", e);
67 toscaOperationFacade.commit();
69 toscaOperationFacade.rollback();
75 private boolean regenerateToscaTemplateArtifacts(Map<GraphVertex, org.openecomp.sdc.be.model.Component> components) {
76 boolean result = true;
78 Map<GraphVertex, org.openecomp.sdc.be.model.Component> filteredComponents = components.entrySet()
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()));
83 for(Entry<GraphVertex, org.openecomp.sdc.be.model.Component> currComponent : filteredComponents.entrySet()){
84 result = regenerateToscaTemplateArtifact(currComponent);
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());
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());
112 data = parent.getValue().getToscaArtifacts().get(ToscaExportHandler.ASSET_TOSCA_TEMPLATE);
113 data.setArtifactChecksum(GeneralUtility.calculateMD5ByByteArray(exportComponent.left().value().getMainYaml().getBytes()));
115 ((Map<String, ArtifactDataDefinition>) toscaDataVertexRes.left().value().getJson()).put(ToscaExportHandler.ASSET_TOSCA_TEMPLATE, data);
117 Either<GraphVertex, TitanOperationStatus> updateVertexRes = toscaOperationFacade.getTitanDao().updateVertex(toscaDataVertexRes.left().value());
118 if(updateVertexRes.isRight()){
123 ESArtifactData artifactData = new ESArtifactData(data.getEsId(), exportComponent.left().value().getMainYaml().getBytes());
124 CassandraOperationStatus status = artifactCassandraDao.saveArtifact(artifactData);
125 if(status != CassandraOperationStatus.OK){
132 public Either<Map<GraphVertex, org.openecomp.sdc.be.model.Component>, StorageOperationStatus> getAllCertifiedComponents() {
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);
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()));
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());
150 components.put(componentV, getComponentsRes.left().value());
153 return Either.left(components);
157 public String description() {
158 return "toscaTemplateRegeneration";