Removed MsoLogger class
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / onap / so / apihandlerinfra / OrchestrationRequests.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Modifications Copyright (c) 2019 Samsung
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  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.so.apihandlerinfra;
24
25 import java.io.IOException;
26 import java.text.SimpleDateFormat;
27 import java.util.ArrayList;
28 import java.util.HashMap;
29 import java.util.List;
30 import java.util.Map;
31
32 import javax.transaction.Transactional;
33 import javax.ws.rs.Consumes;
34 import javax.ws.rs.GET;
35 import javax.ws.rs.POST;
36 import javax.ws.rs.Path;
37 import javax.ws.rs.PathParam;
38 import javax.ws.rs.Produces;
39 import javax.ws.rs.core.Context;
40 import javax.ws.rs.core.MediaType;
41 import javax.ws.rs.core.MultivaluedMap;
42 import javax.ws.rs.core.Response;
43 import javax.ws.rs.core.UriInfo;
44
45 import org.apache.commons.lang.StringUtils;
46 import org.apache.http.HttpStatus;
47 import org.onap.so.apihandler.common.ErrorNumbers;
48 import org.onap.so.apihandler.common.ResponseBuilder;
49 import org.onap.so.apihandlerinfra.exceptions.ApiException;
50 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
51
52 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
53 import org.onap.so.db.request.beans.InfraActiveRequests;
54 import org.onap.so.db.request.beans.RequestProcessingData;
55 import org.onap.so.db.request.client.RequestsDbClient;
56 import org.onap.so.exceptions.ValidationException;
57 import org.onap.so.logger.ErrorCode;
58 import org.onap.so.logger.MessageEnum;
59
60 import org.onap.so.serviceinstancebeans.GetOrchestrationListResponse;
61 import org.onap.so.serviceinstancebeans.GetOrchestrationResponse;
62 import org.onap.so.serviceinstancebeans.InstanceReferences;
63 import org.onap.so.serviceinstancebeans.Request;
64 import org.onap.so.serviceinstancebeans.RequestDetails;
65 import org.onap.so.serviceinstancebeans.RequestList;
66 import org.onap.so.serviceinstancebeans.RequestStatus;
67 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
68 import org.slf4j.Logger;
69 import org.slf4j.LoggerFactory;
70 import org.springframework.beans.factory.annotation.Autowired;
71 import org.springframework.stereotype.Component;
72
73 import com.fasterxml.jackson.databind.ObjectMapper;
74
75 import io.swagger.annotations.Api;
76 import io.swagger.annotations.ApiOperation;
77
78 @Path("onap/so/infra/orchestrationRequests")
79 @Api(value="onap/so/infra/orchestrationRequests",description="API Requests for Orchestration requests")
80 @Component
81 public class OrchestrationRequests {
82
83     private static Logger logger = LoggerFactory.getLogger(OrchestrationRequests.class);
84     
85
86     @Autowired
87         private RequestsDbClient requestsDbClient;
88
89     @Autowired
90     private MsoRequest msoRequest;
91     
92         @Autowired
93         private ResponseBuilder builder;
94
95         @GET
96         @Path("/{version:[vV][4-7]}/{requestId}")
97         @ApiOperation(value="Find Orchestrated Requests for a given requestId",response=Response.class)
98         @Produces(MediaType.APPLICATION_JSON)
99         @Transactional
100         public Response getOrchestrationRequest(@PathParam("requestId") String requestId, @PathParam("version") String version) throws ApiException{
101
102                 String apiVersion = version.substring(1);
103                 GetOrchestrationResponse orchestrationResponse = new GetOrchestrationResponse();
104
105
106                 InfraActiveRequests infraActiveRequest = null;
107                 List<org.onap.so.db.request.beans.RequestProcessingData> requestProcessingData = null;
108                 try {
109                         infraActiveRequest = requestsDbClient.getInfraActiveRequestbyRequestId(requestId);
110                 requestProcessingData = requestsDbClient.getRequestProcessingDataBySoRequestId(requestId);
111
112                 } catch (Exception e) {
113                     logger.error("Exception occurred", e);
114                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.AvailabilityError).build();
115
116
117
118
119                         ValidateException validateException = new ValidateException.Builder("Exception while communciate with Request DB - Infra Request Lookup",
120                                         HttpStatus.SC_NOT_FOUND,ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB).cause(e).errorInfo(errorLoggerInfo).build();
121
122
123                         throw validateException;
124
125                 }
126                 
127         if(infraActiveRequest == null) {
128
129             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, ErrorCode.BusinessProcesssError).build();
130
131
132             ValidateException validateException = new ValidateException.Builder("Orchestration RequestId " + requestId + " is not found in DB",
133                     HttpStatus.SC_NO_CONTENT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).errorInfo(errorLoggerInfo).build();
134
135             throw validateException;
136         }
137         
138         Request request = mapInfraActiveRequestToRequest(infraActiveRequest);
139         if(!requestProcessingData.isEmpty()){
140             request.setRequestProcessingData(mapRequestProcessingData(requestProcessingData));
141         }
142                 request.setRequestId(requestId);
143         orchestrationResponse.setRequest(request);
144         
145         return builder.buildResponse(HttpStatus.SC_OK, requestId, orchestrationResponse, apiVersion);
146         }
147
148         @GET
149         @Path("/{version:[vV][4-7]}")
150         @ApiOperation(value="Find Orchestrated Requests for a URI Information",response=Response.class)
151         @Produces(MediaType.APPLICATION_JSON)
152         @Transactional
153         public Response getOrchestrationRequest(@Context UriInfo ui, @PathParam("version") String version) throws ApiException{
154
155                 long startTime = System.currentTimeMillis ();
156                 
157                 MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
158
159                 List<InfraActiveRequests> activeRequests = null;
160
161                 GetOrchestrationListResponse orchestrationList = null;
162                 Map<String, List<String>> orchestrationMap;
163                 String apiVersion = version.substring(1);
164                 
165                 try {
166                         orchestrationMap = msoRequest.getOrchestrationFilters(queryParams);
167                         if (orchestrationMap.isEmpty()) {
168                                 throw new ValidationException("At least one filter query param must be specified");
169                         }
170                 }catch(ValidationException ex){
171                     logger.error("Exception occurred", ex);
172                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.DataError).build();
173                         ValidateException validateException = new ValidateException.Builder(ex.getMessage(),
174                                         HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR).cause(ex).errorInfo(errorLoggerInfo).build();
175                         throw validateException;
176
177                 }
178                         
179                 activeRequests = requestsDbClient.getOrchestrationFiltersFromInfraActive(orchestrationMap);
180
181                 orchestrationList = new GetOrchestrationListResponse();
182                 List<RequestList> requestLists = new ArrayList<>();
183                 
184                 for(InfraActiveRequests infraActive : activeRequests){
185                         List<RequestProcessingData> requestProcessingData = requestsDbClient.getRequestProcessingDataBySoRequestId(infraActive.getRequestId());
186                         RequestList requestList = new RequestList();
187                         Request request = mapInfraActiveRequestToRequest(infraActive);
188                         if(!requestProcessingData.isEmpty()){
189                                 request.setRequestProcessingData(mapRequestProcessingData(requestProcessingData));
190                 }
191                         requestList.setRequest(request);
192                         requestLists.add(requestList);
193                 }
194
195                 orchestrationList.setRequestList(requestLists);
196                 return builder.buildResponse(HttpStatus.SC_OK, null, orchestrationList, apiVersion);
197         }
198
199
200         @POST
201         @Path("/{version: [vV][4-7]}/{requestId}/unlock")
202         @Consumes(MediaType.APPLICATION_JSON)
203         @Produces(MediaType.APPLICATION_JSON)
204         @ApiOperation(value="Unlock Orchestrated Requests for a given requestId",response=Response.class)
205         @Transactional
206         public Response unlockOrchestrationRequest(String requestJSON, @PathParam("requestId") String requestId, @PathParam("version") String version) throws ApiException{
207
208                 long startTime = System.currentTimeMillis ();
209                 logger.debug ("requestId is: {}", requestId);
210                 ServiceInstancesRequest sir = null;
211
212                 InfraActiveRequests infraActiveRequest = null;
213                 Request request = null;
214                 
215                 try{
216                         ObjectMapper mapper = new ObjectMapper();
217                         sir = mapper.readValue(requestJSON, ServiceInstancesRequest.class);
218                 } catch(IOException e){
219                     logger.error("Exception occurred", e);
220             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError).build();
221             ValidateException validateException = new ValidateException.Builder("Mapping of request to JSON object failed : " + e.getMessage(),
222                     HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
223
224             throw validateException;
225
226                 }
227                 try{
228                         msoRequest.parseOrchestration(sir);
229                 } catch (Exception e) {
230                     logger.error("Exception occurred", e);
231                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError).build();
232                          ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
233                          .errorInfo(errorLoggerInfo).build();
234             throw validateException;
235                 }
236
237                 infraActiveRequest = requestsDbClient.getInfraActiveRequestbyRequestId(requestId);
238                 if(infraActiveRequest == null) {
239                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.BusinessProcesssError).build();
240
241
242                         ValidateException validateException = new ValidateException.Builder("Null response from RequestDB when searching by RequestId",
243                                         HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).errorInfo(errorLoggerInfo).build();
244
245                         throw validateException;
246
247                 }else{
248                         String status = infraActiveRequest.getRequestStatus();
249                         if(status.equalsIgnoreCase("IN_PROGRESS") || status.equalsIgnoreCase("PENDING") || status.equalsIgnoreCase("PENDING_MANUAL_TASK")){
250                                 infraActiveRequest.setRequestStatus("UNLOCKED");
251                                 infraActiveRequest.setLastModifiedBy(Constants.MODIFIED_BY_APIHANDLER);
252                                 infraActiveRequest.setRequestId(requestId);
253                                 requestsDbClient.save(infraActiveRequest);
254                         }else{
255
256                                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError).build();
257
258
259                                 ValidateException validateException = new ValidateException.Builder("Orchestration RequestId " + requestId + " has a status of " + status + " and can not be unlocked",
260                                                 HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).errorInfo(errorLoggerInfo).build();
261
262                                 throw validateException;
263                         }
264                 }
265                 return Response.status (HttpStatus.SC_NO_CONTENT).entity ("").build ();
266         }
267
268     private Request mapInfraActiveRequestToRequest(InfraActiveRequests iar)  throws ApiException{
269
270         String requestBody = iar.getRequestBody();
271         Request request = new Request();
272         
273         ObjectMapper mapper = new ObjectMapper();      
274
275        request.setRequestId(iar.getRequestId());
276        request.setRequestScope(iar.getRequestScope());
277        request.setRequestType(iar.getRequestAction());
278        String rollbackStatusMessage = iar.getRollbackStatusMessage();
279        String flowStatusMessage = iar.getFlowStatus();
280        String retryStatusMessage = iar.getRetryStatusMessage();
281        
282
283        InstanceReferences ir = new InstanceReferences();
284        if(iar.getNetworkId() != null)
285         ir.setNetworkInstanceId(iar.getNetworkId());
286        if(iar.getNetworkName() != null)
287         ir.setNetworkInstanceName(iar.getNetworkName());
288        if(iar.getServiceInstanceId() != null)
289         ir.setServiceInstanceId(iar.getServiceInstanceId());
290        if(iar.getServiceInstanceName() != null)
291         ir.setServiceInstanceName(iar.getServiceInstanceName());
292        if(iar.getVfModuleId() != null)
293         ir.setVfModuleInstanceId(iar.getVfModuleId());
294        if(iar.getVfModuleName() != null)
295         ir.setVfModuleInstanceName(iar.getVfModuleName());
296        if(iar.getVnfId() != null)
297         ir.setVnfInstanceId(iar.getVnfId());
298        if(iar.getVnfName() != null)
299         ir.setVnfInstanceName(iar.getVnfName());
300        if(iar.getVolumeGroupId() != null)
301         ir.setVolumeGroupInstanceId(iar.getVolumeGroupId());
302        if(iar.getVolumeGroupName() != null)
303         ir.setVolumeGroupInstanceName(iar.getVolumeGroupName());
304                 if(iar.getRequestorId() != null)
305                         ir.setRequestorId(iar.getRequestorId());
306                 if(iar.getInstanceGroupId() != null)
307                         ir.setInstanceGroupId(iar.getInstanceGroupId());
308                 if(iar.getInstanceGroupName() != null)
309                         ir.setInstanceGroupName(iar.getInstanceGroupName());
310                         
311
312
313                 request.setInstanceReferences(ir);
314
315        RequestDetails requestDetails = null;
316
317        if(StringUtils.isNotBlank(requestBody)) {
318                    try {
319                            if(requestBody.contains("\"requestDetails\":")){
320                                    ServiceInstancesRequest sir = mapper.readValue(requestBody, ServiceInstancesRequest.class);
321                                    requestDetails = sir.getRequestDetails();
322                            } else {
323                                    requestDetails = mapper.readValue(requestBody, RequestDetails.class);
324                            }
325                    } catch (IOException e) {
326                        logger.error("Exception occurred", e);
327                            ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError).build();
328                            ValidateException validateException = new ValidateException.Builder("Mapping of request to JSON object failed : ",
329                                            HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
330
331                            throw validateException;
332                    }
333            }
334        request.setRequestDetails(requestDetails);
335        
336        if(iar.getStartTime() != null) {
337                String startTimeStamp = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss").format(iar.getStartTime()) + " GMT";
338                request.setStartTime(startTimeStamp);
339        }
340        if(iar.getEndTime() != null){
341            String endTimeStamp = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss").format(iar.getEndTime()) + " GMT";
342            request.setFinishTime(endTimeStamp);
343        }
344        String statusMessages = null;
345        RequestStatus status = new RequestStatus();
346        if(iar.getStatusMessage() != null){
347           statusMessages = "STATUS: " + iar.getStatusMessage();
348        }
349        if(flowStatusMessage != null){
350            if(statusMessages != null){
351                    statusMessages = statusMessages + " " + "FLOW STATUS: " + flowStatusMessage;
352            }else{
353                    statusMessages = "FLOW STATUS: " + flowStatusMessage;
354            }
355        }
356        if(retryStatusMessage != null){
357            if(statusMessages != null){
358                    statusMessages = statusMessages + " " + "RETRY STATUS: " + retryStatusMessage;
359            }else{
360                    statusMessages = "RETRY STATUS: " + retryStatusMessage;
361            }
362        }
363        if(rollbackStatusMessage != null){
364            if(statusMessages != null){
365                    statusMessages = statusMessages + " " + "ROLLBACK STATUS: " + rollbackStatusMessage;
366            }else{
367                    statusMessages = "ROLLBACK STATUS: " + rollbackStatusMessage;
368            }
369        }
370        if(statusMessages != null){
371            status.setStatusMessage(statusMessages);
372        }
373        if(iar.getModifyTime() != null){
374            String timeStamp = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss").format(iar.getModifyTime()) + " GMT";
375            status.setTimeStamp(timeStamp);
376        }
377
378
379        if(iar.getRequestStatus() != null){
380            status.setRequestState(iar.getRequestStatus());
381        }
382
383        if(iar.getProgress() != null){
384            status.setPercentProgress(iar.getProgress().intValue());
385        }
386
387        request.setRequestStatus(status);
388
389        return request;
390    }
391    
392    public List<org.onap.so.serviceinstancebeans.RequestProcessingData> mapRequestProcessingData(List<org.onap.so.db.request.beans.RequestProcessingData> processingData){
393            List<org.onap.so.serviceinstancebeans.RequestProcessingData> addedRequestProcessingData = new ArrayList<>();
394            org.onap.so.serviceinstancebeans.RequestProcessingData finalProcessingData = new org.onap.so.serviceinstancebeans.RequestProcessingData();
395            String currentGroupingId = null;
396            HashMap<String, String> tempMap = new HashMap<>();
397            List<HashMap<String, String>> tempList = new ArrayList<>();
398            for(RequestProcessingData data : processingData){
399                    String groupingId = data.getGroupingId();
400                    String tag = data.getTag();
401                    if(currentGroupingId == null || !currentGroupingId.equals(groupingId)){
402                            if(!tempMap.isEmpty()){
403                                    tempList.add(tempMap);
404                                    finalProcessingData.setDataPairs(tempList);
405                                    addedRequestProcessingData.add(finalProcessingData);
406                            }
407                            finalProcessingData = new org.onap.so.serviceinstancebeans.RequestProcessingData();
408                            if(groupingId != null){
409                                    finalProcessingData.setGroupingId(groupingId);
410                            }
411                            if(tag != null){
412                                    finalProcessingData.setTag(tag);
413                            }
414                            currentGroupingId = groupingId;
415                            tempMap = new HashMap<>();
416                            tempList = new ArrayList<>();
417                            if(data.getName() != null && data.getValue() != null){
418                                    tempMap.put(data.getName(), data.getValue());
419                            }
420                    }else{
421                            if(data.getName() != null && data.getValue() != null){
422                                    tempMap.put(data.getName(), data.getValue());
423                            }
424                    }
425            }
426            if(tempMap.size() > 0){
427                    tempList.add(tempMap);
428                    finalProcessingData.setDataPairs(tempList);
429            }
430            addedRequestProcessingData.add(finalProcessingData);
431            return addedRequestProcessingData;
432    }
433  }