1 package org.onap.vid.services;
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;
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;
24 public class AuditServiceImpl implements AuditService{
26 private final AsyncInstantiationBusinessLogic asyncInstantiationBL;
27 private final RestMsoImplementation restMso;
30 public AuditServiceImpl(AsyncInstantiationBusinessLogic asyncInstantiationBL, RestMsoImplementation restMso) {
31 this.asyncInstantiationBL = asyncInstantiationBL;
32 this.restMso = restMso;
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);
42 private String formatExceptionAdditionalInfo(int statusCode, String msoResponse) {
43 String errorMsg = "Http Code:" + statusCode;
44 if (!StringUtils.isEmpty(msoResponse)) {
47 ObjectMapper objectMapper = new ObjectMapper();
48 filteredJson = StringUtils.defaultIfEmpty(
49 objectMapper.readTree(msoResponse).path("serviceException").toString().replaceAll("[\\{\\}]","") ,
52 } catch (JsonParseException e) {
53 filteredJson = msoResponse;
54 } catch (IOException e) {
55 throw new GenericUncheckedException(e);
58 errorMsg = errorMsg + ", " + filteredJson;
64 public List<JobAuditStatus> getAuditStatusFromMsoByRequestId(UUID jobId, UUID requestId) {
65 String filter = "requestId:EQUALS:" + requestId;
66 return getAuditStatusFromMso(jobId, filter, null);
70 public List<JobAuditStatus> getAuditStatusFromMsoByServiceInstanceId(UUID jobId, UUID serviceInstanceId) {
71 String filter = "serviceInstanceId:EQUALS:" + serviceInstanceId;
72 return getAuditStatusFromMso(jobId, filter, serviceInstanceId);
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)
87 private List<JobAuditStatus> getAuditStatusFromMso(UUID jobId, String filter, UUID serviceInstanceId) {
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);
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);
100 private String getInstanceNameFromServiceInfo(UUID jobId) {
101 return asyncInstantiationBL.getServiceInfoByJobId(jobId).getServiceInstanceName();
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;
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();
126 return new JobAuditStatus(instanceName, jobStatus, requestId, additionalInfo, created, instanceType);
127 }).collect(Collectors.toList());
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;
137 public static class BadResponseFromMso extends RuntimeException {
138 private final RestObject<AsyncRequestStatusList> msoResponse;
140 public BadResponseFromMso(RestObject<AsyncRequestStatusList> msoResponse) {
141 this.msoResponse = msoResponse;
144 public RestObject<AsyncRequestStatusList> getMsoResponse() {