From 75b7b93cf75087b4509a27fa5efa5f40c3b9438d Mon Sep 17 00:00:00 2001 From: saakhan Date: Tue, 7 Nov 2023 17:01:38 +0530 Subject: [PATCH 1/3] remove redundant convert method, fix the null issue in listExperiment Signed-off-by: saakhan --- .../analyzer/serviceObjects/Converters.java | 102 ------------------ .../analyzer/services/ListExperiments.java | 51 +-------- 2 files changed, 2 insertions(+), 151 deletions(-) diff --git a/src/main/java/com/autotune/analyzer/serviceObjects/Converters.java b/src/main/java/com/autotune/analyzer/serviceObjects/Converters.java index e25295fc9..2016aade7 100644 --- a/src/main/java/com/autotune/analyzer/serviceObjects/Converters.java +++ b/src/main/java/com/autotune/analyzer/serviceObjects/Converters.java @@ -183,108 +183,6 @@ public static ListRecommendationsAPIObject convertKruizeObjectToListRecommendati return listRecommendationsAPIObject; } - public static ListRecommendationsAPIObject convertKruizeObjectToListRecommendationSO( - KruizeObject kruizeObject, - boolean getLatest, - boolean checkForTimestamp, - String monitoringEndTimestamp) { - ListRecommendationsAPIObject listRecommendationsAPIObject = new ListRecommendationsAPIObject(); - try { - listRecommendationsAPIObject.setApiVersion(AnalyzerConstants.VersionConstants.APIVersionConstants.CURRENT_LIST_RECOMMENDATIONS_VERSION); - listRecommendationsAPIObject.setExperimentName(kruizeObject.getExperimentName()); - listRecommendationsAPIObject.setClusterName(kruizeObject.getClusterName()); - List kubernetesAPIObjects = new ArrayList<>(); - KubernetesAPIObject kubernetesAPIObject; - for (K8sObject k8sObject : kruizeObject.getKubernetes_objects()) { - kubernetesAPIObject = new KubernetesAPIObject(k8sObject.getName(), k8sObject.getType(), k8sObject.getNamespace()); - HashMap containerDataMap = new HashMap<>(); - List containerAPIObjects = new ArrayList<>(); - for (ContainerData containerData : k8sObject.getContainerDataMap().values()) { - ContainerAPIObject containerAPIObject; - // if a Time stamp is passed it holds the priority than latest - if (checkForTimestamp) { - // This step causes a performance degradation, need to be replaced with a better flow of creating SO's - ContainerData clonedContainerData = Utils.getClone(containerData, ContainerData.class); - if (null != clonedContainerData) { - HashMap recommendations = clonedContainerData.getContainerRecommendations().getData(); - Date medDate = Utils.DateUtils.getDateFrom(KruizeConstants.DateFormats.STANDARD_JSON_DATE_FORMAT, monitoringEndTimestamp); - Timestamp givenTimestamp = new Timestamp(medDate.getTime()); - if (recommendations.containsKey(givenTimestamp)) { - List tempList = new ArrayList<>(); - for (Timestamp timestamp : recommendations.keySet()) { - if (!timestamp.equals(givenTimestamp)) - tempList.add(timestamp); - } - for (Timestamp timestamp : tempList) { - recommendations.remove(timestamp); - } - clonedContainerData.getContainerRecommendations().setData(recommendations); - containerAPIObject = new ContainerAPIObject(clonedContainerData.getContainer_name(), - clonedContainerData.getContainer_image_name(), - clonedContainerData.getContainerRecommendations(), - new ArrayList<>(clonedContainerData.getMetrics().values())); - containerAPIObjects.add(containerAPIObject); - } - } - } else if (getLatest) { - // This step causes a performance degradation, need to be replaced with a better flow of creating SO's - containerData = getLatestRecommendations(containerData); - containerAPIObject = new ContainerAPIObject(containerData.getContainer_name(), - containerData.getContainer_image_name(), - containerData.getContainerRecommendations(), - new ArrayList<>(containerData.getMetrics().values())); - containerAPIObjects.add(containerAPIObject); - } else { - containerAPIObject = new ContainerAPIObject(containerData.getContainer_name(), - containerData.getContainer_image_name(), - containerData.getContainerRecommendations(), - new ArrayList<>(containerData.getMetrics().values())); - containerAPIObjects.add(containerAPIObject); - containerDataMap.put(containerData.getContainer_name(), containerData); - } - } - kubernetesAPIObject.setContainerAPIObjects(containerAPIObjects); - kubernetesAPIObjects.add(kubernetesAPIObject); - } - listRecommendationsAPIObject.setKubernetesObjects(kubernetesAPIObjects); - } catch (Exception e) { - e.printStackTrace(); - } - return listRecommendationsAPIObject; - } - - - /** - * @param containerData - * @return - */ - public static ContainerData getLatestRecommendations(ContainerData containerData) { - ContainerData clonedContainerData = Utils.getClone(containerData, ContainerData.class); - if (null != clonedContainerData) { - HashMap recommendations = clonedContainerData.getContainerRecommendations().getData(); - Timestamp latestTimestamp = null; - List tempList = new ArrayList<>(); - for (Timestamp timestamp : recommendations.keySet()) { - if (null == latestTimestamp) { - latestTimestamp = timestamp; - } else { - if (timestamp.after(latestTimestamp)) { - tempList.add(latestTimestamp); - latestTimestamp = timestamp; - } else { - tempList.add(timestamp); - } - } - } - for (Timestamp timestamp : tempList) { - recommendations.remove(timestamp); - } - clonedContainerData.getContainerRecommendations().setData(recommendations); - } - return clonedContainerData; - } - - /** * @param containerData */ diff --git a/src/main/java/com/autotune/analyzer/services/ListExperiments.java b/src/main/java/com/autotune/analyzer/services/ListExperiments.java index 115d44391..2a3915401 100644 --- a/src/main/java/com/autotune/analyzer/services/ListExperiments.java +++ b/src/main/java/com/autotune/analyzer/services/ListExperiments.java @@ -56,6 +56,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.sql.Timestamp; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @@ -384,7 +385,7 @@ private void buildRecommendationsResponse(Map mKruizeExper ko, getLatest, false, - (String) null); + null); mergeRecommendationsInKruizeObject(listRecommendationsAPIObject, ko); } catch (Exception e) { @@ -397,54 +398,6 @@ private void mergeRecommendationsInKruizeObject(ListRecommendationsAPIObject lis ko.setKubernetes_objects(convertKubernetesAPIObjectListToK8sObjectList(listRecommendationsAPIObject.getKubernetesObjects())); } - //TODO this function no more used. - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - response.setStatus(HttpServletResponse.SC_OK); - response.setContentType(JSON_CONTENT_TYPE); - response.setCharacterEncoding(CHARACTER_ENCODING); - - LOGGER.info("Processing trial result..."); - try { - String experimentName = request.getParameter(AnalyzerConstants.ServiceConstants.EXPERIMENT_NAME); - // String deploymentName = request.getParameter(AnalyzerConstants.ServiceConstants.DEPLOYMENT_NAME); - - String trialResultsData = request.getReader().lines().collect(Collectors.joining()); - JSONObject trialResultsJson = new JSONObject(trialResultsData); - - // Read in the experiment name and the deployment name in the received JSON from EM - String experimentNameJson = trialResultsJson.getString(EXPERIMENT_NAME); - String trialNumber = trialResultsJson.getString("trialNumber"); - - JSONArray deploymentsJsonArray = trialResultsJson.getJSONArray("deployments"); - for (Object deploymentObject : deploymentsJsonArray) { - JSONObject deploymentJsonObject = (JSONObject) deploymentObject; - String deploymentNameJson = deploymentJsonObject.getString(DEPLOYMENT_NAME); - KruizeExperiment kruizeExperiment = experimentsMap.get(deploymentNameJson); - - // Check if the passed in JSON has the same info as in the URL - if (!experimentName.equals(experimentNameJson) || kruizeExperiment == null) { - LOGGER.error("Bad results JSON passed: {}", experimentNameJson); - response.setStatus(HttpServletResponse.SC_BAD_REQUEST); - break; - } - - try { - updateExperimentTrial(trialNumber, kruizeExperiment, trialResultsJson); - } catch (InvalidValueException | IncompatibleInputJSONException e) { - e.printStackTrace(); - } - RunExperiment runExperiment = kruizeExperiment.getExperimentThread(); - // Received a metrics JSON from EM after a trial, let the waiting thread know - LOGGER.info("Received trial result for experiment: " + experimentNameJson + "; Deployment name: " + deploymentNameJson); - runExperiment.send(); - } - response.getWriter().close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - public void sendErrorResponse(HttpServletResponse response, Exception e, int httpStatusCode, String errorMsg) throws IOException { if (null != e) { From fe99cb71349f83e2d18000827b03afb31c1b6a2a Mon Sep 17 00:00:00 2001 From: Saad Khan Date: Fri, 15 Dec 2023 18:21:55 +0530 Subject: [PATCH 2/3] update test file and handled the null case Signed-off-by: Saad Khan --- .../com/autotune/database/service/ExperimentDBService.java | 4 +++- .../remote_monitoring_fault_tolerant_tests.sh | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/autotune/database/service/ExperimentDBService.java b/src/main/java/com/autotune/database/service/ExperimentDBService.java index 7a2422ac8..6d594deae 100644 --- a/src/main/java/com/autotune/database/service/ExperimentDBService.java +++ b/src/main/java/com/autotune/database/service/ExperimentDBService.java @@ -90,7 +90,9 @@ public void loadAllResults(Map mainKruizeExperimentMap) th List resultDataList = new ArrayList<>(); for (UpdateResultsAPIObject updateResultsAPIObject : updateResultsAPIObjects) { try { - ExperimentResultData experimentResultData = Converters.KruizeObjectConverters.convertUpdateResultsAPIObjToExperimentResultData(updateResultsAPIObject); + ExperimentResultData experimentResultData = null; + if (updateResultsAPIObject.getKruizeObject() != null) + experimentResultData = Converters.KruizeObjectConverters.convertUpdateResultsAPIObjToExperimentResultData(updateResultsAPIObject); if (experimentResultData != null) resultDataList.add(experimentResultData); else diff --git a/tests/scripts/remote_monitoring_tests/fault_tolerant_tests/remote_monitoring_fault_tolerant_tests.sh b/tests/scripts/remote_monitoring_tests/fault_tolerant_tests/remote_monitoring_fault_tolerant_tests.sh index 220ea6a2e..b881413bb 100755 --- a/tests/scripts/remote_monitoring_tests/fault_tolerant_tests/remote_monitoring_fault_tolerant_tests.sh +++ b/tests/scripts/remote_monitoring_tests/fault_tolerant_tests/remote_monitoring_fault_tolerant_tests.sh @@ -152,13 +152,13 @@ echo "" echo "Running fault tolerant test for kruize on ${CLUSTER_TYPE}" | tee -a ${LOG} if [ "${CLUSTER_TYPE}" == "openshift" ]; then echo "python3 kruize_pod_restart_test.py -c ${CLUSTER_TYPE} -a ${SERVER_IP_ADDR} -u ${num_exps} -d ${iterations} -r ${LOG_DIR} | tee -a ${TEST_LOG}" | tee -a ${LOG} - python3 kruize_pod_restart_test.py -c ${CLUSTER_TYPE} -a ${SERVER_IP_ADDR} -u ${num_exps} -d ${iterations} -r "${LOG_DIR}" + python3 kruize_pod_restart_test.py -c ${CLUSTER_TYPE} -a ${SERVER_IP_ADDR} -u ${num_exps} -d ${iterations} -r "${LOG_DIR}" | tee -a ${TEST_LOG} exit_code=$? echo "exit_code = $exit_code" else echo "python3 kruize_pod_restart_test.py -c ${CLUSTER_TYPE} -u ${num_exps} -d ${iterations} -r ${LOG_DIR} | tee -a ${TEST_LOG}" | tee -a ${LOG} - python3 kruize_pod_restart_test.py -c ${CLUSTER_TYPE} -u ${num_exps} -d ${iterations} -r "${LOG_DIR}" + python3 kruize_pod_restart_test.py -c ${CLUSTER_TYPE} -u ${num_exps} -d ${iterations} -r "${LOG_DIR}" | tee -a ${TEST_LOG} exit_code=$? echo "exit_code = $exit_code" fi @@ -174,7 +174,7 @@ if [ "${exit_code}" -ne 0 ]; then echo "Fault tolerant test failed! Check the log for details" | tee -a ${LOG} exit 1 else - if [[ $(grep -i "error\|exception" ${KRUIZE_POD_LOG_BEFORE}) || $(grep -i "error\|exception" ${KRUIZE_POD_LOG_AFTER}) ]]; then + if [[ $(grep -i "ERROR" ${KRUIZE_POD_LOG_BEFORE}) || $(grep -i "error\|exception" ${KRUIZE_POD_LOG_AFTER}) ]]; then echo "Fault tolerant test failed! Check the logs for details" | tee -a ${LOG} exit 1 else From 4b3f36d9c2262e7fd95ab9e31f93575a6d22a844 Mon Sep 17 00:00:00 2001 From: Saad Khan Date: Mon, 15 Jan 2024 18:23:09 +0530 Subject: [PATCH 3/3] fix the recurring warning messages issue while running the fault tests Signed-off-by: Saad Khan --- .../database/service/ExperimentDBService.java | 15 ++++++--------- .../remote_monitoring_fault_tolerant_tests.sh | 2 +- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/autotune/database/service/ExperimentDBService.java b/src/main/java/com/autotune/database/service/ExperimentDBService.java index 6d594deae..5cbf2f6b7 100644 --- a/src/main/java/com/autotune/database/service/ExperimentDBService.java +++ b/src/main/java/com/autotune/database/service/ExperimentDBService.java @@ -81,22 +81,19 @@ public void loadAllExperiments(Map mainKruizeExperimentMap public void loadAllResults(Map mainKruizeExperimentMap) throws Exception { ExperimentInterface experimentInterface = new ExperimentInterfaceImpl(); - + KruizeObject kruizeObject; // Load results from the DB and save to local List kruizeResultsEntries = experimentDAO.loadAllResults(); if (null != kruizeResultsEntries && !kruizeResultsEntries.isEmpty()) { List updateResultsAPIObjects = DBHelpers.Converters.KruizeObjectConverters.convertResultEntryToUpdateResultsAPIObject(kruizeResultsEntries); - if (null != updateResultsAPIObjects && !updateResultsAPIObjects.isEmpty()) { + if (!updateResultsAPIObjects.isEmpty()) { List resultDataList = new ArrayList<>(); for (UpdateResultsAPIObject updateResultsAPIObject : updateResultsAPIObjects) { try { - ExperimentResultData experimentResultData = null; - if (updateResultsAPIObject.getKruizeObject() != null) - experimentResultData = Converters.KruizeObjectConverters.convertUpdateResultsAPIObjToExperimentResultData(updateResultsAPIObject); - if (experimentResultData != null) - resultDataList.add(experimentResultData); - else - LOGGER.warn("Converted experimentResultData is null"); + kruizeObject = mainKruizeExperimentMap.get(updateResultsAPIObject.getExperimentName()); + updateResultsAPIObject.setKruizeObject(kruizeObject); + ExperimentResultData experimentResultData = Converters.KruizeObjectConverters.convertUpdateResultsAPIObjToExperimentResultData(updateResultsAPIObject); + resultDataList.add(experimentResultData); } catch (IllegalArgumentException e) { LOGGER.error("Failed to convert DB data to local: {}", e.getMessage()); } catch (Exception e) { diff --git a/tests/scripts/remote_monitoring_tests/fault_tolerant_tests/remote_monitoring_fault_tolerant_tests.sh b/tests/scripts/remote_monitoring_tests/fault_tolerant_tests/remote_monitoring_fault_tolerant_tests.sh index b881413bb..0758f77eb 100755 --- a/tests/scripts/remote_monitoring_tests/fault_tolerant_tests/remote_monitoring_fault_tolerant_tests.sh +++ b/tests/scripts/remote_monitoring_tests/fault_tolerant_tests/remote_monitoring_fault_tolerant_tests.sh @@ -174,7 +174,7 @@ if [ "${exit_code}" -ne 0 ]; then echo "Fault tolerant test failed! Check the log for details" | tee -a ${LOG} exit 1 else - if [[ $(grep -i "ERROR" ${KRUIZE_POD_LOG_BEFORE}) || $(grep -i "error\|exception" ${KRUIZE_POD_LOG_AFTER}) ]]; then + if [[ $(grep -i "error\|exception" ${KRUIZE_POD_LOG_BEFORE}) || $(grep -i "error\|exception" ${KRUIZE_POD_LOG_AFTER}) ]]; then echo "Fault tolerant test failed! Check the logs for details" | tee -a ${LOG} exit 1 else