From a30f2ae8dfdf9b6c0af2405d1686d71eb7048a15 Mon Sep 17 00:00:00 2001 From: pandong <100667564+pandong2011@users.noreply.github.com> Date: Tue, 25 Oct 2022 15:11:54 +0800 Subject: [PATCH] cherry-pick [fix#12439] [Alert] fix send script alert NPE #12495 --- .../alert/script/ScriptAlertChannel.java | 6 +++-- .../plugin/alert/script/ScriptSender.java | 18 ++++++++++--- .../plugin/alert/script/ScriptSenderTest.java | 27 +++++++++++++++++++ .../alert/AlertSenderService.java | 4 ++- 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptAlertChannel.java b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptAlertChannel.java index bd52955b74..c83ffcf9b6 100644 --- a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptAlertChannel.java +++ b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptAlertChannel.java @@ -22,6 +22,8 @@ import org.apache.dolphinscheduler.alert.api.AlertData; import org.apache.dolphinscheduler.alert.api.AlertInfo; import org.apache.dolphinscheduler.alert.api.AlertResult; +import org.apache.commons.collections.MapUtils; + import java.util.Map; public final class ScriptAlertChannel implements AlertChannel { @@ -29,8 +31,8 @@ public final class ScriptAlertChannel implements AlertChannel { public AlertResult process(AlertInfo alertinfo) { AlertData alertData = alertinfo.getAlertData(); Map paramsMap = alertinfo.getAlertParams(); - if (null == paramsMap) { - return new AlertResult("false", "script params is null"); + if (MapUtils.isEmpty(paramsMap)) { + return new AlertResult("false", "script params is empty"); } return new ScriptSender(paramsMap).sendScriptAlert(alertData.getTitle(), alertData.getContent()); } diff --git a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptSender.java b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptSender.java index 3f6e690f03..ef7221ea82 100644 --- a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptSender.java +++ b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptSender.java @@ -18,6 +18,7 @@ package org.apache.dolphinscheduler.plugin.alert.script; import org.apache.dolphinscheduler.alert.api.AlertResult; +import org.apache.dolphinscheduler.spi.utils.StringUtils; import java.io.File; import java.util.Map; @@ -36,9 +37,15 @@ public final class ScriptSender { private final String userParams; ScriptSender(Map config) { - scriptPath = config.get(ScriptParamsConstants.NAME_SCRIPT_PATH); - scriptType = config.get(ScriptParamsConstants.NAME_SCRIPT_TYPE); - userParams = config.get(ScriptParamsConstants.NAME_SCRIPT_USER_PARAMS); + scriptPath = StringUtils.isNotBlank(config.get(ScriptParamsConstants.NAME_SCRIPT_PATH)) + ? config.get(ScriptParamsConstants.NAME_SCRIPT_PATH) + : ""; + scriptType = StringUtils.isNotBlank(config.get(ScriptParamsConstants.NAME_SCRIPT_TYPE)) + ? config.get(ScriptParamsConstants.NAME_SCRIPT_TYPE) + : ""; + userParams = StringUtils.isNotBlank(config.get(ScriptParamsConstants.NAME_SCRIPT_USER_PARAMS)) + ? config.get(ScriptParamsConstants.NAME_SCRIPT_USER_PARAMS) + : ""; } AlertResult sendScriptAlert(String title, String content) { @@ -46,6 +53,11 @@ public final class ScriptSender { if (ScriptType.SHELL.getDescp().equals(scriptType)) { return executeShellScript(title, content); } + // If it is another type of alarm script can be added here, such as python + + alertResult.setStatus("false"); + logger.error("script type error: {}", scriptType); + alertResult.setMessage("script type error : " + scriptType); return alertResult; } diff --git a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-script/src/test/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptSenderTest.java b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-script/src/test/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptSenderTest.java index 64a811d474..bda9cd1fea 100644 --- a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-script/src/test/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptSenderTest.java +++ b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-script/src/test/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptSenderTest.java @@ -61,4 +61,31 @@ public class ScriptSenderTest { Assert.assertEquals("false", alertResult.getStatus()); } + @Test + public void testUserParamsNPE() { + scriptConfig.put(ScriptParamsConstants.NAME_SCRIPT_USER_PARAMS, null); + ScriptSender scriptSender = new ScriptSender(scriptConfig); + AlertResult alertResult; + alertResult = scriptSender.sendScriptAlert("test user params NPE", "test content"); + Assertions.assertEquals("true", alertResult.getStatus()); + } + + @Test + public void testPathNPE() { + scriptConfig.put(ScriptParamsConstants.NAME_SCRIPT_PATH, null); + ScriptSender scriptSender = new ScriptSender(scriptConfig); + AlertResult alertResult; + alertResult = scriptSender.sendScriptAlert("test path NPE", "test content"); + Assertions.assertEquals("false", alertResult.getStatus()); + } + + @Test + public void testTypeIsError() { + scriptConfig.put(ScriptParamsConstants.NAME_SCRIPT_TYPE, null); + ScriptSender scriptSender = new ScriptSender(scriptConfig); + AlertResult alertResult; + alertResult = scriptSender.sendScriptAlert("test type is error", "test content"); + Assertions.assertEquals("false", alertResult.getStatus()); + } + } diff --git a/dolphinscheduler-alert/dolphinscheduler-alert-server/src/main/java/org/apache/dolphinscheduler/alert/AlertSenderService.java b/dolphinscheduler-alert/dolphinscheduler-alert-server/src/main/java/org/apache/dolphinscheduler/alert/AlertSenderService.java index 92b3cea45b..1f2c6c1c36 100644 --- a/dolphinscheduler-alert/dolphinscheduler-alert-server/src/main/java/org/apache/dolphinscheduler/alert/AlertSenderService.java +++ b/dolphinscheduler-alert/dolphinscheduler-alert-server/src/main/java/org/apache/dolphinscheduler/alert/AlertSenderService.java @@ -41,6 +41,8 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.annotation.Nullable; +import org.apache.commons.collections.MapUtils; + import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -200,7 +202,7 @@ public final class AlertSenderService extends Thread { Map paramsMap = JSONUtils.toMap(instance.getPluginInstanceParams()); String instanceWarnType = WarningType.ALL.getDescp(); - if (paramsMap != null) { + if (MapUtils.isNotEmpty(paramsMap)) { instanceWarnType = paramsMap.getOrDefault(AlertConstants.NAME_WARNING_TYPE, WarningType.ALL.getDescp()); }