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
index 7fb126e..287a771 100644 (file)
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
 package org.onap.vid.services;
 
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.commons.lang3.StringUtils;
-import org.onap.vid.exceptions.GenericUncheckedException;
+import static org.apache.commons.lang3.ObjectUtils.notEqual;
+
+import org.jetbrains.annotations.NotNull;
+import org.onap.vid.dal.AsyncInstantiationRepository;
+import org.onap.vid.job.Job;
 import org.onap.vid.model.JobAuditStatus;
-import org.onap.vid.mso.MsoBusinessLogicImpl;
-import org.onap.vid.mso.MsoProperties;
-import org.onap.vid.mso.RestMsoImplementation;
-import org.onap.vid.mso.RestObject;
+import org.onap.vid.mso.*;
 import org.onap.vid.mso.rest.AsyncRequestStatus;
 import org.onap.vid.mso.rest.AsyncRequestStatusList;
 import org.springframework.stereotype.Service;
 
 import javax.inject.Inject;
-import java.io.IOException;
 import java.util.List;
+import java.util.Objects;
 import java.util.UUID;
 import java.util.stream.Collectors;
 
@@ -43,41 +41,20 @@ import java.util.stream.Collectors;
 @Service
 public class AuditServiceImpl implements AuditService{
 
-    private final AsyncInstantiationBusinessLogic asyncInstantiationBL;
     private final RestMsoImplementation restMso;
+    private final AsyncInstantiationRepository asyncInstantiationRepository;
 
     @Inject
-    public AuditServiceImpl(AsyncInstantiationBusinessLogic asyncInstantiationBL, RestMsoImplementation restMso) {
-        this.asyncInstantiationBL = asyncInstantiationBL;
+    public AuditServiceImpl(RestMsoImplementation restMso, AsyncInstantiationRepository asyncInstantiationRepository) {
         this.restMso = restMso;
+        this.asyncInstantiationRepository = asyncInstantiationRepository;
     }
 
     @Override
     public void setFailedAuditStatusFromMso(UUID jobUuid, String requestId, int statusCode, String msoResponse){
         final String failedMsoRequestStatus = "FAILED";
-        String additionalInfo = formatExceptionAdditionalInfo(statusCode, msoResponse);
-        asyncInstantiationBL.auditMsoStatus(jobUuid, failedMsoRequestStatus, requestId, additionalInfo);
-    }
-
-    private String formatExceptionAdditionalInfo(int statusCode, String msoResponse) {
-        String errorMsg = "Http Code:" + statusCode;
-        if (!StringUtils.isEmpty(msoResponse)) {
-            String filteredJson;
-            try {
-                ObjectMapper objectMapper = new ObjectMapper();
-                filteredJson = StringUtils.defaultIfEmpty(
-                        objectMapper.readTree(msoResponse).path("serviceException").toString().replaceAll("[\\{\\}]","") ,
-                        msoResponse
-                );
-            } catch (JsonParseException e) {
-                filteredJson = msoResponse;
-            } catch (IOException e) {
-                throw new GenericUncheckedException(e);
-            }
-
-            errorMsg = errorMsg + ", " + filteredJson;
-        }
-        return errorMsg;
+        String additionalInfo = MsoUtil.formatExceptionAdditionalInfo(statusCode, msoResponse);
+        auditMsoStatus(jobUuid, failedMsoRequestStatus, requestId, additionalInfo);
     }
 
     @Override
@@ -87,64 +64,133 @@ public class AuditServiceImpl implements AuditService{
     }
 
     @Override
-    public List<JobAuditStatus> getAuditStatusFromMsoByServiceInstanceId(UUID jobId, UUID serviceInstanceId) {
-        String filter = "serviceInstanceId:EQUALS:" + serviceInstanceId;
-        return getAuditStatusFromMso(jobId, filter, serviceInstanceId);
+    public List<JobAuditStatus> getAuditStatusFromMsoByInstanceId(JobAuditStatus.ResourceTypeFilter resourceTypeFilter, UUID instanceId, UUID jobId) {
+        String filter = resourceTypeFilter.getFilterBy() + ":EQUALS:" + instanceId;
+        return getAuditStatusFromMso(jobId, filter, instanceId);
     }
 
     @Override
     public List<JobAuditStatus> getAuditStatusFromMsoByJobId(UUID jobId) {
-        List<JobAuditStatus> auditStatuses = asyncInstantiationBL.getAuditStatuses(jobId, JobAuditStatus.SourceStatus.MSO);
+        List<JobAuditStatus> auditStatuses = getAuditStatuses(jobId, JobAuditStatus.SourceStatus.MSO);
         String instanceName = getInstanceNameFromServiceInfo(jobId);
         auditStatuses.stream().forEach(status ->
-            status.setInstanceName(instanceName)
+                status.setInstanceName(instanceName)
         );
         return auditStatuses;
     }
 
+    @Override
+    public void auditVidStatus(UUID jobUUID, Job.JobStatus jobStatus){
+        JobAuditStatus vidStatus = new JobAuditStatus(jobUUID, jobStatus.toString(), JobAuditStatus.SourceStatus.VID);
+        auditStatus(vidStatus);
+    }
 
+    @Override
+    public void auditMsoStatus(UUID jobUUID, AsyncRequestStatus.Request msoRequestStatus){
+        auditMsoStatus(jobUUID, msoRequestStatus.requestStatus.getRequestState(), msoRequestStatus.requestId, msoRequestStatus.requestStatus.getStatusMessage());
+    }
+
+    @Override
+    public void auditMsoStatus(UUID jobUUID, String jobStatus, String requestId, String additionalInfo){
+        JobAuditStatus msoStatus = new JobAuditStatus(jobUUID, jobStatus, JobAuditStatus.SourceStatus.MSO,
+                requestId != null ? UUID.fromString(requestId) : null,
+                additionalInfo);
+        auditStatus(msoStatus);
+    }
 
-    private List<JobAuditStatus> getAuditStatusFromMso(UUID jobId, String filter, UUID serviceInstanceId) {
+    private void auditStatus(JobAuditStatus jobAuditStatus){
+        JobAuditStatus latestStatus = getLatestAuditStatus(jobAuditStatus.getJobId(), jobAuditStatus.getSource());
 
+        if (notEqual(jobAuditStatus, latestStatus)) {
+            jobAuditStatus.setOrdinal(nextOrdinalAfter(latestStatus));
+            asyncInstantiationRepository.addJobAudiStatus(jobAuditStatus);
+        }
+    }
+
+    protected int nextOrdinalAfter(JobAuditStatus jobAuditStatus) {
+        return jobAuditStatus == null ? 0 : (jobAuditStatus.getOrdinal() + 1);
+    }
+
+    private JobAuditStatus getLatestAuditStatus(UUID jobUUID, JobAuditStatus.SourceStatus source){
+        List<JobAuditStatus> list = getAuditStatuses(jobUUID, source);
+        return !list.isEmpty() ? list.get(list.size()-1) : null;
+    }
+
+    public List<JobAuditStatus> getAuditStatuses(UUID jobUUID, JobAuditStatus.SourceStatus source) {
+        return asyncInstantiationRepository.getAuditStatuses(jobUUID, source);
+    }
+
+    @Override
+    //modelType is requestScope in MSO response
+    public List<AsyncRequestStatus.Request> retrieveRequestsFromMsoByServiceIdAndRequestTypeAndScope(String instanceId, String requestType, String modelType) {
+        String filter = JobAuditStatus.ResourceTypeFilter.SERVICE.getFilterBy() + ":EQUALS:" + instanceId;
+        List<AsyncRequestStatus> msoStatuses = getAsyncRequestStatusListFromMso(filter);
+        return msoStatuses.stream()
+                .filter(x -> Objects.equals(x.request.requestType, requestType) && Objects.equals(x.request.requestScope, modelType))
+                .map(x -> x.request)
+                .collect(Collectors.toList());
+    }
+
+    private List<JobAuditStatus> getAuditStatusFromMso(UUID jobId, String filter, UUID instanceId) {
+
+        List<AsyncRequestStatus> msoStatuses = getAsyncRequestStatusListFromMso(filter);
+
+        //add service name from service info for each audit status (in case that serviceInstanceId is null all statuses belong to service)
+        String userInstanceName = (instanceId == null && jobId != null) ? getInstanceNameFromServiceInfo(jobId) : null;
+        return convertMsoResponseStatusToJobAuditStatus(msoStatuses, userInstanceName);
+    }
+
+    @NotNull
+    private List<AsyncRequestStatus> getAsyncRequestStatusListFromMso(String filter) {
         String path = MsoBusinessLogicImpl.validateEndpointPath(MsoProperties.MSO_REST_API_GET_ORC_REQS) + "filter=" + filter;
         RestObject<AsyncRequestStatusList> msoResponse = restMso.GetForObject(path , AsyncRequestStatusList.class);
         if (msoResponse.getStatusCode() >= 400 || msoResponse.get() == null) {
             throw new BadResponseFromMso(msoResponse);
         }
-
-        //add service name from service info for each audit status (in case that serviceInstanceId is null all statuses belong to service)
-        String userInstanceName = serviceInstanceId == null ? getInstanceNameFromServiceInfo(jobId): null;
-        return convertMsoResponseStatusToJobAuditStatus(msoResponse.get().getRequestList(), userInstanceName);
+        return msoResponse.get().getRequestList();
     }
 
     private String getInstanceNameFromServiceInfo(UUID jobId) {
-        return asyncInstantiationBL.getServiceInfoByJobId(jobId).getServiceInstanceName();
+        return asyncInstantiationRepository.getServiceInfoByJobId(jobId).getServiceInstanceName();
     }
 
     protected List<JobAuditStatus> convertMsoResponseStatusToJobAuditStatus(List<AsyncRequestStatus> msoStatuses, String defaultName){
-        return msoStatuses.stream().map(status -> {
-            UUID requestId = null;
-            String instanceName = defaultName;
-            String jobStatus = null;
-            String additionalInfo = null;
-            String created = null;
-            String instanceType = null;
-
-            AsyncRequestStatus.Request request = status.request;
-            if(request != null) {
+        return msoStatuses.stream().map(status ->
+                convertAsyncRequestStatusToJobAuditStatus(status, defaultName)
+        ).collect(Collectors.toList());
+    }
+
+    private JobAuditStatus convertAsyncRequestStatusToJobAuditStatus(AsyncRequestStatus status, String defaultName){
+        if (status == null) {
+            return null;
+        }
+
+        UUID requestId = null;
+        String instanceName = defaultName;
+        String jobStatus = null;
+        String additionalInfo = null;
+        String created = null;
+        String instanceType = null;
+
+        AsyncRequestStatus.Request request = status.request;
+        if(request != null) {
+            if (request.requestId != null) {
                 requestId = UUID.fromString(request.requestId);
-                instanceName = extractInstanceName(instanceName, request);
-                instanceType = request.requestScope;
-                if(request.requestStatus != null) {
-                    jobStatus = request.requestStatus.getRequestState();
-                    additionalInfo = request.requestStatus.getStatusMessage();
-                    if(!request.requestStatus.getAdditionalProperties().isEmpty()) {
-                        created = request.requestStatus.getAdditionalProperties().get("finishTime") != null? request.requestStatus.getAdditionalProperties().get("finishTime").toString() : request.requestStatus.getTimestamp();
-                    }
+            }
+            instanceName = extractInstanceName(instanceName, request);
+            instanceType = request.requestScope;
+            if(request.requestStatus != null) {
+                jobStatus = request.requestStatus.getRequestState();
+                additionalInfo = request.requestStatus.getStatusMessage();
+                if(!request.requestStatus.getAdditionalProperties().isEmpty() &&
+                        request.requestStatus.getAdditionalProperties().get("finishTime") != null) {
+                    created = request.requestStatus.getAdditionalProperties().get("finishTime").toString();
+                } else {
+                    created = request.requestStatus.getTimestamp();
                 }
             }
-            return new JobAuditStatus(instanceName, jobStatus, requestId, additionalInfo, created, instanceType);
-        }).collect(Collectors.toList());
+        }
+        return new JobAuditStatus(instanceName, jobStatus, requestId, additionalInfo, created, instanceType);
     }
 
     private String extractInstanceName(String instanceName, AsyncRequestStatus.Request request) {
@@ -154,6 +200,13 @@ public class AuditServiceImpl implements AuditService{
         return instanceName;
     }
 
+    @Override
+    public JobAuditStatus getResourceAuditStatus(String trackById) {
+        AsyncRequestStatus asyncRequestStatus = asyncInstantiationRepository.getResourceInfoByTrackId(trackById).getErrorMessage();
+        return convertAsyncRequestStatusToJobAuditStatus(asyncRequestStatus, null);
+    }
+
+
     public static class BadResponseFromMso extends RuntimeException {
         private final RestObject<AsyncRequestStatusList> msoResponse;