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