2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.onap.vid.services;
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;
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;
44 public class AuditServiceImpl implements AuditService{
46 private final AsyncInstantiationBusinessLogic asyncInstantiationBL;
47 private final RestMsoImplementation restMso;
50 public AuditServiceImpl(AsyncInstantiationBusinessLogic asyncInstantiationBL, RestMsoImplementation restMso) {
51 this.asyncInstantiationBL = asyncInstantiationBL;
52 this.restMso = restMso;
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);
62 private String formatExceptionAdditionalInfo(int statusCode, String msoResponse) {
63 String errorMsg = "Http Code:" + statusCode;
64 if (!StringUtils.isEmpty(msoResponse)) {
67 ObjectMapper objectMapper = new ObjectMapper();
68 filteredJson = StringUtils.defaultIfEmpty(
69 objectMapper.readTree(msoResponse).path("serviceException").toString().replaceAll("[\\{\\}]","") ,
72 } catch (JsonParseException e) {
73 filteredJson = msoResponse;
74 } catch (IOException e) {
75 throw new GenericUncheckedException(e);
78 errorMsg = errorMsg + ", " + filteredJson;
84 public List<JobAuditStatus> getAuditStatusFromMsoByRequestId(UUID jobId, UUID requestId) {
85 String filter = "requestId:EQUALS:" + requestId;
86 return getAuditStatusFromMso(jobId, filter, null);
90 public List<JobAuditStatus> getAuditStatusFromMsoByServiceInstanceId(UUID jobId, UUID serviceInstanceId) {
91 String filter = "serviceInstanceId:EQUALS:" + serviceInstanceId;
92 return getAuditStatusFromMso(jobId, filter, serviceInstanceId);
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)
102 return auditStatuses;
107 private List<JobAuditStatus> getAuditStatusFromMso(UUID jobId, String filter, UUID serviceInstanceId) {
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);
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);
120 private String getInstanceNameFromServiceInfo(UUID jobId) {
121 return asyncInstantiationBL.getServiceInfoByJobId(jobId).getServiceInstanceName();
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;
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();
146 return new JobAuditStatus(instanceName, jobStatus, requestId, additionalInfo, created, instanceType);
147 }).collect(Collectors.toList());
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;
157 public static class BadResponseFromMso extends RuntimeException {
158 private final RestObject<AsyncRequestStatusList> msoResponse;
160 public BadResponseFromMso(RestObject<AsyncRequestStatusList> msoResponse) {
161 this.msoResponse = msoResponse;
164 public RestObject<AsyncRequestStatusList> getMsoResponse() {