diff --git a/src/main/java/com/autotune/analyzer/experiment/ExperimentInitiator.java b/src/main/java/com/autotune/analyzer/experiment/ExperimentInitiator.java index 8247c11ba..790246b62 100644 --- a/src/main/java/com/autotune/analyzer/experiment/ExperimentInitiator.java +++ b/src/main/java/com/autotune/analyzer/experiment/ExperimentInitiator.java @@ -15,11 +15,13 @@ *******************************************************************************/ package com.autotune.analyzer.experiment; +import com.autotune.analyzer.exceptions.KruizeResponse; import com.autotune.analyzer.kruizeObject.KruizeObject; import com.autotune.analyzer.performanceProfiles.PerformanceProfileInterface.PerfProfileInterface; import com.autotune.analyzer.serviceObjects.Converters; import com.autotune.analyzer.serviceObjects.UpdateResultsAPIObject; import com.autotune.analyzer.utils.AnalyzerConstants; +import com.autotune.analyzer.utils.AnalyzerErrorConstants; import com.autotune.common.data.ValidationOutputData; import com.autotune.common.data.result.ExperimentResultData; import com.autotune.database.service.ExperimentDBService; @@ -32,6 +34,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Field; import java.sql.Timestamp; import java.util.ArrayList; @@ -50,6 +53,30 @@ public class ExperimentInitiator { List failedUpdateResultsAPIObjects = new ArrayList<>(); private ValidationOutputData validationOutputData; + public static List getErrorMap(List errorMessages) { + List responses; + if (null != errorMessages) { + responses = new ArrayList<>(); + errorMessages.forEach( + (errorText) -> { + if (AnalyzerErrorConstants.APIErrors.updateResultsAPI.ERROR_CODE_MAP.containsKey(errorText)) { + responses.add( + new KruizeResponse(errorText, AnalyzerErrorConstants.APIErrors.updateResultsAPI.ERROR_CODE_MAP.get(errorText), "", "ERROR", null) + ); + + } else { + responses.add( + new KruizeResponse(errorText, HttpServletResponse.SC_BAD_REQUEST, "", "ERROR", null) + ); + } + } + ); + } else { + responses = null; + } + return responses; + } + /** * Initiate Experiment validation * @@ -93,7 +120,6 @@ public void generateAndAddRecommendations(KruizeObject kruizeObject, List updateResultsAPIObjects) { List failedDBObjects = new ArrayList<>(); Validator validator = Validation.byProvider(HibernateValidator.class) @@ -117,7 +143,7 @@ public void validateAndAddExperimentResults(List updateR errorReasons.add(violation.getMessage()); } } - object.setErrorReasons(errorReasons); + object.setErrors(getErrorMap(errorReasons)); failedUpdateResultsAPIObjects.add(object); } } diff --git a/src/main/java/com/autotune/analyzer/serviceObjects/UpdateResultsAPIObject.java b/src/main/java/com/autotune/analyzer/serviceObjects/UpdateResultsAPIObject.java index 033457e76..43bc57867 100644 --- a/src/main/java/com/autotune/analyzer/serviceObjects/UpdateResultsAPIObject.java +++ b/src/main/java/com/autotune/analyzer/serviceObjects/UpdateResultsAPIObject.java @@ -15,6 +15,7 @@ *******************************************************************************/ package com.autotune.analyzer.serviceObjects; +import com.autotune.analyzer.exceptions.KruizeResponse; import com.autotune.analyzer.serviceObjects.verification.annotators.CompareDate; import com.autotune.analyzer.serviceObjects.verification.annotators.KubernetesElementsCheck; import com.autotune.analyzer.serviceObjects.verification.annotators.PerformanceProfileCheck; @@ -29,7 +30,6 @@ import java.sql.Timestamp; import java.util.List; - @CompareDate(groups = BaseSO.InitialValidation.class, message = AnalyzerErrorConstants.AutotuneObjectErrors.WRONG_TIMESTAMP) @TimeDifferenceCheck(groups = UpdateResultsAPIObject.EvaluateRemainingConstraints.class, message = AnalyzerErrorConstants.AutotuneObjectErrors.MEASUREMENT_DURATION_ERROR) @PerformanceProfileCheck(groups = UpdateResultsAPIObject.EvaluateRemainingConstraints.class) @@ -50,7 +50,7 @@ public class UpdateResultsAPIObject extends BaseSO { @SerializedName(KruizeConstants.JSONKeys.KUBERNETES_OBJECTS) private List kubernetesAPIObjects; - private List errorReasons; + private List errors; public Timestamp getStartTimestamp() { return startTimestamp; @@ -76,12 +76,12 @@ public void setKubernetesObjects(List kubernetesAPIObjects) this.kubernetesAPIObjects = kubernetesAPIObjects; } - public List getErrorReasons() { - return errorReasons; + public List getErrors() { + return errors; } - public void setErrorReasons(List errorReasons) { - this.errorReasons = errorReasons; + public void setErrors(List errors) { + this.errors = errors; } @Override diff --git a/src/main/java/com/autotune/analyzer/utils/AnalyzerErrorConstants.java b/src/main/java/com/autotune/analyzer/utils/AnalyzerErrorConstants.java index 7c145bade..7a521d056 100644 --- a/src/main/java/com/autotune/analyzer/utils/AnalyzerErrorConstants.java +++ b/src/main/java/com/autotune/analyzer/utils/AnalyzerErrorConstants.java @@ -18,6 +18,9 @@ import com.autotune.operator.KruizeDeploymentInfo; import com.autotune.utils.KruizeConstants; +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; + /** * Contains strings describing the errors encountered */ @@ -111,6 +114,16 @@ private RunExperimentMessages() { public static final class APIErrors { private APIErrors() { + } + + public static final class updateResultsAPI { + public static final String RESULTS_ALREADY_EXISTS = "An entry for this record already exists!"; + + public static final HashMap ERROR_CODE_MAP = new HashMap() {{ + put(RESULTS_ALREADY_EXISTS, HttpServletResponse.SC_CONFLICT); + }}; + + } public static final class ListRecommendationsAPI { diff --git a/src/main/java/com/autotune/database/dao/ExperimentDAOImpl.java b/src/main/java/com/autotune/database/dao/ExperimentDAOImpl.java index 94519ae2e..de8783360 100644 --- a/src/main/java/com/autotune/database/dao/ExperimentDAOImpl.java +++ b/src/main/java/com/autotune/database/dao/ExperimentDAOImpl.java @@ -2,6 +2,7 @@ import com.autotune.analyzer.kruizeObject.KruizeObject; import com.autotune.analyzer.utils.AnalyzerConstants; +import com.autotune.analyzer.utils.AnalyzerErrorConstants; import com.autotune.common.data.ValidationOutputData; import com.autotune.database.helper.DBConstants; import com.autotune.database.init.KruizeHibernateUtil; @@ -120,8 +121,7 @@ public List addToDBAndFetchFailedResults(List convertResultEntryToUpdateResultsAPIO updateResultsAPIObject.setExperimentName(kruizeResultsEntry.getExperiment_name()); updateResultsAPIObject.setStartTimestamp(kruizeResultsEntry.getInterval_start_time()); updateResultsAPIObject.setEndTimestamp(kruizeResultsEntry.getInterval_end_time()); - updateResultsAPIObject.setErrorReasons(kruizeResultsEntry.getErrorReasons()); + updateResultsAPIObject.setErrors(getErrorMap(kruizeResultsEntry.getErrorReasons())); JsonNode extendedDataNode = kruizeResultsEntry.getExtended_data(); JsonNode k8sObjectsNode = extendedDataNode.get(KruizeConstants.JSONKeys.KUBERNETES_OBJECTS); List k8sObjectList = new ArrayList<>(); diff --git a/tests/scripts/remote_monitoring_tests/rest_apis/test_update_results.py b/tests/scripts/remote_monitoring_tests/rest_apis/test_update_results.py index d37190109..ca27ac7c1 100644 --- a/tests/scripts/remote_monitoring_tests/rest_apis/test_update_results.py +++ b/tests/scripts/remote_monitoring_tests/rest_apis/test_update_results.py @@ -481,13 +481,12 @@ def test_update_results_with_same_result(cluster_type): interval_end_time = result_json_data[0]['interval_end_time'] interval_start_time = result_json_data[0]['interval_start_time'] - TIMESTAMP_PRESENT_MSG = 'A record with the name %s already exists within the timestamp range starting ' \ - 'from %s and ending on %s.' % (experiment_name, interval_start_time, interval_end_time) + TIMESTAMP_PRESENT_MSG = 'An entry for this record already exists!' print(TIMESTAMP_PRESENT_MSG) - print(data['data'][0]['errorReasons'][0]) + print(data['data'][0]['errors'][0]['message']) assert data['message'] == 'Out of a total of 1 records, 1 failed to save' - assert data['data'][0]['errorReasons'][0] == TIMESTAMP_PRESENT_MSG + assert data['data'][0]['errors'][0]['message'] == TIMESTAMP_PRESENT_MSG response = delete_experiment(input_json_file) print("delete exp = ", response.status_code) @@ -535,12 +534,12 @@ def test_update_results_with_valid_and_invalid_interval_duration(test_name, inte assert response.status_code == ERROR_STATUS_CODE assert data['status'] == ERROR_STATUS assert data['message'] == 'Out of a total of 1 records, 1 failed to save' - assert data['data'][0]['errorReasons'][0] == UPDATE_RESULTS_DATE_PRECEDE_ERROR_MSG + assert data['data'][0]['errors'][0]['message'] == UPDATE_RESULTS_DATE_PRECEDE_ERROR_MSG else: assert response.status_code == ERROR_STATUS_CODE assert data['status'] == ERROR_STATUS assert data['message'] == 'Out of a total of 1 records, 1 failed to save' - assert data['data'][0]['errorReasons'][0] == INVALID_INTERVAL_DURATION_MSG + assert data['data'][0]['errors'][0]['message'] == INVALID_INTERVAL_DURATION_MSG response = delete_experiment(input_json_file) print("delete exp = ", response.status_code)