re base code
[sdc.git] / asdctool / src / main / java / org / openecomp / sdc / asdctool / impl / internal / tool / CsarGenerator.java
1 package org.openecomp.sdc.asdctool.impl.internal.tool;
2
3 import java.io.IOException;
4 import java.util.EnumMap;
5 import java.util.HashMap;
6 import java.util.List;
7 import java.util.Map;
8 import java.util.Optional;
9 import java.util.Scanner;
10 import java.util.function.Supplier;
11 import java.util.stream.Collectors;
12
13 import org.openecomp.sdc.asdctool.utils.ConsoleWriter;
14 import org.openecomp.sdc.be.dao.cassandra.ArtifactCassandraDao;
15 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
16 import org.openecomp.sdc.be.dao.jsongraph.TitanDao;
17 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
18 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
19 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
20 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
21 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
22 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
23 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
24 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
25 import org.openecomp.sdc.be.model.ArtifactDefinition;
26 import org.openecomp.sdc.be.model.Component;
27 import org.openecomp.sdc.be.model.LifecycleStateEnum;
28 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
29 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
30 import org.openecomp.sdc.be.resources.data.ESArtifactData;
31 import org.openecomp.sdc.be.tosca.CsarUtils;
32 import org.openecomp.sdc.be.tosca.ToscaError;
33 import org.openecomp.sdc.be.tosca.ToscaExportHandler;
34 import org.openecomp.sdc.be.tosca.ToscaRepresentation;
35 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
36 import org.openecomp.sdc.common.log.wrappers.Logger;
37 import org.openecomp.sdc.common.util.GeneralUtility;
38 import org.openecomp.sdc.exception.ResponseFormat;
39 import org.springframework.beans.factory.annotation.Autowired;
40
41 import fj.data.Either;
42
43 @org.springframework.stereotype.Component("csarGenerator")
44 public class CsarGenerator extends CommonInternalTool {
45     public CsarGenerator() {
46         super("generate");
47     }
48
49     @Autowired
50     private TitanDao titanDao;
51     @Autowired
52     private CsarUtils csarUtils;
53     @Autowired
54     private ToscaOperationFacade toscaOperationFacade;
55     @Autowired
56     private ArtifactCassandraDao artifactCassandraDao;
57     @Autowired
58     private ToscaExportHandler toscaExportHandler;
59     
60
61     private static Logger log = Logger.getLogger(CsarGenerator.class.getName());
62
63     public void generateCsar(String uuid, Scanner scanner) {
64         TitanOperationStatus status = TitanOperationStatus.OK;
65
66         Map<GraphPropertyEnum, Object> props = new EnumMap<>(GraphPropertyEnum.class);
67         props.put(GraphPropertyEnum.UUID, uuid);
68         props.put(GraphPropertyEnum.STATE, LifecycleStateEnum.CERTIFIED.name());
69         props.put(GraphPropertyEnum.COMPONENT_TYPE, ComponentTypeEnum.SERVICE.name());
70
71         List<GraphVertex> byCriterria = titanDao.getByCriteria(VertexTypeEnum.TOPOLOGY_TEMPLATE, props).either(l -> l, r -> null);
72         if (byCriterria != null && !byCriterria.isEmpty()) {
73             if (byCriterria.size() > 1) {
74                 ConsoleWriter.dataLine("Warning ! More that 1 certified service with uuid", uuid);
75                 // TBD
76             } else {
77                 GraphVertex metadataV = byCriterria.get(0);
78
79                 printComponentInfo(metadataV.getMetadataProperties());
80                 ConsoleWriter.dataLine("\nGenerate CSAR (yes/no)?");
81                 String input = scanner.nextLine();
82                 if (input.equalsIgnoreCase("yes")) {
83                     
84                     status = handleService(metadataV, uuid);
85                 }
86             }
87         } else {
88             ConsoleWriter.dataLine("No certified service with UUID", uuid);
89         }
90         if (status == TitanOperationStatus.OK) {
91             titanDao.commit();
92         } else {
93             titanDao.rollback();
94         }
95     }
96
97     private TitanOperationStatus handleService(GraphVertex metadataV, String uuid) {
98         TitanOperationStatus status = TitanOperationStatus.OK;
99         org.openecomp.sdc.be.model.Component component = toscaOperationFacade.getToscaFullElement(metadataV.getUniqueId()).either(l -> l, r -> null);
100         if (component != null) {
101
102             Supplier<byte[]> supplier = () -> generateToscaPayload(component);
103             generateArtifact(component, ArtifactTypeEnum.TOSCA_TEMPLATE, supplier);
104             
105             supplier = () -> generateCsarPayload(component);
106             generateArtifact(component, ArtifactTypeEnum.TOSCA_CSAR, supplier);
107             
108             GraphVertex toscaArtifactV = titanDao.getChildVertex(metadataV, EdgeLabelEnum.TOSCA_ARTIFACTS, JsonParseFlagEnum.ParseJson).either(l->l, r->null);
109             if ( toscaArtifactV != null ){
110                 Map<String, ArtifactDataDefinition> copy = component.getToscaArtifacts().entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> new ArtifactDataDefinition(e.getValue())));
111                 toscaArtifactV.setJson(copy);
112                 titanDao.updateVertex(toscaArtifactV);
113             }
114            
115         } else {
116             ConsoleWriter.dataLine("Failed to fetch certified service with UUID", uuid);
117         }
118         return status;
119     }
120
121     private TitanOperationStatus generateArtifact(Component component, ArtifactTypeEnum artifactType, Supplier<byte[]> supplier){
122         TitanOperationStatus status = TitanOperationStatus.GENERAL_ERROR;
123         ArtifactDefinition csarArtifact = null;
124         Optional<ArtifactDefinition> op = component.getToscaArtifacts().values().stream().filter(p -> p.getArtifactType().equals(artifactType.getType())).findAny();
125         if (op.isPresent()) {
126             csarArtifact = op.get();
127               
128             status = savePayload(component, csarArtifact, supplier);
129         }
130         return status;
131     }
132     
133     private byte[] generateCsarPayload(org.openecomp.sdc.be.model.Component component) {
134         return csarUtils.createCsar(component, true, true).either( l -> l, r -> null);
135     }
136     private byte[] generateToscaPayload(Component component){
137        return toscaExportHandler.exportComponent(component).either(l -> l.getMainYaml().getBytes(), r -> null);
138     }
139
140     private TitanOperationStatus savePayload(org.openecomp.sdc.be.model.Component component, ArtifactDefinition csarArtifact, Supplier<byte[]> supplier) {
141         byte[] payload = supplier.get();
142
143         if ( payload == null ) {
144             ConsoleWriter.dataLine("create artifact failed ", csarArtifact.getArtifactLabel());
145             return TitanOperationStatus.GENERAL_ERROR;
146         }
147         ConsoleWriter.dataLine("createartifact  success ", csarArtifact.getArtifactLabel());
148         csarArtifact.setPayload(payload);
149         byte[] decodedPayload = csarArtifact.getPayloadData();
150
151         String uniqueId = UniqueIdBuilder.buildPropertyUniqueId(component.getUniqueId(), csarArtifact.getArtifactLabel());
152         csarArtifact.setUniqueId(uniqueId);
153         csarArtifact.setEsId(csarArtifact.getUniqueId());
154         
155         ConsoleWriter.dataLine("create artifact unique id ", uniqueId);
156         
157         
158         csarArtifact.setArtifactChecksum(GeneralUtility.calculateMD5Base64EncodedByByteArray(decodedPayload));
159         ESArtifactData artifactData = new ESArtifactData(csarArtifact.getEsId(), decodedPayload);
160         artifactCassandraDao.saveArtifact(artifactData);
161         ConsoleWriter.dataLine("Artifact generated and saved into Cassandra ", csarArtifact.getArtifactLabel());
162         report(component, csarArtifact);
163
164         return TitanOperationStatus.OK;
165     }
166
167     private void report(org.openecomp.sdc.be.model.Component component, ArtifactDefinition csarArtifact) {
168         Map<String, Object> dataToPrint = new HashMap<>();
169         dataToPrint.put("name", component.getName());
170         dataToPrint.put("type", component.getComponentType());
171         dataToPrint.put("version", component.getVersion());
172         dataToPrint.put("UUID", component.getUUID());
173         dataToPrint.put("state", component.getLifecycleState());
174         dataToPrint.put("archive", component.isArchived());
175         dataToPrint.put("id", component.getUniqueId());
176         dataToPrint.put("artifact name", csarArtifact.getArtifactLabel());
177         dataToPrint.put("artifact id", csarArtifact.getUniqueId());
178         dataToPrint.put("csar es id", csarArtifact.getEsId());
179         dataToPrint.put("artifact checksum", csarArtifact.getArtifactChecksum());
180
181         try {
182             getReportWriter().report(dataToPrint);
183         } catch (IOException e) {
184             ConsoleWriter.dataLine("\nFailed to created report file.");
185         }
186     }
187 }