You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by di...@apache.org on 2019/02/25 21:51:16 UTC

[airavata] branch develop updated: Adding job execution engine and job monitoring starting units to ide integration module

This is an automated email from the ASF dual-hosted git repository.

dimuthuupe pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/airavata.git


The following commit(s) were added to refs/heads/develop by this push:
     new 4d222ac  Adding job execution engine and job monitoring starting units to ide integration module
4d222ac is described below

commit 4d222ac1fd50ba29c79ff686a8d8322484367653
Author: Dimuthu Wannipurage <di...@gmail.com>
AuthorDate: Mon Feb 25 16:51:07 2019 -0500

    Adding job execution engine and job monitoring starting units to ide integration module
---
 .../helix/impl/participant/GlobalParticipant.java  | 17 +++--
 .../helix/impl/workflow/PostWorkflowManager.java   | 45 ++++++-----
 .../helix/impl/workflow/PreWorkflowManager.java    |  8 +-
 modules/ide-integration/README.md                  | 21 ++++++
 modules/ide-integration/pom.xml                    | 10 +++
 .../airavata/ide/integration/JobEngineStarter.java | 47 ++++++++++++
 .../ide/integration/JobMonitorStarter.java         | 10 +++
 .../src/main/resources/airavata-server.properties  | 86 +++++++---------------
 .../src/main/resources/docker-compose.yml          | 15 +++-
 .../src/main/resources/email-config.yaml           | 48 ++++++++++++
 .../airavata/monitor/email/EmailBasedMonitor.java  |  9 ++-
 11 files changed, 226 insertions(+), 90 deletions(-)

diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/participant/GlobalParticipant.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/participant/GlobalParticipant.java
index d29fcd9..41c125e 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/participant/GlobalParticipant.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/participant/GlobalParticipant.java
@@ -32,7 +32,7 @@ public class GlobalParticipant extends HelixParticipant<AbstractTask> {
 
     private final static Logger logger = LoggerFactory.getLogger(GlobalParticipant.class);
 
-    private final static String[] taskClassNames = {
+    public final static String[] TASK_CLASS_NAMES = {
             "org.apache.airavata.helix.impl.task.env.EnvSetupTask",
             "org.apache.airavata.helix.impl.task.staging.InputDataStagingTask",
             "org.apache.airavata.helix.impl.task.staging.OutputDataStagingTask",
@@ -54,21 +54,28 @@ public class GlobalParticipant extends HelixParticipant<AbstractTask> {
         super(taskClasses, taskTypeName);
     }
 
+    public void startServer() {
+        Thread t = new Thread(this);
+        t.start();
+    }
+
+    public void stopServer() {
+
+    }
+
     public static void main(String args[]) {
         logger.info("Starting global participant");
 
         try {
             ArrayList<Class<? extends AbstractTask>> taskClasses = new ArrayList<>();
 
-            for (String taskClassName : taskClassNames) {
+            for (String taskClassName : TASK_CLASS_NAMES) {
                 logger.debug("Adding task class: " + taskClassName + " to the global participant");
                 taskClasses.add(Class.forName(taskClassName).asSubclass(AbstractTask.class));
             }
 
             GlobalParticipant participant = new GlobalParticipant(taskClasses, null);
-
-            Thread t = new Thread(participant);
-            t.start();
+            participant.startServer();
 
         } catch (Exception e) {
             logger.error("Failed to start global participant", e);
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
index 6aebdd2..a992148 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
@@ -264,29 +264,31 @@ public class PostWorkflowManager extends WorkflowManager {
 
     }
 
-    private void runConsumer() throws ApplicationSettingsException {
-        final Consumer<String, JobStatusResult> consumer = createConsumer();
-
-        while (true) {
-            final ConsumerRecords<String, JobStatusResult> consumerRecords = consumer.poll(Long.MAX_VALUE);
+    public void startServer() throws Exception {
 
-            for (TopicPartition partition : consumerRecords.partitions()) {
-                List<ConsumerRecord<String, JobStatusResult>> partitionRecords = consumerRecords.records(partition);
-                for (ConsumerRecord<String, JobStatusResult> record : partitionRecords) {
-                    boolean success = process(record.value());
-                    logger.info("Status of processing " + record.value().getJobId() + " : " + success);
-                    if (success) {
-                        consumer.commitSync(Collections.singletonMap(partition, new OffsetAndMetadata(record.offset() + 1)));
+        init();
+        final Consumer<String, JobStatusResult> consumer = createConsumer();
+        new Thread(() -> {
+
+            while (true) {
+                final ConsumerRecords<String, JobStatusResult> consumerRecords = consumer.poll(Long.MAX_VALUE);
+
+                for (TopicPartition partition : consumerRecords.partitions()) {
+                    List<ConsumerRecord<String, JobStatusResult>> partitionRecords = consumerRecords.records(partition);
+                    for (ConsumerRecord<String, JobStatusResult> record : partitionRecords) {
+                        boolean success = process(record.value());
+                        logger.info("Status of processing " + record.value().getJobId() + " : " + success);
+                        if (success) {
+                            consumer.commitSync(Collections.singletonMap(partition, new OffsetAndMetadata(record.offset() + 1)));
+                        }
                     }
                 }
-            }
 
-            consumerRecords.forEach(record -> {
-                process(record.value());
-            });
+                consumerRecords.forEach(record -> process(record.value()));
 
-            consumer.commitAsync();
-        }
+                consumer.commitAsync();
+            }
+        }).start();
     }
 
     private void saveAndPublishJobStatus(String jobId, String taskId, String processId, String experimentId, String gateway,
@@ -329,10 +331,13 @@ public class PostWorkflowManager extends WorkflowManager {
         }
     }
 
+    public void stopServer() {
+
+    }
+
     public static void main(String[] args) throws Exception {
 
         PostWorkflowManager postManager = new PostWorkflowManager();
-        postManager.init();
-        postManager.runConsumer();
+        postManager.startServer();
     }
 }
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PreWorkflowManager.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PreWorkflowManager.java
index 922c89d..767e403 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PreWorkflowManager.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PreWorkflowManager.java
@@ -61,11 +61,15 @@ public class PreWorkflowManager extends WorkflowManager {
         super(ServerSettings.getSetting("pre.workflow.manager.name"));
     }
 
-    private void initAllComponents() throws Exception {
+    public void startServer() throws Exception {
         super.initComponents();
         initLaunchSubscriber();
     }
 
+    public void stopServer() {
+
+    }
+
     private void initLaunchSubscriber() throws AiravataException {
         List<String> routingKeys = new ArrayList<>();
         routingKeys.add(ServerSettings.getRabbitmqProcessExchangeName());
@@ -208,7 +212,7 @@ public class PreWorkflowManager extends WorkflowManager {
 
     public static void main(String[] args) throws Exception {
         PreWorkflowManager preWorkflowManager = new PreWorkflowManager();
-        preWorkflowManager.initAllComponents();
+        preWorkflowManager.startServer();
     }
 
     private class ProcessLaunchMessageHandler implements MessageHandler {
diff --git a/modules/ide-integration/README.md b/modules/ide-integration/README.md
index 940cca3..e44772a 100644
--- a/modules/ide-integration/README.md
+++ b/modules/ide-integration/README.md
@@ -59,6 +59,27 @@
 * Use the username : default-admin and password : 123456 to login to the portal
 * Use the username : default-admin and password : 123456 to login to the portal
 
+### Starting Job Execution Engine
+
+* Go to org.apache.airavata.ide.integration.JobEngineStarter class and right click on the editor and click Run option. 
+This will start all components of Job Execution Engine including Helix Controller, Helix Participant, Pre Workflow Manager and 
+Post Workflow Manager
+
+### Starting Job Monitoring components
+
+* This will start the Email Based Job Monitoring agent. Before starting this, you have to create a new gmail account by going to 
+https://accounts.google.com/signup
+
+* Once the account is created, turn on Less Security App access for that gmail account 
+https://support.google.com/accounts/answer/6010255?hl=en
+
+* Update the email account credentials in src/main/resources/airavata-server.properties file
+
+  email.based.monitor.address=CHANGEME
+  email.based.monitor.password=CHANGEME
+  
+* Go to org.apache.airavata.ide.integration.JobMonitorStarter class and right click on the editor and click Run option.
+ 
 ### Stop all components
 
 * For each composer file, run 
diff --git a/modules/ide-integration/pom.xml b/modules/ide-integration/pom.xml
index 617e96c..5b71a01 100644
--- a/modules/ide-integration/pom.xml
+++ b/modules/ide-integration/pom.xml
@@ -59,6 +59,16 @@
             <artifactId>mariadb-java-client</artifactId>
             <version>2.0.2</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>helix-spectator</artifactId>
+            <version>0.17-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>email-monitor</artifactId>
+            <version>0.17-SNAPSHOT</version>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/JobEngineStarter.java b/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/JobEngineStarter.java
new file mode 100644
index 0000000..61e43fe
--- /dev/null
+++ b/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/JobEngineStarter.java
@@ -0,0 +1,47 @@
+package org.apache.airavata.ide.integration;
+
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.common.utils.ServerSettings;
+import org.apache.airavata.helix.core.AbstractTask;
+import org.apache.airavata.helix.impl.controller.HelixController;
+import org.apache.airavata.helix.impl.participant.GlobalParticipant;
+import org.apache.airavata.helix.impl.workflow.PostWorkflowManager;
+import org.apache.airavata.helix.impl.workflow.PreWorkflowManager;
+import org.apache.airavata.monitor.email.EmailBasedMonitor;
+import org.apache.helix.manager.zk.ZKHelixAdmin;
+import org.apache.helix.manager.zk.ZNRecordSerializer;
+import org.apache.helix.manager.zk.ZkClient;
+
+import java.util.ArrayList;
+
+public class JobEngineStarter {
+
+    public static void main(String args[]) throws Exception {
+
+        ZkClient zkClient = new ZkClient(ServerSettings.getZookeeperConnection(), ZkClient.DEFAULT_SESSION_TIMEOUT,
+                    ZkClient.DEFAULT_CONNECTION_TIMEOUT, new ZNRecordSerializer());
+        ZKHelixAdmin zkHelixAdmin = new ZKHelixAdmin(zkClient);
+
+        zkHelixAdmin.addCluster(ServerSettings.getSetting("helix.cluster.name"), true);
+
+        // Starting helix controller
+        HelixController controller = new HelixController();
+        controller.startServer();
+
+        ArrayList<Class<? extends AbstractTask>> taskClasses = new ArrayList<>();
+
+        for (String taskClassName : GlobalParticipant.TASK_CLASS_NAMES) {
+            taskClasses.add(Class.forName(taskClassName).asSubclass(AbstractTask.class));
+        }
+
+        // Starting helix participant
+        GlobalParticipant participant = new GlobalParticipant(taskClasses, null);
+        participant.startServer();
+
+        PreWorkflowManager preWorkflowManager = new PreWorkflowManager();
+        preWorkflowManager.startServer();
+
+        PostWorkflowManager postWorkflowManager = new PostWorkflowManager();
+        postWorkflowManager.startServer();
+    }
+}
diff --git a/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/JobMonitorStarter.java b/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/JobMonitorStarter.java
new file mode 100644
index 0000000..03dba26
--- /dev/null
+++ b/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/JobMonitorStarter.java
@@ -0,0 +1,10 @@
+package org.apache.airavata.ide.integration;
+
+import org.apache.airavata.monitor.email.EmailBasedMonitor;
+
+public class JobMonitorStarter {
+    public static void main(String args[]) throws Exception {
+        EmailBasedMonitor emailBasedMonitor = new EmailBasedMonitor();
+        emailBasedMonitor.startServer();
+    }
+}
diff --git a/modules/ide-integration/src/main/resources/airavata-server.properties b/modules/ide-integration/src/main/resources/airavata-server.properties
index 4183d81..85d4dec 100644
--- a/modules/ide-integration/src/main/resources/airavata-server.properties
+++ b/modules/ide-integration/src/main/resources/airavata-server.properties
@@ -29,10 +29,6 @@
 #  API Server Registry Configuration
 ###########################################################################
 
-#for derby [AiravataJPARegistry]
-#registry.jdbc.driver=org.apache.derby.jdbc.ClientDriver
-#registry.jdbc.url=jdbc:derby://localhost:1527/experiment_catalog;create=true;user=airavata;password=airavata
-# MariaDB database configuration
 registry.jdbc.driver=org.mariadb.jdbc.Driver
 registry.jdbc.url=jdbc:mariadb://localhost:13306/experiment_catalog
 registry.jdbc.user=root
@@ -62,10 +58,6 @@ cluster.status.monitoring.repeat.time=18000
 ###########################################################################
 #  Application Catalog DB Configuration
 ###########################################################################
-#for derby [AiravataJPARegistry]
-#appcatalog.jdbc.driver=org.apache.derby.jdbc.ClientDriver
-#appcatalog.jdbc.url=jdbc:derby://localhost:1527/app_catalog;create=true;user=airavata;password=airavata
-# MariaDB database configuration
 appcatalog.jdbc.driver=org.mariadb.jdbc.Driver
 appcatalog.jdbc.url=jdbc:mariadb://localhost:13306/app_catalog
 appcatalog.jdbc.user=root
@@ -75,10 +67,6 @@ appcatalog.validationQuery=SELECT 1 from CONFIGURATION
 ##########################################################################
 #  Replica Catalog DB Configuration
 ###########################################################################
-#for derby [AiravataJPARegistry]
-#replicacatalog.jdbc.driver=org.apache.derby.jdbc.ClientDriver
-#replicacatalog.jdbc.url=jdbc:derby://localhost:1527/replica_catalog;create=true;user=airavata;password=airavata
-# MariaDB database configuration
 replicacatalog.jdbc.driver=org.mariadb.jdbc.Driver
 replicacatalog.jdbc.url=jdbc:mariadb://localhost:13306/replica_catalog
 replicacatalog.jdbc.user=root
@@ -88,10 +76,6 @@ replicacatalog.validationQuery=SELECT 1 from CONFIGURATION
 ###########################################################################
 #  Workflow Catalog DB Configuration
 ###########################################################################
-#for derby [AiravataJPARegistry]
-#workflowcatalog.jdbc.driver=org.apache.derby.jdbc.ClientDriver
-#workflowcatalog.jdbc.url=jdbc:derby://localhost:1527/workflow_catalog;create=true;user=airavata;password=airavata
-# MariaDB database configuration
 workflowcatalog.jdbc.driver=org.mariadb.jdbc.Driver
 workflowcatalog.jdbc.url=jdbc:mariadb://localhost:13306/workflow_catalog
 workflowcatalog.jdbc.user=root
@@ -101,10 +85,6 @@ workflowcatalog.validationQuery=SELECT 1 from CONFIGURATION
 ###########################################################################
 #  Sharing Catalog DB Configuration
 ###########################################################################
-#for derby [AiravataJPARegistry]
-#sharingcatalog.jdbc.driver=org.apache.derby.jdbc.ClientDriver
-#sharingcatalog.jdbc.url=jdbc:derby://localhost:1527/sharing_catalog;create=true;user=airavata;password=airavata
-# MariaDB database configuration
 sharingcatalog.jdbc.driver=org.mariadb.jdbc.Driver
 sharingcatalog.jdbc.url=jdbc:mariadb://localhost:13306/sharing_catalog
 sharingcatalog.jdbc.user=root
@@ -175,18 +155,6 @@ regserver.server.min.threads=50
 workflowserver=org.apache.airavata.api.server.WorkflowServer
 enactment.thread.pool.size=10
 
-#to define custom workflow parser user following property
-#workflow.parser=org.apache.airavata.workflow.core.parser.AiravataWorkflowBuilder
-
-
-
-###########################################################################
-#  Job Scheduler can send informative email messages to you about the status of your job.
-# Specify a string which consists of either the single character "n" (no mail), or one or more
-#  of the characters "a" (send mail when job is aborted), "b" (send mail when job begins),
-# and "e" (send mail when job terminates).  The default is "a" if not specified.
-###########################################################################
-
 job.notification.enable=true
 #Provide comma separated email ids as a string if more than one
 job.notification.emailids=
@@ -215,32 +183,6 @@ email.password=xxx
 email.ssl=true
 email.from=airavata@apache.org
 
-# SSH PKI key pair or ssh password can be used SSH based sshKeyAuthentication is used.
-# if user specify both password sshKeyAuthentication gets the higher preference
-
-################# ---------- For ssh key pair sshKeyAuthentication ------------------- ################
-#ssh.public.key=/path to public key for ssh
-#ssh.private.key=/path to private key file for ssh
-#ssh.keypass=passphrase for the private key
-#ssh.username=username for ssh connection
-## If you set "yes" for ssh.strict.hostKey.checking, then you must provide known hosts file path
-#ssh.strict.hostKey.checking=yes/no
-#ssh.known.hosts.file=/path to known hosts file
-### Incase of password sshKeyAuthentication.
-#ssh.password=Password for ssh connection
-
-################ ---------- BES Properties ------------------- ###############
-#bes.ca.cert.path=<location>/certificates/cacert.pem
-#bes.ca.key.path=<location>/certificates/cakey.pem
-#bes.ca.key.pass=passphrase
-
-###########################################################################
-# AMQP Notification Configuration
-###########################################################################
-#for simple scenarios we can use the guest user
-#rabbitmq.broker.url=amqp://localhost:5672
-#for production scenarios, give url as amqp://userName:password@hostName:portNumber/virtualHost, create user, virtualhost
-# and give permissions, refer: http://blog.dtzq.com/2012/06/rabbitmq-users-and-virtual-hosts.html
 rabbitmq.broker.url=amqp://guest:guest@localhost:5672/develop
 rabbitmq.status.exchange.name=status_exchange
 rabbitmq.process.exchange.name=process_exchange
@@ -306,4 +248,30 @@ iam.server.super.admin.password=admin
 ###########################################################################
 # DB Event Manager Runner
 ###########################################################################
-db_event_manager=org.apache.airavata.db.event.manager.DBEventManagerRunner
\ No newline at end of file
+db_event_manager=org.apache.airavata.db.event.manager.DBEventManagerRunner
+
+###########################################################################
+# Job Execution Engine related properties
+###########################################################################
+helix.cluster.name=AiravataCluster
+helix.controller.name=AiravataController
+helix.participant.name=AiravataParticipant
+pre.workflow.manager.name=AiravataPreWM
+post.workflow.manager.name=AiravataPostWM
+kafka.broker.url=airavata.host:9092
+job.monitor.broker.url=airavata.host:9092
+kafka.broker.consumer.group=MonitoringConsumer
+kafka.broker.topic=monitoring-date
+
+###########################################################################
+# Job Monitor related properties
+###########################################################################
+job.monitor.broker.publisher.id=AiravataMonitorPublisher
+email.based.monitor.host=imap.gmail.com
+email.based.monitor.store.protocol=imaps
+email.based.monitor.folder.name=INBOX
+email.expiration.minutes=60
+email.based.monitoring.period=10000
+
+email.based.monitor.address=CHANGEME
+email.based.monitor.password=CHANGEME
\ No newline at end of file
diff --git a/modules/ide-integration/src/main/resources/docker-compose.yml b/modules/ide-integration/src/main/resources/docker-compose.yml
index 97dbe56..6736a09 100644
--- a/modules/ide-integration/src/main/resources/docker-compose.yml
+++ b/modules/ide-integration/src/main/resources/docker-compose.yml
@@ -36,4 +36,17 @@ services:
     restart: always
     hostname: zk
     ports:
-      - "12181:2181"
\ No newline at end of file
+      - "12181:2181"
+  kafka:
+    image: confluentinc/cp-kafka:5.1.0
+    hostname: kafka
+    ports:
+      - "9092:9092"
+    environment:
+      KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER_INTERNAL://kafka1:19092,LISTENER_DOCKER_EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9092
+      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER_INTERNAL:PLAINTEXT,LISTENER_DOCKER_EXTERNAL:PLAINTEXT
+      KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_DOCKER_INTERNAL
+      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
+      KAFKA_BROKER_ID: 1
+      KAFKA_LOG4J_LOGGERS: "kafka.controller=INFO,kafka.producer.async.DefaultEventHandler=INFO,state.change.logger=INFO"
+      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
\ No newline at end of file
diff --git a/modules/ide-integration/src/main/resources/email-config.yaml b/modules/ide-integration/src/main/resources/email-config.yaml
new file mode 100644
index 0000000..e6c6a85
--- /dev/null
+++ b/modules/ide-integration/src/main/resources/email-config.yaml
@@ -0,0 +1,48 @@
+config:
+ resources:
+   - jobManagerType: PBS
+     emailParser: org.apache.airavata.monitor.email.parser.PBSEmailParser
+     resourceEmailAddresses:
+       - pbsconsult@sdsc.edu  # gordon
+       - adm@trident.bigred2.uits.iu.edu # Bigred2
+       - root <ad...@trident.bigred2.uits.iu.edu> # Bigred2
+       - root <ad...@scyld.localdomain> # alamo
+       - root <ad...@m1.mason.indiana.edu> #mason
+       - smic3 <sm...@mail.hpc.lsu.edu> # philip.hpc.lsu
+       - adm@jetstream-cloud.org
+       - root <ad...@alamo.uthscsa.edu> #alamo
+
+   - jobManagerType: SLURM
+     emailParser: org.apache.airavata.monitor.email.parser.SLURMEmailParser
+     resourceEmailAddresses:
+       - SDSC Admin <sl...@comet-fe3.sdsc.edu> # comet
+       - slurm@batch1.stampede.tacc.utexas.edu # stampede
+       - slurm@helix-slurm-headnode.novalocal
+       - slurm@comet-fe4.sdsc.edu
+       - Slurm <sl...@psc.edu> # bridges
+       - Slurm Daemon <sl...@odin.oscer.ou.edu> # OU Schooner
+       - slurm@lnet28.stampede.tacc.utexas.edu # stampede2
+       - Slurm service account <sl...@chpc.utah.edu> # Utah Ember
+       - SLURM workload manager <sl...@jetstream.chemcompute.org> # JS Mark Cluster
+       - root@master.ls5.tacc.utexas.edu
+       - batch-jsc@fz-juelich.de # Jureca Email
+       - Slurm <sl...@br003.pvt.bridges.psc.edu>
+       - slurm@jetstream-cloud.org
+       - slurm@slurm-example.novalocal
+       - slurm@tutorial-headnode.novalocal # Jetstream Ultrascan static cluster with 10 nodes
+       - slurm@batch1.stampede2.tacc.utexas.edu #Stampede2
+       - slurm@sra-master.jetstreamlocal #Searching SRA
+       - Slurm Admin <sl...@hpclogin01.rs.gsu.edu> #GSU cluster
+       - slurm@head.cluster #USD cluster
+       - slurm@js-169-158.jetstream-cloud.org
+       - slurm@joker.nmsu.edu
+       - root@ls5.tacc.utexas.edu
+
+   - jobManagerType: UGE
+     emailParser: org.apache.airavata.monitor.email.parser.UGEEmailParser
+     resourceEmailAddresses:
+       - ls4.tacc.utexas.edu # contain Lonestar
+       - root <ro...@local> # USD HPC Cluster
+       - root <li...@siu.edu> # SIU Little Dog
+       - sge@bigdog.research.siu.edu # SIU Big Dog
+       - root <ro...@legacy.usd.edu> # USD HPC Cluster
\ No newline at end of file
diff --git a/modules/job-monitor/email-monitor/src/main/java/org/apache/airavata/monitor/email/EmailBasedMonitor.java b/modules/job-monitor/email-monitor/src/main/java/org/apache/airavata/monitor/email/EmailBasedMonitor.java
index 10e8877..64f5b86 100644
--- a/modules/job-monitor/email-monitor/src/main/java/org/apache/airavata/monitor/email/EmailBasedMonitor.java
+++ b/modules/job-monitor/email-monitor/src/main/java/org/apache/airavata/monitor/email/EmailBasedMonitor.java
@@ -281,10 +281,13 @@ public class EmailBasedMonitor extends AbstractMonitor implements Runnable {
         }
     }
 
-    public static void main(String args[]) throws Exception {
-        EmailBasedMonitor monitor = new EmailBasedMonitor();
-        Thread t = new Thread(monitor);
+    public void startServer() throws InterruptedException {
+        Thread t = new Thread(this);
         t.start();
         t.join();
     }
+    public static void main(String args[]) throws Exception {
+        EmailBasedMonitor monitor = new EmailBasedMonitor();
+        monitor.startServer();
+    }
 }