3190fc507e56ace0cb86f9a99bf495a7c7c7ebaf
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / openecomp / mso / apihandlerinfra / VolumeInfoHandler.java
1 package org.openecomp.mso.apihandlerinfra;
2
3 /*-
4  * #%L
5  * MSO
6  * %%
7  * Copyright (C) 2016 OPENECOMP - MSO
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  * #L%
21  */
22
23
24 import java.io.StringReader;
25 import java.io.StringWriter;
26 import java.util.LinkedList;
27 import java.util.List;
28
29 import javax.ws.rs.GET;
30 import javax.ws.rs.Path;
31 import javax.ws.rs.PathParam;
32 import javax.ws.rs.QueryParam;
33 import javax.ws.rs.core.Response;
34 import javax.ws.rs.core.Response;
35 import javax.xml.bind.JAXBContext;
36 import javax.xml.bind.JAXBException;
37 import javax.xml.bind.Marshaller;
38
39 import org.apache.http.HttpStatus;
40
41 import javax.xml.bind.Unmarshaller;
42 import javax.xml.transform.sax.SAXSource;
43
44 import org.xml.sax.InputSource;
45
46 import org.openecomp.mso.apihandler.common.ValidationException;
47 import org.openecomp.mso.apihandlerinfra.volumebeans.ActionType;
48 import org.openecomp.mso.apihandlerinfra.volumebeans.ObjectFactory;
49 import org.openecomp.mso.apihandlerinfra.volumebeans.RequestInfo;
50 import org.openecomp.mso.apihandlerinfra.volumebeans.RequestStatusType;
51 import org.openecomp.mso.apihandlerinfra.volumebeans.VolumeInputs;
52 import org.openecomp.mso.apihandlerinfra.volumebeans.VolumeOutputs;
53 import org.openecomp.mso.apihandlerinfra.volumebeans.VolumeRequest;
54 import org.openecomp.mso.apihandlerinfra.volumebeans.VolumeRequests;
55 import org.openecomp.mso.logger.MsoLogger;
56 import org.openecomp.mso.requestsdb.InfraRequests;
57 import org.openecomp.mso.requestsdb.InfraActiveRequests;
58 import org.openecomp.mso.requestsdb.RequestsDatabase;
59 import org.openecomp.mso.utils.UUIDChecker;
60
61 @Path("/{version: v1|v2|v3}/volume-request")
62 public class VolumeInfoHandler {
63         
64         protected ObjectFactory beansObjectFactory = new ObjectFactory ();
65
66         private static MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.APIH);
67
68     @GET
69     public Response queryFilters (@QueryParam("vnf-type") String vnfType,
70                                   @QueryParam("service-type") String serviceType,
71                                   @QueryParam("aic-node-clli") String aicNodeClli,
72                                   @QueryParam("tenantId") String tenantId,
73                                   @QueryParam("volume-group-id") String volumeGroupId,
74                                   @QueryParam("volume-group-name") String volumeGroupName,
75                                   @PathParam("version") String version) {
76         long startTime = System.currentTimeMillis ();
77         MsoLogger.setServiceName ("VolumeQueryFilters");
78         // Generate a Request Id
79         UUIDChecker.generateUUID(msoLogger);
80         msoLogger.debug ("Incoming request received for queryFilter with vnf-type:" + vnfType
81                                                                 + " service-type:" + serviceType
82                                                                 + " aic-node-clli:" + aicNodeClli
83                                                                 + " tenant-id:" + tenantId
84                                                                 + " volume-group-id:" + volumeGroupId
85                                                                 + " volume-group-name:" + volumeGroupName);
86         Response response = null;
87         if (vnfType != null) {
88             response = this.getRequestList ("vnfType", vnfType, version);
89         } else {
90                 response = queryGenericFilters (serviceType, aicNodeClli, tenantId, volumeGroupId, volumeGroupName, version);
91         }
92         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successful");
93         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
94         return response;
95     }
96
97     @GET
98     @Path(Constants.REQUEST_ID_PATH)
99     public Response getRequest (@PathParam("request-id") String requestId, @PathParam("version") String version) {
100         
101         // Check INFRA_ACTIVE_REQUESTS table to find info
102         // on this request
103         
104         long startTime = System.currentTimeMillis ();
105         MsoLogger.setServiceName ("VolumeGetRequest");
106         // Generate a Request Id
107         UUIDChecker.generateUUID(msoLogger);
108         msoLogger.debug ("Incoming request received for getRequest with request-id:" + requestId);
109
110         Response response = getRequestGeneric (requestId, version);
111         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successful");
112         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
113         return response;
114
115     }
116
117    
118     protected MsoLogger getMsoLogger () {
119         return msoLogger;
120     }
121
122    
123      protected void fillVolumeRequest (VolumeRequest qr, InfraRequests ar, String version) {
124         VolumeInputs vi = beansObjectFactory.createVolumeInputs ();
125
126         if (ar.getVolumeGroupId () != null) {
127             vi.setVolumeGroupId (ar.getVolumeGroupId ());
128         }
129         if (ar.getVolumeGroupName () != null) {
130             vi.setVolumeGroupName (ar.getVolumeGroupName ());
131         }
132         if (ar.getVnfType () != null) {
133             vi.setVnfType (ar.getVnfType ());
134         }
135         
136         if (version.equals(Constants.SCHEMA_VERSION_V1)) {
137                 if (ar.getServiceType () != null) {
138                         vi.setServiceType (ar.getServiceType ());
139                 }
140                 if (ar.getAicNodeClli () != null) {
141                         vi.setAicNodeClli (ar.getAicNodeClli ());
142                 }
143         }
144         else if (version.equals(Constants.SCHEMA_VERSION_V2)) {
145                 if (ar.getAaiServiceId () != null) {
146                         vi.setServiceId (ar.getAaiServiceId ());
147                 }
148                 if (ar.getAicCloudRegion () != null) {
149                         vi.setAicCloudRegion (ar.getAicCloudRegion ());
150                 }               
151                 if (ar.getVfModuleModelName () != null) {
152                         vi.setVfModuleModelName (ar.getVfModuleModelName ());
153                 }               
154         }
155         else if (version.equals(Constants.SCHEMA_VERSION_V3)) {
156                 if (ar.getAaiServiceId () != null) {
157                         vi.setServiceId (ar.getAaiServiceId ());
158                 }
159                 if (ar.getAicCloudRegion () != null) {
160                         vi.setAicCloudRegion (ar.getAicCloudRegion ());
161                 }               
162                 if (ar.getVfModuleModelName () != null) {
163                         vi.setVfModuleModelName (ar.getVfModuleModelName ());
164                 }
165                 if (ar.getServiceInstanceId () != null) {
166                         vi.setServiceInstanceId (ar.getServiceInstanceId ());
167                 }
168                 if (ar.getVnfId () != null) {
169                 vi.setVnfId (ar.getVnfId ());
170             }
171         }
172         if (ar.getTenantId () != null) {
173             vi.setTenantId (ar.getTenantId ());
174         }
175         
176         qr.setVolumeInputs (vi);
177         
178         qr.setVolumeParams(ar.getVnfParams ());
179
180         try {
181             String volumeoutputs = ar.getVnfOutputs ();
182             if (volumeoutputs != null && volumeoutputs.length () > 0) {
183                 msoLogger.debug ("Read VOLUME outputs: " + volumeoutputs);
184                 VolumeOutputs volumeOutput = null;
185
186                 // Now unmarshal it into network outputs
187                 try {
188                     JAXBContext jaxbContext = JAXBContext.newInstance (VolumeOutputs.class);
189                     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller ();
190
191                     InputSource inputSource = new InputSource (new StringReader (volumeoutputs));
192                     SAXSource source = new SAXSource (inputSource);
193
194                     volumeOutput = (VolumeOutputs) jaxbUnmarshaller.unmarshal (source, VolumeOutputs.class).getValue ();
195
196                 } catch (Exception e) {
197                     msoLogger.debug ("Validation failed", e);
198                     throw new ValidationException ("format for volume outputs");
199                 }
200
201                 qr.setVolumeOutputs (volumeOutput);
202             }
203         } catch (Exception e) {
204             msoLogger.debug ("exception reading networkOutputs Clob", e);
205         }
206     }
207     
208     protected Response queryGenericFilters (String serviceType, String aicNodeClli, String tenantId, String volumeGroupId, String volumeGroupName, String version) {
209         if (serviceType != null) {
210             return this.getRequestList ("serviceType", serviceType, version);
211         }
212         if (aicNodeClli != null) {
213             return this.getRequestList ("aicNodeClli", aicNodeClli, version);
214         }
215         if (tenantId != null) {
216             return this.getRequestList ("tenantId", tenantId, version);
217         }
218         if (volumeGroupName != null) {
219                 return this.getRequestList ("volumeGroupName", volumeGroupName, version);
220         }
221         if (volumeGroupId != null) {
222                 return this.getRequestList ("volumeGroupId", volumeGroupId, version);
223         }
224         return Response.status (HttpStatus.SC_BAD_REQUEST).entity ("").build ();
225     }
226
227
228     protected Response getRequestGeneric (String requestId, String version) {
229         // Check INFRA_ACTIVE_REQUESTS table  to find info
230         // on this request
231
232         getMsoLogger ().debug ("getRequest: " + requestId);
233
234         String responseString = null;
235
236         InfraActiveRequests activeReq = RequestsDatabase.getRequestFromInfraActive (requestId,
237                                                                                     "VOLUME");
238         if (activeReq != null) {
239             // build response for active
240             responseString = infraRequestsResponse (activeReq, version);
241             return Response.status (HttpStatus.SC_OK).entity (responseString).build ();
242         } else {
243             // Report that no request has been found
244             return Response.status (HttpStatus.SC_NOT_FOUND).entity ("").build ();
245          }
246     }
247
248     protected Response getRequestList (String queryAttribute, String queryValue, String version) {
249         // Check INFRA_ACTIVE_REQUESTS table to find info
250         // on this request
251
252         getMsoLogger ().debug ("getRequest based on " + queryAttribute + ": " + queryValue);
253
254         List <InfraActiveRequests> activeReqList = RequestsDatabase.getRequestListFromInfraActive (queryAttribute,
255                                                                                                    queryValue,
256                                                                                                    "VOLUME");
257   
258         List <VolumeRequest> queryResponseList = new LinkedList <VolumeRequest> ();
259
260         if (activeReqList != null) {
261             // build response for active
262             queryResponseList = infraRequestsResponses (activeReqList, version);
263
264         }
265
266  
267         if (queryResponseList != null && !queryResponseList.isEmpty ()) {
268             String result = this.translateVolumeRequests (queryResponseList);
269             return Response.status (HttpStatus.SC_OK).entity (result).build ();
270
271         } else {
272             // Report that no request has been found
273             return Response.status (HttpStatus.SC_NOT_FOUND).entity ("").build ();
274         }
275     }
276
277     private VolumeRequest fillGeneric (InfraRequests ar) {
278         VolumeRequest qr = beansObjectFactory.createVolumeRequest ();
279         RequestInfo ri = beansObjectFactory.createRequestInfo ();
280         ri.setRequestId (ar.getRequestId ());
281         ri.setAction (ActionType.fromValue (ar.getAction ()));
282         ri.setRequestStatus (RequestStatusType.fromValue (ar.getRequestStatus ()));
283         if (ar.getProgress () != null) {
284             ri.setProgress (ar.getProgress ().intValue ());
285         }
286         if (ar.getSource () != null) {
287             ri.setSource (ar.getSource ());
288         }
289
290         ri.setStartTime (ar.getStartTime ().toString ());
291         if (ar.getEndTime () != null) {
292             ri.setEndTime (ar.getEndTime ().toString ());
293         }
294         
295         if (ar.getStatusMessage () != null) {
296                 ri.setStatusMessage (ar.getStatusMessage ());
297         }
298         qr.setRequestInfo (ri);
299         return qr;
300     }
301
302     private List <VolumeRequest> infraRequestsResponses (List <? extends InfraRequests> arList, String version) {
303         List <VolumeRequest> queryResponseList = new LinkedList <VolumeRequest> ();
304
305         for (InfraRequests ar : arList) {
306             VolumeRequest qr = fillGeneric (ar);
307             fillVolumeRequest (qr, ar, version);
308             queryResponseList.add (qr);
309         }
310         return queryResponseList;
311     }
312
313     private String translateVolumeRequests (List <VolumeRequest> queryResponseList) {
314         VolumeRequests queryResponses = new VolumeRequests ();
315         for (int i = 0; i < queryResponseList.size (); i++) {
316             queryResponses.getVolumeRequest ().add (queryResponseList.get (i));
317         }
318
319         StringWriter stringWriter = new StringWriter ();
320         try {
321             JAXBContext jaxbContext = JAXBContext.newInstance (VolumeRequests.class);
322             Marshaller jaxbMarshaller = jaxbContext.createMarshaller ();
323
324             // output pretty printed
325             jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true);
326
327             jaxbMarshaller.marshal (queryResponses, stringWriter);
328
329         } catch (JAXBException e) {
330             getMsoLogger ().debug ("Marshalling issue", e);
331         }
332
333         return stringWriter.toString ();
334     }
335
336     private String infraRequestsResponse (InfraRequests ar, String version) {
337         VolumeRequest qr = fillGeneric (ar);
338         fillVolumeRequest (qr, ar, version);
339
340         StringWriter stringWriter = new StringWriter ();
341         try {
342             JAXBContext jaxbContext = JAXBContext.newInstance (VolumeRequest.class);
343             Marshaller jaxbMarshaller = jaxbContext.createMarshaller ();
344
345             jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true);
346             jaxbMarshaller.marshal (qr, stringWriter);
347
348         } catch (JAXBException e) {
349             getMsoLogger ().debug ("Marshalling issue", e);
350         }
351
352         String response = stringWriter.toString ();
353         return response;
354     }
355
356     private String getAuditLogReturnMsg (Response response) {
357         String returnMsg = "";
358         if (response.getStatus() == HttpStatus.SC_OK) {
359                 returnMsg = "Successful. StatusCode=" + HttpStatus.SC_OK;
360         } else if (response.getStatus() == HttpStatus.SC_NOT_FOUND) {
361                 returnMsg = "Record not found . StatusCode=" + HttpStatus.SC_NOT_FOUND;
362         } else if (response.getStatus() == HttpStatus.SC_BAD_REQUEST) {
363                 returnMsg = "Bad request: one of the following attribute serviceType, aicNodeClli, tenantId, volumeGroupId, volumeGroupName should be defined. StatusCode=" + HttpStatus.SC_BAD_REQUEST;
364         }
365         return returnMsg;
366     }
367 }