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