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