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