http://git-wip-us.apache.org/repos/asf/kylin/blob/74e3f614/core-job/src/main/resources/mail_templates/JOB_ERROR.ftl ---------------------------------------------------------------------- diff --git a/core-job/src/main/resources/mail_templates/JOB_ERROR.ftl b/core-job/src/main/resources/mail_templates/JOB_ERROR.ftl new file mode 100644 index 0000000..6012037 --- /dev/null +++ b/core-job/src/main/resources/mail_templates/JOB_ERROR.ftl @@ -0,0 +1,372 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + +<head> + <meta http-equiv="Content-Type" content="Multipart/Alternative; charset=UTF-8"/> + <meta name="viewport" content="width=device-width, initial-scale=1.0"/> +</head> + +<style> + html { + font-size: 10px; + } + + * { + box-sizing: border-box; + } + + a:hover, + a:focus { + color: #23527c; + text-decoration: underline; + } + + a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; + } +</style> + +<body> +<div style="margin-left:5%;margin-right:5%;font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> +<span style=" + line-height: 1.1;font-size: 18px;"> + <p style="text-align:left;">Dear Kylin user,</p> + <p>This cube <strong>failure</strong> may be caused by backend platform being busy, please try again.</p> + <p>Thank you for using Kylin and we apologize for the inconvenience.</p> +</span> + <hr style="margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee;"> + <h1> + <span style="display: inline; + background-color: #d9534f; + color: #fff; + line-height: 1; + font-weight: 700; + font-size:36px; + text-align: center;"> Error </span> + </h1> + <hr style="margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee;"> + + <table cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;border:1px solid #ebccd1;"> + + <tr> + + <td style="padding: 10px 15px; + background-color: #f2dede; + border:1px solid #ebccd1;"> + <h4 style="margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; + color: #a94442; + font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> + ${job_name} + </h4> + </td> + </tr> + <tr> + + <td style="padding: 10px 15px; + background-color: #f2dede; + border:1px solid #ebccd1;"> + <h4 style="margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; + color: #a94442; + font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> + ${env_name} + </h4> + </td> + </tr> + <tr> + + <td style="padding: 15px;"> + <table cellpadding="0" cellspacing="0" width="100%" + style="margin-bottom: 20px;border:1 solid #ddd;border-collapse: collapse;font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;">Submitter + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${submitter} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;">Job Engine + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${job_engine} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;">Project + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${project_name} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;">Cube Name + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${cube_name} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;"> + Source Records Count + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${source_records_count} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;">Start Time + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${start_time} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;"> + Duration + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${duration} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;">MR Waiting Time + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${mr_waiting} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;"> + Last Update Time + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${last_update_time} + </td> + </tr> + </table> + </td> + </tr> + + <tr> + + <td style="padding: 10px 15px; + background-color: #f2dede; + border:1px solid #ebccd1;"> + <h4 style="margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; + color: #a94442; + font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> + Job Error Details + </h4> + </td> + </tr> + <tr> + + <td style="padding: 15px;"> + <table cellpadding="0" cellspacing="0" width="100%" + style="margin-bottom: 20px;border:1 solid #ddd;border-collapse: collapse;font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;"> + Error Step + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${error_step} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;"> + MR Job + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${mr_job_id} + </td> + </tr> + </table> + </td> + </tr> + + <tr> + + <td style="padding: 10px 15px; + background-color: #f2dede; + border:1px solid #ebccd1;"> + <h4 style="margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; + color: #a94442; + font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> + Logs + </h4> + </td> + </tr> + <tr> + + <td style="padding: 15px;"> + <table cellpadding="0" cellspacing="0" width="100%" + style="margin-bottom: 20px;border:1 solid #ddd;border-collapse: collapse;font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> + <tr> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + + <pre style="white-space: pre-wrap;">${error_log}</pre> + </td> + </tr> + </table> + </td> + </tr> + </table> + <hr style="margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee;"> + <h4 style="font-weight: 500; + line-height: 1.1;font-size:18px;"> + <p>Best Wishes!</p> + <p style="margin: 0 0 10px;"><b>Kylin Team</b></p> + </h4> +</div> +</body> + +</html> \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/kylin/blob/74e3f614/core-job/src/main/resources/mail_templates/JOB_SUCCEED.ftl ---------------------------------------------------------------------- diff --git a/core-job/src/main/resources/mail_templates/JOB_SUCCEED.ftl b/core-job/src/main/resources/mail_templates/JOB_SUCCEED.ftl new file mode 100644 index 0000000..f1fb45c --- /dev/null +++ b/core-job/src/main/resources/mail_templates/JOB_SUCCEED.ftl @@ -0,0 +1,274 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + +<head> + <meta http-equiv="Content-Type" content="Multipart/Alternative; charset=UTF-8"/> + <meta name="viewport" content="width=device-width, initial-scale=1.0"/> +</head> + +<style> + html { + font-size: 10px; + } + + * { + box-sizing: border-box; + } + + a:hover, + a:focus { + color: #23527c; + text-decoration: underline; + } + + a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; + } +</style> + +<body> +<div style="margin-left:5%;margin-right:5%;font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> +<span style="line-height: 1.1;font-size: 18px;"> + <p style="text-align:left;">Dear Kylin user,</p> + <p>Congratulations! Please feel free to query based on kylin cube. Thank you for using Kylin.</p> +</span> + <hr style="margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee;"> + <h1> + <span style="display: inline; + background-color: #5cb85c; + color: #fff; + line-height: 1; + font-weight: 700; + font-size:36px; + text-align: center;"> Succeed </span> + </h1> + <hr style="margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee;"> + <table cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;border:1px solid #d6e9c6;"> + + <tr> + + <td style="padding: 10px 15px; + background-color: #dff0d8; + border:1px solid #d6e9c6;"> + <h4 style="margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; + color: #3c763d; + font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> + ${job_name} + </h4> + </td> + </tr> + + <tr> + + <td style="padding: 10px 15px; + background-color: #dff0d8; + border:1px solid #d6e9c6;"> + <h4 style="margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; + color: #3c763d; + font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> + ${env_name} + </h4> + </td> + </tr> + + <tr> + + <td style="padding: 15px;"> + <table cellpadding="0" cellspacing="0" width="100%" + style="margin-bottom: 20px;border:1 solid #ddd;border-collapse: collapse;font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;">Submitter + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${submitter} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;">Job Engine + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${job_engine} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;">Project + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${project_name} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;">Cube Name + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${cube_name} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;"> + Source Records Count + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${source_records_count} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;">Start Time + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${start_time} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;"> + Duration + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${duration} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;">MR Waiting Time + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${mr_waiting} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;"> + Last Update Time + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${last_update_time} + </td> + </tr> + </table> + </td> + </tr> + </table> + <hr style="margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee;"> + <h4 style="font-weight: 500; + line-height: 1.1;font-size:18px;"> + <p>Best Wishes!</p> + <p style="margin: 0 0 10px;"><b>Kylin Team</b></p> + </h4> +</div> +</body> + +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/kylin/blob/74e3f614/core-job/src/main/resources/mail_templates/METADATA_PERSIST_FAIL.ftl ---------------------------------------------------------------------- diff --git a/core-job/src/main/resources/mail_templates/METADATA_PERSIST_FAIL.ftl b/core-job/src/main/resources/mail_templates/METADATA_PERSIST_FAIL.ftl new file mode 100644 index 0000000..2511b57 --- /dev/null +++ b/core-job/src/main/resources/mail_templates/METADATA_PERSIST_FAIL.ftl @@ -0,0 +1,179 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + +<head> + <meta http-equiv="Content-Type" content="Multipart/Alternative; charset=UTF-8"/> + <meta name="viewport" content="width=device-width, initial-scale=1.0"/> +</head> + +<style> + html { + font-size: 10px; + } + + * { + box-sizing: border-box; + } + + a:hover, + a:focus { + color: #23527c; + text-decoration: underline; + } + + a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; + } +</style> + +<body> +<div style="margin-left:5%;margin-right:5%;font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> + <span style="line-height: 1.1;font-size: 18px;"> + <p style="text-align:left;">Dear Kylin user,</p> + <p>Kylin fails to update the job output due to some hbase issue. Need to ask Hadoop Service Team for help as soon as possible.</p> +</span> + <hr style="margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee;"> + <h1> + <span style="display: inline; + background-color: #d9534f; + color: #fff; + line-height: 1; + font-weight: 700; + font-size:36px; + text-align: center;"> Error </span> + </h1> + <hr style="margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee;"> + <table cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;border:1px solid #ebccd1;"> + + <tr> + + <td style="padding: 10px 15px; + background-color: #f2dede; + border:1px solid #ebccd1;"> + <h4 style="margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; + color: #a94442; + font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> + ${job_name} + </h4> + </td> + </tr> + + <tr> + + <td style="padding: 10px 15px; + background-color: #f2dede; + border:1px solid #ebccd1;"> + <h4 style="margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; + color: #a94442; + font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> + ${env_name} + </h4> + </td> + </tr> + + <tr> + + <td style="padding: 15px;"> + <table cellpadding="0" cellspacing="0" width="100%" + style="margin-bottom: 20px;border:1 solid #ddd;border-collapse: collapse;font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;">Submitter + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${submitter} + </td> + </tr> + <tr> + <th width="30%" style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + text-align: left; + font-size: medium; + font-style: normal;">Job Engine + </th> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + ${job_engine} + </td> + </tr> + </table> + </td> + </tr> + + <tr> + + <td style="padding: 10px 15px; + background-color: #f2dede; + border:1px solid #ebccd1;"> + <h4 style="margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; + color: #a94442; + font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> + Logs + </h4> + </td> + </tr> + <tr> + + <td style="padding: 15px;"> + <table cellpadding="0" cellspacing="0" width="100%" + style="margin-bottom: 20px;border:1 solid #ddd;border-collapse: collapse;font-family: 'Trebuchet MS ', Arial, Helvetica, sans-serif;"> + <tr> + <td style="padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border: 1px solid #ddd; + font-size: medium; + font-style: normal;"> + <pre style="white-space: pre-wrap;">${error_log}</pre> + </td> + </tr> + </table> + </td> + </tr> + </table> + <hr style="margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee;"> + <h4 style="font-weight: 500; + line-height: 1.1;font-size:18px;"> + <p>Best Wishes!</p> + <p style="margin: 0 0 10px;"><b>Kylin Team</b></p> + </h4> +</div> +</body> + +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/kylin/blob/74e3f614/core-job/src/test/java/org/apache/kylin/job/util/MailNotificationUtilTest.java ---------------------------------------------------------------------- diff --git a/core-job/src/test/java/org/apache/kylin/job/util/MailNotificationUtilTest.java b/core-job/src/test/java/org/apache/kylin/job/util/MailNotificationUtilTest.java new file mode 100644 index 0000000..50627e0 --- /dev/null +++ b/core-job/src/test/java/org/apache/kylin/job/util/MailNotificationUtilTest.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +package org.apache.kylin.job.util; + +import org.apache.kylin.job.execution.ExecutableState; +import org.junit.Assert; +import org.junit.Test; + +import com.google.common.collect.Maps; + +public class MailNotificationUtilTest { + + @Test + public void testGetMailTitle() { + String[] titleParts = new String[] { "JOB", "SUCCEED" }; + Assert.assertEquals("[" + titleParts[0] + "]-[" + titleParts[1] + "]", + MailNotificationUtil.getMailTitle(titleParts)); + } + + @Test + public void testHasMailNotification() { + Assert.assertTrue(MailNotificationUtil.hasMailNotification(ExecutableState.DISCARDED)); + Assert.assertTrue(MailNotificationUtil.hasMailNotification(ExecutableState.ERROR)); + Assert.assertTrue(MailNotificationUtil.hasMailNotification(ExecutableState.SUCCEED)); + Assert.assertFalse(MailNotificationUtil.hasMailNotification(ExecutableState.RUNNING)); + Assert.assertFalse(MailNotificationUtil.hasMailNotification(ExecutableState.STOPPED)); + Assert.assertFalse(MailNotificationUtil.hasMailNotification(ExecutableState.READY)); + } + + @Test + public void testGetMailContent() { + Assert.assertFalse( + MailNotificationUtil.getMailContent(ExecutableState.DISCARDED, Maps.<String, Object>newHashMap()) + .startsWith("Cannot find email template for")); + Assert.assertFalse(MailNotificationUtil.getMailContent(ExecutableState.ERROR, Maps.<String, Object>newHashMap()) + .startsWith("Cannot find email template for")); + Assert.assertFalse( + MailNotificationUtil.getMailContent(ExecutableState.SUCCEED, Maps.<String, Object>newHashMap()) + .startsWith("Cannot find email template for")); + Assert.assertTrue( + MailNotificationUtil.getMailContent(ExecutableState.RUNNING, Maps.<String, Object>newHashMap()) + .startsWith("Cannot find email template for")); + Assert.assertTrue( + MailNotificationUtil.getMailContent(ExecutableState.STOPPED, Maps.<String, Object>newHashMap()) + .startsWith("Cannot find email template for")); + Assert.assertTrue(MailNotificationUtil.getMailContent(ExecutableState.READY, Maps.<String, Object>newHashMap()) + .startsWith("Cannot find email template for")); + } +} http://git-wip-us.apache.org/repos/asf/kylin/blob/74e3f614/engine-mr/src/main/java/org/apache/kylin/engine/mr/CubingJob.java ---------------------------------------------------------------------- diff --git a/engine-mr/src/main/java/org/apache/kylin/engine/mr/CubingJob.java b/engine-mr/src/main/java/org/apache/kylin/engine/mr/CubingJob.java index 548dcb9..9173dbd 100644 --- a/engine-mr/src/main/java/org/apache/kylin/engine/mr/CubingJob.java +++ b/engine-mr/src/main/java/org/apache/kylin/engine/mr/CubingJob.java @@ -27,10 +27,7 @@ import java.util.Map; import java.util.TimeZone; import java.util.regex.Matcher; - import org.apache.kylin.common.KylinConfig; -import org.apache.kylin.common.util.EmailTemplateEnum; -import org.apache.kylin.common.util.EmailTemplateFactory; import org.apache.kylin.common.util.Pair; import org.apache.kylin.common.util.StringUtil; import org.apache.kylin.cube.CubeInstance; @@ -47,7 +44,7 @@ import org.apache.kylin.job.execution.ExecutableState; import org.apache.kylin.job.execution.ExecuteResult; import org.apache.kylin.job.execution.Output; import org.apache.kylin.job.metrics.JobMetricsFacade; -import org.apache.kylin.job.util.ExecutableStateUtil; +import org.apache.kylin.job.util.MailNotificationUtil; import org.apache.kylin.metadata.project.ProjectInstance; import org.apache.kylin.metadata.project.ProjectManager; import org.slf4j.Logger; @@ -205,8 +202,7 @@ public class CubingJob extends DefaultChainedExecutable { return null; } - EmailTemplateEnum templateEnum = ExecutableStateUtil.getEmailTemplateEnum(state); - if (templateEnum == null) { + if (!MailNotificationUtil.hasMailNotification(state)) { logger.info("Cannot find email template for job state: " + state); return null; } @@ -215,7 +211,7 @@ public class CubingJob extends DefaultChainedExecutable { dataMap.put("job_name", getName()); dataMap.put("env_name", getDeployEnvName()); dataMap.put("submitter", StringUtil.noBlank(getSubmitter(), "missing submitter")); - dataMap.put("job_engine", EmailTemplateFactory.getLocalHostName()); + dataMap.put("job_engine", MailNotificationUtil.getLocalHostName()); dataMap.put("project_name", getProjectName()); dataMap.put("cube_name", cubeInstance.getName()); dataMap.put("source_records_count", String.valueOf(findSourceRecordCount())); @@ -242,15 +238,14 @@ public class CubingJob extends DefaultChainedExecutable { final String mrJobId = errorOutput.getExtra().get(ExecutableConstants.MR_JOB_ID); dataMap.put("mr_job_id", StringUtil.noBlank(mrJobId, "Not initialized")); } else { - dataMap.put("mr_job_id", EmailTemplateFactory.NA); + dataMap.put("mr_job_id", MailNotificationUtil.NA); } dataMap.put("error_log", Matcher.quoteReplacement(StringUtil.noBlank(output.getVerboseMsg(), "no error message"))); } - String content = EmailTemplateFactory.getInstance() - .buildEmailContent(ExecutableStateUtil.getEmailTemplateEnum(state), dataMap); - String title = EmailTemplateFactory.getEmailTitle("JOB", state.toString(), getDeployEnvName(), getProjectName(), + String content = MailNotificationUtil.getMailContent(state, dataMap); + String title = MailNotificationUtil.getMailTitle("JOB", state.toString(), getDeployEnvName(), getProjectName(), cubeInstance.getName()); return Pair.newPair(title, content); } @@ -279,9 +274,8 @@ public class CubingJob extends DefaultChainedExecutable { protected void updateMetrics(ExecutableContext context, ExecuteResult result, ExecutableState state) { JobMetricsFacade.JobStatisticsResult jobStats = new JobMetricsFacade.JobStatisticsResult(); - jobStats.setWrapper(getSubmitter(), getProjectName(), - CubingExecutableUtil.getCubeName(getParams()), getId(), getJobType(), - getAlgorithm() == null ? "NULL" : getAlgorithm().toString()); + jobStats.setWrapper(getSubmitter(), getProjectName(), CubingExecutableUtil.getCubeName(getParams()), getId(), + getJobType(), getAlgorithm() == null ? "NULL" : getAlgorithm().toString()); if (state == ExecutableState.SUCCEED) { jobStats.setJobStats(findSourceSizeBytes(), findCubeSizeBytes(), getDuration(), getMapReduceWaitTime(),
