You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ya...@apache.org on 2025/08/19 22:22:22 UTC
(airavata) 01/06: initial merge of all thrift apis
This is an automated email from the ASF dual-hosted git repository.
yasith pushed a commit to branch merge-svcs
in repository https://gitbox.apache.org/repos/asf/airavata.git
commit 807ee5c7b327de36369793eea5cfa2066994d2bd
Author: yasithdev <ya...@icloud.com>
AuthorDate: Tue Aug 19 00:29:16 2025 -0400
initial merge of all thrift apis
---
.vscode/launch.json | 21 +-
.../src/main/java/org/apache/airavata/Main.java | 62 ++++
.../helix/core/participant/HelixParticipant.java | 37 +--
.../helix/impl/controller/HelixController.java | 79 ++---
.../helix/impl/participant/GlobalParticipant.java | 30 +-
.../helix/impl/workflow/ParserWorkflowManager.java | 29 +-
.../helix/impl/workflow/PostWorkflowManager.java | 28 +-
.../helix/impl/workflow/PreWorkflowManager.java | 12 +-
.../helix/impl/workflow/WorkflowManager.java | 2 +-
.../apache/airavata/monitor/AbstractMonitor.java | 2 +-
.../airavata/monitor/email/EmailBasedMonitor.java | 12 +-
.../airavata/monitor/realtime/RealtimeMonitor.java | 11 +-
.../org/apache/airavata/server/ServerMain.java | 333 ++++-----------------
.../apache/airavata/server/ThriftAPIServer.java | 223 ++++++++++++++
modules/ide-integration/.gitignore | 1 -
modules/ide-integration/README.md | 294 ------------------
modules/ide-integration/pom.xml | 56 ----
.../airavata/ide/integration/APIServerStarter.java | 49 ---
.../airavata/ide/integration/JobEngineStarter.java | 73 -----
.../ide/integration/JobMonitorStarter.java | 29 --
pom.xml | 1 -
21 files changed, 455 insertions(+), 929 deletions(-)
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 9a39c30cdc..62150d2f6c 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -2,25 +2,10 @@
"configurations": [
{
"type": "java",
- "name": "Start API Server",
+ "name": "Main",
"request": "launch",
- "cwd": "${workspaceFolder}/modules/ide-integration",
- "mainClass": "org.apache.airavata.ide.integration.APIServerStarter",
- "vmArgs": "-javaagent:/home/vscode/.m2/repository/org/apache/openjpa/openjpa/4.0.1/openjpa-4.0.1.jar",
- },
- {
- "type": "java",
- "name": "Start Job Engine",
- "request": "launch",
- "cwd": "${workspaceFolder}/modules/ide-integration",
- "mainClass": "org.apache.airavata.ide.integration.JobEngineStarter"
- },
- {
- "type": "java",
- "name": "Start Job Monitor",
- "request": "launch",
- "cwd": "${workspaceFolder}/modules/ide-integration",
- "mainClass": "org.apache.airavata.ide.integration.JobMonitorStarter"
+ "mainClass": "org.apache.airavata.Main",
+ "projectName": "airavata-api"
}
],
}
\ No newline at end of file
diff --git a/airavata-api/src/main/java/org/apache/airavata/Main.java b/airavata-api/src/main/java/org/apache/airavata/Main.java
new file mode 100644
index 0000000000..d60f122ed1
--- /dev/null
+++ b/airavata-api/src/main/java/org/apache/airavata/Main.java
@@ -0,0 +1,62 @@
+/**
+*
+* 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.airavata;
+
+import org.apache.airavata.db.event.manager.DBEventManagerRunner;
+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.airavata.server.ThriftAPIServer;
+
+public class Main {
+
+ public static void main(String[] args) throws Exception {
+
+ System.out.println("Starting Thrift API Server .......");
+ var thriftApiServer = new ThriftAPIServer();
+ thriftApiServer.start();
+
+ System.out.println("Starting DB Event Manager Runner .......");
+ var dbEventManagerRunner = new DBEventManagerRunner();
+ dbEventManagerRunner.start();
+
+ System.out.println("Starting Helix Controller .......");
+ var helixController = new HelixController();
+ helixController.start();
+
+ System.out.println("Starting Helix Participant .......");
+ var globalParticipant = new GlobalParticipant();
+ globalParticipant.run();
+
+ System.out.println("Starting Pre Workflow Manager .......");
+ var preWorkflowManager = new PreWorkflowManager();
+ preWorkflowManager.run();
+
+ System.out.println("Starting Post Workflow Manager .......");
+ var postWorkflowManager = new PostWorkflowManager();
+ postWorkflowManager.run();
+
+ System.out.println("Starting Email Based Monitor .......");
+ var emailBasedMonitor = new EmailBasedMonitor();
+ emailBasedMonitor.run();
+ }
+}
diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/core/participant/HelixParticipant.java b/airavata-api/src/main/java/org/apache/airavata/helix/core/participant/HelixParticipant.java
index eff9eeca88..0ea915cac8 100644
--- a/airavata-api/src/main/java/org/apache/airavata/helix/core/participant/HelixParticipant.java
+++ b/airavata-api/src/main/java/org/apache/airavata/helix/core/participant/HelixParticipant.java
@@ -19,18 +19,19 @@
*/
package org.apache.airavata.helix.core.participant;
+import java.lang.reflect.InvocationTargetException;
import java.util.*;
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.core.support.TaskHelperImpl;
import org.apache.airavata.helix.task.api.annotation.TaskDef;
+import org.apache.airavata.patform.monitoring.MonitoringServer;
import org.apache.helix.InstanceType;
+import org.apache.helix.constants.InstanceConstants.InstanceOperation;
import org.apache.helix.examples.OnlineOfflineStateModelFactory;
import org.apache.helix.manager.zk.ZKHelixAdmin;
import org.apache.helix.manager.zk.ZKHelixManager;
-import org.apache.helix.manager.zk.ZNRecordSerializer;
-import org.apache.helix.manager.zk.ZkClient;
import org.apache.helix.model.BuiltInStateModelDefinitions;
import org.apache.helix.model.InstanceConfig;
import org.apache.helix.participant.StateMachineEngine;
@@ -116,11 +117,11 @@ public class HelixParticipant<T extends AbstractTask> implements Runnable {
TaskFactory taskFac = context -> {
try {
return AbstractTask.class
- .cast(taskClass.newInstance())
+ .cast(taskClass.getDeclaredConstructor().newInstance())
.setParticipant(HelixParticipant.this)
.setCallbackContext(context)
.setTaskHelper(new TaskHelperImpl());
- } catch (InstantiationException | IllegalAccessException e) {
+ } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
logger.error(
"Failed to initialize the task: "
+ context.getTaskConfig().getId(),
@@ -135,21 +136,14 @@ public class HelixParticipant<T extends AbstractTask> implements Runnable {
}
public void run() {
- ZkClient zkClient = null;
+ ZKHelixAdmin zkHelixAdmin = new ZKHelixAdmin.Builder().setZkAddress(zkAddress).build();
try {
- zkClient = new ZkClient(
- zkAddress,
- ZkClient.DEFAULT_SESSION_TIMEOUT,
- ZkClient.DEFAULT_CONNECTION_TIMEOUT,
- new ZNRecordSerializer());
- ZKHelixAdmin zkHelixAdmin = new ZKHelixAdmin(zkClient);
-
List<String> nodesInCluster = zkHelixAdmin.getInstancesInCluster(clusterName);
if (!nodesInCluster.contains(participantName)) {
InstanceConfig instanceConfig = new InstanceConfig(participantName);
instanceConfig.setHostName("localhost");
- instanceConfig.setInstanceEnabled(true);
+ instanceConfig.setInstanceOperation(InstanceOperation.ENABLE);
if (taskTypeName != null) {
instanceConfig.addTag(taskTypeName);
}
@@ -159,14 +153,14 @@ public class HelixParticipant<T extends AbstractTask> implements Runnable {
if (taskTypeName != null) {
zkHelixAdmin.addInstanceTag(clusterName, participantName, taskTypeName);
}
- zkHelixAdmin.enableInstance(clusterName, participantName, true);
+ zkHelixAdmin.setInstanceOperation(clusterName, participantName, InstanceOperation.ENABLE);
logger.debug("Participant: " + participantName + " has been re-enabled at the cluster: " + clusterName);
}
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
logger.debug("Participant: " + participantName + " shutdown hook called");
try {
- zkHelixAdmin.enableInstance(clusterName, participantName, false);
+ zkHelixAdmin.setInstanceOperation(clusterName, participantName, InstanceOperation.DISABLE);
} catch (Exception e) {
logger.warn("Participant: " + participantName + " was not disabled normally", e);
}
@@ -178,8 +172,8 @@ public class HelixParticipant<T extends AbstractTask> implements Runnable {
} catch (Exception ex) {
logger.error("Error in run() for Participant: " + participantName + ", reason: " + ex, ex);
} finally {
- if (zkClient != null) {
- zkClient.close();
+ if (zkHelixAdmin != null) {
+ zkHelixAdmin.close();
}
}
}
@@ -201,7 +195,16 @@ public class HelixParticipant<T extends AbstractTask> implements Runnable {
zkHelixManager.connect();
logger.info("Participant: " + participantName + ", has connected to cluster: " + clusterName);
+ if (ServerSettings.getBooleanSetting("participant.monitoring.enabled")) {
+ System.out.println("Starting participant monitoring server .......");
+ var monitoringServer = new MonitoringServer(
+ ServerSettings.getSetting("participant.monitoring.host"),
+ ServerSettings.getIntSetting("participant.monitoring.port"));
+ monitoringServer.start();
+ Runtime.getRuntime().addShutdownHook(new Thread(monitoringServer::stop));
+ }
Thread.currentThread().join();
+
} catch (InterruptedException ex) {
logger.error("Participant: " + participantName + ", is interrupted! reason: " + ex, ex);
} catch (Exception ex) {
diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/controller/HelixController.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/controller/HelixController.java
index f41afbaed2..0139cca7fd 100644
--- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/controller/HelixController.java
+++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/controller/HelixController.java
@@ -19,13 +19,10 @@
*/
package org.apache.airavata.helix.impl.controller;
-import java.util.concurrent.CountDownLatch;
import org.apache.airavata.common.exception.ApplicationSettingsException;
import org.apache.airavata.common.utils.ServerSettings;
import org.apache.helix.controller.HelixControllerMain;
import org.apache.helix.manager.zk.ZKHelixAdmin;
-import org.apache.helix.manager.zk.ZNRecordSerializer;
-import org.apache.helix.manager.zk.ZkClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -44,9 +41,6 @@ public class HelixController implements Runnable {
private String zkAddress;
private org.apache.helix.HelixManager zkHelixManager;
- private CountDownLatch startLatch = new CountDownLatch(1);
- private CountDownLatch stopLatch = new CountDownLatch(1);
-
@SuppressWarnings("WeakerAccess")
public HelixController() throws ApplicationSettingsException {
this.clusterName = ServerSettings.getSetting("helix.cluster.name");
@@ -56,74 +50,39 @@ public class HelixController implements Runnable {
public void run() {
try {
- ZkClient zkClient = new ZkClient(
- ServerSettings.getZookeeperConnection(),
- ZkClient.DEFAULT_SESSION_TIMEOUT,
- ZkClient.DEFAULT_CONNECTION_TIMEOUT,
- new ZNRecordSerializer());
- ZKHelixAdmin zkHelixAdmin = new ZKHelixAdmin(zkClient);
-
- // Creates the zk cluster if not available
- if (!zkHelixAdmin.getClusters().contains(clusterName)) {
- zkHelixAdmin.addCluster(clusterName, true);
- }
-
+ var zkHelixAdmin = new ZKHelixAdmin.Builder()
+ .setZkAddress(ServerSettings.getZookeeperConnection())
+ .build();
+ zkHelixAdmin.addCluster(clusterName, false);
zkHelixAdmin.close();
- zkClient.close();
-
- logger.info("Connection to helix cluster : " + clusterName + " with name : " + controllerName);
- logger.info("Zookeeper connection string " + zkAddress);
+ logger.info("Starting helix controller '{}' for cluster '{}' at address '{}'", controllerName, clusterName, zkAddress);
zkHelixManager = HelixControllerMain.startHelixController(
zkAddress, clusterName, controllerName, HelixControllerMain.STANDALONE);
- startLatch.countDown();
- stopLatch.await();
+ logger.info("Controller '{}' started for cluster '{}'", controllerName, clusterName);
+ Thread.currentThread().join();
+ } catch (InterruptedException ie) {
+ logger.info("Helix controller interrupted, shutting down.");
} catch (Exception ex) {
- logger.error("Error in run() for Controller: " + controllerName + ", reason: " + ex, ex);
+ logger.error("Error in run() for controller '{}', reason: {}", controllerName, ex, ex);
} finally {
- disconnect();
- }
- }
-
- public void startServer() throws Exception {
-
- // WorkflowCleanupAgent cleanupAgent = new WorkflowCleanupAgent();
- // cleanupAgent.init();
- // ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
- // executor.scheduleWithFixedDelay(cleanupAgent, 10, 120, TimeUnit.SECONDS);
-
- new Thread(this).start();
- try {
- startLatch.await();
- logger.info("Controller: " + controllerName + ", has connected to cluster: " + clusterName);
-
- Runtime.getRuntime().addShutdownHook(new Thread(this::disconnect));
-
- } catch (InterruptedException ex) {
- logger.error("Controller: " + controllerName + ", is interrupted! reason: " + ex, ex);
+ if (zkHelixManager != null) {
+ logger.info("Controller '{}' has disconnected from cluster '{}'", controllerName, clusterName);
+ zkHelixManager.disconnect();
+ }
}
}
- @SuppressWarnings({"WeakerAccess", "unused"})
- public void stop() {
- stopLatch.countDown();
- }
-
- private void disconnect() {
- if (zkHelixManager != null) {
- logger.info("Controller: " + controllerName + ", has disconnected from cluster: " + clusterName);
- zkHelixManager.disconnect();
- }
+ public void start() throws Exception {
+ Thread controllerThread = new Thread(this);
+ controllerThread.start();
+ Runtime.getRuntime().addShutdownHook(new Thread(controllerThread::interrupt));
}
public static void main(String args[]) {
try {
-
logger.info("Starting helix controller");
-
- HelixController helixController = new HelixController();
- helixController.startServer();
-
+ new HelixController().start();
} catch (Exception e) {
logger.error("Failed to start the helix controller", e);
}
diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/participant/GlobalParticipant.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/participant/GlobalParticipant.java
index 3cb6be524c..03c3772a72 100644
--- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/participant/GlobalParticipant.java
+++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/participant/GlobalParticipant.java
@@ -55,10 +55,21 @@ public class GlobalParticipant extends HelixParticipant<AbstractTask> {
"org.apache.airavata.helix.impl.task.aws.AWSCompletingTask",
};
+ public static List<Class<? extends AbstractTask>> taskClasses = new ArrayList<>();
+
+ static {
+ for (String taskClassName : TASK_CLASS_NAMES) {
+ try {
+ taskClasses.add(Class.forName(taskClassName).asSubclass(AbstractTask.class));
+ } catch (ClassNotFoundException e) {
+ logger.error("Failed to load task class: " + taskClassName, e);
+ }
+ }
+ }
+
@SuppressWarnings("WeakerAccess")
- public GlobalParticipant(List<Class<? extends AbstractTask>> taskClasses, String taskTypeName)
- throws ApplicationSettingsException {
- super(taskClasses, taskTypeName);
+ public GlobalParticipant() throws ApplicationSettingsException {
+ super(GlobalParticipant.taskClasses, null);
}
public void startServer() {
@@ -70,27 +81,16 @@ public class GlobalParticipant extends HelixParticipant<AbstractTask> {
public static void main(String args[]) {
logger.info("Starting global participant");
-
try {
- ArrayList<Class<? extends AbstractTask>> taskClasses = new ArrayList<>();
-
- for (String taskClassName : TASK_CLASS_NAMES) {
- logger.debug("Adding task class: " + taskClassName + " to the global participant");
- taskClasses.add(Class.forName(taskClassName).asSubclass(AbstractTask.class));
- }
-
if (ServerSettings.getBooleanSetting("participant.monitoring.enabled")) {
MonitoringServer monitoringServer = new MonitoringServer(
ServerSettings.getSetting("participant.monitoring.host"),
ServerSettings.getIntSetting("participant.monitoring.port"));
monitoringServer.start();
-
Runtime.getRuntime().addShutdownHook(new Thread(monitoringServer::stop));
}
-
- GlobalParticipant participant = new GlobalParticipant(taskClasses, null);
+ GlobalParticipant participant = new GlobalParticipant();
participant.startServer();
-
} catch (Exception e) {
logger.error("Failed to start global participant", e);
}
diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java
index e75f494210..7551f0855f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java
+++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java
@@ -64,9 +64,10 @@ public class ParserWorkflowManager extends WorkflowManager {
Boolean.parseBoolean(ServerSettings.getSetting("post.workflow.manager.loadbalance.clusters")));
}
- public static void main(String[] args) throws Exception {
-
- if (ServerSettings.getBooleanSetting("parser.workflow.manager.monitoring.enabled")) {
+ @Override
+ public void run() {
+ try {
+ if (ServerSettings.getBooleanSetting("parser.workflow.manager.monitoring.enabled")) {
MonitoringServer monitoringServer = new MonitoringServer(
ServerSettings.getSetting("parser.workflow.manager.monitoring.host"),
ServerSettings.getIntSetting("parser.workflow.manager.monitoring.port"));
@@ -74,10 +75,15 @@ public class ParserWorkflowManager extends WorkflowManager {
Runtime.getRuntime().addShutdownHook(new Thread(monitoringServer::stop));
}
+ this.init();
+ this.runConsumer();
+ } catch (Exception e) {
+ logger.error("Error starting PreWorkflowManager", e);
+ }
+ }
- ParserWorkflowManager manager = new ParserWorkflowManager();
- manager.init();
- manager.runConsumer();
+ public static void main(String[] args) throws Exception {
+ new ParserWorkflowManager().run();
}
private void init() throws Exception {
@@ -89,12 +95,13 @@ public class ParserWorkflowManager extends WorkflowManager {
RegistryService.Client registryClient = getRegistryClientPool().getResource();
try {
- ProcessModel processModel;
- ApplicationInterfaceDescription appDescription;
try {
- processModel = registryClient.getProcess(completionMessage.getProcessId());
- appDescription = registryClient.getApplicationInterface(processModel.getApplicationInterfaceId());
-
+ ProcessModel processModel = registryClient.getProcess(completionMessage.getProcessId());
+ ApplicationInterfaceDescription appDescription = registryClient.getApplicationInterface(processModel.getApplicationInterfaceId());
+ if (appDescription == null) {
+ logger.error("Application interface not found for process id " + completionMessage.getProcessId());
+ throw new Exception("Application interface not found for process id " + completionMessage.getProcessId());
+ }
} catch (Exception e) {
logger.error(
"Failed to fetch process or application description from registry associated with process id "
diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
index a23d1b5edf..ac85fdeec0 100644
--- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
+++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
@@ -68,19 +68,25 @@ public class PostWorkflowManager extends WorkflowManager {
Boolean.parseBoolean(ServerSettings.getSetting("post.workflow.manager.loadbalance.clusters")));
}
- public static void main(String[] args) throws Exception {
-
- if (ServerSettings.getBooleanSetting("post.workflow.manager.monitoring.enabled")) {
- MonitoringServer monitoringServer = new MonitoringServer(
- ServerSettings.getSetting("post.workflow.manager.monitoring.host"),
- ServerSettings.getIntSetting("post.workflow.manager.monitoring.port"));
- monitoringServer.start();
-
- Runtime.getRuntime().addShutdownHook(new Thread(monitoringServer::stop));
+ @Override
+ public void run() {
+ try {
+ if (ServerSettings.getBooleanSetting("post.workflow.manager.monitoring.enabled")) {
+ MonitoringServer monitoringServer = new MonitoringServer(
+ ServerSettings.getSetting("post.workflow.manager.monitoring.host"),
+ ServerSettings.getIntSetting("post.workflow.manager.monitoring.port"));
+ monitoringServer.start();
+
+ Runtime.getRuntime().addShutdownHook(new Thread(monitoringServer::stop));
+ }
+ startServer();
+ } catch (Exception e) {
+ logger.error("Error starting PreWorkflowManager", e);
}
+ }
- PostWorkflowManager postManager = new PostWorkflowManager();
- postManager.startServer();
+ public static void main(String[] args) throws Exception {
+ new PostWorkflowManager().run();
}
private void init() throws Exception {
diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PreWorkflowManager.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PreWorkflowManager.java
index 19b31fbb4a..6102143d58 100644
--- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PreWorkflowManager.java
+++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PreWorkflowManager.java
@@ -287,6 +287,15 @@ public class PreWorkflowManager extends WorkflowManager {
return workflow;
}
+ @Override
+ public void run() {
+ try {
+ startServer();
+ } catch (Exception e) {
+ logger.error("Error starting PreWorkflowManager", e);
+ }
+ }
+
public static void main(String[] args) throws Exception {
if (ServerSettings.getBooleanSetting("pre.workflow.manager.monitoring.enabled")) {
@@ -298,8 +307,7 @@ public class PreWorkflowManager extends WorkflowManager {
Runtime.getRuntime().addShutdownHook(new Thread(monitoringServer::stop));
}
- PreWorkflowManager preWorkflowManager = new PreWorkflowManager();
- preWorkflowManager.startServer();
+ new PreWorkflowManager().run();
}
private class ProcessLaunchMessageHandler implements MessageHandler {
diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/WorkflowManager.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/WorkflowManager.java
index eb32f19098..daf3bb4519 100644
--- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/WorkflowManager.java
+++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/WorkflowManager.java
@@ -46,7 +46,7 @@ import org.apache.helix.zookeeper.api.client.RealmAwareZkClient.RealmMode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class WorkflowManager {
+public abstract class WorkflowManager implements Runnable {
private static final Logger logger = LoggerFactory.getLogger(WorkflowManager.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/monitor/AbstractMonitor.java b/airavata-api/src/main/java/org/apache/airavata/monitor/AbstractMonitor.java
index ce29676cc8..d9b2f4423a 100644
--- a/airavata-api/src/main/java/org/apache/airavata/monitor/AbstractMonitor.java
+++ b/airavata-api/src/main/java/org/apache/airavata/monitor/AbstractMonitor.java
@@ -31,7 +31,7 @@ import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class AbstractMonitor {
+public abstract class AbstractMonitor implements Runnable {
private static final Logger log = LoggerFactory.getLogger(AbstractMonitor.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/monitor/email/EmailBasedMonitor.java b/airavata-api/src/main/java/org/apache/airavata/monitor/email/EmailBasedMonitor.java
index 5c4aecede3..fcca0561b5 100644
--- a/airavata-api/src/main/java/org/apache/airavata/monitor/email/EmailBasedMonitor.java
+++ b/airavata-api/src/main/java/org/apache/airavata/monitor/email/EmailBasedMonitor.java
@@ -44,7 +44,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yaml.snakeyaml.Yaml;
-public class EmailBasedMonitor extends AbstractMonitor implements Runnable {
+public class EmailBasedMonitor extends AbstractMonitor {
private static final Logger log = LoggerFactory.getLogger(EmailBasedMonitor.class);
@@ -301,14 +301,8 @@ public class EmailBasedMonitor extends AbstractMonitor implements Runnable {
}
}
- 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();
+ new EmailBasedMonitor().run();
}
+
}
diff --git a/airavata-api/src/main/java/org/apache/airavata/monitor/realtime/RealtimeMonitor.java b/airavata-api/src/main/java/org/apache/airavata/monitor/realtime/RealtimeMonitor.java
index dde0582d8f..13e4da2b2c 100644
--- a/airavata-api/src/main/java/org/apache/airavata/monitor/realtime/RealtimeMonitor.java
+++ b/airavata-api/src/main/java/org/apache/airavata/monitor/realtime/RealtimeMonitor.java
@@ -93,7 +93,16 @@ public class RealtimeMonitor extends AbstractMonitor {
}
}
+ @Override
+ public void run() {
+ try {
+ runConsumer();
+ } catch (ApplicationSettingsException e) {
+ logger.error("Error while running consumer", e);
+ }
+ }
+
public static void main(String args[]) throws ApplicationSettingsException {
- new RealtimeMonitor().runConsumer();
+ new RealtimeMonitor().run();
}
}
diff --git a/airavata-api/src/main/java/org/apache/airavata/server/ServerMain.java b/airavata-api/src/main/java/org/apache/airavata/server/ServerMain.java
index 701d5e4dd6..2306c3d6a1 100644
--- a/airavata-api/src/main/java/org/apache/airavata/server/ServerMain.java
+++ b/airavata-api/src/main/java/org/apache/airavata/server/ServerMain.java
@@ -19,82 +19,67 @@
*/
package org.apache.airavata.server;
-import java.io.File;
-import java.io.FileNotFoundException;
import java.io.IOException;
-import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+
+import org.apache.airavata.api.server.AiravataAPIServer;
import org.apache.airavata.common.exception.AiravataException;
-import org.apache.airavata.common.exception.ApplicationSettingsException;
import org.apache.airavata.common.utils.*;
import org.apache.airavata.common.utils.ApplicationSettings.ShutdownStrategy;
import org.apache.airavata.common.utils.IServer.ServerStatus;
-import org.apache.airavata.common.utils.StringUtil.CommandLineParameters;
+import org.apache.airavata.credential.store.server.CredentialStoreServer;
+import org.apache.airavata.db.event.manager.DBEventManagerRunner;
+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.airavata.monitor.realtime.RealtimeMonitor;
+import org.apache.airavata.orchestrator.server.OrchestratorServer;
import org.apache.airavata.patform.monitoring.MonitoringServer;
+import org.apache.airavata.registry.api.service.RegistryAPIServer;
+import org.apache.airavata.service.profile.server.ProfileServiceServer;
+import org.apache.airavata.sharing.registry.server.SharingRegistryServer;
import org.apache.commons.cli.ParseException;
-import org.apache.zookeeper.server.ServerCnxnFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ServerMain {
private static List<IServer> servers;
- private static final String SERVERS_KEY = "servers";
+ private static List<Class<?>> additionalServers;
private static final Logger logger = LoggerFactory.getLogger(ServerMain.class);
private static boolean serversLoaded = false;
- private static final String stopFileNamePrefix = "server_stop";
- private static long serverPID = -1;
- private static final String serverStartedFileNamePrefix = "server_start";
private static boolean systemShutDown = false;
- private static String STOP_COMMAND_STR = "stop";
-
- private static final String ALL_IN_ONE = "all";
- private static final String API_ORCH = "api-orch";
- private static final String EXECUTION = "execution";
- // server names
- private static final String API_SERVER = "apiserver.class";
- private static final String CREDENTIAL_STORE = "credential.store.class";
- private static final String REGISTRY_SERVER = "regserver";
- private static final String SHARING_SERVER = "sharing_server";
- private static final String GFAC_SERVER = "gfac";
- private static final String ORCHESTRATOR = "orchestrator";
- private static final String PROFILE_SERVICE = "profile_service.class";
- private static final String DB_EVENT_MANAGER = "db_event_manager.class";
- private static ServerCnxnFactory cnxnFactory;
- // private static boolean shutdownHookCalledBefore=false;
static {
- servers = new ArrayList<IServer>();
- }
-
- private static void loadServers(String serverNames) {
- try {
- if (serverNames != null) {
- List<String> serversList = handleServerDependencies(serverNames);
- for (String serverString : serversList) {
- serverString = serverString.trim();
- String serverClassName = ServerSettings.getSetting(serverString);
- Class<?> classInstance;
- try {
- classInstance = ServerMain.class.getClassLoader().loadClass(serverClassName);
- servers.add((IServer) classInstance.newInstance());
- } catch (ClassNotFoundException e) {
- logger.error("Error while locating server implementation \"" + serverString + "\"!!!", e);
- } catch (InstantiationException e) {
- logger.error("Error while initiating server instance \"" + serverString + "\"!!!", e);
- } catch (IllegalAccessException e) {
- logger.error("Error while initiating server instance \"" + serverString + "\"!!!", e);
- } catch (ClassCastException e) {
- logger.error("Invalid server \"" + serverString + "\"!!!", e);
- }
- }
- } else {
- logger.warn("No server name specify to start, use -h command line option to view help menu ...");
- }
- } catch (ApplicationSettingsException e) {
- logger.error("Error while retrieving server list!!!", e);
- }
+ servers = new ArrayList<>();
+ additionalServers = new ArrayList<>();
+ }
+
+ private static void loadServers() {
+ servers.clear();
+ additionalServers.clear();
+
+ servers.addAll(Arrays.asList(
+ new DBEventManagerRunner(),
+ new RegistryAPIServer(),
+ new CredentialStoreServer(),
+ new SharingRegistryServer(),
+ new AiravataAPIServer(),
+ new OrchestratorServer(),
+ new ProfileServiceServer()
+ ));
+
+ additionalServers.addAll(Arrays.asList(
+ HelixController.class,
+ GlobalParticipant.class,
+ EmailBasedMonitor.class,
+ RealtimeMonitor.class,
+ PreWorkflowManager.class,
+ PostWorkflowManager.class
+ ));
serversLoaded = true;
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
@@ -104,65 +89,6 @@ public class ServerMain {
});
}
- private static List<String> handleServerDependencies(String serverNames) {
- List<String> serverList = new ArrayList<>(Arrays.asList(serverNames.split(",")));
- if (serverList.indexOf(ALL_IN_ONE) > -1) {
- serverList.clear();
- serverList.add(DB_EVENT_MANAGER); // DB Event Manager should start before everything
- serverList.add(REGISTRY_SERVER); // registry server should start before everything else
- serverList.add(CREDENTIAL_STORE); // credential store should start before api server
- serverList.add(SHARING_SERVER);
- serverList.add(API_SERVER);
- serverList.add(ORCHESTRATOR);
- serverList.add(GFAC_SERVER);
- serverList.add(PROFILE_SERVICE);
- } else if (serverList.indexOf(API_ORCH) > -1) {
- serverList.clear();
- serverList.add(DB_EVENT_MANAGER); // DB Event Manager should start before everything
- serverList.add(REGISTRY_SERVER); // registry server should start before everything else
- serverList.add(CREDENTIAL_STORE); // credential store should start before api server
- serverList.add(SHARING_SERVER);
- serverList.add(API_SERVER);
- serverList.add(ORCHESTRATOR);
- serverList.add(PROFILE_SERVICE);
- } else if (serverList.indexOf(EXECUTION) > -1) {
- serverList.clear();
- serverList.add(GFAC_SERVER);
- } else {
- // registry server should start before everything
- int regPos = serverList.indexOf(REGISTRY_SERVER);
- if (regPos > 0) {
- String temp = serverList.get(0);
- serverList.set(0, serverList.get(regPos));
- serverList.set(regPos, temp);
- }
-
- // credential store should start before api server
- int credPos = serverList.indexOf(CREDENTIAL_STORE);
- int apiPos = serverList.indexOf(API_SERVER);
- if (credPos >= 0 && apiPos >= 0 && (credPos > apiPos)) {
- String temp = serverList.get(apiPos);
- serverList.set(apiPos, serverList.get(credPos));
- serverList.set(credPos, temp);
- }
- }
- return serverList;
- }
-
- // private static void addSecondaryShutdownHook(){
- // Runtime.getRuntime().addShutdownHook(new Thread(){
- // @Override
- // public void run() {
- // System.out.print("Graceful shutdown attempt is still active. Do you want to exit instead? (y/n)");
- // String command=System.console().readLine().trim().toLowerCase();
- // if (command.equals("yes") || command.equals("y")){
- // System.exit(1);
- // }
-
- // }
- // });
- // }
-
public static void main(String[] args) throws IOException, AiravataException, ParseException {
ServerSettings.mergeSettingsCommandLineArgs(args);
if (ServerSettings.getBooleanSetting("api.server.monitoring.enabled")) {
@@ -174,34 +100,20 @@ public class ServerMain {
Runtime.getRuntime().addShutdownHook(new Thread(monitoringServer::stop));
}
- CommandLineParameters commandLineParameters = StringUtil.getCommandLineParser(args);
- if (commandLineParameters.getArguments().contains(STOP_COMMAND_STR)) {
- performServerStopRequest(commandLineParameters);
- } else {
- performServerStart(args);
- }
- }
-
- private static void performServerStart(String[] args) {
- setServerStarted();
logger.info("Airavata server instance starting...");
- String serverNames = "all";
- for (String string : args) {
- logger.info("Server Arguments: " + string);
- if (string.startsWith("--servers=")) {
- serverNames = string.substring("--servers=".length());
- }
- }
- serverNames = ApplicationSettings.getSetting(SERVERS_KEY, serverNames);
- startAllServers(serverNames);
- while (!hasStopRequested()) {
- try {
+ startAllServers();
+
+ // Wait until SIGTERM or KeyboardInterrupt (Ctrl+C) triggers shutdown hook.
+ try {
+ while (!isSystemShutDown()) {
Thread.sleep(2000);
- } catch (InterruptedException e) {
- stopAllServers();
}
+ } catch (InterruptedException e) {
+ logger.info("Interrupted, shutting down servers...");
+ setSystemShutDown();
}
- if (hasStopRequested()) {
+
+ if (isSystemShutDown()) {
ServerSettings.setStopAllThreads(true);
stopAllServers();
ShutdownStrategy shutdownStrategy;
@@ -222,111 +134,6 @@ public class ServerMain {
}
}
- private static void performServerStopRequest(CommandLineParameters commandLineParameters) throws IOException {
- // deleteOldStartRecords();
- String serverIndexOption = "serverIndex";
- if (commandLineParameters.getParameters().containsKey(serverIndexOption)) {
- serverPID = Integer.parseInt(commandLineParameters.getParameters().get(serverIndexOption));
- }
- if (isServerRunning()) {
- logger.info("Requesting airavata server" + (serverPID == -1 ? "(s)" : " instance " + serverPID)
- + " to stop...");
- requestStop();
- while (isServerRunning()) {
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- logger.error(e.getMessage(), e);
- }
- }
- logger.info("Server" + (serverPID == -1 ? "(s)" : " instance " + serverPID) + " stopped!!!");
- } else {
- logger.error("Server" + (serverPID == -1 ? "" : " instance " + serverPID) + " is not running!!!");
- }
- if (ServerSettings.isEmbeddedZK()) {
- cnxnFactory.shutdown();
- }
- }
-
- @SuppressWarnings("resource")
- private static void requestStop() throws IOException {
- File file = new File(getServerStopFileName());
- file.createNewFile();
- new RandomAccessFile(file, "rw").getChannel().lock();
- file.deleteOnExit();
- }
-
- private static boolean hasStopRequested() {
- return isSystemShutDown()
- || new File(getServerStopFileName()).exists()
- || new File(stopFileNamePrefix).exists();
- }
-
- private static String getServerStopFileName() {
- return stopFileNamePrefix;
- }
-
- private static void deleteOldStopRequests() {
- File[] files = new File(".").listFiles();
- for (File file : files) {
- if (file.getName().contains(stopFileNamePrefix)) {
- file.delete();
- }
- }
- }
-
- // private static void deleteOldStartRecords(){
- // File[] files = new File(".").listFiles();
- // for (File file : files) {
- // if (file.getName().contains(serverStartedFileNamePrefix)){
- // try {
- // new FileOutputStream(file);
- // file.delete();
- // } catch (Exception e) {
- // //file is locked which means there's an active process using it
- // }
- // }
- // }
- // }
-
- private static boolean isServerRunning() {
- if (serverPID == -1) {
- String[] files = new File(".").list();
- for (String file : files) {
- if (file.contains(serverStartedFileNamePrefix)) {
- return true;
- }
- }
- return false;
- } else {
- return new File(getServerStartedFileName()).exists();
- }
- }
-
- @SuppressWarnings({"resource"})
- private static void setServerStarted() {
- try {
- serverPID = getPID();
- deleteOldStopRequests();
- File serverStartedFile = null;
- serverStartedFile = new File(getServerStartedFileName());
- serverStartedFile.createNewFile();
- serverStartedFile.deleteOnExit();
- new RandomAccessFile(serverStartedFile, "rw").getChannel().lock();
- } catch (FileNotFoundException e) {
- logger.error(e.getMessage(), e);
- } catch (IOException e) {
- logger.error(e.getMessage(), e);
- }
- }
-
- private static String getServerStartedFileName() {
- return new File(
- new File(System.getenv("AIRAVATA_HOME"), "bin"),
- serverStartedFileNamePrefix + "_" + Long.toString(serverPID))
- .toString();
- }
-
public static void stopAllServers() {
// stopping should be done in reverse order of starting the servers
for (int i = servers.size() - 1; i >= 0; i--) {
@@ -339,9 +146,9 @@ public class ServerMain {
}
}
- public static void startAllServers(String serversNames) {
+ public static void startAllServers() {
if (!serversLoaded) {
- loadServers(serversNames);
+ loadServers();
}
for (IServer server : servers) {
try {
@@ -358,9 +165,6 @@ public class ServerMain {
private static void waitForServerToStart(IServer server, Integer maxWait) throws Exception {
int count = 0;
- // if (server.getStatus()==ServerStatus.STARTING) {
- // logger.info("Waiting for " + server.getName() + " to start...");
- // }
while (server.getStatus() == ServerStatus.STARTING && (maxWait == null || count < maxWait)) {
Thread.sleep(SERVER_STATUS_CHANGE_WAIT_INTERVAL);
count += SERVER_STATUS_CHANGE_WAIT_INTERVAL;
@@ -375,8 +179,6 @@ public class ServerMain {
if (server.getStatus() == ServerStatus.STOPING) {
logger.info("Waiting for " + server.getName() + " to stop...");
}
- // we are doing hasStopRequested() check because while we are stuck in the loop to stop there could be a
- // forceStop request
while (server.getStatus() == ServerStatus.STOPING && (maxWait == null || count < maxWait)) {
Thread.sleep(SERVER_STATUS_CHANGE_WAIT_INTERVAL);
count += SERVER_STATUS_CHANGE_WAIT_INTERVAL;
@@ -393,33 +195,4 @@ public class ServerMain {
private static void setSystemShutDown() {
ServerMain.systemShutDown = true;
}
-
- // private static int getPID(){
- // try {
- // java.lang.management.RuntimeMXBean runtime = java.lang.management.ManagementFactory
- // .getRuntimeMXBean();
- // java.lang.reflect.Field jvm = runtime.getClass()
- // .getDeclaredField("jvm");
- // jvm.setAccessible(true);
- // sun.management.VMManagement mgmt = (sun.management.VMManagement) jvm
- // .get(runtime);
- // java.lang.reflect.Method pid_method = mgmt.getClass()
- // .getDeclaredMethod("getProcessId");
- // pid_method.setAccessible(true);
- //
- // int pid = (Integer) pid_method.invoke(mgmt);
- // return pid;
- // } catch (Exception e) {
- // return -1;
- // }
- // }
-
- // getPID from ProcessHandle JDK 9 and onwards
- private static long getPID() {
- try {
- return ProcessHandle.current().pid();
- } catch (Exception e) {
- return -1;
- }
- }
}
diff --git a/airavata-api/src/main/java/org/apache/airavata/server/ThriftAPIServer.java b/airavata-api/src/main/java/org/apache/airavata/server/ThriftAPIServer.java
new file mode 100644
index 0000000000..ca81c852e7
--- /dev/null
+++ b/airavata-api/src/main/java/org/apache/airavata/server/ThriftAPIServer.java
@@ -0,0 +1,223 @@
+/**
+*
+* 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.airavata.server;
+
+import java.net.InetSocketAddress;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.airavata.api.Airavata;
+import org.apache.airavata.api.server.handler.AiravataServerHandler;
+import org.apache.airavata.common.utils.DBInitConfig;
+import org.apache.airavata.common.utils.DBInitializer;
+import org.apache.airavata.common.utils.IServer;
+import org.apache.airavata.common.utils.ServerSettings;
+import org.apache.airavata.credential.store.cpi.CredentialStoreService;
+import org.apache.airavata.credential.store.server.CredentialStoreServerHandler;
+import org.apache.airavata.orchestrator.cpi.OrchestratorService;
+import org.apache.airavata.orchestrator.server.OrchestratorServerHandler;
+import org.apache.airavata.registry.api.RegistryService;
+import org.apache.airavata.registry.api.service.handler.RegistryServerHandler;
+import org.apache.airavata.registry.core.utils.AppCatalogDBInitConfig;
+import org.apache.airavata.registry.core.utils.ExpCatalogDBInitConfig;
+import org.apache.airavata.registry.core.utils.ReplicaCatalogDBInitConfig;
+import org.apache.airavata.service.profile.groupmanager.cpi.GroupManagerService;
+import org.apache.airavata.service.profile.handlers.GroupManagerServiceHandler;
+import org.apache.airavata.service.profile.iam.admin.services.cpi.IamAdminServices;
+import org.apache.airavata.service.profile.handlers.IamAdminServicesHandler;
+import org.apache.airavata.service.profile.tenant.cpi.TenantProfileService;
+import org.apache.airavata.service.profile.handlers.TenantProfileServiceHandler;
+import org.apache.airavata.service.profile.user.cpi.UserProfileService;
+import org.apache.airavata.service.profile.handlers.UserProfileServiceHandler;
+import org.apache.airavata.service.profile.user.core.utils.UserProfileCatalogDBInitConfig;
+import org.apache.airavata.sharing.registry.service.cpi.SharingRegistryService;
+import org.apache.airavata.sharing.registry.server.SharingRegistryServerHandler;
+import org.apache.airavata.sharing.registry.db.utils.SharingRegistryDBInitConfig;
+import org.apache.thrift.TMultiplexedProcessor;
+import org.apache.thrift.server.TServer;
+import org.apache.thrift.server.TThreadPoolServer;
+import org.apache.thrift.transport.TServerSocket;
+import org.apache.thrift.transport.TServerTransport;
+import org.apache.thrift.transport.TTransportException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Airavata Thrift API Server that combines all Airavata services into a single server
+ * using the orchestrator's host and port configuration.
+ */
+public class ThriftAPIServer implements IServer {
+ private static final Logger logger = LoggerFactory.getLogger(ThriftAPIServer.class);
+ private static final String SERVER_NAME = "Airavata Thrift API";
+ private static final String SERVER_VERSION = "1.0";
+
+ private ServerStatus status;
+ private TServer server;
+
+ // Service names for multiplexing
+ public static final String AIRAVATA_API_SERVICE = "AiravataAPI";
+ public static final String REGISTRY_SERVICE = "RegistryAPI";
+ public static final String CREDENTIAL_STORE_SERVICE = "CredentialStore";
+ public static final String SHARING_REGISTRY_SERVICE = "SharingRegistry";
+ public static final String ORCHESTRATOR_SERVICE = "Orchestrator";
+ public static final String USER_PROFILE_SERVICE = "UserProfile";
+ public static final String TENANT_PROFILE_SERVICE = "TenantProfile";
+ public static final String IAM_ADMIN_SERVICES = "IamAdminServices";
+ public static final String GROUP_MANAGER_SERVICE = "GroupManager";
+
+ public ThriftAPIServer() {
+ setStatus(ServerStatus.STOPPED);
+ }
+
+ @Override
+ public String getName() {
+ return SERVER_NAME;
+ }
+
+ @Override
+ public String getVersion() {
+ return SERVER_VERSION;
+ }
+
+ @Override
+ public void start() throws Exception {
+ try {
+ setStatus(ServerStatus.STARTING);
+
+ // Initialize databases
+ logger.info("Initializing databases...");
+ List<DBInitConfig> dbInitConfigs = Arrays.asList(
+ new ExpCatalogDBInitConfig(),
+ new AppCatalogDBInitConfig(),
+ new ReplicaCatalogDBInitConfig(),
+ new UserProfileCatalogDBInitConfig(),
+ new SharingRegistryDBInitConfig()
+ );
+
+ for (DBInitConfig dbInitConfig : dbInitConfigs) {
+ DBInitializer.initializeDB(dbInitConfig);
+ }
+ logger.info("Databases initialized successfully");
+
+ // Use orchestrator's host and port configuration
+ final int serverPort = Integer.parseInt(ServerSettings.getSetting("orchestrator.server.port", "8940"));
+ final String serverHost = ServerSettings.getSetting("orchestrator.server.host", "localhost");
+
+ // Create processors for each service
+ var airavataAPIProcessor = new Airavata.Processor<>(new AiravataServerHandler());
+ var registryProcessor = new RegistryService.Processor<>(new RegistryServerHandler());
+ var credentialStoreProcessor = new CredentialStoreService.Processor<>(new CredentialStoreServerHandler());
+ var sharingRegistryProcessor = new SharingRegistryService.Processor<>(new SharingRegistryServerHandler());
+ var orchestratorProcessor = new OrchestratorService.Processor<>(new OrchestratorServerHandler());
+ var userProfileProcessor = new UserProfileService.Processor<>(new UserProfileServiceHandler());
+ var tenantProfileProcessor = new TenantProfileService.Processor<>(new TenantProfileServiceHandler());
+ var iamAdminServicesProcessor = new IamAdminServices.Processor<>(new IamAdminServicesHandler());
+ var groupManagerProcessor = new GroupManagerService.Processor<>(new GroupManagerServiceHandler());
+
+ // Create multiplexed processor
+ TMultiplexedProcessor multiplexedProcessor = new TMultiplexedProcessor();
+
+ // Register all processors with their service names
+ multiplexedProcessor.registerProcessor(AIRAVATA_API_SERVICE, airavataAPIProcessor);
+ multiplexedProcessor.registerProcessor(REGISTRY_SERVICE, registryProcessor);
+ multiplexedProcessor.registerProcessor(CREDENTIAL_STORE_SERVICE, credentialStoreProcessor);
+ multiplexedProcessor.registerProcessor(SHARING_REGISTRY_SERVICE, sharingRegistryProcessor);
+ multiplexedProcessor.registerProcessor(ORCHESTRATOR_SERVICE, orchestratorProcessor);
+ multiplexedProcessor.registerProcessor(USER_PROFILE_SERVICE, userProfileProcessor);
+ multiplexedProcessor.registerProcessor(TENANT_PROFILE_SERVICE, tenantProfileProcessor);
+ multiplexedProcessor.registerProcessor(IAM_ADMIN_SERVICES, iamAdminServicesProcessor);
+ multiplexedProcessor.registerProcessor(GROUP_MANAGER_SERVICE, groupManagerProcessor);
+
+ // Create server transport
+ TServerTransport serverTransport;
+ if (serverHost == null) {
+ serverTransport = new TServerSocket(serverPort);
+ } else {
+ InetSocketAddress inetSocketAddress = new InetSocketAddress(serverHost, serverPort);
+ serverTransport = new TServerSocket(inetSocketAddress);
+ }
+
+ // Create and start server
+ TThreadPoolServer.Args options = new TThreadPoolServer.Args(serverTransport);
+ options.minWorkerThreads = Integer.parseInt(ServerSettings.getSetting("orchestrator.server.min.threads", "30"));
+ server = new TThreadPoolServer(options.processor(multiplexedProcessor));
+
+ // Start server in background thread
+ new Thread(() -> {
+ server.serve();
+ setStatus(ServerStatus.STOPPED);
+ logger.info("Airavata Thrift API Stopped.");
+ }).start();
+
+ // Monitor server startup
+ new Thread(() -> {
+ while (!server.isServing()) {
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ break;
+ }
+ }
+ if (server.isServing()) {
+ setStatus(ServerStatus.STARTED);
+ logger.info("Started Airavata Thrift API on {}:{}", serverHost, serverPort);
+ logger.info("Registered services: {}, {}, {}, {}, {}, {}, {}, {}, {}",
+ AIRAVATA_API_SERVICE, REGISTRY_SERVICE, CREDENTIAL_STORE_SERVICE,
+ SHARING_REGISTRY_SERVICE, ORCHESTRATOR_SERVICE, USER_PROFILE_SERVICE,
+ TENANT_PROFILE_SERVICE, IAM_ADMIN_SERVICES, GROUP_MANAGER_SERVICE);
+ }
+ }).start();
+
+ } catch (TTransportException e) {
+ logger.error("Failed to start Airavata Thrift API", e);
+ setStatus(ServerStatus.FAILED);
+ throw new Exception("Error while starting the Airavata Thrift API", e);
+ }
+ }
+
+ @Override
+ public void stop() throws Exception {
+ if (server != null && server.isServing()) {
+ setStatus(ServerStatus.STOPING);
+ server.stop();
+ }
+ }
+
+ @Override
+ public void restart() throws Exception {
+ stop();
+ start();
+ }
+
+ @Override
+ public void configure() throws Exception {
+ // Configuration handled in start method
+ }
+
+ @Override
+ public ServerStatus getStatus() throws Exception {
+ return status;
+ }
+
+ private void setStatus(ServerStatus stat) {
+ status = stat;
+ status.updateTime();
+ }
+}
diff --git a/modules/ide-integration/.gitignore b/modules/ide-integration/.gitignore
deleted file mode 100644
index 69c3559aa6..0000000000
--- a/modules/ide-integration/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-database_data/
diff --git a/modules/ide-integration/README.md b/modules/ide-integration/README.md
deleted file mode 100644
index 40ab393d7d..0000000000
--- a/modules/ide-integration/README.md
+++ /dev/null
@@ -1,294 +0,0 @@
-# Apache Airavata - IDE Integration Setup
-
-<div align="center">
- <h3>🚀 Complete Development Environment Setup for IntelliJ IDEA</h3>
- <p>Set up a full Airavata installation inside IntelliJ IDEA for seamless development</p>
-</div>
-
----
-
-## 📋 Prerequisites
-
-Before starting, ensure you have the following installed on your system:
-
-| Tool | Version | Purpose | Installation Link |
-|------|---------|---------|-------------------|
-| 🐳 **Docker & Docker Compose** | Latest | Container orchestration | [Get Docker](https://docs.docker.com/compose/) |
-| 💡 **IntelliJ IDEA** | Latest | IDE with Java 17+ | [Download IDEA](https://www.jetbrains.com/idea/download/) |
-| ☕ **Java JDK** | 17+ | Runtime environment | [OpenJDK 17](https://openjdk.org/projects/jdk/17/) |
-| 🔧 **Apache Maven** | 3.8+ | Build tool | [Install Maven](https://maven.apache.org/install.html) |
-| 📝 **Git** | Latest | Version control | [Install Git](https://git-scm.com/downloads) |
-| 🐍 **Python** | 3.8+ | Django portal | [Python.org](https://www.python.org/downloads/) |
-| 📦 **Node.js & npm** | Latest LTS | Frontend build tools | [Node.js](https://nodejs.org/) |
-
-## 🏗️ Development Environment Setup
-
-### 1️⃣ Clone and Prepare Repository
-
-```bash
-# Clone the main repository
-git clone https://github.com/apache/airavata.git
-cd airavata
-
-# Build the project (this may take a few minutes)
-mvn clean install -DskipTests
-```
-
-### 2️⃣ Open in IntelliJ IDEA
-
-1. **Launch IntelliJ IDEA**
-2. **Open Project** → Navigate to your cloned `airavata` directory
-3. **Navigate to:** `modules` → `ide-integration` module
-
-## 🐳 Backend Services Setup
-
-### 3️⃣ Configure Host Resolution
-
-Add the following entry to your system's hosts file:
-
-**Linux/macOS:** `/etc/hosts`
-**Windows:** `C:\Windows\System32\drivers\etc\hosts`
-
-```bash
-127.0.0.1 airavata.host
-```
-
-### 4️⃣ Start Backend Services
-
-Navigate to the containers directory and start all required services:
-
-```bash
-cd .devcontainer
-docker-compose up -d
-```
-
-**Services Started:**
-- 🗄️ **MySQL Database**
-- 🔐 **Keycloak** (Authentication)
-- 📨 **Apache Kafka** (Messaging)
-- 🐰 **RabbitMQ** (Message Queue)
-- 🔒 **SSHD Server** (Secure connections)
-
-### 5️⃣ Initialize Database
-
-Apply database migrations:
-
-```bash
-cd .devcontainer
-cat ./database_scripts/init/*-migrations.sql | docker exec -i containers-db-1 mysql -p123456
-```
-
-## 🖥️ Starting Airavata Components
-
-### 6️⃣ Start API Server
-
-1. **Navigate to:** `org.apache.airavata.ide.integration.APIServerStarter`
-2. **Right-click** in the editor
-3. **Select:** `Run 'APIServerStarter.main()'`
-
-> 💡 **JDK 17+ Note:** Add this JVM argument in your run configuration:
-> ```
-> --add-opens java.base/java.lang=ALL-UNNAMED
-> ```
-
-### 7️⃣ Start Job Execution Engine
-
-1. **Navigate to:** `org.apache.airavata.ide.integration.JobEngineStarter`
-2. **Right-click** and select **Run**
-
-**Components Started:**
-- 🔄 Helix Controller
-- 👥 Helix Participant
-- ⚙️ Pre Workflow Manager
-- 📋 Post Workflow Manager
-
-### 8️⃣ Start Job Monitoring
-
-#### **Setup Email Monitor (One-Time Setup)**
-
-1. **Create a Gmail Account** [https://accounts.google.com/signup](https://accounts.google.com/signup)
-
-2. **Enable 2-Step Verification** [https://myaccount.google.com/security](https://myaccount.google.com/security)
-
-3. **Go to App Passwords** [https://myaccount.google.com/apppasswords](https://myaccount.google.com/apppasswords)
- *(Make sure you're logged in and have already enabled 2-Step Verification.)*
-
-4. **Generate App Password:**
- - Enter the name **"Airavata"** and click **"Generate"**.
-
-5. **Copy the Generated App Password**
- - A 16 character password will appear **copy and save it immediately**, as it will not be shown again.
-
-5. **Update Configuration:**
- Edit `src/main/resources/airavata-server.properties`:
- ```properties
- email.based.monitor.address=your-email@gmail.com
- email.based.monitor.password=your-app-password
- ```
-
-6. **Start Monitor:**
- - Navigate to: `org.apache.airavata.ide.integration.JobMonitorStarter`
- - Right-click and **Run**
-
-## 🌐 User Portal Setup (Django)
-
-### 9️⃣ Django Portal Installation
-
-**You can create and launch experiments and manage credentials using this portal.**
-
-```bash
-# Navigate outside the Airavata directory
-cd ..
-
-# Clone the Django portal repository
-git clone https://github.com/apache/airavata-portals.git
-cd airavata-portals/airavata-django-portal
-
-# Create a virtual environment
-python3 -m venv venv
-
-# Activate the virtual environment
-source venv/bin/activate # For Windows: venv\Scripts\activate
-
-# Install Python dependencies
-pip install -r requirements.txt
-
-### 🔟 Configure Django Portal
-
-```bash
-# Create local settings
-cp django_airavata/settings_local.py.ide django_airavata/settings_local.py
-
-# Run database migrations
-python3 manage.py migrate
-
-# Build JavaScript components
-./build_js.sh
-
-# Load default CMS pages
-python3 manage.py load_default_gateway
-
-# Start development server
-python3 manage.py runserver
-```
-
-### 🌍 Access User Portal
-
-- **URL:** [http://localhost:8000/auth/login](http://localhost:8000/auth/login)
-- **Username:** `default-admin`
-- **Password:** `123456`
-
-## 🛠️ Admin Portal Setup (Optional)
-
-For registering compute resources and storage resources:
-
-### 1️⃣ Starting Super Admin Portal (PGA)
-
-**This portal is required when registering new compute or storage resources into the gateway.**
-
-```bash
-cd .devcontainer/pga
-docker-compose up -d
-```
-
-### 2️⃣ Configure Host Resolution
-
-**Get host machine IP:**
-
-**macOS:**
-```bash
-docker-compose exec pga getent hosts docker.for.mac.host.internal | awk '{ print $1 }'
-```
-
-**Windows:**
-```bash
-docker-compose exec pga getent hosts host.docker.internal
-```
-
-**Update container hosts:**
-*Replace <host-machine-ip> with the actual IP*
-```bash
-docker-compose exec pga /bin/sh -c "echo '<host-machine-ip> airavata.host' >> /etc/hosts"
-```
-
-### 3️⃣ Access Admin Portal
-
-- **URL:** [http://airavata.host:8008](http://airavata.host:8008)
-- **Username:** `default-admin`
-- **Password:** `123456`
-
-## 🛑 Cleanup & Troubleshooting
-
-### Stop All Services
-
-```bash
-# In each docker-compose directory, run:
-docker-compose down
-docker-compose rm -f
-
-# Remove unused containers and networks
-docker system prune
-```
-
-### 🔐 Certificate Renewal (If Expired)
-
-Only needed when Keycloak certificates expire:
-
-```bash
-cd modules/ide-integration/src/main/resources/keystores
-
-# Remove old keystore
-rm airavata.p12
-
-# Generate new keystore (airavata.p12)
-keytool -genkey -keyalg RSA -alias selfsigned -keystore airavata.p12 \
- -storetype pkcs12 -storepass airavata -validity 360 -keysize 2048 \
- -dname "CN=airavata.host,OU=airavata.host,O=airavata.host,L=airavata.host,ST=airavata.host,C=airavata.host"
-
-# Generate self-signed key-pair (for TLS)
-openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt \
- -subj "/CN=airavata.host/OU=airavata.host/O=airavata.host/L=airavata.host/ST=airavata.host/C=airavata.host" \
- -addext "subjectAltName=DNS:airavata.host"
-```
-
-## 📊 Service Status Overview
-
-| Service | Port | Status Check | Purpose |
-|---------|------|-------------|---------|
-| 🗄️ **MySQL** | 3306 | `docker ps` | Database |
-| 🔐 **Keycloak** | 8443 | [airavata.host:8443](http://airavata.host:8443) | Authentication |
-| 📨 **Kafka** | 9092 | Internal | Messaging |
-| 🐰 **RabbitMQ** | 5672 | Internal | Message Queue |
-| 🌐 **Django Portal** | 8000 | [localhost:8000](http://localhost:8000) | User Interface |
-| 🛠️ **PGA Admin** | 8008 | [airavata.host:8008](http://airavata.host:8008) | Admin Portal |
-
-## 🆘 Common Issues
-
-**Port Conflicts:**
-```bash
-# Check what's using a port
-lsof -i :8000
-netstat -tulpn | grep :8000
-```
-
-**Docker Issues:**
-```bash
-# Reset Docker
-docker system prune -a
-docker-compose down --volumes
-```
-
-**Build Failures:**
-```bash
-# Clean Maven cache
-mvn clean
-rm -rf ~/.m2/repository/org/apache/airavata
-```
-
----
-
-<div align="center">
- <strong>🎉 Happy Developing with Apache Airavata!</strong>
- <br>
- <em>Need help? Check our <a href="https://airavata.apache.org/mailing-list.html">mailing lists</a></em>
-</div>
\ No newline at end of file
diff --git a/modules/ide-integration/pom.xml b/modules/ide-integration/pom.xml
deleted file mode 100644
index 67857b0257..0000000000
--- a/modules/ide-integration/pom.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<!--
-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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <artifactId>airavata</artifactId>
- <groupId>org.apache.airavata</groupId>
- <version>0.21-SNAPSHOT</version>
- <relativePath>../../pom.xml</relativePath>
- </parent>
- <modelVersion>4.0.0</modelVersion>
-
- <artifactId>ide-integration</artifactId>
- <name>Airavata IDE Integration</name>
- <packaging>jar</packaging>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.airavata</groupId>
- <artifactId>airavata-api</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.mariadb.jdbc</groupId>
- <artifactId>mariadb-java-client</artifactId>
- </dependency>
- </dependencies>
-
- <build>
- <resources>
- <resource>
- <directory>../../keystores</directory>
- <targetPath>keystores</targetPath>
- <includes>
- <include>*.jks</include>
- </includes>
- </resource>
- </resources>
- </build>
-
-</project>
diff --git a/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/APIServerStarter.java b/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/APIServerStarter.java
deleted file mode 100644
index 1445c53877..0000000000
--- a/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/APIServerStarter.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
-*
-* 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.airavata.ide.integration;
-
-import org.apache.airavata.api.server.AiravataAPIServer;
-import org.apache.airavata.credential.store.server.CredentialStoreServer;
-import org.apache.airavata.db.event.manager.DBEventManagerRunner;
-import org.apache.airavata.orchestrator.server.OrchestratorServer;
-import org.apache.airavata.registry.api.service.RegistryAPIServer;
-import org.apache.airavata.service.profile.server.ProfileServiceServer;
-import org.apache.airavata.sharing.registry.server.SharingRegistryServer;
-
-public class APIServerStarter {
-
- public static void main(String[] args) throws Exception {
- DBEventManagerRunner dbEventManagerRunner = new DBEventManagerRunner();
- RegistryAPIServer registryAPIServer = new RegistryAPIServer();
- CredentialStoreServer credentialStoreServer = new CredentialStoreServer();
- SharingRegistryServer sharingRegistryServer = new SharingRegistryServer();
- AiravataAPIServer airavataAPIServer = new AiravataAPIServer();
- OrchestratorServer orchestratorServer = new OrchestratorServer();
- ProfileServiceServer profileServiceServer = new ProfileServiceServer();
-
- dbEventManagerRunner.start();
- registryAPIServer.start();
- credentialStoreServer.start();
- sharingRegistryServer.start();
- airavataAPIServer.start();
- orchestratorServer.start();
- profileServiceServer.start();
- }
-}
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
deleted file mode 100644
index 297f8dcd88..0000000000
--- a/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/JobEngineStarter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
-*
-* 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.airavata.ide.integration;
-
-import java.util.ArrayList;
-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.helix.manager.zk.ZKHelixAdmin;
-import org.apache.helix.manager.zk.ZNRecordSerializer;
-import org.apache.helix.manager.zk.ZkClient;
-
-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);
-
- System.out.println("Starting Helix Controller .......");
- // 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));
- }
-
- System.out.println("Starting Helix Participant .......");
-
- // Starting helix participant
- GlobalParticipant participant = new GlobalParticipant(taskClasses, null);
- participant.startServer();
-
- System.out.println("Starting Pre Workflow Manager .......");
-
- PreWorkflowManager preWorkflowManager = new PreWorkflowManager();
- preWorkflowManager.startServer();
-
- System.out.println("Starting Post Workflow Manager .......");
-
- 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
deleted file mode 100644
index 2068e4e38a..0000000000
--- a/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/JobMonitorStarter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
-*
-* 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.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/pom.xml b/pom.xml
index edafd19681..e6e931c830 100644
--- a/pom.xml
+++ b/pom.xml
@@ -75,7 +75,6 @@ under the License.
<module>modules/restproxy</module>
<module>modules/registry-db-migrator</module>
<module>modules/registry-jpa-generator</module>
- <module>modules/ide-integration</module>
</modules>
<properties>