package org.akraino.validation.ui.service; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import javax.annotation.Nonnull; import org.akraino.validation.ui.client.nexus.resources.RobotTestResult; import org.akraino.validation.ui.client.nexus.resources.ValidationNexusTestResult; import org.akraino.validation.ui.client.nexus.resources.WRobotNexusTestResult; import org.akraino.validation.ui.dao.ValidationTestResultDAO; import org.akraino.validation.ui.dao.WRobotTestResultDAO; import org.akraino.validation.ui.data.BlueprintLayer; import org.akraino.validation.ui.data.JnksJobNotify; import org.akraino.validation.ui.data.Lab; import org.akraino.validation.ui.data.SubmissionData; import org.akraino.validation.ui.entity.LabInfo; import org.akraino.validation.ui.entity.LabSilo; import org.akraino.validation.ui.entity.Submission; import org.akraino.validation.ui.entity.ValidationDbTestResult; import org.akraino.validation.ui.entity.WRobotDbTestResult; import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; import org.onap.portalsdk.core.web.support.UserUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; @Service @Transactional public class DbResultAdapter { private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(DbResultAdapter.class); private static final Object LOCK = new Object(); @Autowired LabService labService; @Autowired private ValidationTestResultDAO vTestResultDAO; @Autowired private WRobotTestResultDAO wRobotDAO; @Autowired private SiloService siloService; @Autowired DbSubmissionAdapter subService; public void associateSubmissionWithValidationResult(SubmissionData submissionData) throws JsonParseException, JsonMappingException, IOException { synchronized (LOCK) { ValidationDbTestResult vDbTestResult = this .convertValidationNexusToDb(submissionData.getValidationNexusTestResult()); Submission submission = new Submission(); submission.setSubmissionId(submissionData.getSubmissionId()); vDbTestResult.setSubmission(submission); vTestResultDAO.saveOrUpdate(vDbTestResult); List vRobotDbResults = this.convertWRobotNexusResultsToDb( submissionData.getValidationNexusTestResult().getwRobotNexusTestResults()); if (vRobotDbResults != null) { for (WRobotDbTestResult vRobotDbResult : vRobotDbResults) { vRobotDbResult.setValidationTestResult(vDbTestResult); wRobotDAO.saveOrUpdate(vRobotDbResult); } } } } public void storeResultInDb(List vNexusResults) { synchronized (LOCK) { if (vNexusResults == null || vNexusResults.size() < 1) { return; } for (ValidationNexusTestResult vNexusResult : vNexusResults) { if (!checkValidityOfValidationNexusTestResult(vNexusResult)) { continue; } LabInfo labInfo = null; for (LabSilo silo : siloService.getSilos()) { if (silo.getSilo().equals(vNexusResult.getSilo())) { labInfo = silo.getLab(); } } ValidationDbTestResult vDbResult = vTestResultDAO.getValidationTestResult(labInfo, vNexusResult.getTimestamp()); if (vDbResult == null) { vDbResult = new ValidationDbTestResult(); vDbResult.setLab(labInfo); vDbResult.setTimestamp(vNexusResult.getTimestamp()); vDbResult.setBlueprintName(vNexusResult.getBlueprintName()); vDbResult.setVersion(vNexusResult.getVersion()); vDbResult.setAllLayers(vNexusResult.getAllLayers()); vDbResult.setOptional(vNexusResult.getOptional()); } vDbResult.setResult(vNexusResult.getResult()); vDbResult.setDateStorage(vNexusResult.getDateOfStorage()); LOGGER.debug(EELFLoggerDelegate.debugLogger, "Storing validation test result with keys: blueprint name: " + vNexusResult.getBlueprintName() + ", version: " + vNexusResult.getVersion() + ", lab: " + vNexusResult.getSilo() + ", timestamp: " + vNexusResult.getTimestamp()); vTestResultDAO.saveOrUpdate(vDbResult); List wRobotDbResults = wRobotDAO .getWRobotTestResult(vDbResult); if (wRobotDbResults == null) { // Store the new wrapper robot rest results in db for (WRobotNexusTestResult wNexusResult : vNexusResult.getwRobotNexusTestResults()) { WRobotDbTestResult wRobotDbResult = new WRobotDbTestResult(); wRobotDbResult.setLayer(wNexusResult.getBlueprintLayer().name()); wRobotDbResult.setValidationTestResult(vDbResult); ObjectMapper mapper = new ObjectMapper(); try { wRobotDbResult .setRobotTestResults(mapper.writeValueAsString(wNexusResult.getRobotTestResults())); } catch (JsonProcessingException e) { LOGGER.error(EELFLoggerDelegate.errorLogger, "Error while converting POJO to string. " + UserUtils.getStackTrace(e)); continue; } wRobotDAO.saveOrUpdate(wRobotDbResult); } } else if (vDbResult.getSubmission() != null) { // update validation result related to submission for (WRobotNexusTestResult wNexusResult : vNexusResult.getwRobotNexusTestResults()) { WRobotDbTestResult wRobotDbResult = wRobotDAO .getWRobotTestResult(wNexusResult.getBlueprintLayer().name(), vDbResult); ObjectMapper mapper = new ObjectMapper(); try { wRobotDbResult .setRobotTestResults(mapper.writeValueAsString(wNexusResult.getRobotTestResults())); } catch (JsonProcessingException e) { LOGGER.error(EELFLoggerDelegate.errorLogger, "Error while converting POJO to string. " + UserUtils.getStackTrace(e)); continue; } wRobotDAO.saveOrUpdate(wRobotDbResult); } } } } } public void updateTimestamp(JnksJobNotify jnksJobNotify) { synchronized (LOCK) { if (!checkValidityOfJenkinsNotification(jnksJobNotify)) { return; } ValidationDbTestResult vDbSubmission = vTestResultDAO .getValidationTestResult(subService.getSubmission(String.valueOf(jnksJobNotify.getSubmissionId()))); ValidationDbTestResult vDbTimestamp = vTestResultDAO.getValidationTestResult(vDbSubmission.getLab(), jnksJobNotify.getTimestamp()); if (vDbTimestamp == null) { vDbSubmission.setTimestamp(jnksJobNotify.getTimestamp()); vTestResultDAO.saveOrUpdate(vDbSubmission); return; } // Delete the wrobot results associated with submission validation result List wRobotResults = wRobotDAO.getWRobotTestResult(vDbSubmission); if (wRobotResults != null && wRobotResults.size() > 0) { for (WRobotDbTestResult wRobotResult : wRobotResults) { wRobotDAO.deleteWRobotTestResult(wRobotResult.getWRobotResultId()); } } // Change the timestamp wrobot results to point to submission validation result wRobotResults = wRobotDAO.getWRobotTestResult(vDbTimestamp); if (wRobotResults != null && wRobotResults.size() > 0) { for (WRobotDbTestResult wRobotResult : wRobotResults) { wRobotResult.setValidationTestResult(vDbSubmission); wRobotDAO.saveOrUpdate(wRobotResult); } } vTestResultDAO.deleteValidationTestResult(vDbTimestamp); // Now vDbSubmission can be updated vDbSubmission.setDateStorage(vDbTimestamp.getDateStorage()); vDbSubmission.setResult(vDbTimestamp.getResult()); vDbSubmission.setTimestamp(vDbTimestamp.getTimestamp()); vTestResultDAO.saveOrUpdate(vDbSubmission); } } public List readResultFromDb(String blueprintName, String version, Lab lab, List layers, Boolean allLayers, Boolean optional, Boolean outcome) throws JsonParseException, JsonMappingException, IOException { synchronized (LOCK) { LabInfo actualLabInfo = labService.getLab(lab); List vDbResults = vTestResultDAO.getValidationTestResults(blueprintName, version, actualLabInfo, allLayers, optional, outcome); if (vDbResults == null || vDbResults.size() < 1) { return null; } List vNexusResults = new ArrayList(); for (ValidationDbTestResult vDbResult : vDbResults) { if (layers != null && layers.size() > 0) { List storedLayers = new ArrayList(); List wDbResults = wRobotDAO.getWRobotTestResult(vDbResult); if (wDbResults == null || wDbResults.size() < 1) { continue; } for (WRobotDbTestResult wRobot : wDbResults) { storedLayers.add(BlueprintLayer.valueOf(wRobot.getLayer())); } if (!new HashSet<>(storedLayers).equals(new HashSet<>(layers))) { continue; } } vNexusResults.add(convertValidationDbToNexus(vDbResult)); } return vNexusResults; } } public ValidationNexusTestResult readResultFromDb(@Nonnull Lab lab, @Nonnull String timestamp) throws JsonParseException, JsonMappingException, IOException { synchronized (LOCK) { LabInfo actualLabInfo = labService.getLab(lab); ValidationDbTestResult vDbResult = vTestResultDAO.getValidationTestResult(actualLabInfo, timestamp); if (vDbResult == null) { return null; } return convertValidationDbToNexus(vDbResult); } } public ValidationNexusTestResult readResultFromDb(@Nonnull String submissionId) throws JsonParseException, JsonMappingException, IOException { synchronized (LOCK) { ValidationDbTestResult vDbResult = vTestResultDAO .getValidationTestResult(subService.getSubmission(submissionId)); if (vDbResult == null) { return null; } return convertValidationDbToNexus(vDbResult); } } public void deleteUnreferencedEntries(List vNexusResults) { synchronized (LOCK) { if (vNexusResults == null || vNexusResults.size() < 1) { return; } LabInfo labInfo = null; for (LabSilo silo : siloService.getSilos()) { if (silo.getSilo().equals(vNexusResults.get(0).getSilo())) { labInfo = silo.getLab(); } } if (labInfo == null) { return; } List vDbResults = vTestResultDAO.getValidationTestResults( vNexusResults.get(0).getBlueprintName(), vNexusResults.get(0).getVersion(), labInfo, null, null, null); if (vDbResults == null || vDbResults.size() < 1) { return; } for (ValidationDbTestResult vDbResult : vDbResults) { if (vDbResult.getSubmission() != null) { continue; } boolean deletion = true; String dbTimestamp = vDbResult.getTimestamp(); LabInfo dbLabInfo = vDbResult.getLab(); for (ValidationNexusTestResult vNexusResult : vNexusResults) { LabInfo nexusLabInfo = null; for (LabSilo silo : siloService.getSilos()) { if (silo.getSilo().equals(vNexusResult.getSilo())) { nexusLabInfo = silo.getLab(); } } if (nexusLabInfo == null) { continue; } if (vNexusResult.getTimestamp().equals(dbTimestamp) && nexusLabInfo.equals(dbLabInfo)) { deletion = false; break; } } if (deletion) { LOGGER.debug(EELFLoggerDelegate.debugLogger, "Deleting unreferenced validation result with id: " + vDbResult.getResultId()); // Delete old associated wrapper robot rest results from db for (WRobotDbTestResult wRobotDbResult : wRobotDAO.getWRobotTestResult(vDbResult)) { wRobotDAO.deleteWRobotTestResult(wRobotDbResult.getWRobotResultId()); } vTestResultDAO.deleteValidationTestResult(vDbResult); } } } } public List getValidationTestResults() { synchronized (LOCK) { return vTestResultDAO.getValidationTestResults(); } } public ValidationDbTestResult getValidationTestResult(Integer resultId) { synchronized (LOCK) { return vTestResultDAO.getValidationTestResult(resultId); } } public List getValidationTestResults(String blueprintName, String version, LabInfo labInfo, Boolean allLayers, Boolean optional, Boolean outcome) { synchronized (LOCK) { return vTestResultDAO.getValidationTestResults(blueprintName, version, labInfo, allLayers, optional, outcome); } } public ValidationDbTestResult getValidationTestResult(LabInfo labInfo, String timestamp) { synchronized (LOCK) { return vTestResultDAO.getValidationTestResult(labInfo, timestamp); } } public ValidationDbTestResult getValidationTestResult(@Nonnull Submission submission) { synchronized (LOCK) { return vTestResultDAO.getValidationTestResult(submission); } } public List getWRobotTestResults() { synchronized (LOCK) { return wRobotDAO.getWRobotTestResults(); } } public WRobotDbTestResult getWRobotTestResult(Integer wRobotResultId) { synchronized (LOCK) { return wRobotDAO.getWRobotTestResult(wRobotResultId); } } public List getWRobotTestResult(ValidationDbTestResult vResult) { synchronized (LOCK) { return wRobotDAO.getWRobotTestResult(vResult); } } private ValidationNexusTestResult convertValidationDbToNexus(ValidationDbTestResult vDbResult) throws JsonParseException, JsonMappingException, IOException { ValidationNexusTestResult vNexusResult = new ValidationNexusTestResult(); vNexusResult.setResultId(vDbResult.getResultId()); vNexusResult.setBlueprintName(vDbResult.getBlueprintName()); vNexusResult.setVersion(vDbResult.getVersion()); vNexusResult.setAllLayers(vDbResult.getAllLayers()); vNexusResult.setDateOfStorage(vDbResult.getDateStorage()); vNexusResult.setOptional(vDbResult.getOptional()); vNexusResult.setResult(vDbResult.getResult()); String siloText = null; for (LabSilo silo : siloService.getSilos()) { if (silo.getLab().getLab().equals(vDbResult.getLab().getLab())) { siloText = silo.getSilo(); } } if (siloText == null) { throw new IllegalArgumentException("Lab does not exist: " + vDbResult.getLab().toString()); } vNexusResult.setSilo(siloText); vNexusResult.setTimestamp(vDbResult.getTimestamp()); if (vDbResult.getSubmission() != null) { vNexusResult.setSubmissionId(String.valueOf(vDbResult.getSubmission().getSubmissionId())); } List wNexusResults = new ArrayList(); List wDbResults = wRobotDAO.getWRobotTestResult(vDbResult); if (wDbResults != null && wDbResults.size() > 0) { for (WRobotDbTestResult wRobot : wDbResults) { WRobotNexusTestResult wNexusResult = new WRobotNexusTestResult(); wNexusResult.setBlueprintLayer(BlueprintLayer.valueOf(wRobot.getLayer())); if (wRobot.getRobotTestResults() != null) { ObjectMapper mapper = new ObjectMapper(); wNexusResult.setRobotTestResults( mapper.readValue(wRobot.getRobotTestResults(), new TypeReference>() { })); } wNexusResults.add(wNexusResult); } vNexusResult.setwRobotNexusTestResults(wNexusResults); } return vNexusResult; } private ValidationDbTestResult convertValidationNexusToDb(ValidationNexusTestResult vNexusResult) throws JsonParseException, JsonMappingException, IOException { LabInfo labInfo = null; for (LabSilo silo : siloService.getSilos()) { if (silo.getSilo().equals(vNexusResult.getSilo())) { labInfo = silo.getLab(); } } if (labInfo == null) { return null; } ValidationDbTestResult vDbResult = new ValidationDbTestResult(); vDbResult.setBlueprintName(vNexusResult.getBlueprintName()); vDbResult.setVersion(vNexusResult.getVersion()); vDbResult.setLab(labInfo); vDbResult.setOptional(vNexusResult.getOptional()); vDbResult.setAllLayers(vNexusResult.getAllLayers()); vDbResult.setDateStorage(vNexusResult.getDateOfStorage()); vDbResult.setResult(vNexusResult.getResult()); vDbResult.setTimestamp(vNexusResult.getTimestamp()); return vDbResult; } private List convertWRobotNexusResultsToDb(List wRobotNexusResults) { if (wRobotNexusResults == null || wRobotNexusResults.size() < 1) { return null; } List wDbResults = new ArrayList(); for (WRobotNexusTestResult wRobotNexusResult : wRobotNexusResults) { WRobotDbTestResult wDbResult = new WRobotDbTestResult(); if (wRobotNexusResult.getBlueprintLayer() != null) { wDbResult.setLayer(wRobotNexusResult.getBlueprintLayer().toString()); } ObjectMapper mapper = new ObjectMapper(); if (wRobotNexusResult.getRobotTestResults() != null && wRobotNexusResult.getRobotTestResults().size() > 0) { try { wDbResult.setRobotTestResults(mapper.writeValueAsString(wRobotNexusResult.getRobotTestResults())); } catch (JsonProcessingException e) { LOGGER.error(EELFLoggerDelegate.errorLogger, "Error while converting POJO to string. " + UserUtils.getStackTrace(e)); continue; } } wDbResults.add(wDbResult); } return wDbResults; } private boolean checkValidityOfValidationNexusTestResult(ValidationNexusTestResult vNexusResult) { LabInfo labInfo = null; for (LabSilo silo : siloService.getSilos()) { if (silo.getSilo().equals(vNexusResult.getSilo())) { labInfo = silo.getLab(); } } if (labInfo == null) { LOGGER.error(EELFLoggerDelegate.errorLogger, "No lab Info found for silo. " + vNexusResult.getSilo()); return false; } ValidationDbTestResult vDbResult = vTestResultDAO.getValidationTestResult(labInfo, vNexusResult.getTimestamp()); if (vDbResult != null) { // Be elastic for allLayers and optional if (!vDbResult.getBlueprintName().equals(vNexusResult.getBlueprintName()) || !vDbResult.getVersion().equals(vNexusResult.getVersion()) || !vDbResult.getLab().equals(labInfo) || !vDbResult.getTimestamp().equals(vNexusResult.getTimestamp())) { LOGGER.error(EELFLoggerDelegate.errorLogger, "Nexus has different data for blueprint : " + vDbResult.getBlueprintName() + ", version: " + vDbResult.getVersion() + " and lab: " + vDbResult.getLab().getLab().name()); return false; } } List wRobotDbResults = wRobotDAO .getWRobotTestResult(vDbResult); if (wRobotDbResults != null) { if (vDbResult.getSubmission() != null) { for (WRobotNexusTestResult wNexusResult : vNexusResult.getwRobotNexusTestResults()) { WRobotDbTestResult wRobotDbResult = wRobotDAO .getWRobotTestResult(wNexusResult.getBlueprintLayer().name(), vDbResult); if (wRobotDbResult == null) { LOGGER.error(EELFLoggerDelegate.errorLogger, "Nexus has different layer results for submission id: " + vDbResult.getSubmission().getSubmissionId()); return false; } } } } return true; } private boolean checkValidityOfJenkinsNotification(JnksJobNotify jnksJobNotify) { ValidationDbTestResult vDbSubmission = vTestResultDAO .getValidationTestResult(subService.getSubmission(String.valueOf(jnksJobNotify.getSubmissionId()))); if (vDbSubmission == null) { return false; } ValidationDbTestResult vDbTimestamp = vTestResultDAO.getValidationTestResult(vDbSubmission.getLab(), jnksJobNotify.getTimestamp()); if (vDbTimestamp == null) { return true; } if (vDbTimestamp.equals(vDbSubmission) || (vDbTimestamp.getSubmission() != null && !jnksJobNotify.getSubmissionId().equals(vDbTimestamp.getSubmission().getSubmissionId()))) { LOGGER.error(EELFLoggerDelegate.errorLogger, "Received same timestamp: " + jnksJobNotify.getTimestamp() + " from nexus for submission id: " + jnksJobNotify.getSubmissionId()); return false; } // Be elastic for allLayers and optional if (!vDbSubmission.getBlueprintName().equals(vDbTimestamp.getBlueprintName()) || !vDbSubmission.getVersion().equals(vDbTimestamp.getVersion()) || !vDbSubmission.getLab().equals(vDbTimestamp.getLab())) { LOGGER.error(EELFLoggerDelegate.errorLogger, "No consistency exists in database records."); return false; } return true; } }