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