7fb126e23507fe9aa3468ddf89fdb077ee930edc
[vid.git] / vid-app-common / src / main / java / org / onap / vid / services / AuditServiceImpl.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * VID
4  * ================================================================================
5  * Copyright (C) 2017 - 2019 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
21 package org.onap.vid.services;
22
23 import com.fasterxml.jackson.core.JsonParseException;
24 import com.fasterxml.jackson.databind.ObjectMapper;
25 import org.apache.commons.lang3.StringUtils;
26 import org.onap.vid.exceptions.GenericUncheckedException;
27 import org.onap.vid.model.JobAuditStatus;
28 import org.onap.vid.mso.MsoBusinessLogicImpl;
29 import org.onap.vid.mso.MsoProperties;
30 import org.onap.vid.mso.RestMsoImplementation;
31 import org.onap.vid.mso.RestObject;
32 import org.onap.vid.mso.rest.AsyncRequestStatus;
33 import org.onap.vid.mso.rest.AsyncRequestStatusList;
34 import org.springframework.stereotype.Service;
35
36 import javax.inject.Inject;
37 import java.io.IOException;
38 import java.util.List;
39 import java.util.UUID;
40 import java.util.stream.Collectors;
41
42
43 @Service
44 public class AuditServiceImpl implements AuditService{
45
46     private final AsyncInstantiationBusinessLogic asyncInstantiationBL;
47     private final RestMsoImplementation restMso;
48
49     @Inject
50     public AuditServiceImpl(AsyncInstantiationBusinessLogic asyncInstantiationBL, RestMsoImplementation restMso) {
51         this.asyncInstantiationBL = asyncInstantiationBL;
52         this.restMso = restMso;
53     }
54
55     @Override
56     public void setFailedAuditStatusFromMso(UUID jobUuid, String requestId, int statusCode, String msoResponse){
57         final String failedMsoRequestStatus = "FAILED";
58         String additionalInfo = formatExceptionAdditionalInfo(statusCode, msoResponse);
59         asyncInstantiationBL.auditMsoStatus(jobUuid, failedMsoRequestStatus, requestId, additionalInfo);
60     }
61
62     private String formatExceptionAdditionalInfo(int statusCode, String msoResponse) {
63         String errorMsg = "Http Code:" + statusCode;
64         if (!StringUtils.isEmpty(msoResponse)) {
65             String filteredJson;
66             try {
67                 ObjectMapper objectMapper = new ObjectMapper();
68                 filteredJson = StringUtils.defaultIfEmpty(
69                         objectMapper.readTree(msoResponse).path("serviceException").toString().replaceAll("[\\{\\}]","") ,
70                         msoResponse
71                 );
72             } catch (JsonParseException e) {
73                 filteredJson = msoResponse;
74             } catch (IOException e) {
75                 throw new GenericUncheckedException(e);
76             }
77
78             errorMsg = errorMsg + ", " + filteredJson;
79         }
80         return errorMsg;
81     }
82
83     @Override
84     public List<JobAuditStatus> getAuditStatusFromMsoByRequestId(UUID jobId, UUID requestId) {
85         String filter = "requestId:EQUALS:" + requestId;
86         return getAuditStatusFromMso(jobId, filter, null);
87     }
88
89     @Override
90     public List<JobAuditStatus> getAuditStatusFromMsoByServiceInstanceId(UUID jobId, UUID serviceInstanceId) {
91         String filter = "serviceInstanceId:EQUALS:" + serviceInstanceId;
92         return getAuditStatusFromMso(jobId, filter, serviceInstanceId);
93     }
94
95     @Override
96     public List<JobAuditStatus> getAuditStatusFromMsoByJobId(UUID jobId) {
97         List<JobAuditStatus> auditStatuses = asyncInstantiationBL.getAuditStatuses(jobId, JobAuditStatus.SourceStatus.MSO);
98         String instanceName = getInstanceNameFromServiceInfo(jobId);
99         auditStatuses.stream().forEach(status ->
100             status.setInstanceName(instanceName)
101         );
102         return auditStatuses;
103     }
104
105
106
107     private List<JobAuditStatus> getAuditStatusFromMso(UUID jobId, String filter, UUID serviceInstanceId) {
108
109         String path = MsoBusinessLogicImpl.validateEndpointPath(MsoProperties.MSO_REST_API_GET_ORC_REQS) + "filter=" + filter;
110         RestObject<AsyncRequestStatusList> msoResponse = restMso.GetForObject(path , AsyncRequestStatusList.class);
111         if (msoResponse.getStatusCode() >= 400 || msoResponse.get() == null) {
112             throw new BadResponseFromMso(msoResponse);
113         }
114
115         //add service name from service info for each audit status (in case that serviceInstanceId is null all statuses belong to service)
116         String userInstanceName = serviceInstanceId == null ? getInstanceNameFromServiceInfo(jobId): null;
117         return convertMsoResponseStatusToJobAuditStatus(msoResponse.get().getRequestList(), userInstanceName);
118     }
119
120     private String getInstanceNameFromServiceInfo(UUID jobId) {
121         return asyncInstantiationBL.getServiceInfoByJobId(jobId).getServiceInstanceName();
122     }
123
124     protected List<JobAuditStatus> convertMsoResponseStatusToJobAuditStatus(List<AsyncRequestStatus> msoStatuses, String defaultName){
125         return msoStatuses.stream().map(status -> {
126             UUID requestId = null;
127             String instanceName = defaultName;
128             String jobStatus = null;
129             String additionalInfo = null;
130             String created = null;
131             String instanceType = null;
132
133             AsyncRequestStatus.Request request = status.request;
134             if(request != null) {
135                 requestId = UUID.fromString(request.requestId);
136                 instanceName = extractInstanceName(instanceName, request);
137                 instanceType = request.requestScope;
138                 if(request.requestStatus != null) {
139                     jobStatus = request.requestStatus.getRequestState();
140                     additionalInfo = request.requestStatus.getStatusMessage();
141                     if(!request.requestStatus.getAdditionalProperties().isEmpty()) {
142                         created = request.requestStatus.getAdditionalProperties().get("finishTime") != null? request.requestStatus.getAdditionalProperties().get("finishTime").toString() : request.requestStatus.getTimestamp();
143                     }
144                 }
145             }
146             return new JobAuditStatus(instanceName, jobStatus, requestId, additionalInfo, created, instanceType);
147         }).collect(Collectors.toList());
148     }
149
150     private String extractInstanceName(String instanceName, AsyncRequestStatus.Request request) {
151         if(request.requestDetails != null && request.requestDetails.requestInfo != null && request.requestDetails.requestInfo.instanceName != null) {
152             instanceName = request.requestDetails.requestInfo.instanceName;
153         }
154         return instanceName;
155     }
156
157     public static class BadResponseFromMso extends RuntimeException {
158         private final RestObject<AsyncRequestStatusList> msoResponse;
159
160         public BadResponseFromMso(RestObject<AsyncRequestStatusList> msoResponse) {
161             this.msoResponse = msoResponse;
162         }
163
164         public RestObject<AsyncRequestStatusList> getMsoResponse() {
165             return msoResponse;
166         }
167     }
168 }