2 * ============LICENSE_START=======================================================
\r
4 * ================================================================================
\r
5 * Copyright © 2017 AT&T Intellectual Property.
\r
6 * Copyright © 2017 Amdocs
\r
7 * All rights reserved.
\r
8 * ================================================================================
\r
9 * Licensed under the Apache License, Version 2.0 (the "License");
\r
10 * you may not use this file except in compliance with the License.
\r
11 * You may obtain a copy of the License at
\r
12 * http://www.apache.org/licenses/LICENSE-2.0
\r
13 * Unless required by applicable law or agreed to in writing, software
\r
14 * distributed under the License is distributed on an "AS IS" BASIS,
\r
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
16 * See the License for the specific language governing permissions and
\r
17 * limitations under the License.
\r
18 * ============LICENSE_END=========================================================
\r
20 * ECOMP and OpenECOMP are trademarks
\r
21 * and service marks of AT&T Intellectual Property.
\r
23 package org.openecomp.modelloader.entity.catalog;
\r
25 import com.sun.jersey.api.client.ClientResponse;
\r
27 import generated.VnfCatalog;
\r
28 import generated.VnfCatalog.PartNumberList;
\r
30 import inventory.aai.openecomp.org.v8.VnfImage;
\r
32 import org.eclipse.persistence.jaxb.MarshallerProperties;
\r
33 import org.openecomp.cl.api.Logger;
\r
34 import org.openecomp.cl.eelf.LoggerFactory;
\r
35 import org.openecomp.modelloader.config.ModelLoaderConfig;
\r
36 import org.openecomp.modelloader.entity.Artifact;
\r
37 import org.openecomp.modelloader.entity.ArtifactHandler;
\r
38 import org.openecomp.modelloader.restclient.AaiRestClient;
\r
39 import org.openecomp.modelloader.restclient.AaiRestClient.MimeType;
\r
40 import org.openecomp.modelloader.service.ModelLoaderMsgs;
\r
41 import org.springframework.web.util.UriUtils;
\r
43 import java.io.StringReader;
\r
44 import java.io.StringWriter;
\r
45 import java.io.UnsupportedEncodingException;
\r
46 import java.util.ArrayList;
\r
47 import java.util.List;
\r
48 import java.util.UUID;
\r
50 import javax.ws.rs.core.Response;
\r
51 import javax.xml.bind.JAXBContext;
\r
52 import javax.xml.bind.JAXBException;
\r
53 import javax.xml.bind.Marshaller;
\r
54 import javax.xml.bind.Unmarshaller;
\r
57 public class VnfCatalogArtifactHandler extends ArtifactHandler {
\r
59 private static Logger logger = LoggerFactory.getInstance()
\r
60 .getLogger(VnfCatalogArtifactHandler.class.getName());
\r
62 public VnfCatalogArtifactHandler(ModelLoaderConfig config) {
\r
67 public boolean pushArtifacts(List<Artifact> artifacts, String distributionId) {
\r
68 for (Artifact art : artifacts) {
\r
69 VnfCatalogArtifact vnfCatalog = (VnfCatalogArtifact) art;
\r
70 String artifactPayload = vnfCatalog.getPayload();
\r
72 AaiRestClient restClient = new AaiRestClient(this.config);
\r
73 List<VnfImage> putImages = new ArrayList<VnfImage>();
\r
76 JAXBContext inputContext = JAXBContext.newInstance(VnfCatalog.class);
\r
77 Unmarshaller unmarshaller = inputContext.createUnmarshaller();
\r
78 StringReader reader = new StringReader(artifactPayload);
\r
79 VnfCatalog cat = (VnfCatalog) unmarshaller.unmarshal(reader);
\r
81 int numParts = cat.getPartNumberList().size();
\r
83 for (int i = 0; i < numParts; i++) {
\r
85 PartNumberList pnl = cat.getPartNumberList().get(i);
\r
87 String application = pnl.getVendorInfo().getVendorModel();
\r
88 String applicationVendor = pnl.getVendorInfo().getVendorName();
\r
90 int numVersions = pnl.getSoftwareVersionList().size();
\r
92 for (int j = 0; j < numVersions; j++) {
\r
93 String applicationVersion = pnl.getSoftwareVersionList().get(j).getSoftwareVersion();
\r
95 String imageId = "vnf image " + applicationVendor + " " + application + " "
\r
96 + applicationVersion;
\r
98 String queryURI = "application-vendor=" + applicationVendor + "&application=" + application + "&application-version=" + applicationVersion;
\r
100 String getUrl = config.getAaiBaseUrl() + config.getAaiVnfImageUrl() + "?" + UriUtils.encodePath(queryURI, "UTF-8");
\r
102 ClientResponse tryGet = restClient.getResource(getUrl, distributionId, MimeType.JSON);
\r
103 if (tryGet == null) {
\r
104 logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR,
\r
105 "Ingestion failed on " + imageId + ". Rolling back distribution.");
\r
106 failureCleanup(putImages, restClient, distributionId);
\r
109 if (tryGet.getStatus() == Response.Status.NOT_FOUND.getStatusCode()) {
\r
110 // this vnf-image not already in the db, need to add
\r
111 // only do this on 404 bc other error responses could mean there
\r
112 // are problems that
\r
113 // you might not want to try to PUT against
\r
115 VnfImage image = new VnfImage();
\r
116 image.setApplication(application);
\r
117 image.setApplicationVendor(applicationVendor);
\r
118 image.setApplicationVersion(applicationVersion);
\r
119 String uuid = UUID.randomUUID().toString();
\r
120 image.setUuid(uuid); // need to create uuid
\r
122 System.setProperty("javax.xml.bind.context.factory",
\r
123 "org.eclipse.persistence.jaxb.JAXBContextFactory");
\r
124 JAXBContext jaxbContext = JAXBContext.newInstance(VnfImage.class);
\r
125 Marshaller marshaller = jaxbContext.createMarshaller();
\r
126 marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
\r
127 marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
\r
128 marshaller.setProperty(MarshallerProperties.JSON_WRAPPER_AS_ARRAY_NAME, true);
\r
129 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);
\r
130 StringWriter writer = new StringWriter();
\r
131 marshaller.marshal(image, writer);
\r
132 String payload = writer.toString();
\r
134 String putUrl = config.getAaiBaseUrl() + config.getAaiVnfImageUrl() + "/vnf-image/"
\r
137 ClientResponse putResp = restClient.putResource(putUrl, payload, distributionId,
\r
139 if (putResp == null
\r
140 || putResp.getStatus() != Response.Status.CREATED.getStatusCode()) {
\r
141 logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR,
\r
142 "Ingestion failed on vnf-image " + imageId + ". Rolling back distribution.");
\r
143 failureCleanup(putImages, restClient, distributionId);
\r
146 putImages.add(image);
\r
147 logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, imageId + " successfully ingested.");
\r
148 } else if (tryGet.getStatus() == Response.Status.OK.getStatusCode()) {
\r
149 logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT,
\r
150 imageId + " already exists. Skipping ingestion.");
\r
152 // if other than 404 or 200, something went wrong
\r
153 logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR,
\r
154 "Ingestion failed on vnf-image " + imageId + " with status " + tryGet.getStatus()
\r
155 + ". Rolling back distribution.");
\r
156 failureCleanup(putImages, restClient, distributionId);
\r
162 } catch (JAXBException e) {
\r
163 logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR,
\r
164 "Ingestion failed. " + e.getMessage() + ". Rolling back distribution.");
\r
165 failureCleanup(putImages, restClient, distributionId);
\r
167 } catch (UnsupportedEncodingException e) {
\r
168 logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR, "Ingestion failed. " + e.getMessage() + ". Rolling back distribution.");
\r
169 failureCleanup(putImages, restClient, distributionId);
\r
178 * if something fails in the middle of ingesting the catalog we want to
\r
179 * rollback any changes to the db
\r
181 private void failureCleanup(List<VnfImage> putImages, AaiRestClient restClient, String transId) {
\r
182 for (VnfImage image : putImages) {
\r
183 String url = config.getAaiBaseUrl() + config.getAaiVnfImageUrl() + "/vnf-image/"
\r
185 restClient.getAndDeleteResource(url, transId); // try to delete the image,
\r
186 // if something goes wrong
\r
187 // we can't really do
\r