Merge "Replaced with Diamond symbol"
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / openecomp / mso / apihandlerinfra / NetworkInfoHandler.java
1
2 package org.openecomp.mso.apihandlerinfra;
3
4 /*-
5  * #%L
6  * MSO
7  * %%
8  * Copyright (C) 2016 OPENECOMP - MSO
9  * %%
10  * Licensed under the Apache License, Version 2.0 (the "License");
11  * you may not use this file except in compliance with the License.
12  * You may obtain a copy of the License at
13  *
14  *      http://www.apache.org/licenses/LICENSE-2.0
15  *
16  * Unless required by applicable law or agreed to in writing, software
17  * distributed under the License is distributed on an "AS IS" BASIS,
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  * See the License for the specific language governing permissions and
20  * limitations under the License.
21  * #L%
22  */
23
24
25 import java.io.StringReader;
26 import java.io.StringWriter;
27 import java.util.LinkedList;
28 import java.util.List;
29
30 import javax.ws.rs.GET;
31 import javax.ws.rs.Path;
32 import javax.ws.rs.PathParam;
33 import javax.ws.rs.QueryParam;
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 import javax.xml.bind.Unmarshaller;
39 import javax.xml.transform.sax.SAXSource;
40
41 import org.apache.http.HttpStatus;
42 import org.openecomp.mso.apihandler.common.ValidationException;
43 import org.openecomp.mso.apihandlerinfra.networkbeans.ActionType;
44 import org.openecomp.mso.apihandlerinfra.networkbeans.NetworkInputs;
45 import org.openecomp.mso.apihandlerinfra.networkbeans.NetworkOutputs;
46 import org.openecomp.mso.apihandlerinfra.networkbeans.NetworkRequest;
47 import org.openecomp.mso.apihandlerinfra.networkbeans.NetworkRequests;
48 import org.openecomp.mso.apihandlerinfra.networkbeans.ObjectFactory;
49 import org.openecomp.mso.apihandlerinfra.networkbeans.RequestInfo;
50 import org.openecomp.mso.apihandlerinfra.networkbeans.RequestStatusType;
51 import org.openecomp.mso.logger.MsoLogger;
52 import org.openecomp.mso.requestsdb.InfraActiveRequests;
53 import org.openecomp.mso.requestsdb.InfraRequests;
54 import org.openecomp.mso.requestsdb.RequestsDatabase;
55 import org.openecomp.mso.utils.UUIDChecker;
56 import org.xml.sax.InputSource;
57
58 import com.wordnik.swagger.annotations.Api;
59 import com.wordnik.swagger.annotations.ApiOperation;
60
61 @Path("/{version: v1|v2|v3}/network-request")
62 @Api(value="/{version: v1|v2|v3}/network-request",description="API Requests for network requests")
63 public class NetworkInfoHandler {
64
65     protected ObjectFactory beansObjectFactory = new ObjectFactory ();
66
67     private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
68
69     @GET
70     @ApiOperation(value="Finds Network Requests",response=Response.class)
71     public Response queryFilters (@QueryParam("network-type") String networkType,
72                                   @QueryParam("service-type") String serviceType,
73                                   @QueryParam("aic-node-clli") String aicNodeClli,
74                                   @QueryParam("tenant-id") String tenantId,
75                                   @PathParam("version") String version) {
76         MsoLogger.setServiceName ("QueryFilters");
77         // Generate a Request Id
78         UUIDChecker.generateUUID(msoLogger);
79         long startTime = System.currentTimeMillis ();
80
81         msoLogger.debug ("Incoming request received for query filters with Network type " + networkType
82                                          + " - service type "
83                                          + serviceType
84                                          + " - aicNodeClli "
85                                          + aicNodeClli
86                                          + " - tenant id "
87                                          + tenantId);
88         Response response;
89         if (networkType != null) {
90             response = this.getRequestList ("vnfType", networkType, version);
91         } else {
92             response = queryGenericFilters (serviceType, aicNodeClli, tenantId, version);
93         }
94         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successful");
95         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
96         return response;
97     }
98
99     @GET
100     @Path(Constants.REQUEST_ID_PATH)
101     @ApiOperation(value="Add a Network Outputs from requestId and version",response=Response.class)
102     public Response getRequest (@PathParam("request-id") String requestId, @PathParam("version") String version) {
103         // Check INFRA_ACTIVE_REQUESTS table to find info
104         // on this request
105         MsoLogger.setServiceName ("GetRequest");
106         // Generate a Request Id
107         UUIDChecker.generateUUID(msoLogger);
108         msoLogger.debug ("Incoming request received for getRequest with requestId=" + requestId + ", version = " + version);
109         long startTime = System.currentTimeMillis ();
110
111         Response response = getRequestGeneric (requestId, version);
112         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successful");
113         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
114         return response;
115     }
116
117     protected MsoLogger getMsoLogger () {
118         return msoLogger;
119     }
120
121     protected void fillNetworkRequest (NetworkRequest qr, InfraRequests ar, String version) {
122         NetworkInputs vi = beansObjectFactory.createNetworkInputs ();
123
124         if (ar.getVnfId () != null) {
125             vi.setNetworkId (ar.getVnfId ());
126         }
127         if (ar.getVnfName () != null) {
128             vi.setNetworkName (ar.getVnfName ());
129         }
130         if (ar.getVnfType () != null) {
131             vi.setNetworkType (ar.getVnfType ());
132         }
133         if (version.equals(Constants.SCHEMA_VERSION_V1)) {
134                 if (ar.getServiceType () != null) {
135                         vi.setServiceType (ar.getServiceType ());
136                 }
137                 if (ar.getAicNodeClli () != null) {
138                         vi.setAicNodeClli (ar.getAicNodeClli ());
139                 }
140         }
141         else if (version.equals(Constants.SCHEMA_VERSION_V2)) {
142                 if (ar.getAaiServiceId () != null) {
143                         vi.setServiceId (ar.getAaiServiceId ());
144                 }
145                 if (ar.getAicCloudRegion () != null) {
146                         vi.setAicCloudRegion (ar.getAicCloudRegion ());
147                 }
148         }
149         else if (version.equals(Constants.SCHEMA_VERSION_V3)) {
150                 if (ar.getAaiServiceId () != null) {
151                         vi.setServiceId (ar.getAaiServiceId ());
152                 }
153                 if (ar.getAicCloudRegion () != null) {
154                         vi.setAicCloudRegion (ar.getAicCloudRegion ());
155                 }
156                 if (ar.getServiceInstanceId () != null) {
157                         vi.setServiceInstanceId (ar.getServiceInstanceId ());
158                 }
159                                 
160         }
161         
162         if (ar.getTenantId () != null) {
163             vi.setTenantId (ar.getTenantId ());
164         }
165         if (ar.getProvStatus () != null) {
166             vi.setProvStatus (ar.getProvStatus ());
167         }
168         qr.setNetworkInputs (vi);
169
170         qr.setNetworkParams (ar.getVnfParams ());
171
172         try {
173             String networkoutputs = ar.getVnfOutputs ();
174             if (networkoutputs != null && networkoutputs.length () > 0) {
175                 msoLogger.debug ("Read NETWORK outputs: " + networkoutputs);
176                 NetworkOutputs networkOutput = null;
177
178                 // Now unmarshal it into network outputs
179                 try {
180                     JAXBContext jaxbContext = JAXBContext.newInstance (NetworkOutputs.class);
181                     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller ();
182
183                     InputSource inputSource = new InputSource (new StringReader (networkoutputs));
184                     SAXSource source = new SAXSource (inputSource);
185
186                     networkOutput = jaxbUnmarshaller.unmarshal (source, NetworkOutputs.class).getValue ();
187
188                 } catch (Exception e) {
189                     msoLogger.debug ("Validation failed", e);
190                     throw new ValidationException ("format for network outputs");
191                 }
192
193                 qr.setNetworkOutputs (networkOutput);
194             }
195         } catch (Exception e) {
196             msoLogger.debug ("exception reading networkOutputs Clob", e);
197         }
198     }
199
200     protected Response queryGenericFilters (String serviceType, String aicNodeClli, String tenantId, String version) {
201         if (serviceType != null) {
202             return this.getRequestList ("serviceType", serviceType, version);
203         }
204         if (aicNodeClli != null) {
205             return this.getRequestList ("aicNodeClli", aicNodeClli, version);
206         }
207         if (tenantId != null) {
208             return this.getRequestList ("tenantId", tenantId, version);
209         }
210         return Response.status (HttpStatus.SC_BAD_REQUEST).entity ("").build ();
211     }
212
213     protected Response getRequestGeneric (String requestId, String version) {
214         // Check INFRA_ACTIVE_REQUESTS table to find info
215         // on this request
216         MsoLogger.setLogContext (requestId, null);
217         getMsoLogger ().debug ("getRequest: " + requestId);
218
219         String responseString;
220
221         InfraActiveRequests activeReq = (RequestsDatabase.getInstance()).getRequestFromInfraActive (requestId, "NETWORK");
222         if (activeReq != null) {
223             // build response for active
224             responseString = infraRequestsResponse (activeReq, version);
225             return Response.status (HttpStatus.SC_OK).entity (responseString).build ();
226         } else {
227             // Report that no request has been found
228             return Response.status (HttpStatus.SC_NOT_FOUND).entity ("").build ();
229         }
230     }
231
232     protected Response getRequestList (String queryAttribute, String queryValue, String version) {
233         // Check INFRA_ACTIVE_REQUESTS table to find info
234         // on this request
235
236         getMsoLogger ().debug ("getRequest based on " + queryAttribute + ": " + queryValue);
237
238         List <InfraActiveRequests> activeReqList = (RequestsDatabase.getInstance()).getRequestListFromInfraActive (queryAttribute,
239                                                                                                    queryValue,
240                                                                                                    "NETWORK");
241
242         List <NetworkRequest> queryResponseList = new LinkedList <> ();
243
244         if (activeReqList != null) {
245             // build response for active
246             queryResponseList = infraRequestsResponses (activeReqList, version);
247
248         }
249
250         if (queryResponseList != null && !queryResponseList.isEmpty ()) {
251             String result = this.translateNetworkRequests (queryResponseList);
252             return Response.status (HttpStatus.SC_OK).entity (result).build ();
253
254         } else {
255             // Report that no request has been found
256             return Response.status (HttpStatus.SC_NOT_FOUND).entity ("").build ();
257         }
258     }
259
260     private NetworkRequest fillGeneric (InfraRequests ar) {
261         NetworkRequest qr = beansObjectFactory.createNetworkRequest ();
262         RequestInfo ri = beansObjectFactory.createRequestInfo ();
263         ri.setRequestId (ar.getRequestId ());
264         ri.setAction (ActionType.fromValue (ar.getAction ()));
265         ri.setRequestStatus (RequestStatusType.fromValue (ar.getRequestStatus ()));
266         if (ar.getProgress () != null) {
267             ri.setProgress (ar.getProgress ().intValue ());
268         }
269         if (ar.getSource () != null) {
270             ri.setSource (ar.getSource ());
271         }
272
273         ri.setStartTime (ar.getStartTime ().toString ());
274         if (ar.getEndTime () != null) {
275             ri.setEndTime (ar.getEndTime ().toString ());
276         }
277
278         if (ar.getStatusMessage () != null) {
279             ri.setStatusMessage (ar.getStatusMessage ());
280         }
281         qr.setRequestInfo (ri);
282         return qr;
283     }
284
285     private List <NetworkRequest> infraRequestsResponses (List <? extends InfraRequests> arList, String version) {
286         List <NetworkRequest> queryResponseList = new LinkedList <> ();
287
288         for (InfraRequests ar : arList) {
289             NetworkRequest qr = fillGeneric (ar);
290             fillNetworkRequest (qr, ar, version);
291             queryResponseList.add (qr);
292         }
293         return queryResponseList;
294     }
295
296     private String translateNetworkRequests (List <NetworkRequest> queryResponseList) {
297         NetworkRequests queryResponses = new NetworkRequests ();
298         for (int i = 0; i < queryResponseList.size (); i++) {
299             queryResponses.getNetworkRequest ().add (queryResponseList.get (i));
300         }
301
302         StringWriter stringWriter = new StringWriter ();
303         try {
304             JAXBContext jaxbContext = JAXBContext.newInstance (NetworkRequests.class);
305             Marshaller jaxbMarshaller = jaxbContext.createMarshaller ();
306
307             // output pretty printed
308             jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true);
309
310             jaxbMarshaller.marshal (queryResponses, stringWriter);
311
312         } catch (JAXBException e) {
313             getMsoLogger ().debug ("Marshalling issue", e);
314         }
315
316         return stringWriter.toString ();
317     }
318
319     private String infraRequestsResponse (InfraRequests ar, String version) {
320         NetworkRequest qr = fillGeneric (ar);
321         fillNetworkRequest (qr, ar, version);
322
323         StringWriter stringWriter = new StringWriter ();
324         try {
325             JAXBContext jaxbContext = JAXBContext.newInstance (NetworkRequest.class);
326             Marshaller jaxbMarshaller = jaxbContext.createMarshaller ();
327
328             jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true);
329             jaxbMarshaller.marshal (qr, stringWriter);
330
331         } catch (JAXBException e) {
332             getMsoLogger ().debug ("Marshalling issue", e);
333         }
334
335         String response = stringWriter.toString ();
336         return response;
337     }
338 }