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();
+ }
}