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 static org.apache.commons.lang3.ObjectUtils.notEqual;
25 import org.jetbrains.annotations.NotNull;
26 import org.onap.vid.dal.AsyncInstantiationRepository;
27 import org.onap.vid.job.Job;
28 import org.onap.vid.model.JobAuditStatus;
29 import org.onap.vid.mso.*;
30 import org.onap.vid.mso.rest.AsyncRequestStatus;
31 import org.onap.vid.mso.rest.AsyncRequestStatusList;
32 import org.springframework.stereotype.Service;
34 import javax.inject.Inject;
35 import java.util.List;
36 import java.util.Objects;
37 import java.util.UUID;
38 import java.util.stream.Collectors;
42 public class AuditServiceImpl implements AuditService{
44 private final RestMsoImplementation restMso;
45 private final AsyncInstantiationRepository asyncInstantiationRepository;
48 public AuditServiceImpl(RestMsoImplementation restMso, AsyncInstantiationRepository asyncInstantiationRepository) {
49 this.restMso = restMso;
50 this.asyncInstantiationRepository = asyncInstantiationRepository;
54 public void setFailedAuditStatusFromMso(UUID jobUuid, String requestId, int statusCode, String msoResponse){
55 final String failedMsoRequestStatus = "FAILED";
56 String additionalInfo = MsoUtil.formatExceptionAdditionalInfo(statusCode, msoResponse);
57 auditMsoStatus(jobUuid, failedMsoRequestStatus, requestId, additionalInfo);
61 public List<JobAuditStatus> getAuditStatusFromMsoByRequestId(UUID jobId, UUID requestId) {
62 String filter = "requestId:EQUALS:" + requestId;
63 return getAuditStatusFromMso(jobId, filter, null);
67 public List<JobAuditStatus> getAuditStatusFromMsoByInstanceId(JobAuditStatus.ResourceTypeFilter resourceTypeFilter, UUID instanceId, UUID jobId) {
68 String filter = resourceTypeFilter.getFilterBy() + ":EQUALS:" + instanceId;
69 return getAuditStatusFromMso(jobId, filter, instanceId);
73 public List<JobAuditStatus> getAuditStatusFromMsoByJobId(UUID jobId) {
74 List<JobAuditStatus> auditStatuses = getAuditStatuses(jobId, JobAuditStatus.SourceStatus.MSO);
75 String instanceName = getInstanceNameFromServiceInfo(jobId);
76 auditStatuses.stream().forEach(status ->
77 status.setInstanceName(instanceName)
83 public void auditVidStatus(UUID jobUUID, Job.JobStatus jobStatus){
84 JobAuditStatus vidStatus = new JobAuditStatus(jobUUID, jobStatus.toString(), JobAuditStatus.SourceStatus.VID);
85 auditStatus(vidStatus);
89 public void auditMsoStatus(UUID jobUUID, AsyncRequestStatus.Request msoRequestStatus){
90 auditMsoStatus(jobUUID, msoRequestStatus.requestStatus.getRequestState(), msoRequestStatus.requestId, msoRequestStatus.requestStatus.getStatusMessage());
94 public void auditMsoStatus(UUID jobUUID, String jobStatus, String requestId, String additionalInfo){
95 JobAuditStatus msoStatus = new JobAuditStatus(jobUUID, jobStatus, JobAuditStatus.SourceStatus.MSO,
96 requestId != null ? UUID.fromString(requestId) : null,
98 auditStatus(msoStatus);
101 private void auditStatus(JobAuditStatus jobAuditStatus){
102 JobAuditStatus latestStatus = getLatestAuditStatus(jobAuditStatus.getJobId(), jobAuditStatus.getSource());
104 if (notEqual(jobAuditStatus, latestStatus)) {
105 jobAuditStatus.setOrdinal(nextOrdinalAfter(latestStatus));
106 asyncInstantiationRepository.addJobAudiStatus(jobAuditStatus);
110 protected int nextOrdinalAfter(JobAuditStatus jobAuditStatus) {
111 return jobAuditStatus == null ? 0 : (jobAuditStatus.getOrdinal() + 1);
114 private JobAuditStatus getLatestAuditStatus(UUID jobUUID, JobAuditStatus.SourceStatus source){
115 List<JobAuditStatus> list = getAuditStatuses(jobUUID, source);
116 return !list.isEmpty() ? list.get(list.size()-1) : null;
119 public List<JobAuditStatus> getAuditStatuses(UUID jobUUID, JobAuditStatus.SourceStatus source) {
120 return asyncInstantiationRepository.getAuditStatuses(jobUUID, source);
124 //modelType is requestScope in MSO response
125 public List<AsyncRequestStatus.Request> retrieveRequestsFromMsoByServiceIdAndRequestTypeAndScope(String instanceId, String requestType, String modelType) {
126 String filter = JobAuditStatus.ResourceTypeFilter.SERVICE.getFilterBy() + ":EQUALS:" + instanceId;
127 List<AsyncRequestStatus> msoStatuses = getAsyncRequestStatusListFromMso(filter);
128 return msoStatuses.stream()
129 .filter(x -> Objects.equals(x.request.requestType, requestType) && Objects.equals(x.request.requestScope, modelType))
131 .collect(Collectors.toList());
134 private List<JobAuditStatus> getAuditStatusFromMso(UUID jobId, String filter, UUID instanceId) {
136 List<AsyncRequestStatus> msoStatuses = getAsyncRequestStatusListFromMso(filter);
138 //add service name from service info for each audit status (in case that serviceInstanceId is null all statuses belong to service)
139 String userInstanceName = (instanceId == null && jobId != null) ? getInstanceNameFromServiceInfo(jobId) : null;
140 return convertMsoResponseStatusToJobAuditStatus(msoStatuses, userInstanceName);
144 private List<AsyncRequestStatus> getAsyncRequestStatusListFromMso(String filter) {
145 String path = MsoBusinessLogicImpl.validateEndpointPath(MsoProperties.MSO_REST_API_GET_ORC_REQS) + "filter=" + filter;
146 RestObject<AsyncRequestStatusList> msoResponse = restMso.GetForObject(path , AsyncRequestStatusList.class);
147 if (msoResponse.getStatusCode() >= 400 || msoResponse.get() == null) {
148 throw new BadResponseFromMso(msoResponse);
150 return msoResponse.get().getRequestList();
153 private String getInstanceNameFromServiceInfo(UUID jobId) {
154 return asyncInstantiationRepository.getServiceInfoByJobId(jobId).getServiceInstanceName();
157 protected List<JobAuditStatus> convertMsoResponseStatusToJobAuditStatus(List<AsyncRequestStatus> msoStatuses, String defaultName){
158 return msoStatuses.stream().map(status ->
159 convertAsyncRequestStatusToJobAuditStatus(status, defaultName)
160 ).collect(Collectors.toList());
163 private JobAuditStatus convertAsyncRequestStatusToJobAuditStatus(AsyncRequestStatus status, String defaultName){
164 if (status == null) {
168 UUID requestId = null;
169 String instanceName = defaultName;
170 String jobStatus = null;
171 String additionalInfo = null;
172 String created = null;
173 String instanceType = null;
175 AsyncRequestStatus.Request request = status.request;
176 if(request != null) {
177 if (request.requestId != null) {
178 requestId = UUID.fromString(request.requestId);
180 instanceName = extractInstanceName(instanceName, request);
181 instanceType = request.requestScope;
182 if(request.requestStatus != null) {
183 jobStatus = request.requestStatus.getRequestState();
184 additionalInfo = request.requestStatus.getStatusMessage();
185 if(!request.requestStatus.getAdditionalProperties().isEmpty() &&
186 request.requestStatus.getAdditionalProperties().get("finishTime") != null) {
187 created = request.requestStatus.getAdditionalProperties().get("finishTime").toString();
189 created = request.requestStatus.getTimestamp();
193 return new JobAuditStatus(instanceName, jobStatus, requestId, additionalInfo, created, instanceType);
196 private String extractInstanceName(String instanceName, AsyncRequestStatus.Request request) {
197 if(request.requestDetails != null && request.requestDetails.requestInfo != null && request.requestDetails.requestInfo.instanceName != null) {
198 instanceName = request.requestDetails.requestInfo.instanceName;
204 public JobAuditStatus getResourceAuditStatus(String trackById) {
205 AsyncRequestStatus asyncRequestStatus = asyncInstantiationRepository.getResourceInfoByTrackId(trackById).getErrorMessage();
206 return convertAsyncRequestStatusToJobAuditStatus(asyncRequestStatus, null);
210 public static class BadResponseFromMso extends RuntimeException {
211 private final RestObject<AsyncRequestStatusList> msoResponse;
213 public BadResponseFromMso(RestObject<AsyncRequestStatusList> msoResponse) {
214 this.msoResponse = msoResponse;
217 public RestObject<AsyncRequestStatusList> getMsoResponse() {