AT&T 1712 and 1802 release code
[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 ONAP - SO
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         switch (version) {
134             case Constants.SCHEMA_VERSION_V1:
135                 if (ar.getServiceType() != null) {
136                     vi.setServiceType(ar.getServiceType());
137                 }
138                 if (ar.getAicNodeClli() != null) {
139                     vi.setAicNodeClli(ar.getAicNodeClli());
140                 }
141                 break;
142             case Constants.SCHEMA_VERSION_V2:
143                 if (ar.getAaiServiceId() != null) {
144                     vi.setServiceId(ar.getAaiServiceId());
145                 }
146                 if (ar.getAicCloudRegion() != null) {
147                     vi.setAicCloudRegion(ar.getAicCloudRegion());
148                 }
149                 break;
150             case Constants.SCHEMA_VERSION_V3:
151                 if (ar.getAaiServiceId() != null) {
152                     vi.setServiceId(ar.getAaiServiceId());
153                 }
154                 if (ar.getAicCloudRegion() != null) {
155                     vi.setAicCloudRegion(ar.getAicCloudRegion());
156                 }
157                 if (ar.getServiceInstanceId() != null) {
158                     vi.setServiceInstanceId(ar.getServiceInstanceId());
159                 }
160
161                 break;
162         }
163         
164         if (ar.getTenantId () != null) {
165             vi.setTenantId (ar.getTenantId ());
166         }
167         if (ar.getProvStatus () != null) {
168             vi.setProvStatus (ar.getProvStatus ());
169         }
170         qr.setNetworkInputs (vi);
171
172         qr.setNetworkParams (ar.getVnfParams ());
173
174         try {
175             String networkoutputs = ar.getVnfOutputs ();
176             if (networkoutputs != null && networkoutputs.length () > 0) {
177                 msoLogger.debug ("Read NETWORK outputs: " + networkoutputs);
178                 NetworkOutputs networkOutput = null;
179
180                 // Now unmarshal it into network outputs
181                 try {
182                     JAXBContext jaxbContext = JAXBContext.newInstance (NetworkOutputs.class);
183                     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller ();
184
185                     InputSource inputSource = new InputSource (new StringReader (networkoutputs));
186                     SAXSource source = new SAXSource (inputSource);
187
188                     networkOutput = jaxbUnmarshaller.unmarshal (source, NetworkOutputs.class).getValue ();
189
190                 } catch (Exception e) {
191                     msoLogger.debug ("Validation failed", e);
192                     throw new ValidationException ("format for network outputs");
193                 }
194
195                 qr.setNetworkOutputs (networkOutput);
196             }
197         } catch (Exception e) {
198             msoLogger.debug ("exception reading networkOutputs Clob", e);
199         }
200     }
201
202     protected Response queryGenericFilters (String serviceType, String aicNodeClli, String tenantId, String version) {
203         if (serviceType != null) {
204             return this.getRequestList ("serviceType", serviceType, version);
205         }
206         if (aicNodeClli != null) {
207             return this.getRequestList ("aicNodeClli", aicNodeClli, version);
208         }
209         if (tenantId != null) {
210             return this.getRequestList ("tenantId", tenantId, version);
211         }
212         return Response.status (HttpStatus.SC_BAD_REQUEST).entity ("").build ();
213     }
214
215     protected Response getRequestGeneric (String requestId, String version) {
216         // Check INFRA_ACTIVE_REQUESTS table to find info
217         // on this request
218         MsoLogger.setLogContext (requestId, null);
219         getMsoLogger ().debug ("getRequest: " + requestId);
220
221         String responseString;
222
223         InfraActiveRequests activeReq = (RequestsDatabase.getInstance()).getRequestFromInfraActive (requestId, "NETWORK");
224         if (activeReq != null) {
225             // build response for active
226             responseString = infraRequestsResponse (activeReq, version);
227             return Response.status (HttpStatus.SC_OK).entity (responseString).build ();
228         } else {
229             // Report that no request has been found
230             return Response.status (HttpStatus.SC_NOT_FOUND).entity ("").build ();
231         }
232     }
233
234     protected Response getRequestList (String queryAttribute, String queryValue, String version) {
235         // Check INFRA_ACTIVE_REQUESTS table to find info
236         // on this request
237
238         getMsoLogger ().debug ("getRequest based on " + queryAttribute + ": " + queryValue);
239
240         List <InfraActiveRequests> activeReqList = (RequestsDatabase.getInstance()).getRequestListFromInfraActive (queryAttribute,
241                                                                                                    queryValue,
242                                                                                                    "NETWORK");
243
244         List <NetworkRequest> queryResponseList = new LinkedList <> ();
245
246         if (activeReqList != null) {
247             // build response for active
248             queryResponseList = infraRequestsResponses (activeReqList, version);
249
250         }
251
252         if (queryResponseList != null && !queryResponseList.isEmpty ()) {
253             String result = this.translateNetworkRequests (queryResponseList);
254             return Response.status (HttpStatus.SC_OK).entity (result).build ();
255
256         } else {
257             // Report that no request has been found
258             return Response.status (HttpStatus.SC_NOT_FOUND).entity ("").build ();
259         }
260     }
261
262     private NetworkRequest fillGeneric (InfraRequests ar) {
263         NetworkRequest qr = beansObjectFactory.createNetworkRequest ();
264         RequestInfo ri = beansObjectFactory.createRequestInfo ();
265         ri.setRequestId (ar.getRequestId ());
266         ri.setAction (ActionType.fromValue (ar.getAction ()));
267         ri.setRequestStatus (RequestStatusType.fromValue (ar.getRequestStatus ()));
268         if (ar.getProgress () != null) {
269             ri.setProgress (ar.getProgress ().intValue ());
270         }
271         if (ar.getSource () != null) {
272             ri.setSource (ar.getSource ());
273         }
274
275         ri.setStartTime (ar.getStartTime ().toString ());
276         if (ar.getEndTime () != null) {
277             ri.setEndTime (ar.getEndTime ().toString ());
278         }
279
280         if (ar.getStatusMessage () != null) {
281             ri.setStatusMessage (ar.getStatusMessage ());
282         }
283         qr.setRequestInfo (ri);
284         return qr;
285     }
286
287     private List <NetworkRequest> infraRequestsResponses (List <? extends InfraRequests> arList, String version) {
288         List <NetworkRequest> queryResponseList = new LinkedList <> ();
289
290         for (InfraRequests ar : arList) {
291             NetworkRequest qr = fillGeneric (ar);
292             fillNetworkRequest (qr, ar, version);
293             queryResponseList.add (qr);
294         }
295         return queryResponseList;
296     }
297
298     private String translateNetworkRequests (List <NetworkRequest> queryResponseList) {
299         NetworkRequests queryResponses = new NetworkRequests ();
300         for (NetworkRequest aQueryResponseList : queryResponseList) {
301             queryResponses.getNetworkRequest().add(aQueryResponseList);
302         }
303
304         StringWriter stringWriter = new StringWriter ();
305         try {
306             JAXBContext jaxbContext = JAXBContext.newInstance (NetworkRequests.class);
307             Marshaller jaxbMarshaller = jaxbContext.createMarshaller ();
308
309             // output pretty printed
310             jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true);
311
312             jaxbMarshaller.marshal (queryResponses, stringWriter);
313
314         } catch (JAXBException e) {
315             getMsoLogger ().debug ("Marshalling issue", e);
316         }
317
318         return stringWriter.toString ();
319     }
320
321     private String infraRequestsResponse (InfraRequests ar, String version) {
322         NetworkRequest qr = fillGeneric (ar);
323         fillNetworkRequest (qr, ar, version);
324
325         StringWriter stringWriter = new StringWriter ();
326         try {
327             JAXBContext jaxbContext = JAXBContext.newInstance (NetworkRequest.class);
328             Marshaller jaxbMarshaller = jaxbContext.createMarshaller ();
329
330             jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true);
331             jaxbMarshaller.marshal (qr, stringWriter);
332
333         } catch (JAXBException e) {
334             getMsoLogger ().debug ("Marshalling issue", e);
335         }
336
337         String response = stringWriter.toString ();
338         return response;
339     }
340 }