2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
20 package org.openecomp.sdc.asdctool.impl.internal.tool;
22 import java.io.IOException;
23 import java.util.EnumMap;
24 import java.util.HashMap;
25 import java.util.List;
27 import java.util.Optional;
28 import java.util.Scanner;
29 import java.util.function.Supplier;
30 import java.util.stream.Collectors;
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;
56 @org.springframework.stereotype.Component("csarGenerator")
57 public class CsarGenerator extends CommonInternalTool {
58 public CsarGenerator() {
63 private JanusGraphDao janusGraphDao;
65 private CsarUtils csarUtils;
67 private ToscaOperationFacade toscaOperationFacade;
69 private ArtifactCassandraDao artifactCassandraDao;
71 private ToscaExportHandler toscaExportHandler;
74 private static Logger log = Logger.getLogger(CsarGenerator.class.getName());
76 public void generateCsar(String uuid, Scanner scanner) {
77 JanusGraphOperationStatus status = JanusGraphOperationStatus.OK;
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());
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);
91 GraphVertex metadataV = byCriterria.get(0);
93 printComponentInfo(metadataV.getMetadataProperties());
94 ConsoleWriter.dataLine("\nGenerate CSAR (yes/no)?");
95 String input = scanner.nextLine();
96 if (input.equalsIgnoreCase("yes")) {
98 status = handleService(metadataV, uuid);
102 ConsoleWriter.dataLine("No certified service with UUID", uuid);
104 if (status == JanusGraphOperationStatus.OK) {
105 janusGraphDao.commit();
107 janusGraphDao.rollback();
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) {
116 Supplier<byte[]> supplier = () -> generateToscaPayload(component);
117 generateArtifact(component, ArtifactTypeEnum.TOSCA_TEMPLATE, supplier);
119 supplier = () -> generateCsarPayload(component);
120 generateArtifact(component, ArtifactTypeEnum.TOSCA_CSAR, supplier);
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);
131 ConsoleWriter.dataLine("Failed to fetch certified service with UUID", uuid);
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();
143 status = savePayload(component, csarArtifact, supplier);
148 private byte[] generateCsarPayload(org.openecomp.sdc.be.model.Component component) {
149 return csarUtils.createCsar(component, true, true).either( l -> l, r -> null);
151 private byte[] generateToscaPayload(Component component){
152 return toscaExportHandler.exportComponent(component).either(l -> l.getMainYaml().getBytes(), r -> null);
155 private JanusGraphOperationStatus savePayload(org.openecomp.sdc.be.model.Component component, ArtifactDefinition csarArtifact, Supplier<byte[]> supplier) {
156 byte[] payload = supplier.get();
158 if ( payload == null ) {
159 ConsoleWriter.dataLine("create artifact failed ", csarArtifact.getArtifactLabel());
160 return JanusGraphOperationStatus.GENERAL_ERROR;
162 ConsoleWriter.dataLine("createartifact success ", csarArtifact.getArtifactLabel());
163 csarArtifact.setPayload(payload);
164 byte[] decodedPayload = csarArtifact.getPayloadData();
166 String uniqueId = UniqueIdBuilder.buildPropertyUniqueId(component.getUniqueId(), csarArtifact.getArtifactLabel());
167 csarArtifact.setUniqueId(uniqueId);
168 csarArtifact.setEsId(csarArtifact.getUniqueId());
170 ConsoleWriter.dataLine("create artifact unique id ", uniqueId);
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);
179 return JanusGraphOperationStatus.OK;
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());
197 getReportWriter().report(dataToPrint);
198 } catch (IOException e) {
199 ConsoleWriter.dataLine("\nFailed to created report file.");