You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@falcon.apache.org by aj...@apache.org on 2015/09/17 16:06:35 UTC
falcon git commit: FALCON-1425 Provide Email based plugin to send
Notification once instance completed. Contributed by Peeyush Bishnoi.
Repository: falcon
Updated Branches:
refs/heads/master ccdcd2e6f -> 5d8b36c16
FALCON-1425 Provide Email based plugin to send Notification once instance completed. Contributed by Peeyush Bishnoi.
Project: http://git-wip-us.apache.org/repos/asf/falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/falcon/commit/5d8b36c1
Tree: http://git-wip-us.apache.org/repos/asf/falcon/tree/5d8b36c1
Diff: http://git-wip-us.apache.org/repos/asf/falcon/diff/5d8b36c1
Branch: refs/heads/master
Commit: 5d8b36c16c72c0bb5581ad27b61da32ab652f3c4
Parents: ccdcd2e
Author: Ajay Yadava <aj...@gmail.com>
Authored: Thu Sep 17 18:13:16 2015 +0530
Committer: Ajay Yadava <aj...@gmail.com>
Committed: Thu Sep 17 18:14:04 2015 +0530
----------------------------------------------------------------------
CHANGES.txt | 2 +
.../falcon/entity/v0/EntityNotification.java | 35 ++++
client/src/main/resources/feed-0.1.xsd | 39 +++++
client/src/main/resources/jaxb-binding.xjb | 8 +
client/src/main/resources/process-0.1.xsd | 40 +++++
.../org/apache/falcon/entity/EntityUtil.java | 13 ++
common/src/main/resources/startup.properties | 24 +++
.../entity/parser/FeedEntityParserTest.java | 9 +
.../entity/parser/ProcessEntityParserTest.java | 8 +
.../src/test/resources/config/feed/feed-0.1.xml | 1 +
.../resources/config/process/process-0.1.xml | 2 +
metrics/pom.xml | 11 ++
.../falcon/plugin/NotificationPlugin.java | 29 ++++
.../falcon/util/EmailNotificationProps.java | 58 +++++++
.../apache/falcon/util/NotificationType.java | 46 +++++
prism/pom.xml | 11 ++
.../apache/falcon/plugin/EmailNotification.java | 167 +++++++++++++++++++
.../falcon/plugin/EmailNotificationPlugin.java | 74 ++++++++
.../falcon/plugin/NotificationHandler.java | 39 +++++
.../apache/falcon/util/NotificationUtil.java | 77 +++++++++
.../falcon/plugin/EmailNotificationTest.java | 160 ++++++++++++++++++
src/conf/startup.properties | 24 +++
22 files changed, 877 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index d431546..013e0fd 100755
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -8,6 +8,8 @@ Trunk (Unreleased)
FALCON-1027 Falcon proxy user support(Sowmya Ramesh)
IMPROVEMENTS
+ FALCON-1425 Provide Email based plugin to send Notification once instance completed(Peeyush Bishnoi via Ajay Yadava)
+
FALCON-1205 SLAService to keep track of missing SLAs for feeds(Ajay Yadava)
FALCON-1449 Move getEntityProperties method to EntityUtil.(Ajay Yadava)
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/client/src/main/java/org/apache/falcon/entity/v0/EntityNotification.java
----------------------------------------------------------------------
diff --git a/client/src/main/java/org/apache/falcon/entity/v0/EntityNotification.java b/client/src/main/java/org/apache/falcon/entity/v0/EntityNotification.java
new file mode 100644
index 0000000..bab70d4
--- /dev/null
+++ b/client/src/main/java/org/apache/falcon/entity/v0/EntityNotification.java
@@ -0,0 +1,35 @@
+/**
+ * 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.falcon.entity.v0;
+
+/**
+ * EntityNotification class to be extended by Feed/Process notification class.
+ */
+public abstract class EntityNotification {
+ public abstract String getType();
+ public abstract String getLevel();
+ public abstract String getTo();
+
+ public String toString() {
+ return "Notification{"
+ + "type=" + getType()
+ + ", to=" + getTo()
+ + "}";
+ }
+}
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/client/src/main/resources/feed-0.1.xsd
----------------------------------------------------------------------
diff --git a/client/src/main/resources/feed-0.1.xsd b/client/src/main/resources/feed-0.1.xsd
index 4ff8baa..2af28d2 100644
--- a/client/src/main/resources/feed-0.1.xsd
+++ b/client/src/main/resources/feed-0.1.xsd
@@ -114,6 +114,14 @@
<xs:element type="locations" name="locations"/>
<xs:element type="catalog-table" name="table"/>
</xs:choice>
+ <xs:element type="notification" name="notification" minOccurs="0">
+ <xs:annotation>
+ <xs:documentation>Notification will help to notify the users about the finished status of Falcon
+ Instance. Currently Email type notification is supported and users must specify the receiver's
+ email address.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
<xs:element type="ACL" name="ACL"/>
<xs:element type="schema" name="schema"/>
<xs:element type="properties" name="properties" minOccurs="0"/>
@@ -291,6 +299,37 @@
<xs:complexType name="partition">
<xs:attribute type="IDENTIFIER" name="name" use="required"/>
</xs:complexType>
+
+ <xs:complexType name="notification">
+ <xs:annotation>
+ <xs:documentation>
+ Notification specifies the "type" of notification to be used to send notification.
+ Currently email based notification type is supported and user can specify the comma
+ separated email address with "to" property.
+ e.g: type="email" to="falcon@localhost,hive@localhost"
+ "limit" property in notification will help to set the frequency of email notification
+ in case of Falcon instance failure. Incase of feed entity limit="attempt" is only supported
+ as there is no retry element.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:attribute name="type" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="email"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="level" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="attempt"/>
+ <xs:enumeration value="instance"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute type="xs:string" name="to" use="required"/>
+ </xs:complexType>
+
<xs:complexType name="ACL">
<xs:annotation>
<xs:documentation>
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/client/src/main/resources/jaxb-binding.xjb
----------------------------------------------------------------------
diff --git a/client/src/main/resources/jaxb-binding.xjb b/client/src/main/resources/jaxb-binding.xjb
index f644f40..6f1d6c7 100644
--- a/client/src/main/resources/jaxb-binding.xjb
+++ b/client/src/main/resources/jaxb-binding.xjb
@@ -40,6 +40,10 @@
<inheritance:extends>org.apache.falcon.entity.v0.AccessControlList</inheritance:extends>
</jaxb:bindings>
+ <jaxb:bindings schemaLocation="feed-0.1.xsd" node="//xs:complexType[@name='notification']">
+ <inheritance:extends>org.apache.falcon.entity.v0.EntityNotification</inheritance:extends>
+ </jaxb:bindings>
+
<jaxb:bindings schemaLocation="process-0.1.xsd" node="//xs:complexType[@name='process']">
<inheritance:extends>org.apache.falcon.entity.v0.Entity</inheritance:extends>
</jaxb:bindings>
@@ -48,6 +52,10 @@
<inheritance:extends>org.apache.falcon.entity.v0.AccessControlList</inheritance:extends>
</jaxb:bindings>
+ <jaxb:bindings schemaLocation="process-0.1.xsd" node="//xs:complexType[@name='notification']">
+ <inheritance:extends>org.apache.falcon.entity.v0.EntityNotification</inheritance:extends>
+ </jaxb:bindings>
+
<jaxb:globalBindings>
<xjc:simple/>
</jaxb:globalBindings>
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/client/src/main/resources/process-0.1.xsd
----------------------------------------------------------------------
diff --git a/client/src/main/resources/process-0.1.xsd b/client/src/main/resources/process-0.1.xsd
index c81d6f7..256a29f 100644
--- a/client/src/main/resources/process-0.1.xsd
+++ b/client/src/main/resources/process-0.1.xsd
@@ -170,6 +170,14 @@
</xs:documentation>
</xs:annotation>
</xs:element>
+ <xs:element type="notification" name="notification" minOccurs="0">
+ <xs:annotation>
+ <xs:documentation>Notification will help to notify the users about the finished status of Falcon
+ Instance. Currently Email type notification is supported and users must specify the receiver's
+ email address.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
<xs:element type="ACL" name="ACL" minOccurs="0"/>
</xs:sequence>
<xs:attribute type="IDENTIFIER" name="name" use="required"/>
@@ -399,4 +407,36 @@
<xs:attribute type="xs:string" name="group"/>
<xs:attribute type="xs:string" name="permission" default="*"/>
</xs:complexType>
+
+ <xs:complexType name="notification">
+ <xs:annotation>
+ <xs:documentation>
+ Notification specifies the "type" of notification to be used to send notification.
+ Currently email based notification type is supported and user can specify the comma
+ separated email address with "to" property.
+ e.g: type="email" to="falcon@localhost,hive@localhost"
+ "limit" property in notification will help to set the frequency of email notification
+ in case of Falcon instance failure.
+ If limit="attempt" is set, for every instance failure email will be sent.
+ If limit="final" is set, failure email will be sent only when all the attempts has been
+ tried defined with retry element.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:attribute name="type" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="email"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="level" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="attempt"/>
+ <xs:enumeration value="instance"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute type="xs:string" name="to" use="required"/>
+ </xs:complexType>
</xs:schema>
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/common/src/main/java/org/apache/falcon/entity/EntityUtil.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/falcon/entity/EntityUtil.java b/common/src/main/java/org/apache/falcon/entity/EntityUtil.java
index 2f05b1f..646afc3 100644
--- a/common/src/main/java/org/apache/falcon/entity/EntityUtil.java
+++ b/common/src/main/java/org/apache/falcon/entity/EntityUtil.java
@@ -29,6 +29,7 @@ import org.apache.falcon.entity.WorkflowNameBuilder.WorkflowName;
import org.apache.falcon.entity.store.ConfigurationStore;
import org.apache.falcon.entity.v0.Entity;
import org.apache.falcon.entity.v0.EntityGraph;
+import org.apache.falcon.entity.v0.EntityNotification;
import org.apache.falcon.entity.v0.EntityType;
import org.apache.falcon.entity.v0.Frequency;
import org.apache.falcon.entity.v0.SchemaHelper;
@@ -936,5 +937,17 @@ public final class EntityUtil {
return result;
}
+ public static EntityNotification getEntityNotification(Entity entity) {
+ switch (entity.getEntityType()) {
+ case FEED:
+ Feed feed = (Feed) entity;
+ return feed.getNotification();
+ case PROCESS:
+ Process process = (Process) entity;
+ return process.getNotification();
+ default:
+ throw new IllegalArgumentException("Unhandled type: " + entity.getEntityType());
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/common/src/main/resources/startup.properties
----------------------------------------------------------------------
diff --git a/common/src/main/resources/startup.properties b/common/src/main/resources/startup.properties
index 39a412d..9db460c 100644
--- a/common/src/main/resources/startup.properties
+++ b/common/src/main/resources/startup.properties
@@ -198,3 +198,27 @@ it.workflow.execution.listeners=org.apache.falcon.catalog.CatalogPartitionHandle
*.falcon.security.authorization.provider=org.apache.falcon.security.DefaultAuthorizationProvider
######### Authorization Properties #########
+
+######### SMTP Properties ########
+
+# Setting SMTP hostname
+#*.falcon.email.smtp.host=localhost
+
+# Setting SMTP port number
+#*.falcon.email.smtp.port=25
+
+# Setting email from address
+#*.falcon.email.from.address=falcon@localhost
+
+# Setting email Auth
+#*.falcon.email.smtp.auth=false
+
+#Setting user name
+#*.falcon.email.smtp.user=""
+
+#Setting password
+#*.falcon.email.smtp.password=""
+
+# Setting monitoring plugin, if SMTP parameters is defined
+#*.monitoring.plugins=org.apache.falcon.plugin.DefaultMonitoringPlugin,\
+# org.apache.falcon.plugin.EmailNotificationPlugin
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/common/src/test/java/org/apache/falcon/entity/parser/FeedEntityParserTest.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/falcon/entity/parser/FeedEntityParserTest.java b/common/src/test/java/org/apache/falcon/entity/parser/FeedEntityParserTest.java
index d203b7c..1e9b72f 100644
--- a/common/src/test/java/org/apache/falcon/entity/parser/FeedEntityParserTest.java
+++ b/common/src/test/java/org/apache/falcon/entity/parser/FeedEntityParserTest.java
@@ -927,6 +927,15 @@ public class FeedEntityParserTest extends AbstractTestBase {
}
@Test
+ public void testValidateEmailNotification() throws Exception {
+ Feed feedNotification = (Feed) EntityType.FEED.getUnmarshaller().unmarshal(
+ (FeedEntityParserTest.class.getResourceAsStream(FEED_XML)));
+ Assert.assertNotNull(feedNotification.getNotification());
+ Assert.assertEquals(feedNotification.getNotification().getTo(), "falcon@localhost");
+ Assert.assertEquals(feedNotification.getNotification().getType(), "email");
+ }
+
+ @Test
public void testValidateFeedProperties() throws Exception {
FeedEntityParser feedEntityParser = Mockito
.spy((FeedEntityParser) EntityParserFactory.getParser(EntityType.FEED));
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/common/src/test/java/org/apache/falcon/entity/parser/ProcessEntityParserTest.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/falcon/entity/parser/ProcessEntityParserTest.java b/common/src/test/java/org/apache/falcon/entity/parser/ProcessEntityParserTest.java
index 77f6a77..a935db3 100644
--- a/common/src/test/java/org/apache/falcon/entity/parser/ProcessEntityParserTest.java
+++ b/common/src/test/java/org/apache/falcon/entity/parser/ProcessEntityParserTest.java
@@ -357,6 +357,14 @@ public class ProcessEntityParserTest extends AbstractTestBase {
}
@Test
+ public void testValidateEmailNotification() throws Exception {
+ Process process = parser.parseAndValidate(getClass().getResourceAsStream(PROCESS_XML));
+ Assert.assertNotNull(process.getNotification());
+ Assert.assertEquals(process.getNotification().getTo(), "falcon@localhost");
+ Assert.assertEquals(process.getNotification().getType(), "email");
+ }
+
+ @Test
public void testValidateACLWithNoACLAndAuthorizationDisabled() throws Exception {
InputStream stream = this.getClass().getResourceAsStream(PROCESS_XML);
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/common/src/test/resources/config/feed/feed-0.1.xml
----------------------------------------------------------------------
diff --git a/common/src/test/resources/config/feed/feed-0.1.xml b/common/src/test/resources/config/feed/feed-0.1.xml
index ee2607a..d223d5d 100644
--- a/common/src/test/resources/config/feed/feed-0.1.xml
+++ b/common/src/test/resources/config/feed/feed-0.1.xml
@@ -58,6 +58,7 @@
<location type="meta" path="/projects/falcon/clicksMetaData"/>
</locations>
+ <notification type="email" to="falcon@localhost"/>
<ACL owner="testuser-ut-user" group="group" permission="0x755"/>
<schema location="/schema/clicks" provider="protobuf"/>
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/common/src/test/resources/config/process/process-0.1.xml
----------------------------------------------------------------------
diff --git a/common/src/test/resources/config/process/process-0.1.xml b/common/src/test/resources/config/process/process-0.1.xml
index 2659903..039208c 100644
--- a/common/src/test/resources/config/process/process-0.1.xml
+++ b/common/src/test/resources/config/process/process-0.1.xml
@@ -54,4 +54,6 @@
<late-input input="impression" workflow-path="himpression/late/workflow"/>
<late-input input="clicks" workflow-path="hdfs://clicks/late/workflow"/>
</late-process>
+
+ <notification type="email" to="falcon@localhost"/>
</process>
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/metrics/pom.xml
----------------------------------------------------------------------
diff --git a/metrics/pom.xml b/metrics/pom.xml
index 748fb97..a0358db 100644
--- a/metrics/pom.xml
+++ b/metrics/pom.xml
@@ -35,6 +35,11 @@
<dependencies>
<dependency>
+ <groupId>org.apache.falcon</groupId>
+ <artifactId>falcon-client</artifactId>
+ </dependency>
+
+ <dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</dependency>
@@ -54,5 +59,11 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
+
+ <dependency>
+ <groupId>javax.mail</groupId>
+ <artifactId>mail</artifactId>
+ <version>1.4.7</version>
+ </dependency>
</dependencies>
</project>
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/metrics/src/main/java/org/apache/falcon/plugin/NotificationPlugin.java
----------------------------------------------------------------------
diff --git a/metrics/src/main/java/org/apache/falcon/plugin/NotificationPlugin.java b/metrics/src/main/java/org/apache/falcon/plugin/NotificationPlugin.java
new file mode 100644
index 0000000..ff86d28
--- /dev/null
+++ b/metrics/src/main/java/org/apache/falcon/plugin/NotificationPlugin.java
@@ -0,0 +1,29 @@
+/**
+ * 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.falcon.plugin;
+
+import org.apache.falcon.aspect.ResourceMessage;
+import org.apache.falcon.entity.v0.EntityNotification;
+
+/**
+ * Interface to be implemented by notification class to send notification.
+ */
+public interface NotificationPlugin {
+ void sendNotification(ResourceMessage resourceMessage, EntityNotification entityNotification) throws Exception;
+}
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/metrics/src/main/java/org/apache/falcon/util/EmailNotificationProps.java
----------------------------------------------------------------------
diff --git a/metrics/src/main/java/org/apache/falcon/util/EmailNotificationProps.java b/metrics/src/main/java/org/apache/falcon/util/EmailNotificationProps.java
new file mode 100644
index 0000000..7de7b73
--- /dev/null
+++ b/metrics/src/main/java/org/apache/falcon/util/EmailNotificationProps.java
@@ -0,0 +1,58 @@
+/**
+ * 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.falcon.util;
+
+/**
+ * Email Notification Argument list.
+ */
+public enum EmailNotificationProps {
+ SMTP_HOST("falcon.email.smtp.host", "SMTP host server name", true),
+ SMTP_PORT("falcon.email.smtp.port", "SMTP port number", true),
+ SMTP_FROM("falcon.email.from.address", "SMTP from address", true),
+ SMTP_AUTH("falcon.email.smtp.auth", "SMTP authorization details", false),
+ SMTP_USER("falcon.email.smtp.user", "SMTP username", false),
+ SMTP_PASSWORD("falcon.email.smtp.password", "SMTP password", false);
+
+ private final String name;
+ private final String description;
+ private final boolean isRequired;
+
+ EmailNotificationProps(String name, String description, boolean isRequired) {
+ this.name = name;
+ this.description = description;
+ this.isRequired = isRequired;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public String getDescription() {
+ return this.description;
+ }
+
+ public boolean isRequired() {
+ return this.isRequired;
+ }
+
+ public String toString() {
+ return getName();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/metrics/src/main/java/org/apache/falcon/util/NotificationType.java
----------------------------------------------------------------------
diff --git a/metrics/src/main/java/org/apache/falcon/util/NotificationType.java b/metrics/src/main/java/org/apache/falcon/util/NotificationType.java
new file mode 100644
index 0000000..e5f7258
--- /dev/null
+++ b/metrics/src/main/java/org/apache/falcon/util/NotificationType.java
@@ -0,0 +1,46 @@
+/**
+ * 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.falcon.util;
+
+/**
+ * Types of Notification.
+ */
+public enum NotificationType {
+ EMAIL("email", "send email notification");
+
+ private final String name;
+ private final String description;
+
+ NotificationType(String name, String description) {
+ this.name = name;
+ this.description = description;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String toString() {
+ return getName();
+ }
+}
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/prism/pom.xml
----------------------------------------------------------------------
diff --git a/prism/pom.xml b/prism/pom.xml
index be04ac9..6eca0b9 100644
--- a/prism/pom.xml
+++ b/prism/pom.xml
@@ -76,6 +76,11 @@
<dependency>
<groupId>org.apache.falcon</groupId>
+ <artifactId>falcon-client</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.falcon</groupId>
<artifactId>falcon-oozie-adaptor</artifactId>
</dependency>
@@ -148,6 +153,12 @@
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
</dependency>
+
+ <dependency>
+ <groupId>com.icegreen</groupId>
+ <artifactId>greenmail</artifactId>
+ <version>1.4.1</version>
+ </dependency>
</dependencies>
<build>
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/prism/src/main/java/org/apache/falcon/plugin/EmailNotification.java
----------------------------------------------------------------------
diff --git a/prism/src/main/java/org/apache/falcon/plugin/EmailNotification.java b/prism/src/main/java/org/apache/falcon/plugin/EmailNotification.java
new file mode 100644
index 0000000..8c42c70
--- /dev/null
+++ b/prism/src/main/java/org/apache/falcon/plugin/EmailNotification.java
@@ -0,0 +1,167 @@
+/**
+ * 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.falcon.plugin;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.falcon.FalconException;
+import org.apache.falcon.aspect.ResourceMessage;
+import org.apache.falcon.entity.v0.EntityNotification;
+import org.apache.falcon.util.EmailNotificationProps;
+import org.apache.falcon.util.NotificationUtil;
+import org.apache.falcon.util.StartupProperties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.mail.Authenticator;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.PasswordAuthentication;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Concrete class for email notification.
+ */
+public class EmailNotification implements NotificationPlugin {
+
+ private static final Logger LOG = LoggerFactory.getLogger(EmailNotification.class);
+
+ private static final String SMTP_HOST = StartupProperties.get().getProperty(
+ EmailNotificationProps.SMTP_HOST.getName(), "localhost");
+ private static final String SMTP_PORT = StartupProperties.get().getProperty(
+ EmailNotificationProps.SMTP_PORT.getName(), "3025");
+ private static final String SMTP_FROM = StartupProperties.get().getProperty(
+ EmailNotificationProps.SMTP_FROM.getName(), "falcon@localhost");
+ private static final Boolean SMTP_AUTH = Boolean.valueOf(StartupProperties.get().getProperty(
+ EmailNotificationProps.SMTP_AUTH.getName(), "false"));
+ private static final String SMTP_USER = StartupProperties.get().getProperty(
+ EmailNotificationProps.SMTP_USER.getName(), "");
+ private static final String SMTP_PASSWORD = StartupProperties.get().getProperty(
+ EmailNotificationProps.SMTP_PASSWORD.getName(), "");
+
+ private static final String NEWLINE_DELIM = System.getProperty("line.separator");
+ private static final String TAB_DELIM = "\t";
+
+ private Message message;
+
+ public EmailNotification() throws FalconException {
+ initialize();
+ }
+
+ private void initialize() throws FalconException {
+ Properties emailProperties = new Properties();
+ if (StringUtils.isEmpty(SMTP_HOST) && StringUtils.isEmpty(SMTP_PORT)
+ && StringUtils.isEmpty(SMTP_FROM)) {
+ LOG.error("SMTP properties is not defined in startup.properties");
+ return;
+ }
+
+ emailProperties.setProperty("mail.smtp.host", SMTP_HOST);
+ emailProperties.setProperty("mail.smtp.port", SMTP_PORT);
+ emailProperties.setProperty("mail.smtp.auth", SMTP_AUTH.toString());
+ try {
+ Session session;
+ if (!SMTP_AUTH) {
+ session = Session.getInstance(emailProperties);
+ } else {
+ session = Session.getInstance(emailProperties, new FalconMailAuthenticator(SMTP_USER, SMTP_PASSWORD));
+ }
+ message = new MimeMessage(session);
+ message.setFrom(new InternetAddress(SMTP_FROM));
+ } catch (MessagingException e) {
+ throw new FalconException("Exception occurred in SMTP initialization:" +e);
+ }
+ }
+
+
+ public void sendNotification(ResourceMessage resourceMessage, EntityNotification entityNotification)
+ throws FalconException {
+ try {
+ message.addRecipients(Message.RecipientType.TO,
+ NotificationUtil.getToAddress(entityNotification.getTo()));
+
+ if (resourceMessage.getAction().equals("wf-instance-succeeded")) {
+ sendSuccessNotification(resourceMessage);
+ } else if ((resourceMessage.getAction().equals("wf-instance-failed"))) {
+ sendFailureNotification(resourceMessage);
+ }
+
+ // Send message
+ Transport.send(message);
+ } catch (MessagingException e) {
+ throw new FalconException("Error occurred while sending email message using SMTP:" +e);
+ }
+ }
+
+ private void sendSuccessNotification(ResourceMessage resourceMessage) throws FalconException {
+ try {
+ String subjectMessage = "Falcon Instance Succeeded : " + getSubjectMessage(resourceMessage);
+ message.setSubject(subjectMessage);
+ message.setText(subjectMessage + NEWLINE_DELIM + getBodyMessage(resourceMessage));
+ } catch (MessagingException e) {
+ throw new FalconException("Error in composing email notification:" +e);
+ }
+ }
+
+ private void sendFailureNotification(ResourceMessage resourceMessage) throws FalconException {
+ try {
+ String subjectMessage = "Falcon Instance Failed : " + getSubjectMessage(resourceMessage);
+ message.setSubject(subjectMessage);
+ message.setText(subjectMessage + NEWLINE_DELIM + getBodyMessage(resourceMessage));
+ } catch (MessagingException e) {
+ throw new FalconException("Error in composing email notification:" +e);
+ }
+ }
+
+ private String getSubjectMessage(ResourceMessage resourceMessage) throws FalconException {
+ return "Workflow id:" + resourceMessage.getDimensions().get("wf-id")
+ + " Name:" + resourceMessage.getDimensions().get("entity-name")
+ + " Type:" + resourceMessage.getDimensions().get("entity-type");
+ }
+
+ private String getBodyMessage(ResourceMessage resourceMessage) throws FalconException {
+ StringBuilder msg = new StringBuilder();
+ Map<String, String> instanceMap = resourceMessage.getDimensions();
+ for (Map.Entry<String, String> entry : instanceMap.entrySet()) {
+ msg.append(entry.getKey() + TAB_DELIM + entry.getValue());
+ msg.append(NEWLINE_DELIM);
+ }
+ msg.append("---");
+ return msg.toString();
+ }
+
+ private static class FalconMailAuthenticator extends Authenticator {
+ private String user;
+ private String password;
+
+ public FalconMailAuthenticator(String user, String password) {
+ this.user = user;
+ this.password = password;
+ }
+
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(user, password);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/prism/src/main/java/org/apache/falcon/plugin/EmailNotificationPlugin.java
----------------------------------------------------------------------
diff --git a/prism/src/main/java/org/apache/falcon/plugin/EmailNotificationPlugin.java b/prism/src/main/java/org/apache/falcon/plugin/EmailNotificationPlugin.java
new file mode 100644
index 0000000..bcb8c0a
--- /dev/null
+++ b/prism/src/main/java/org/apache/falcon/plugin/EmailNotificationPlugin.java
@@ -0,0 +1,74 @@
+/**
+ * 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.falcon.plugin;
+
+import org.apache.falcon.aspect.ResourceMessage;
+import org.apache.falcon.entity.EntityUtil;
+import org.apache.falcon.entity.store.ConfigurationStore;
+import org.apache.falcon.entity.v0.Entity;
+import org.apache.falcon.entity.v0.EntityNotification;
+import org.apache.falcon.entity.v0.EntityType;
+import org.apache.falcon.util.NotificationUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * EmailNotification plugin implementation for sending email notification.
+ */
+public class EmailNotificationPlugin implements MonitoringPlugin {
+
+ private static final Logger LOG = LoggerFactory.getLogger(EmailNotificationPlugin.class);
+
+ @Override
+ public void monitor(ResourceMessage message) {
+ try {
+ String entityType = message.getDimensions().get("entity-type");
+ String entityName = message.getDimensions().get("entity-name");
+ Entity entity = null;
+ if (entityType.equals("PROCESS")) {
+ entity = ConfigurationStore.get().get(EntityType.PROCESS, entityName);
+ } else if (entityType.equals("FEED")) {
+ entity = ConfigurationStore.get().get(EntityType.FEED, entityName);
+ }
+
+ EntityNotification entityNotification = EntityUtil.getEntityNotification(entity);
+ if (entityNotification == null) {
+ LOG.info("Notification tag is not defined for entity: {}", entityName);
+ return;
+ }
+
+ if (!(NotificationUtil.isEmailAddressValid(entityNotification))) {
+ LOG.error("Notification email address is not valid: {}", entityNotification.getTo());
+ return;
+ }
+
+ if ((message.getAction().equals("wf-instance-succeeded")
+ || message.getAction().equals("wf-instance-failed"))) {
+ NotificationPlugin pluginType = NotificationHandler.getNotificationType(entityNotification.getType());
+ if (pluginType != null) {
+ pluginType.sendNotification(message, entityNotification);
+ } else {
+ LOG.error("Notification type is not supported: {}", entityNotification.getType());
+ }
+ }
+ } catch (Exception e) {
+ LOG.error("Exception in sending Notification from EmailNotificationPlugin:" +e);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/prism/src/main/java/org/apache/falcon/plugin/NotificationHandler.java
----------------------------------------------------------------------
diff --git a/prism/src/main/java/org/apache/falcon/plugin/NotificationHandler.java b/prism/src/main/java/org/apache/falcon/plugin/NotificationHandler.java
new file mode 100644
index 0000000..582d3eb
--- /dev/null
+++ b/prism/src/main/java/org/apache/falcon/plugin/NotificationHandler.java
@@ -0,0 +1,39 @@
+/**
+ * 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.falcon.plugin;
+
+import org.apache.falcon.FalconException;
+import org.apache.falcon.util.NotificationType;
+
+/**
+ * Notification Handler to initialize the Notification concrete class.
+ */
+public final class NotificationHandler {
+
+ private NotificationHandler() {
+ }
+
+ public static NotificationPlugin getNotificationType(final String notificationType) throws FalconException {
+ if (notificationType.equals(NotificationType.EMAIL.getName())) {
+ return new EmailNotification();
+ } else {
+ return null;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/prism/src/main/java/org/apache/falcon/util/NotificationUtil.java
----------------------------------------------------------------------
diff --git a/prism/src/main/java/org/apache/falcon/util/NotificationUtil.java b/prism/src/main/java/org/apache/falcon/util/NotificationUtil.java
new file mode 100644
index 0000000..d20422b
--- /dev/null
+++ b/prism/src/main/java/org/apache/falcon/util/NotificationUtil.java
@@ -0,0 +1,77 @@
+/**
+ * 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.falcon.util;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.falcon.FalconException;
+import org.apache.falcon.entity.v0.EntityNotification;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.mail.Address;
+import javax.mail.internet.AddressException;
+import javax.mail.internet.InternetAddress;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Utils class for notification.
+ */
+public final class NotificationUtil {
+ public static final Logger LOG = LoggerFactory.getLogger(NotificationUtil.class);
+
+ private NotificationUtil() {
+ }
+
+ private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
+ + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*$";
+ private static final String COMMA = ",";
+
+ public static boolean isEmailAddressValid(EntityNotification entityNotification) throws FalconException {
+ Pattern pattern = Pattern.compile(EMAIL_PATTERN);
+ if (StringUtils.isEmpty(entityNotification.getTo())) {
+ return false;
+ }
+
+ for (String address : entityNotification.getTo().split(COMMA)) {
+ Matcher matcher = pattern.matcher(address.trim());
+ if (!(matcher.matches())) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public static Address[] getToAddress(String toAddress) throws FalconException {
+ List<InternetAddress> toAddrs = new ArrayList<InternetAddress>();
+ String []tos = toAddress.split(COMMA);
+ try {
+ for (String toStr : tos) {
+ toAddrs.add(new InternetAddress(toStr.trim()));
+ }
+ } catch (AddressException e) {
+ throw new FalconException("Exception in to address:"+e);
+ }
+
+ return toAddrs.toArray(new InternetAddress[0]);
+ }
+}
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/prism/src/test/java/org/apache/falcon/plugin/EmailNotificationTest.java
----------------------------------------------------------------------
diff --git a/prism/src/test/java/org/apache/falcon/plugin/EmailNotificationTest.java b/prism/src/test/java/org/apache/falcon/plugin/EmailNotificationTest.java
new file mode 100644
index 0000000..a6671fa
--- /dev/null
+++ b/prism/src/test/java/org/apache/falcon/plugin/EmailNotificationTest.java
@@ -0,0 +1,160 @@
+/**
+ * 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.falcon.plugin;
+
+import com.icegreen.greenmail.util.GreenMail;
+import com.icegreen.greenmail.util.ServerSetup;
+import org.apache.falcon.aspect.ResourceMessage;
+import org.apache.falcon.entity.v0.process.Notification;
+import org.apache.falcon.util.NotificationUtil;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import javax.mail.Message;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Unit test to test Email Notification.
+ */
+
+public class EmailNotificationTest {
+ private static final String EMAIL_FROM = "falcon@localhost";
+
+ private GreenMail mailServer;
+ private ResourceMessage resourceMessage;
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ ServerSetup setup = new ServerSetup(3025, "localhost", "smtp");
+ mailServer = new GreenMail(setup);
+ mailServer.setUser(EMAIL_FROM, "", "");
+ mailServer.start();
+ resourceMessage = buildResourceMessage();
+ }
+
+ private ResourceMessage buildResourceMessage() {
+ String action = "wf-instance-succeeded";
+ ResourceMessage.Status status = ResourceMessage.Status.SUCCEEDED;
+ long executionTime = 78819000000L; //Time in nano seconds.
+ Map<String, String> dimensions = new HashMap<String, String>();
+ dimensions.put("entity-type", "process");
+ dimensions.put("entity-name", "pig-process");
+ dimensions.put("wf-id", "001-oozie-wf");
+ dimensions.put("wf-user", "falcon");
+ dimensions.put("run-id", "1");
+ dimensions.put("operation", "GENERATE");
+
+ return new ResourceMessage(action, dimensions, status, executionTime);
+ }
+
+
+ @Test
+ public void testSendNotification() throws Exception {
+ String notificationType = "email";
+ String emailTo = "falcon_to@localhost";
+
+ Notification notification = new Notification();
+ notification.setType(notificationType);
+ notification.setTo(emailTo);
+
+ NotificationPlugin pluginType = NotificationHandler.getNotificationType(notification.getType());
+ Assert.assertNotNull(pluginType);
+
+ pluginType.sendNotification(resourceMessage, notification);
+ mailServer.waitForIncomingEmail(5000, 1);
+ Message[] messages = mailServer.getReceivedMessages();
+ Assert.assertNotNull(messages);
+ Assert.assertEquals(messages[0].getFrom()[0].toString(), EMAIL_FROM);
+ Assert.assertEquals(messages[0].getAllRecipients()[0].toString(), emailTo);
+ Assert.assertEquals(messages[0].getSubject(), "Falcon Instance Succeeded : Workflow id:001-oozie-wf "
+ + "Name:pig-process Type:process");
+ }
+
+ @Test
+ public void testNotificationType() throws Exception {
+ String notificationType = "email";
+ String emailTo = "falcon@localhost";
+
+ Notification notification = new Notification();
+ notification.setType(notificationType);
+ notification.setTo(emailTo);
+
+ NotificationPlugin pluginType = NotificationHandler.getNotificationType(notification.getType());
+ Assert.assertNotNull(pluginType);
+
+ notificationType = "eml";
+ notification.setType(notificationType);
+ pluginType = NotificationHandler.getNotificationType(notification.getType());
+ Assert.assertNull(pluginType);
+
+ notificationType = "";
+ notification.setType(notificationType);
+ pluginType = NotificationHandler.getNotificationType(notification.getType());
+ Assert.assertNull(pluginType);
+ }
+
+ @Test
+ public void testNotificationEmailAddress() throws Exception {
+ String notificationType = "email";
+ String emailAddress = "falcon@locahost";
+
+ Notification notification = new Notification();
+ notification.setType(notificationType);
+ notification.setTo(emailAddress);
+
+ Assert.assertTrue(NotificationUtil.isEmailAddressValid(notification));
+
+ emailAddress = "falcon_123@localhost";
+ notification.setTo(emailAddress);
+ Assert.assertTrue(NotificationUtil.isEmailAddressValid(notification));
+
+ emailAddress = "falcon-123@localhost-inc.com";
+ notification.setTo(emailAddress);
+ Assert.assertTrue(NotificationUtil.isEmailAddressValid(notification));
+
+ emailAddress = "falcon@locahost,hive@localhost,user@abc.com";
+ notification.setTo(emailAddress);
+ Assert.assertTrue(NotificationUtil.isEmailAddressValid(notification));
+
+ emailAddress = "falcon@locahost,,,";
+ notification.setTo(emailAddress);
+ Assert.assertTrue(NotificationUtil.isEmailAddressValid(notification));
+
+ emailAddress = "falcon";
+ notification.setTo(emailAddress);
+ Assert.assertFalse(NotificationUtil.isEmailAddressValid(notification));
+
+ emailAddress = "falcon#localhost";
+ notification.setTo(emailAddress);
+ Assert.assertFalse(NotificationUtil.isEmailAddressValid(notification));
+
+ emailAddress = "";
+ notification.setTo(emailAddress);
+ Assert.assertFalse(NotificationUtil.isEmailAddressValid(notification));
+ }
+
+
+ @AfterClass
+ public void tearDown() throws Exception {
+ mailServer.stop();
+ }
+}
http://git-wip-us.apache.org/repos/asf/falcon/blob/5d8b36c1/src/conf/startup.properties
----------------------------------------------------------------------
diff --git a/src/conf/startup.properties b/src/conf/startup.properties
index 305ac36..8f3bc35 100644
--- a/src/conf/startup.properties
+++ b/src/conf/startup.properties
@@ -202,3 +202,27 @@ prism.configstore.listeners=org.apache.falcon.entity.v0.EntityGraph,\
*.falcon.security.authorization.provider=org.apache.falcon.security.DefaultAuthorizationProvider
######### Authorization Properties #########
+
+######### SMTP Properties ########
+
+# Setting SMTP hostname
+#*.falcon.email.smtp.host=localhost
+
+# Setting SMTP port number
+#*.falcon.email.smtp.port=25
+
+# Setting email from address
+#*.falcon.email.from.address=falcon@localhost
+
+# Setting email Auth
+#*.falcon.email.smtp.auth=false
+
+#Setting user name, if Auth is true
+#*.falcon.email.smtp.user=""
+
+#Setting password, if Auth is true
+#*.falcon.email.smtp.password=""
+
+# Setting monitoring plugin, if SMTP parameters is defined
+#*.monitoring.plugins=org.apache.falcon.plugin.DefaultMonitoringPlugin,\
+# org.apache.falcon.plugin.EmailNotificationPlugin