46a37273f40f1ec945520920487ecd496940dd6f
[appc.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP : APPC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Copyright (C) 2017 Amdocs
8  * =============================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  * 
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  * 
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * 
21  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22  * ============LICENSE_END=========================================================
23  */
24
25 package org.onap.appc.sdc.artifacts.impl;
26
27 import com.att.eelf.configuration.EELFLogger;
28 import com.att.eelf.configuration.EELFManager;
29 import com.fasterxml.jackson.databind.JsonNode;
30 import com.fasterxml.jackson.databind.ObjectMapper;
31 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
32 import org.apache.commons.lang.StringUtils;
33 import org.onap.appc.adapter.message.EventSender;
34 import org.onap.appc.exceptions.APPCException;
35 import org.onap.appc.sdc.artifacts.helper.DependencyModelGenerator;
36 import org.onap.appc.sdc.artifacts.object.Resource;
37 import org.onap.appc.sdc.artifacts.object.SDCArtifact;
38 import org.onap.appc.sdc.artifacts.object.SDCReference;
39 import org.openecomp.sdc.api.IDistributionClient;
40 import org.openecomp.sdc.api.notification.IArtifactInfo;
41 import org.openecomp.sdc.api.notification.INotificationData;
42 import org.openecomp.sdc.api.notification.IResourceInstance;
43 import org.openecomp.sdc.api.results.IDistributionClientDownloadResult;
44
45 import java.io.*;
46 import java.net.URI;
47 import java.util.*;
48 import java.util.zip.ZipEntry;
49 import java.util.zip.ZipInputStream;
50
51 public class ToscaCsarArtifactProcessor extends AbstractArtifactProcessor{
52
53     private final EELFLogger logger = EELFManager.getInstance().getLogger(ToscaCsarArtifactProcessor.class);
54
55     private DependencyModelGenerator dependencyModelGenerator;
56
57     public ToscaCsarArtifactProcessor(IDistributionClient client, EventSender eventSender, INotificationData notification, IResourceInstance resource,
58                                       IArtifactInfo artifact, URI storeUri){
59         super(client,eventSender,notification,resource,artifact,storeUri);
60         dependencyModelGenerator = new DependencyModelGenerator();
61     }
62
63     @Override
64     public void processArtifact(IDistributionClientDownloadResult download) throws APPCException {
65         logger.debug("processing artifact " + super.artifact.getArtifactType());
66         byte[] byteArray = download.getArtifactPayload();
67         String serviceFileName = "";
68         String serviceTemplateContent = "";
69         List<Resource> resources = null;
70         Map<String,String> csarFiles = new HashMap<>();
71         try (ZipInputStream inputStream = new ZipInputStream(new ByteArrayInputStream(byteArray))) {
72             ZipEntry entry = inputStream.getNextEntry();
73             logger.debug("First Entry = " +entry);
74             while(entry!= null){
75                 String filename = entry.getName();
76                 logger.debug("Next Entry = "+ filename);
77
78                 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
79                 String str = null;
80                 StringBuilder sb = new StringBuilder();
81                 while((str = bufferedReader.readLine()) != null){
82                     sb.append(new String(str)).append(System.getProperty("line.separator"));
83                 }
84                 csarFiles.put(filename,sb.toString());
85                 entry = inputStream.getNextEntry();
86             }
87
88         } catch (IOException e) {
89             logger.error("Error Reading TOSCA.meta from CSAR",e);
90             throw new APPCException(e);
91         }
92         serviceFileName = readServiceFileName(csarFiles.get("TOSCA-Metadata/TOSCA.meta"));
93         logger.debug("Service File Name = " + serviceFileName);
94         serviceTemplateContent = csarFiles.get(serviceFileName);
95
96         try {
97             resources = readResources (serviceTemplateContent);
98         } catch (Exception e) {
99             logger.error("Error reading resources from " + ", serviceFileName = " + serviceFileName
100                     + ", TOSCA Metadata = " + csarFiles.get("TOSCA-Metadata/TOSCA.meta"),e);
101             throw new APPCException(e);
102         }
103
104         for(Resource resource:resources){
105             String resourceTemplate = csarFiles.get("Definitions/resource-" + resource.getFileNameTag() + "-template.yml");
106             SDCArtifact artifact = this.getArtifactObject(resource,resourceTemplate);
107             processArtifact(artifact);
108         }
109     }
110
111     private String readServiceFileName(String toscaMetadata) {
112         toscaMetadata = toscaMetadata.substring(toscaMetadata.indexOf("Entry-Definitions"), toscaMetadata.indexOf(System.getProperty("line.separator"),toscaMetadata.indexOf("Entry-Definitions")));
113         toscaMetadata =toscaMetadata.split(":")[1].trim();
114         return toscaMetadata;
115     }
116
117     protected SDCArtifact getArtifactObject(Resource resource, String data){
118
119         SDCArtifact sdcArtifact = new SDCArtifact();
120
121         sdcArtifact.setArtifactUUID(this.artifact.getArtifactUUID());
122         sdcArtifact.setArtifactName(this.artifact.getArtifactName());
123         sdcArtifact.setArtifactType(this.artifact.getArtifactType());
124         sdcArtifact.setArtifactVersion(this.artifact.getArtifactVersion());
125         sdcArtifact.setArtifactDescription(this.artifact.getArtifactDescription());
126         sdcArtifact.setArtifactContent(data);
127         sdcArtifact.setCreationDate(super.getCurrentDateTime());
128
129         sdcArtifact.setDistributionId(this.notification.getDistributionID());
130         sdcArtifact.setServiceUUID(this.notification.getServiceUUID());
131         sdcArtifact.setServiceName(this.notification.getServiceName());
132         sdcArtifact.setServiceDescription(this.notification.getServiceDescription());
133
134         sdcArtifact.setResourceName(resource.getName());
135         sdcArtifact.setResourceType(resource.getType());
136         sdcArtifact.setResourceVersion(resource.getVersion());
137         sdcArtifact.setResourceUUID(resource.getUuid());
138         sdcArtifact.setResourceInstanceName(resource.getInstanceName());
139
140         return sdcArtifact;
141     }
142
143     private List<Resource> readResources(String serviceTemplateContent) throws IOException {
144         List<Resource> resources = new LinkedList<>();
145         ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
146         JsonNode root = mapper.readTree(serviceTemplateContent);
147         JsonNode topologyTemplate =  root.get("topology_template");
148         JsonNode nodeTemplates =  topologyTemplate.get("node_templates");
149         Iterator<Map.Entry<String, JsonNode>> itr = nodeTemplates.fields();
150         while(itr.hasNext()){
151             Map.Entry<String, JsonNode> entry = itr.next();
152             String instanceName = entry.getKey();
153             JsonNode nodeTemplate = entry.getValue();
154
155             String fileNameTag =  nodeTemplate.get("type").asText();
156             logger.debug("Resource type in Service Template = " + fileNameTag);
157             fileNameTag = fileNameTag.substring(fileNameTag.lastIndexOf(".")+1,fileNameTag.length());
158             String version = nodeTemplate.get("metadata").get("version").asText();
159             String uuid = nodeTemplate.get("metadata").get("UUID").asText();
160             String name = nodeTemplate.get("metadata").get("name").asText();
161             String type = nodeTemplate.get("metadata").get("type").asText();
162
163             if(!"VF".equalsIgnoreCase(type)){
164                 continue;
165             }
166
167             Resource resource = new Resource();
168             resource.setFileNameTag(fileNameTag);
169             resource.setVersion(version);
170             resource.setUuid(uuid);
171             resource.setInstanceName(instanceName);
172             resource.setName(name);
173             resource.setType(type);
174
175             resources.add(resource);
176         }
177         return resources;
178     }
179
180
181     @Override
182     protected void processArtifact(SDCArtifact artifact) throws APPCException {
183         String vnfType = artifact.getResourceName();
184         String version = artifact.getResourceVersion();
185         String packageArtifactID = artifact.getArtifactUUID();
186
187         if (StringUtils.isEmpty(vnfType) ||
188                 StringUtils.isEmpty(version) ||
189                 StringUtils.isEmpty(packageArtifactID)) {
190             String errStr = String.format("Missing information in SDC request. Details: resource_type='%s', resource_version='%s', artifactID='%s'", vnfType, version, packageArtifactID);
191             logger.error(errStr);
192             throw new APPCException(errStr);
193         }
194         try {
195             SDCReference reference = new SDCReference();
196             reference.setVnfType(vnfType);
197             reference.setFileCategory("tosca_model");
198             reference.setArtifactName(artifact.getArtifactName());
199             logger.debug("Storing TOSCA to SDC Artifact");
200             artifactStorageService.storeSDCArtifactWithReference(artifact,reference);
201
202             SDCArtifact dependencyArtifact = getDependencyArtifact(artifact);
203             SDCReference dependencyReference = new SDCReference();
204             dependencyReference.setVnfType(vnfType);
205             dependencyReference.setFileCategory("tosca_dependency_model");
206             dependencyReference.setArtifactName(dependencyArtifact.getArtifactName());
207             logger.debug("Storing Dependency to SDC Artifact");
208             artifactStorageService.storeSDCArtifactWithReference(dependencyArtifact,dependencyReference);
209         } catch (Exception e) {
210             logger.error("Error processing artifact : " + artifact.toString() );
211             throw new APPCException(e.getMessage(),e);
212         }
213     }
214
215     private SDCArtifact getDependencyArtifact(SDCArtifact toscaArtifact) throws APPCException {
216         SDCArtifact artifact = new SDCArtifact();
217         artifact.setArtifactName("dependency_"+toscaArtifact.getArtifactName());
218         String dependencyModel = dependencyModelGenerator.getDependencyModel(toscaArtifact.getArtifactContent(),toscaArtifact.getResourceName());
219         artifact.setArtifactContent(dependencyModel);
220         artifact.setArtifactType("DEPENDENCY_MODEL");
221
222         artifact.setArtifactUUID(toscaArtifact.getArtifactUUID());
223         artifact.setArtifactVersion(toscaArtifact.getArtifactVersion());
224         artifact.setArtifactDescription(toscaArtifact.getArtifactDescription());
225         artifact.setCreationDate(super.getCurrentDateTime());
226         artifact.setDistributionId(toscaArtifact.getDistributionId());
227         artifact.setServiceUUID(toscaArtifact.getServiceUUID());
228         artifact.setServiceName(toscaArtifact.getServiceName());
229         artifact.setServiceDescription(toscaArtifact.getServiceDescription());
230         artifact.setResourceName(toscaArtifact.getResourceName());
231         artifact.setResourceType(toscaArtifact.getResourceType());
232         artifact.setResourceVersion(toscaArtifact.getResourceVersion());
233         artifact.setResourceUUID(toscaArtifact.getResourceUUID());
234         artifact.setResourceInstanceName(toscaArtifact.getResourceInstanceName());
235         return artifact;
236     }
237
238
239 }