Change the header to SO
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / openecomp / mso / apihandlerinfra / OrchestrationRequests.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20 package org.openecomp.mso.apihandlerinfra;
21
22 import java.text.SimpleDateFormat;
23 import java.util.ArrayList;
24 import java.util.List;
25 import java.util.Map;
26
27 import javax.ws.rs.Consumes;
28 import javax.ws.rs.GET;
29 import javax.ws.rs.POST;
30 import javax.ws.rs.Path;
31 import javax.ws.rs.PathParam;
32 import javax.ws.rs.Produces;
33 import javax.ws.rs.core.Context;
34 import javax.ws.rs.core.MediaType;
35 import javax.ws.rs.core.MultivaluedMap;
36 import javax.ws.rs.core.Response;
37 import javax.ws.rs.core.UriInfo;
38
39 import org.apache.http.HttpStatus;
40 import org.codehaus.jackson.map.ObjectMapper;
41 import org.openecomp.mso.apihandler.common.ErrorNumbers;
42 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.GetOrchestrationListResponse;
43 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.GetOrchestrationResponse;
44 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.InstanceReferences;
45 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.Request;
46 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestDetails;
47 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestList;
48 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestStatus;
49 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceInstancesRequest;
50 import org.openecomp.mso.logger.MessageEnum;
51 import org.openecomp.mso.logger.MsoAlarmLogger;
52 import org.openecomp.mso.logger.MsoLogger;
53 import org.openecomp.mso.requestsdb.InfraActiveRequests;
54 import org.openecomp.mso.requestsdb.RequestsDatabase;
55
56 import com.wordnik.swagger.annotations.Api;
57 import com.wordnik.swagger.annotations.ApiOperation;
58
59 @Path("/orchestrationRequests")
60 @Api(value="/orchestrationRequests",description="API Requests for Orchestration requests")
61 public class OrchestrationRequests {
62
63     public final static String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";
64
65     private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
66
67     private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger ();
68
69     private RequestsDatabase requestsDB = RequestsDatabase.getInstance();
70     
71         /**
72          *
73          */
74         public OrchestrationRequests() {
75                 // TODO Auto-generated constructor stub
76         }
77
78         @GET
79         @Path("/{version:[vV][2-5]}/{requestId}")
80         @ApiOperation(value="Find Orchestrated Requests for a given requestId",response=Response.class)
81         @Produces(MediaType.APPLICATION_JSON)
82         public Response getOrchestrationRequest(@PathParam("requestId") String requestId, @PathParam("version") String version) {
83
84                 GetOrchestrationResponse orchestrationResponse = new GetOrchestrationResponse();
85
86                 MsoRequest msoRequest = new MsoRequest (requestId);
87
88                 long startTime = System.currentTimeMillis ();
89
90                 InfraActiveRequests requestDB = null;
91
92         try {
93                  requestDB = requestsDB.getRequestFromInfraActive(requestId);
94
95             } catch (Exception e) {
96                 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Request DB - Infra Request Lookup", e);
97                 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
98                 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
99                                                                                                                           MsoException.ServiceException,
100                                                                                                                           e.getMessage (),
101                                                                        ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB,
102                                                                        null);
103                 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
104                                        MsoAlarmLogger.CRITICAL,
105                                        Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB));
106                 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with Request DB");
107                 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
108                 return response;
109
110             }
111
112         if(requestDB == null) {
113             Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NO_CONTENT,
114                                                                                                                  MsoException.ServiceException,
115                                                                                                                 "Orchestration RequestId " + requestId + " is not found in DB",
116                                                              ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
117                                                              null);
118             msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Null response from RequestDB when searching by RequestId");
119             msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "Null response from RequestDB when searching by RequestId");
120             msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
121             return resp;
122
123         }
124
125         Request request = mapInfraActiveRequestToRequest(requestDB);
126
127         orchestrationResponse.setRequest(request);
128
129         return Response.status(200).entity(orchestrationResponse).build();
130         }
131
132         @GET
133         @Path("/{version:[vV][2-5]}")
134         @ApiOperation(value="Find Orchestrated Requests for a URI Information",response=Response.class)
135         @Produces(MediaType.APPLICATION_JSON)
136         public Response getOrchestrationRequest(@Context UriInfo ui, @PathParam("version") String version) {
137
138                 long startTime = System.currentTimeMillis ();
139
140                 MsoRequest msoRequest = new MsoRequest();
141
142                 MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
143
144                 List<InfraActiveRequests> activeRequests = null;
145
146                 GetOrchestrationListResponse orchestrationList = null;
147
148
149                 try{
150
151                         Map<String, List<String>> orchestrationMap = msoRequest.getOrchestrationFilters(queryParams);
152
153                         activeRequests = requestsDB.getOrchestrationFiltersFromInfraActive(orchestrationMap);
154
155                         orchestrationList = new GetOrchestrationListResponse();
156
157                         List<RequestList> requestLists = new ArrayList<RequestList>();
158
159                         for(InfraActiveRequests infraActive : activeRequests){
160
161                                 Request request = mapInfraActiveRequestToRequest(infraActive);
162                                 RequestList requestList = new RequestList();
163                                 requestList.setRequest(request);
164
165                                 requestLists.add(requestList);
166
167                         }
168
169                         orchestrationList.setRequestList(requestLists);
170
171                 }catch(Exception e){
172                    msoLogger.debug ("Get Orchestration Request with Filters Failed : ", e);
173                    Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
174                            "Get Orchestration Request with Filters Failed.  " + e.getMessage(),
175                            ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null);
176                    msoLogger.error (MessageEnum.APIH_GENERAL_EXCEPTION, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Get Orchestration Request with Filters Failed : " + e);
177                    msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataError, "Get Orchestration Request with Filters Failed");
178                    msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
179                    return response;
180                 }
181
182
183         return Response.status(200).entity(orchestrationList).build();
184         }
185
186
187         @POST
188         @Path("/{version: [vV][3-5]}/{requestId}/unlock")
189         @Consumes(MediaType.APPLICATION_JSON)
190         @Produces(MediaType.APPLICATION_JSON)
191         @ApiOperation(value="Unlock Orchestrated Requests for a given requestId",response=Response.class)
192         public Response unlockOrchestrationRequest(String requestJSON, @PathParam("requestId") String requestId, @PathParam("version") String version) {
193
194                 MsoRequest msoRequest = new MsoRequest (requestId);
195
196                 long startTime = System.currentTimeMillis ();
197                 msoLogger.debug ("requestId is: " + requestId);
198
199                 InfraActiveRequests requestDB = null;
200                 Request request = null;
201
202                 msoLogger.debug ("requestId is: " + requestId);
203                 ServiceInstancesRequest sir = null;
204
205                 try{
206                         ObjectMapper mapper = new ObjectMapper();
207                         sir = mapper.readValue(requestJSON, ServiceInstancesRequest.class);
208
209                 } catch(Exception e){
210                         msoLogger.debug ("Mapping of request to JSON object failed : ", e);
211                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
212                                         "Mapping of request to JSON object failed.  " + e.getMessage(),
213                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
214                         if (msoRequest.getRequestId () != null) {
215                                 msoLogger.debug ("Mapping of request to JSON object failed");
216                         }
217                         msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
218                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Mapping of request to JSON object failed");
219                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
220                         return response;
221                 }
222
223
224                 try{
225                         msoRequest.parseOrchestration(sir);
226                 } catch (Exception e) {
227                         msoLogger.debug ("Validation failed: ", e);
228                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
229                                         "Error parsing request.  " + e.getMessage(),
230                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
231                         if (msoRequest.getRequestId () != null) {
232                                 msoLogger.debug ("Logging failed message to the database");
233                         }
234                         msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
235                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
236                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
237                         return response;
238                 }
239
240                 try {
241                         requestDB = requestsDB.getRequestFromInfraActive(requestId);
242
243                         if(requestDB == null) {
244                                 Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
245                                                 MsoException.ServiceException,
246                                                 "Orchestration RequestId " + requestId + " is not found in DB",
247                                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
248                                                 null);
249                                 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Null response from RequestDB when searching by RequestId");
250                                 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "Null response from RequestDB when searching by RequestId");
251                                 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
252                                 return resp;
253
254                         }else{
255                                 request = mapInfraActiveRequestToRequest(requestDB);
256                                 RequestStatus reqStatus = request.getRequestStatus();
257                                 Status status = Status.valueOf(reqStatus.getRequestState());
258                                 if(status == Status.IN_PROGRESS || status == Status.PENDING){
259                                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.UNLOCKED);
260                                         reqStatus.setRequestState(Status.UNLOCKED.toString ());
261                                         requestsDB.updateInfraStatus (requestId,
262                                                         Status.UNLOCKED.toString (),
263                                                         Constants.MODIFIED_BY_APIHANDLER);
264
265                                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "RequestId " + requestId + " has been unlocked");
266
267                                 }else{
268                                         Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_REQUEST,
269                                                         MsoException.ServiceException,
270                                                         "Orchestration RequestId " + requestId + " has a status of " + status + " and can not be unlocked",
271                                                         ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
272                                                         null);
273                                         msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Orchestration RequestId " + requestId + " has a status of " + status + " and can not be unlocked");
274                                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataError, "Orchestration RequestId " + requestId + " has a status of " + status + " and can not be unlocked");
275                                         msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
276                                         return resp;
277                                 }
278                         }
279                 } catch (Exception e) {
280                         msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Request DB - Infra Request Lookup", e);
281                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
282                         Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
283                                         MsoException.ServiceException,
284                                         e.getMessage (),
285                                         ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB,
286                                         null);
287                         alarmLogger.sendAlarm ("MsoDatabaseAccessError",
288                                         MsoAlarmLogger.CRITICAL,
289                                         Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB));
290                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with Request DB");
291                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
292                         return response;
293
294                 }
295
296                 return Response.status (HttpStatus.SC_NO_CONTENT).entity ("").build ();
297         }
298
299     private Request mapInfraActiveRequestToRequest(InfraActiveRequests requestDB)  {
300
301
302         Request request = new Request();
303
304         ObjectMapper mapper = new ObjectMapper();
305        // mapper.configure(Feature.WRAP_ROOT_VALUE, true);
306
307        request.setRequestId(requestDB.getRequestId());
308        request.setRequestScope(requestDB.getRequestScope());
309        request.setRequestType(requestDB.getRequestAction());
310
311        InstanceReferences ir = new InstanceReferences();
312        if(requestDB.getNetworkId() != null)
313         ir.setNetworkInstanceId(requestDB.getNetworkId());
314        if(requestDB.getNetworkName() != null)
315         ir.setNetworkInstanceName(requestDB.getNetworkName());
316        if(requestDB.getServiceInstanceId() != null)
317         ir.setServiceInstanceId(requestDB.getServiceInstanceId());
318        if(requestDB.getServiceInstanceName() != null)
319         ir.setServiceInstanceName(requestDB.getServiceInstanceName());
320        if(requestDB.getVfModuleId() != null)
321         ir.setVfModuleInstanceId(requestDB.getVfModuleId());
322        if(requestDB.getVfModuleName() != null)
323         ir.setVfModuleInstanceName(requestDB.getVfModuleName());
324        if(requestDB.getVnfId() != null)
325         ir.setVnfInstanceId(requestDB.getVnfId());
326        if(requestDB.getVnfName() != null)
327         ir.setVnfInstanceName(requestDB.getVnfName());
328        if(requestDB.getVolumeGroupId() != null)
329         ir.setVolumeGroupInstanceId(requestDB.getVolumeGroupId());
330        if(requestDB.getVolumeGroupName() != null)
331         ir.setVolumeGroupInstanceName(requestDB.getVolumeGroupName());
332                 if(requestDB.getRequestorId() != null)
333                         ir.setRequestorId(requestDB.getRequestorId());
334
335
336                 request.setInstanceReferences(ir);
337
338        String requestBody = requestDB.getRequestBody();
339
340        RequestDetails requestDetails = null;
341
342        try{
343         requestDetails = mapper.readValue(requestBody, RequestDetails.class);
344
345        }catch(Exception e){
346         msoLogger.debug("Exception caught mapping requestBody to RequestDetails");
347        }
348
349        request.setRequestDetails(requestDetails);
350        String startTimeStamp = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss").format(requestDB.getStartTime()) + " GMT";
351        request.setStartTime(startTimeStamp);
352
353        RequestStatus status = new RequestStatus();
354        if(requestDB.getStatusMessage() != null){
355            status.setStatusMessage(requestDB.getStatusMessage());
356        }
357
358        if(requestDB.getEndTime() != null){
359            String endTimeStamp = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss").format(requestDB.getEndTime()) + " GMT";
360            status.setFinishTime(endTimeStamp);
361        }
362
363
364        if(requestDB.getRequestStatus() != null){
365            status.setRequestState(requestDB.getRequestStatus());
366        }
367
368        if(requestDB.getProgress() != null){
369            status.setPercentProgress(requestDB.getProgress().intValue());
370        }
371
372        request.setRequestStatus(status);
373
374        return request;
375    }
376     }