package org.onap.vid.job.command; import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; import org.onap.vid.job.Job; import org.onap.vid.job.impl.JobSharedData; import org.onap.vid.mso.RestMsoImplementation; import org.onap.vid.mso.RestObject; import org.onap.vid.mso.rest.AsyncRequestStatus; import org.onap.vid.services.AsyncInstantiationBusinessLogic; import org.onap.vid.services.AuditService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.ZonedDateTime; import java.time.format.DateTimeParseException; import java.util.UUID; import static org.onap.vid.utils.TimeUtils.parseZonedDateTime; @Service public class InProgressStatusService { private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(InProgressStatusService.class); private final AsyncInstantiationBusinessLogic asyncInstantiationBL; private final RestMsoImplementation restMso; private final AuditService auditService; @Autowired public InProgressStatusService(AsyncInstantiationBusinessLogic asyncInstantiationBL, RestMsoImplementation restMso, AuditService auditService) { this.asyncInstantiationBL = asyncInstantiationBL; this.restMso = restMso; this.auditService = auditService; } public Job.JobStatus call(ExpiryChecker expiryChecker, JobSharedData sharedData, String requestId) { RestObject asyncRequestStatus = getAsyncRequestStatus(requestId); asyncInstantiationBL.auditMsoStatus(sharedData.getRootJobId(), asyncRequestStatus.get().request); Job.JobStatus jobStatus = asyncInstantiationBL.calcStatus(asyncRequestStatus.get()); ZonedDateTime jobStartTime = getZonedDateTime(asyncRequestStatus, requestId); jobStatus = expiryChecker.isExpired(jobStartTime) ? Job.JobStatus.FAILED : jobStatus; return jobStatus; } private RestObject getAsyncRequestStatus(String requestId) { String path = asyncInstantiationBL.getOrchestrationRequestsPath()+"/"+requestId; RestObject msoResponse = restMso.GetForObject(path, AsyncRequestStatus.class); if (msoResponse.getStatusCode() >= 400 || msoResponse.get() == null) { throw new BadResponseFromMso(msoResponse); } return msoResponse; } public void handleFailedMsoResponse(UUID jobUUID, String requestId, RestObject msoResponse) { auditService.setFailedAuditStatusFromMso(jobUUID, requestId, msoResponse.getStatusCode(), msoResponse.getRaw()); LOGGER.error(EELFLoggerDelegate.errorLogger, "Failed to get orchestration status for {}. Status code: {}, Body: {}", requestId, msoResponse.getStatusCode(), msoResponse.getRaw()); } public static class BadResponseFromMso extends RuntimeException { private final RestObject msoResponse; public BadResponseFromMso(RestObject msoResponse) { this.msoResponse = msoResponse; } public RestObject getMsoResponse() { return msoResponse; } } private ZonedDateTime getZonedDateTime(RestObject asyncRequestStatusResponse, String requestId) { ZonedDateTime jobStartTime; try { jobStartTime = parseZonedDateTime(asyncRequestStatusResponse.get().request.startTime); } catch (DateTimeParseException | NullPointerException e) { LOGGER.error(EELFLoggerDelegate.errorLogger, "Failed to parse start time for {}, body: {}. Current time will be used", requestId, asyncRequestStatusResponse.getRaw(), e); jobStartTime = ZonedDateTime.now(); } return jobStartTime; } }