Implant vid-app-common org.onap.vid.job (main and test)
[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 static org.apache.commons.lang3.ObjectUtils.notEqual;
24
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;
33
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;
39
40
41 @Service
42 public class AuditServiceImpl implements AuditService{
43
44     private final RestMsoImplementation restMso;
45     private final AsyncInstantiationRepository asyncInstantiationRepository;
46
47     @Inject
48     public AuditServiceImpl(RestMsoImplementation restMso, AsyncInstantiationRepository asyncInstantiationRepository) {
49         this.restMso = restMso;
50         this.asyncInstantiationRepository = asyncInstantiationRepository;
51     }
52
53     @Override
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);
58     }
59
60     @Override
61     public List<JobAuditStatus> getAuditStatusFromMsoByRequestId(UUID jobId, UUID requestId) {
62         String filter = "requestId:EQUALS:" + requestId;
63         return getAuditStatusFromMso(jobId, filter, null);
64     }
65
66     @Override
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);
70     }
71
72     @Override
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)
78         );
79         return auditStatuses;
80     }
81
82     @Override
83     public void auditVidStatus(UUID jobUUID, Job.JobStatus jobStatus){
84         JobAuditStatus vidStatus = new JobAuditStatus(jobUUID, jobStatus.toString(), JobAuditStatus.SourceStatus.VID);
85         auditStatus(vidStatus);
86     }
87
88     @Override
89     public void auditMsoStatus(UUID jobUUID, AsyncRequestStatus.Request msoRequestStatus){
90         auditMsoStatus(jobUUID, msoRequestStatus.requestStatus.getRequestState(), msoRequestStatus.requestId, msoRequestStatus.requestStatus.getStatusMessage());
91     }
92
93     @Override
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,
97                 additionalInfo);
98         auditStatus(msoStatus);
99     }
100
101     private void auditStatus(JobAuditStatus jobAuditStatus){
102         JobAuditStatus latestStatus = getLatestAuditStatus(jobAuditStatus.getJobId(), jobAuditStatus.getSource());
103
104         if (notEqual(jobAuditStatus, latestStatus)) {
105             jobAuditStatus.setOrdinal(nextOrdinalAfter(latestStatus));
106             asyncInstantiationRepository.addJobAudiStatus(jobAuditStatus);
107         }
108     }
109
110     protected int nextOrdinalAfter(JobAuditStatus jobAuditStatus) {
111         return jobAuditStatus == null ? 0 : (jobAuditStatus.getOrdinal() + 1);
112     }
113
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;
117     }
118
119     public List<JobAuditStatus> getAuditStatuses(UUID jobUUID, JobAuditStatus.SourceStatus source) {
120         return asyncInstantiationRepository.getAuditStatuses(jobUUID, source);
121     }
122
123     @Override
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))
130                 .map(x -> x.request)
131                 .collect(Collectors.toList());
132     }
133
134     private List<JobAuditStatus> getAuditStatusFromMso(UUID jobId, String filter, UUID instanceId) {
135
136         List<AsyncRequestStatus> msoStatuses = getAsyncRequestStatusListFromMso(filter);
137
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);
141     }
142
143     @NotNull
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);
149         }
150         return msoResponse.get().getRequestList();
151     }
152
153     private String getInstanceNameFromServiceInfo(UUID jobId) {
154         return asyncInstantiationRepository.getServiceInfoByJobId(jobId).getServiceInstanceName();
155     }
156
157     protected List<JobAuditStatus> convertMsoResponseStatusToJobAuditStatus(List<AsyncRequestStatus> msoStatuses, String defaultName){
158         return msoStatuses.stream().map(status ->
159                 convertAsyncRequestStatusToJobAuditStatus(status, defaultName)
160         ).collect(Collectors.toList());
161     }
162
163     private JobAuditStatus convertAsyncRequestStatusToJobAuditStatus(AsyncRequestStatus status, String defaultName){
164         if (status == null) {
165             return null;
166         }
167
168         UUID requestId = null;
169         String instanceName = defaultName;
170         String jobStatus = null;
171         String additionalInfo = null;
172         String created = null;
173         String instanceType = null;
174
175         AsyncRequestStatus.Request request = status.request;
176         if(request != null) {
177             if (request.requestId != null) {
178                 requestId = UUID.fromString(request.requestId);
179             }
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();
188                 } else {
189                     created = request.requestStatus.getTimestamp();
190                 }
191             }
192         }
193         return new JobAuditStatus(instanceName, jobStatus, requestId, additionalInfo, created, instanceType);
194     }
195
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;
199         }
200         return instanceName;
201     }
202
203     @Override
204     public JobAuditStatus getResourceAuditStatus(String trackById) {
205         AsyncRequestStatus asyncRequestStatus = asyncInstantiationRepository.getResourceInfoByTrackId(trackById).getErrorMessage();
206         return convertAsyncRequestStatusToJobAuditStatus(asyncRequestStatus, null);
207     }
208
209
210     public static class BadResponseFromMso extends RuntimeException {
211         private final RestObject<AsyncRequestStatusList> msoResponse;
212
213         public BadResponseFromMso(RestObject<AsyncRequestStatusList> msoResponse) {
214             this.msoResponse = msoResponse;
215         }
216
217         public RestObject<AsyncRequestStatusList> getMsoResponse() {
218             return msoResponse;
219         }
220     }
221 }