Implement support for v10 model entities.
[aai/model-loader.git] / src / main / java / org / openecomp / modelloader / entity / catalog / VnfCatalogArtifactHandler.java
1 /**\r
2  * ============LICENSE_START=======================================================\r
3  * Model Loader\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
19  *\r
20  * ECOMP and OpenECOMP are trademarks\r
21  * and service marks of AT&T Intellectual Property.\r
22  */\r
23 package org.openecomp.modelloader.entity.catalog;\r
24 \r
25 import com.sun.jersey.api.client.ClientResponse;\r
26 \r
27 import generated.VnfCatalog;\r
28 import generated.VnfCatalog.PartNumberList;\r
29 \r
30 import inventory.aai.openecomp.org.v8.VnfImage;\r
31 \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
42 \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
49 \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
55 \r
56 \r
57 public class VnfCatalogArtifactHandler extends ArtifactHandler {\r
58 \r
59   private static Logger logger = LoggerFactory.getInstance()\r
60       .getLogger(VnfCatalogArtifactHandler.class.getName());\r
61 \r
62   public VnfCatalogArtifactHandler(ModelLoaderConfig config) {\r
63     super(config);\r
64   }\r
65 \r
66   @Override\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
71 \r
72       AaiRestClient restClient = new AaiRestClient(this.config);\r
73       List<VnfImage> putImages = new ArrayList<VnfImage>();\r
74 \r
75       try {\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
80 \r
81         int numParts = cat.getPartNumberList().size();\r
82 \r
83         for (int i = 0; i < numParts; i++) {\r
84 \r
85           PartNumberList pnl = cat.getPartNumberList().get(i);\r
86 \r
87           String application = pnl.getVendorInfo().getVendorModel();\r
88           String applicationVendor = pnl.getVendorInfo().getVendorName();\r
89 \r
90           int numVersions = pnl.getSoftwareVersionList().size();\r
91 \r
92           for (int j = 0; j < numVersions; j++) {\r
93             String applicationVersion = pnl.getSoftwareVersionList().get(j).getSoftwareVersion();\r
94 \r
95             String imageId = "vnf image " + applicationVendor + " " + application + " "\r
96                 + applicationVersion;\r
97 \r
98                         String queryURI = "application-vendor=" + applicationVendor + "&application=" + application + "&application-version=" + applicationVersion;\r
99                         \r
100                         String getUrl = config.getAaiBaseUrl() + config.getAaiVnfImageUrl() + "?" + UriUtils.encodePath(queryURI, "UTF-8");\r
101 \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
107               return false;\r
108             }\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
114 \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
121 \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
133 \r
134               String putUrl = config.getAaiBaseUrl() + config.getAaiVnfImageUrl() + "/vnf-image/"\r
135                   + uuid;\r
136 \r
137               ClientResponse putResp = restClient.putResource(putUrl, payload, distributionId,\r
138                   MimeType.JSON);\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
144                 return false;\r
145               }\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
151             } else {\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
157               return false;\r
158             }\r
159           }\r
160         }\r
161 \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
166         return false;\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
170           return false;\r
171       }\r
172     }\r
173 \r
174     return true;\r
175   }\r
176 \r
177   /*\r
178    * if something fails in the middle of ingesting the catalog we want to\r
179    * rollback any changes to the db\r
180    */\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
184           + image.getUuid();\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
188                                                      // anything here\r
189     }\r
190   }\r
191 \r
192 }\r