This is an automated email from the ASF dual-hosted git repository. yasith pushed a commit to branch service-layer-improvements in repository https://gitbox.apache.org/repos/asf/airavata.git
commit 629c85022ccdaeb4ce21005c81ac6d80a8b99464 Author: yasithdev <[email protected]> AuthorDate: Tue Dec 9 18:08:35 2025 -0600 cleanup classes and get code to working state --- .../accountprovisioning/SSHAccountManager.java | 53 +++---------- .../org/apache/airavata/agents/api/AgentUtils.java | 33 +------- .../airavata/config/RegistryServiceProvider.java | 44 ----------- .../apache/airavata/helix/core/AbstractTask.java | 16 +--- .../helix/impl/participant/GlobalParticipant.java | 8 +- .../airavata/helix/impl/task/AWSTaskFactory.java | 11 ++- .../airavata/helix/impl/task/AiravataTask.java | 44 +---------- .../airavata/helix/impl/task/TaskContext.java | 29 +++---- .../helix/impl/task/aws/AWSCompletingTask.java | 7 +- .../helix/impl/task/aws/AWSJobSubmissionTask.java | 13 +-- .../helix/impl/task/aws/CreateEC2InstanceTask.java | 11 ++- .../helix/impl/task/aws/utils/AWSTaskUtil.java | 36 ++------- .../impl/task/cancel/WorkflowCancellationTask.java | 16 +--- .../helix/impl/task/parsing/DataParsingTask.java | 41 ++-------- .../task/submission/DefaultJobSubmissionTask.java | 3 - .../task/submission/config/GroovyMapBuilder.java | 36 ++------- .../helix/impl/workflow/ParserWorkflowManager.java | 4 +- .../helix/impl/workflow/PostWorkflowManager.java | 14 +--- .../manager/dbevent/DBEventManagerRunner.java | 23 ++---- .../orchestrator/impl/AbstractOrchestrator.java | 5 +- .../orchestrator/impl/SimpleOrchestratorImpl.java | 47 ++++++----- .../orchestrator/job/GFACPassiveJobSubmitter.java | 9 ++- .../orchestrator/utils/OrchestratorUtils.java | 92 +++++----------------- .../security/GatewayGroupsInitializer.java | 27 ------- .../airavata/security/KeyCloakSecurityManager.java | 13 ++- .../authzcache/AuthzCacheManagerFactory.java | 45 +++++------ .../apache/airavata/service/AiravataService.java | 20 +++-- .../security/GatewayGroupsInitializerTest.java | 3 - .../file/server/FileServerConfiguration.java | 6 +- .../file/server/service/AirvataFileService.java | 33 ++++++-- .../file/server/service/ProcessDataManager.java | 21 +++-- .../airavata/ide/integration/APIServerStarter.java | 28 ++----- .../airavata/ide/integration/JobEngineStarter.java | 27 +++---- .../ide/integration/JobMonitorStarter.java | 8 +- .../airavata/research/service/AiravataService.java | 15 ++-- 35 files changed, 267 insertions(+), 574 deletions(-) diff --git a/airavata-api/src/main/java/org/apache/airavata/accountprovisioning/SSHAccountManager.java b/airavata-api/src/main/java/org/apache/airavata/accountprovisioning/SSHAccountManager.java index dee18ac07d..1c47be9727 100644 --- a/airavata-api/src/main/java/org/apache/airavata/accountprovisioning/SSHAccountManager.java +++ b/airavata-api/src/main/java/org/apache/airavata/accountprovisioning/SSHAccountManager.java @@ -36,7 +36,6 @@ import org.apache.airavata.model.credential.store.SSHCredential; import org.apache.airavata.registry.api.exception.RegistryServiceException; import org.apache.airavata.service.CredentialStoreService; import org.apache.airavata.service.RegistryService; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; @Component @@ -45,39 +44,11 @@ public class SSHAccountManager { private final RegistryService registryService; private final CredentialStoreService credentialStoreService; - private static ApplicationContext applicationContext; - public SSHAccountManager( RegistryService registryService, - CredentialStoreService credentialStoreService, - ApplicationContext applicationContext) { + CredentialStoreService credentialStoreService) { this.registryService = registryService; this.credentialStoreService = credentialStoreService; - SSHAccountManager.applicationContext = applicationContext; - } - - // Instance methods for Spring DI - private RegistryService getRegistryServiceInstance() { - return registryService; - } - - private CredentialStoreService getCredentialStoreServiceInstance() { - return credentialStoreService; - } - - // Static methods for backward compatibility - delegate to Spring-managed instance - private static RegistryService getRegistryServiceStatic() { - if (applicationContext != null) { - return applicationContext.getBean(SSHAccountManager.class).getRegistryServiceInstance(); - } - throw new RuntimeException("ApplicationContext not available. RegistryService cannot be retrieved."); - } - - private static CredentialStoreService getCredentialStoreServiceStatic() { - if (applicationContext != null) { - return applicationContext.getBean(SSHAccountManager.class).getCredentialStoreServiceInstance(); - } - throw new RuntimeException("ApplicationContext not available. CredentialStoreService cannot be retrieved."); } /** @@ -89,7 +60,7 @@ public class SSHAccountManager { * @throws InvalidSetupException * @throws InvalidUsernameException */ - public static boolean doesUserHaveSSHAccount(String gatewayId, String computeResourceId, String userId) + public boolean doesUserHaveSSHAccount(String gatewayId, String computeResourceId, String userId) throws InvalidSetupException, InvalidUsernameException { SSHAccountProvisioner sshAccountProvisioner = getSshAccountProvisioner(gatewayId, computeResourceId); @@ -102,10 +73,10 @@ public class SSHAccountManager { } } - private static SSHAccountProvisioner getSshAccountProvisioner(String gatewayId, String computeResourceId) + private SSHAccountProvisioner getSshAccountProvisioner(String gatewayId, String computeResourceId) throws InvalidSetupException { // get registry service - RegistryService registryService = getRegistryServiceStatic(); + RegistryService registryService = this.registryService; // get compute resource preferences for the gateway and hostname ComputeResourcePreference computeResourcePreference = null; try { @@ -126,7 +97,7 @@ public class SSHAccountManager { return createSshAccountProvisioner(gatewayId, computeResourcePreference); } - public static boolean isSSHAccountSetupComplete( + public boolean isSSHAccountSetupComplete( String gatewayId, String computeResourceId, String userId, SSHCredential sshCredential) throws InvalidSetupException, InvalidUsernameException { SSHAccountProvisioner sshAccountProvisioner = getSshAccountProvisioner(gatewayId, computeResourceId); @@ -143,12 +114,12 @@ public class SSHAccountManager { * @throws InvalidSetupException * @throws InvalidUsernameException */ - public static UserComputeResourcePreference setupSSHAccount( + public UserComputeResourcePreference setupSSHAccount( String gatewayId, String computeResourceId, String userId, SSHCredential sshCredential) throws InvalidSetupException, InvalidUsernameException { // get compute resource preferences for the gateway and hostname - RegistryService registryService = getRegistryServiceStatic(); + RegistryService registryService = this.registryService; ComputeResourcePreference computeResourcePreference = null; ComputeResourceDescription computeResourceDescription = null; SSHJobSubmission sshJobSubmission = null; @@ -251,7 +222,7 @@ public class SSHAccountManager { return userComputeResourcePreference; } - private static String getSSHHostname( + private String getSSHHostname( ComputeResourceDescription computeResourceDescription, SSHJobSubmission sshJobSubmission) { String alternativeSSHHostName = sshJobSubmission.getAlternativeSSHHostName(); if (alternativeSSHHostName != null && !"".equals(alternativeSSHHostName.trim())) { @@ -261,7 +232,7 @@ public class SSHAccountManager { } } - private static SSHAccountProvisioner createSshAccountProvisioner( + private SSHAccountProvisioner createSshAccountProvisioner( String gatewayId, ComputeResourcePreference computeResourcePreference) throws InvalidSetupException { String provisionerName = computeResourcePreference.getSshAccountProvisioner(); Map<ConfigParam, String> provisionerConfig = @@ -274,10 +245,10 @@ public class SSHAccountManager { return SSHAccountProvisionerFactory.createSSHAccountProvisioner(provisionerName, resolvedConfig); } - private static Map<ConfigParam, String> resolveProvisionerConfig( + private Map<ConfigParam, String> resolveProvisionerConfig( String gatewayId, String provisionerName, Map<ConfigParam, String> provisionerConfig) throws InvalidSetupException { - CredentialStoreService credentialStoreService = getCredentialStoreServiceStatic(); + CredentialStoreService credentialStoreService = this.credentialStoreService; // Resolve any CRED_STORE_PASSWORD_TOKEN config parameters to passwords Map<ConfigParam, String> resolvedConfig = new HashMap<>(); for (Map.Entry<ConfigParam, String> configEntry : provisionerConfig.entrySet()) { @@ -301,7 +272,7 @@ public class SSHAccountManager { return resolvedConfig; } - private static Map<ConfigParam, String> convertConfigParams( + private Map<ConfigParam, String> convertConfigParams( String provisionerName, Map<String, String> thriftConfigParams) throws InvalidSetupException { List<ConfigParam> configParams = SSHAccountProvisionerFactory.getSSHAccountProvisionerConfigParams(provisionerName); diff --git a/airavata-api/src/main/java/org/apache/airavata/agents/api/AgentUtils.java b/airavata-api/src/main/java/org/apache/airavata/agents/api/AgentUtils.java index 40aa83613c..c78831033c 100644 --- a/airavata-api/src/main/java/org/apache/airavata/agents/api/AgentUtils.java +++ b/airavata-api/src/main/java/org/apache/airavata/agents/api/AgentUtils.java @@ -21,53 +21,26 @@ package org.apache.airavata.agents.api; import org.apache.airavata.service.CredentialStoreService; import org.apache.airavata.service.RegistryService; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; @Component -public class AgentUtils implements ApplicationContextAware { - - private static ApplicationContext applicationContext; +public class AgentUtils { private final RegistryService registryService; private final CredentialStoreService credentialStoreService; public AgentUtils( - ApplicationContext applicationContext, RegistryService registryService, CredentialStoreService credentialStoreService) { - AgentUtils.applicationContext = applicationContext; this.registryService = registryService; this.credentialStoreService = credentialStoreService; } - @Override - public void setApplicationContext(ApplicationContext applicationContext) { - AgentUtils.applicationContext = applicationContext; - } - - // Instance methods for Spring DI - public RegistryService getRegistryServiceInstance() { + public RegistryService getRegistryService() { return registryService; } - public CredentialStoreService getCredentialServiceInstance() { + public CredentialStoreService getCredentialService() { return credentialStoreService; } - - // Static methods for backward compatibility - delegate to instance - public static RegistryService getRegistryService() throws AgentException { - if (applicationContext != null) { - return applicationContext.getBean(AgentUtils.class).getRegistryServiceInstance(); - } - throw new AgentException("ApplicationContext not available. RegistryService cannot be retrieved."); - } - - public static CredentialStoreService getCredentialService() throws AgentException { - if (applicationContext != null) { - return applicationContext.getBean(AgentUtils.class).getCredentialServiceInstance(); - } - throw new AgentException("ApplicationContext not available. CredentialStoreService cannot be retrieved."); - } } diff --git a/airavata-api/src/main/java/org/apache/airavata/config/RegistryServiceProvider.java b/airavata-api/src/main/java/org/apache/airavata/config/RegistryServiceProvider.java deleted file mode 100644 index 90fba0e500..0000000000 --- a/airavata-api/src/main/java/org/apache/airavata/config/RegistryServiceProvider.java +++ /dev/null @@ -1,44 +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.config; - -import org.apache.airavata.service.RegistryService; -import org.springframework.stereotype.Component; - -/** - * Provider to make RegistryService available to components that can't use Spring injection - * (e.g., workflow managers started via main methods). - */ -@Component -public class RegistryServiceProvider { - - private static RegistryService instance; - - public RegistryServiceProvider(RegistryService registryService) { - RegistryServiceProvider.instance = registryService; - } - - public static RegistryService getInstance() { - if (instance == null) { - throw new IllegalStateException("RegistryService not initialized. Spring context may not be ready."); - } - return instance; - } -} diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/core/AbstractTask.java b/airavata-api/src/main/java/org/apache/airavata/helix/core/AbstractTask.java index 2c223c5487..0b75a6967b 100644 --- a/airavata-api/src/main/java/org/apache/airavata/helix/core/AbstractTask.java +++ b/airavata-api/src/main/java/org/apache/airavata/helix/core/AbstractTask.java @@ -19,7 +19,6 @@ */ package org.apache.airavata.helix.core; -import org.apache.airavata.config.AiravataServerProperties; import org.apache.airavata.helix.core.participant.HelixParticipant; import org.apache.airavata.helix.core.util.MonitoringUtil; import org.apache.airavata.helix.core.util.TaskUtil; @@ -227,18 +226,9 @@ public abstract class AbstractTask extends UserContentStore implements Task { if (curatorClient == null) { RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3); try { - // Try to get properties from ApplicationContext via AiravataTask - String zkConnection = "localhost:2181"; // default - try { - var ctx = org.apache.airavata.helix.impl.task.AiravataTask.getApplicationContext(); - if (ctx != null) { - var props = ctx.getBean(AiravataServerProperties.class); - zkConnection = props.zookeeper.serverConnection; - } - } catch (Exception e) { - logger.warn( - "Could not get properties from ApplicationContext, using default zookeeper connection", e); - } + // Try to get properties from ApplicationSettings + String zkConnection = org.apache.airavata.common.utils.ApplicationSettings.getSetting( + "zookeeper.server-connection", "localhost:2181"); AbstractTask.curatorClient = CuratorFrameworkFactory.newClient(zkConnection, retryPolicy); AbstractTask.curatorClient.start(); } catch (Exception 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 c6ecb00d6c..06aeb24cc2 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 @@ -81,16 +81,12 @@ public class GlobalParticipant extends HelixParticipant<AbstractTask> { return taskClasses; } - public void startServer() { - Thread t = new Thread(this); - t.start(); - } - /** * Standardized start method for Spring Boot integration. * Non-blocking: starts internal thread and returns immediately. */ public void start() { - startServer(); + Thread t = new Thread(this); + t.start(); } } diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/AWSTaskFactory.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/AWSTaskFactory.java index 229f9f9c5f..136048e094 100644 --- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/AWSTaskFactory.java +++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/AWSTaskFactory.java @@ -41,25 +41,28 @@ public class AWSTaskFactory implements HelixTaskFactory { private final UserProfileService userProfileService; private final CredentialStoreService credentialStoreService; private final org.apache.airavata.helix.impl.task.submission.config.GroovyMapBuilder groovyMapBuilder; + private final org.apache.airavata.helix.impl.task.aws.utils.AWSTaskUtil awsTaskUtil; public AWSTaskFactory( ApplicationContext applicationContext, RegistryService registryService, UserProfileService userProfileService, CredentialStoreService credentialStoreService, - org.apache.airavata.helix.impl.task.submission.config.GroovyMapBuilder groovyMapBuilder) { + org.apache.airavata.helix.impl.task.submission.config.GroovyMapBuilder groovyMapBuilder, + org.apache.airavata.helix.impl.task.aws.utils.AWSTaskUtil awsTaskUtil) { this.applicationContext = applicationContext; this.registryService = registryService; this.userProfileService = userProfileService; this.credentialStoreService = credentialStoreService; this.groovyMapBuilder = groovyMapBuilder; + this.awsTaskUtil = awsTaskUtil; } @Override public AiravataTask createEnvSetupTask(String processId) { LOGGER.info("Creating AWS CreateEc2InstanceTask for process {}...", processId); return new CreateEC2InstanceTask( - applicationContext, registryService, userProfileService, credentialStoreService); + applicationContext, registryService, userProfileService, credentialStoreService, awsTaskUtil); } @Override @@ -70,7 +73,7 @@ public class AWSTaskFactory implements HelixTaskFactory { @Override public AiravataTask createJobSubmissionTask(String processId) { return new AWSJobSubmissionTask( - applicationContext, registryService, userProfileService, credentialStoreService, groovyMapBuilder); + applicationContext, registryService, userProfileService, credentialStoreService, groovyMapBuilder, awsTaskUtil); } @Override @@ -90,7 +93,7 @@ public class AWSTaskFactory implements HelixTaskFactory { @Override public AiravataTask createCompletingTask(String processId) { - return new AWSCompletingTask(applicationContext, registryService, userProfileService, credentialStoreService); + return new AWSCompletingTask(applicationContext, registryService, userProfileService, credentialStoreService, awsTaskUtil); } @Override diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/AiravataTask.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/AiravataTask.java index dbba876cf4..0ac6068df6 100644 --- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/AiravataTask.java +++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/AiravataTask.java @@ -65,8 +65,8 @@ import org.springframework.stereotype.Component; public abstract class AiravataTask extends AbstractTask { private static final Logger logger = LoggerFactory.getLogger(AiravataTask.class); - private static ApplicationContext applicationContext; + protected final ApplicationContext applicationContext; protected final RegistryService registryService; private final UserProfileService userProfileService; private final CredentialStoreService credentialStoreService; @@ -76,13 +76,13 @@ public abstract class AiravataTask extends AbstractTask { RegistryService registryService, UserProfileService userProfileService, CredentialStoreService credentialStoreService) { - AiravataTask.applicationContext = applicationContext; + this.applicationContext = applicationContext; this.registryService = registryService; this.userProfileService = userProfileService; this.credentialStoreService = credentialStoreService; } - public static ApplicationContext getApplicationContext() { + protected ApplicationContext getApplicationContext() { return applicationContext; } @@ -688,42 +688,4 @@ public abstract class AiravataTask extends AbstractTask { this.autoSchedule = autoSchedule; } - // Static methods for backward compatibility - delegate to instance via ApplicationContext - public static RegistryService getRegistryServiceStatic() { - if (applicationContext != null) { - // Try to get from a bean instance first - try { - AiravataTask task = applicationContext.getBean(AiravataTask.class); - return task.getRegistryService(); - } catch (Exception e) { - // Fallback to direct bean lookup - return applicationContext.getBean(RegistryService.class); - } - } - throw new IllegalStateException("ApplicationContext not available"); - } - - public static UserProfileService getUserProfileServiceStatic() { - if (applicationContext != null) { - try { - AiravataTask task = applicationContext.getBean(AiravataTask.class); - return task.getUserProfileService(); - } catch (Exception e) { - return applicationContext.getBean(UserProfileService.class); - } - } - throw new IllegalStateException("ApplicationContext not available"); - } - - public static CredentialStoreService getCredentialStoreServiceStatic() { - if (applicationContext != null) { - try { - AiravataTask task = applicationContext.getBean(AiravataTask.class); - return task.getCredentialStoreService(); - } catch (Exception e) { - return applicationContext.getBean(CredentialStoreService.class); - } - } - throw new IllegalStateException("ApplicationContext not available"); - } } diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/TaskContext.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/TaskContext.java index f89409fadf..c82c33c5e0 100644 --- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/TaskContext.java +++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/TaskContext.java @@ -74,7 +74,6 @@ import org.apache.airavata.service.RegistryService; import org.apache.airavata.service.UserProfileService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; /** * Note: process context property use lazy loading approach. In runtime you will see some properties as null @@ -784,26 +783,26 @@ public class TaskContext { public RegistryService getRegistryService() { if (registryService == null) { - // Get from AiravataTask if available - ApplicationContext applicationContext = AiravataTask.getApplicationContext(); - if (applicationContext != null) { - registryService = applicationContext.getBean(RegistryService.class); - } + throw new IllegalStateException("RegistryService not set in TaskContext. It must be set via setRegistryService()"); } return registryService; } + public void setRegistryService(RegistryService registryService) { + this.registryService = registryService; + } + public UserProfileService getProfileService() { if (profileService == null) { - // Get from AiravataTask if available - ApplicationContext applicationContext = AiravataTask.getApplicationContext(); - if (applicationContext != null) { - profileService = applicationContext.getBean(UserProfileService.class); - } + throw new IllegalStateException("UserProfileService not set in TaskContext. It must be set via setProfileService()"); } return profileService; } + public void setProfileService(UserProfileService profileService) { + this.profileService = profileService; + } + public UserProfile getUserProfile() throws TaskOnFailException { if (this.userProfile == null) { @@ -1035,10 +1034,8 @@ public class TaskContext { } private AiravataSecurityManager getSecurityManager() { - ApplicationContext applicationContext = AiravataTask.getApplicationContext(); - if (applicationContext != null) { - return applicationContext.getBean(AiravataSecurityManager.class); - } - throw new RuntimeException("Unable to get SecurityManager - ApplicationContext not available"); + // SecurityManager should be injected or retrieved via a different mechanism + // For now, throw an exception indicating it needs to be set + throw new RuntimeException("Unable to get SecurityManager - SecurityManager must be injected into TaskContext"); } } diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/AWSCompletingTask.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/AWSCompletingTask.java index 3c64206513..397588880b 100644 --- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/AWSCompletingTask.java +++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/AWSCompletingTask.java @@ -33,13 +33,16 @@ import org.slf4j.LoggerFactory; public class AWSCompletingTask extends AiravataTask { private static final Logger logger = LoggerFactory.getLogger(AWSCompletingTask.class); + private final AWSTaskUtil awsTaskUtil; public AWSCompletingTask( org.springframework.context.ApplicationContext applicationContext, org.apache.airavata.service.RegistryService registryService, org.apache.airavata.service.UserProfileService userProfileService, - org.apache.airavata.service.CredentialStoreService credentialStoreService) { + org.apache.airavata.service.CredentialStoreService credentialStoreService, + AWSTaskUtil awsTaskUtil) { super(applicationContext, registryService, userProfileService, credentialStoreService); + this.awsTaskUtil = awsTaskUtil; } @Override @@ -48,7 +51,7 @@ public class AWSCompletingTask extends AiravataTask { logger.info("Process {} successfully completed", getProcessId()); saveAndPublishProcessStatus(ProcessState.COMPLETED); cleanup(); - AWSTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId()); + awsTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId()); return onSuccess("Process " + getProcessId() + " successfully completed"); } diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/AWSJobSubmissionTask.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/AWSJobSubmissionTask.java index a04df96133..cc57ae9531 100644 --- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/AWSJobSubmissionTask.java +++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/AWSJobSubmissionTask.java @@ -60,16 +60,17 @@ import software.amazon.awssdk.services.ec2.model.InstanceStateName; public class AWSJobSubmissionTask extends JobSubmissionTask { private static final Logger LOGGER = LoggerFactory.getLogger(AWSJobSubmissionTask.class); - private static ApplicationContext applicationContext; + private final AWSTaskUtil awsTaskUtil; public AWSJobSubmissionTask( ApplicationContext applicationContext, org.apache.airavata.service.RegistryService registryService, org.apache.airavata.service.UserProfileService userProfileService, CredentialStoreService credentialStoreService, - org.apache.airavata.helix.impl.task.submission.config.GroovyMapBuilder groovyMapBuilder) { + org.apache.airavata.helix.impl.task.submission.config.GroovyMapBuilder groovyMapBuilder, + AWSTaskUtil awsTaskUtil) { super(applicationContext, registryService, userProfileService, credentialStoreService, groovyMapBuilder); - AWSJobSubmissionTask.applicationContext = applicationContext; + this.awsTaskUtil = awsTaskUtil; } private static final int WAIT_MAX_RETRIES = 10; @@ -218,7 +219,7 @@ public class AWSJobSubmissionTask extends JobSubmissionTask { awsContext.getInstanceId(), publicIpAddress, getProcessId()); - AWSTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId()); + awsTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId()); } catch (Exception e) { LOGGER.error("Failed to execute full cleanup during onCancel for process {}", getProcessId(), e); @@ -230,7 +231,7 @@ public class AWSJobSubmissionTask extends JobSubmissionTask { protected void cleanup() { super.cleanup(); LOGGER.info("AWS Job Submission Task cleanup for process {}", getProcessId()); - AWSTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId()); + awsTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId()); } private String verifyInstanceIsRunning(String token, String instanceId, String region) throws Exception { @@ -241,7 +242,7 @@ public class AWSJobSubmissionTask extends JobSubmissionTask { MAX_DELAY_SECONDS, TimeUnit.SECONDS); - try (Ec2Client ec2Client = AWSTaskUtil.buildEc2Client(token, getGatewayId(), region)) { + try (Ec2Client ec2Client = awsTaskUtil.buildEc2Client(token, getGatewayId(), region)) { return waiter.waitUntil(() -> { DescribeInstancesRequest request = DescribeInstancesRequest.builder() .instanceIds(instanceId) diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/CreateEC2InstanceTask.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/CreateEC2InstanceTask.java index b792e881cc..1fbaae659f 100644 --- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/CreateEC2InstanceTask.java +++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/CreateEC2InstanceTask.java @@ -47,13 +47,16 @@ import software.amazon.awssdk.services.ec2.model.RunInstancesResponse; public class CreateEC2InstanceTask extends AiravataTask { private static final Logger LOGGER = LoggerFactory.getLogger(CreateEC2InstanceTask.class); + private final AWSTaskUtil awsTaskUtil; public CreateEC2InstanceTask( org.springframework.context.ApplicationContext applicationContext, org.apache.airavata.service.RegistryService registryService, org.apache.airavata.service.UserProfileService userProfileService, - org.apache.airavata.service.CredentialStoreService credentialStoreService) { + org.apache.airavata.service.CredentialStoreService credentialStoreService, + AWSTaskUtil awsTaskUtil) { super(applicationContext, registryService, userProfileService, credentialStoreService); + this.awsTaskUtil = awsTaskUtil; } @Override @@ -72,7 +75,7 @@ public class CreateEC2InstanceTask extends AiravataTask { String credentialToken = taskContext.getGroupComputeResourcePreference().getResourceSpecificCredentialStoreToken(); - ec2Client = AWSTaskUtil.buildEc2Client(credentialToken, getGatewayId(), awsPrefs.getRegion()); + ec2Client = awsTaskUtil.buildEc2Client(credentialToken, getGatewayId(), awsPrefs.getRegion()); LOGGER.info("Successfully built EC2 client for region {}", awsPrefs.getRegion()); String securityGroupId = createSecurityGroup(ec2Client); @@ -130,14 +133,14 @@ public class CreateEC2InstanceTask extends AiravataTask { @Override public void onCancel(TaskContext taskContext) { - AWSTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId()); + awsTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId()); } @Override protected void cleanup() { super.cleanup(); LOGGER.info("AWS Create EC2 Instance Task cleanup for process {}", getProcessId()); - AWSTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId()); + awsTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId()); } private String saveSSHCredential(String privateKey, String publicKey) throws Exception { diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/utils/AWSTaskUtil.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/utils/AWSTaskUtil.java index b19749a804..141861bfe3 100644 --- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/utils/AWSTaskUtil.java +++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/utils/AWSTaskUtil.java @@ -25,9 +25,9 @@ import org.apache.airavata.helix.impl.task.aws.AWSProcessContextManager; import org.apache.airavata.model.appcatalog.groupresourceprofile.AwsComputeResourcePreference; import org.apache.airavata.model.credential.store.PasswordCredential; import org.apache.airavata.service.CredentialStoreService; +import org.apache.airavata.service.RegistryService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; @@ -40,34 +40,18 @@ import software.amazon.awssdk.services.ec2.model.InstanceStateName; public final class AWSTaskUtil { private static final Logger LOGGER = LoggerFactory.getLogger(AWSTaskUtil.class); - private static ApplicationContext applicationContext; private final CredentialStoreService credentialStoreService; + private final RegistryService registryService; - public AWSTaskUtil(CredentialStoreService credentialStoreService, ApplicationContext applicationContext) { + public AWSTaskUtil( + CredentialStoreService credentialStoreService, RegistryService registryService) { this.credentialStoreService = credentialStoreService; - AWSTaskUtil.applicationContext = applicationContext; + this.registryService = registryService; } - // Instance method for Spring DI - private CredentialStoreService getCredentialStoreServiceInstance() { - return credentialStoreService; - } - - // Static method for backward compatibility - delegates to Spring-managed instance - private static CredentialStoreService getCredentialStoreServiceStatic() { - if (applicationContext != null) { - return applicationContext.getBean(AWSTaskUtil.class).getCredentialStoreServiceInstance(); - } - throw new RuntimeException("ApplicationContext not available. CredentialStoreService cannot be retrieved."); - } - - public static Ec2Client buildEc2Client(String token, String gatewayId, String region) throws Exception { + public Ec2Client buildEc2Client(String token, String gatewayId, String region) throws Exception { LOGGER.info("Building EC2 client for token {} and gateway id {} in region {}", token, gatewayId, region); - if (applicationContext == null) { - throw new RuntimeException("ApplicationContext not available. CredentialStoreService cannot be retrieved."); - } - CredentialStoreService credentialStoreService = applicationContext.getBean(CredentialStoreService.class); PasswordCredential pwdCred = credentialStoreService.getPasswordCredential(token, gatewayId); AwsBasicCredentials awsCreds = AwsBasicCredentials.create( pwdCred.getLoginUserName(), pwdCred.getPassword()); // TODO support using AWS Credential @@ -77,14 +61,9 @@ public final class AWSTaskUtil { .build(); } - public static void terminateEC2Instance(TaskContext taskContext, String gatewayId) { + public void terminateEC2Instance(TaskContext taskContext, String gatewayId) { LOGGER.warn("Full resource cleanup triggered for process {}", taskContext.getProcessId()); try { - if (applicationContext == null) { - throw new RuntimeException("ApplicationContext not available. RegistryService cannot be retrieved."); - } - org.apache.airavata.service.RegistryService registryService = - applicationContext.getBean(org.apache.airavata.service.RegistryService.class); AWSProcessContextManager awsContext = new AWSProcessContextManager(registryService, taskContext); AwsComputeResourcePreference awsPrefs = taskContext .getGroupComputeResourcePreference() @@ -143,7 +122,6 @@ public final class AWSTaskUtil { ec2Client.deleteKeyPair(req -> req.keyName(keyName)); } if (sshCredentialToken != null) { - CredentialStoreService credentialStoreService = getCredentialStoreServiceStatic(); credentialStoreService.deleteSSHCredential(sshCredentialToken, gatewayId); } } diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/cancel/WorkflowCancellationTask.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/cancel/WorkflowCancellationTask.java index 4704fc83f2..65cd130fc0 100644 --- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/cancel/WorkflowCancellationTask.java +++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/cancel/WorkflowCancellationTask.java @@ -52,18 +52,10 @@ public class WorkflowCancellationTask extends AbstractTask { super.init(manager, workflowName, jobName, taskName); try { - String clusterName = "airavata"; // default - String zkConnection = "localhost:2181"; // default - try { - var ctx = org.apache.airavata.helix.impl.task.AiravataTask.getApplicationContext(); - if (ctx != null) { - var props = ctx.getBean(org.apache.airavata.config.AiravataServerProperties.class); - clusterName = props.helix.clusterName; - zkConnection = props.zookeeper.serverConnection; - } - } catch (Exception e) { - logger.warn("Could not get properties from ApplicationContext, using defaults", e); - } + String clusterName = org.apache.airavata.common.utils.ApplicationSettings.getSetting( + "helix.cluster-name", "airavata"); + String zkConnection = org.apache.airavata.common.utils.ApplicationSettings.getSetting( + "zookeeper.server-connection", "localhost:2181"); helixManager = HelixManagerFactory.getZKHelixManager(clusterName, taskName, InstanceType.SPECTATOR, zkConnection); helixManager.connect(); diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/parsing/DataParsingTask.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/parsing/DataParsingTask.java index 2eeda81dda..f7eca334dc 100644 --- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/parsing/DataParsingTask.java +++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/parsing/DataParsingTask.java @@ -60,13 +60,13 @@ import org.apache.airavata.model.data.replica.DataReplicaLocationModel; import org.apache.airavata.model.data.replica.ReplicaLocationCategory; import org.apache.airavata.model.data.replica.ReplicaPersistentType; import org.apache.airavata.monitor.platform.CountMonitor; +import org.apache.airavata.config.AiravataServerProperties; import org.apache.airavata.registry.api.exception.RegistryServiceException; import org.apache.airavata.service.RegistryService; import org.apache.commons.io.FileUtils; import org.apache.helix.task.TaskResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; /** * Implementation of the data parsing task. @@ -78,13 +78,14 @@ public class DataParsingTask extends AbstractTask { private static final Logger logger = LoggerFactory.getLogger(DataParsingTask.class); private static final CountMonitor parsingTaskCounter = new CountMonitor("parsing_task_counter"); - private static ApplicationContext applicationContext; private final RegistryService registryService; + private final AiravataServerProperties properties; - public DataParsingTask(RegistryService registryService, ApplicationContext applicationContext) { + public DataParsingTask( + RegistryService registryService, AiravataServerProperties properties) { this.registryService = registryService; - DataParsingTask.applicationContext = applicationContext; + this.properties = properties; } @TaskParam(name = "Parser Id") @@ -336,20 +337,11 @@ public class DataParsingTask extends AbstractTask { .exec(new WaitContainerResultCallback()) .awaitStatusCode(); logger.info("Container " + containerResponse.getId() + " exited with status code " + statusCode); - logger.info("Container logs " + dockerLogs.toString()); } - boolean deleteContainer = false; - try { - var ctx = org.apache.airavata.helix.impl.task.AiravataTask.getApplicationContext(); - if (ctx != null) { - var props = ctx.getBean(org.apache.airavata.config.AiravataServerProperties.class); - deleteContainer = props.services.parser.deleteContainer; - } - } catch (Exception e) { - logger.warn("Could not get properties from ApplicationContext", e); - } + boolean deleteContainer = this.properties != null && this.properties.services != null + && this.properties.services.parser != null && this.properties.services.parser.deleteContainer; if (deleteContainer) { dockerClient.removeContainerCmd(containerResponse.getId()).exec(); logger.info("Successfully removed container with id " + containerResponse.getId()); @@ -358,11 +350,6 @@ public class DataParsingTask extends AbstractTask { private StorageResourceAdaptor getStorageResourceAdaptor(String storageResourceId, AdaptorSupport adaptorSupport) throws TaskOnFailException, AgentException, RegistryServiceException { - // Use injected service, fallback to ApplicationContext if not injected - RegistryService registryService = this.registryService; - if (registryService == null && applicationContext != null) { - registryService = applicationContext.getBean(RegistryService.class); - } if (registryService == null) { throw new TaskOnFailException("RegistryService not available.", false, null); } @@ -502,20 +489,8 @@ public class DataParsingTask extends AbstractTask { private RegistryService getRegistryServiceClient() throws TaskOnFailException { // Use injected service, fallback to ApplicationContext if not injected - RegistryService registryService = this.registryService; - if (registryService == null && applicationContext != null) { - registryService = applicationContext.getBean(RegistryService.class); - } - if (registryService == null) { - org.springframework.context.ApplicationContext airavataContext = - org.apache.airavata.helix.impl.task.AiravataTask.getApplicationContext(); - if (airavataContext != null) { - registryService = airavataContext.getBean(RegistryService.class); - } - } if (registryService == null) { - throw new TaskOnFailException( - "ApplicationContext not available. RegistryService cannot be retrieved.", false, null); + throw new TaskOnFailException("RegistryService not available.", false, null); } return registryService; } diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/DefaultJobSubmissionTask.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/DefaultJobSubmissionTask.java index 6890ad4b79..9f70f28bd2 100644 --- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/DefaultJobSubmissionTask.java +++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/DefaultJobSubmissionTask.java @@ -47,8 +47,6 @@ public class DefaultJobSubmissionTask extends JobSubmissionTask { private static final Logger logger = LoggerFactory.getLogger(DefaultJobSubmissionTask.class); private static final CountMonitor defaultJSTaskCounter = new CountMonitor("default_js_task_counter"); - private static ApplicationContext applicationContext; - public DefaultJobSubmissionTask( ApplicationContext applicationContext, RegistryService registryService, @@ -56,7 +54,6 @@ public class DefaultJobSubmissionTask extends JobSubmissionTask { CredentialStoreService credentialStoreService, org.apache.airavata.helix.impl.task.submission.config.GroovyMapBuilder groovyMapBuilder) { super(applicationContext, registryService, userProfileService, credentialStoreService, groovyMapBuilder); - DefaultJobSubmissionTask.applicationContext = applicationContext; } private static final String DEFAULT_JOB_ID = "DEFAULT_JOB_ID"; diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/GroovyMapBuilder.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/GroovyMapBuilder.java index 4959175ea0..27db8b6067 100644 --- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/GroovyMapBuilder.java +++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/GroovyMapBuilder.java @@ -45,24 +45,17 @@ import org.apache.airavata.model.task.JobSubmissionTaskModel; import org.apache.airavata.service.RegistryService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; @Component public class GroovyMapBuilder { private final RegistryService registryService; + private final AiravataServerProperties properties; - private static ApplicationContext applicationContext; - - public GroovyMapBuilder(RegistryService registryService, ApplicationContext applicationContext) { + public GroovyMapBuilder(RegistryService registryService, AiravataServerProperties properties) { this.registryService = registryService; - GroovyMapBuilder.applicationContext = applicationContext; - } - - // Instance method for Spring DI - protected RegistryService getRegistryServiceInstance() { - return registryService; + this.properties = properties; } private static final Logger logger = LoggerFactory.getLogger(GroovyMapBuilder.class); @@ -467,19 +460,11 @@ public class GroovyMapBuilder { } } - private static void setMailAddresses(TaskContext taskContext, GroovyMapData groovyMap) throws Exception { + private void setMailAddresses(TaskContext taskContext, GroovyMapData groovyMap) throws Exception { ProcessModel processModel = taskContext.getProcessModel(); String emailIds = null; - AiravataServerProperties props = null; - try { - var ctx = org.apache.airavata.helix.impl.task.AiravataTask.getApplicationContext(); - if (ctx != null) { - props = ctx.getBean(AiravataServerProperties.class); - } - } catch (Exception e) { - logger.warn("Could not get properties from ApplicationContext", e); - } + AiravataServerProperties props = this.properties; if (isEmailBasedJobMonitor(taskContext) && props != null) { emailIds = props.services.monitor.email.address; @@ -517,12 +502,12 @@ public class GroovyMapBuilder { } } - public static boolean isEmailBasedJobMonitor(TaskContext taskContext) throws Exception { + public boolean isEmailBasedJobMonitor(TaskContext taskContext) throws Exception { JobSubmissionProtocol jobSubmissionProtocol = taskContext.getPreferredJobSubmissionProtocol(); JobSubmissionInterface jobSubmissionInterface = taskContext.getPreferredJobSubmissionInterface(); if (jobSubmissionProtocol == JobSubmissionProtocol.SSH) { String jobSubmissionInterfaceId = jobSubmissionInterface.getJobSubmissionInterfaceId(); - SSHJobSubmission sshJobSubmission = getRegistryService().getSSHJobSubmission(jobSubmissionInterfaceId); + SSHJobSubmission sshJobSubmission = registryService.getSSHJobSubmission(jobSubmissionInterfaceId); MonitorMode monitorMode = sshJobSubmission.getMonitorMode(); return monitorMode != null && monitorMode == MonitorMode.JOB_EMAIL_NOTIFICATION_MONITOR; } else { @@ -547,11 +532,4 @@ public class GroovyMapBuilder { return sb.toString(); } - // Static method for backward compatibility - delegates to Spring-managed instance - private static RegistryService getRegistryService() { - if (applicationContext != null) { - return applicationContext.getBean(GroovyMapBuilder.class).getRegistryServiceInstance(); - } - throw new RuntimeException("ApplicationContext not available. RegistryService cannot be retrieved."); - } } 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 c84aaaccab..fc550dd45e 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 @@ -244,7 +244,7 @@ public class ParserWorkflowManager extends WorkflowManager { List<ParsingTemplateInput> templateInputs, RegistryService registryService) throws Exception { - DataParsingTask parsingTask = new DataParsingTask(registryService, applicationContext); + DataParsingTask parsingTask = new DataParsingTask(registryService, properties); parsingTask.setTaskId(normalizeTaskId(completionMessage.getExperimentId() + "-" + parserInfo.getId() + "-" + UUID.randomUUID().toString())); parsingTask.setGatewayId(completionMessage.getGatewayId()); @@ -396,7 +396,7 @@ public class ParserWorkflowManager extends WorkflowManager { for (ParserConnector connector : parentToChild.get(parentParserInfo.getId())) { Parser childParserInfo = registryService.getParser(connector.getChildParserId(), completionMessage.getGatewayId()); - DataParsingTask parsingTask = new DataParsingTask(registryService, applicationContext); + DataParsingTask parsingTask = new DataParsingTask(registryService, properties); parsingTask.setTaskId(normalizeTaskId(completionMessage.getExperimentId() + "-" + childParserInfo.getId() + "-" + UUID.randomUUID().toString())); parsingTask.setGatewayId(completionMessage.getGatewayId()); 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 e89c99d471..8d0b3dca70 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 @@ -134,19 +134,7 @@ public class PostWorkflowManager extends WorkflowManager { return false; } - RegistryService registryService; - // Use injected registryService from WorkflowManager - if (this.registryService != null) { - registryService = this.registryService; - } else { - // Try to get from Spring context via RegistryServiceProvider - try { - registryService = org.apache.airavata.config.RegistryServiceProvider.getInstance(); - } catch (Exception e) { - logger.error("Failed to get RegistryService from RegistryServiceProvider", e); - return false; - } - } + RegistryService registryService = this.registryService; var jobId = jobStatusResult.getJobId(); var jobName = jobStatusResult.getJobName(); diff --git a/airavata-api/src/main/java/org/apache/airavata/manager/dbevent/DBEventManagerRunner.java b/airavata-api/src/main/java/org/apache/airavata/manager/dbevent/DBEventManagerRunner.java index 143f4d914c..193279bf68 100644 --- a/airavata-api/src/main/java/org/apache/airavata/manager/dbevent/DBEventManagerRunner.java +++ b/airavata-api/src/main/java/org/apache/airavata/manager/dbevent/DBEventManagerRunner.java @@ -25,11 +25,12 @@ import org.apache.airavata.config.AiravataServerProperties; import org.apache.airavata.manager.dbevent.messaging.DBEventManagerMessagingFactory; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; -import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; /** * Created by Ajinkya on 3/29/17. */ +@Component public class DBEventManagerRunner implements IServer { private static final Logger log = LogManager.getLogger(DBEventManagerRunner.class); @@ -37,8 +38,13 @@ public class DBEventManagerRunner implements IServer { private static final String SERVER_NAME = "DB Event Manager"; private static final String SERVER_VERSION = "1.0"; + private final AiravataServerProperties properties; private ServerStatus status; + public DBEventManagerRunner(AiravataServerProperties properties) { + this.properties = properties; + } + /** * Start required messaging utilities */ @@ -72,23 +78,10 @@ public class DBEventManagerRunner implements IServer { public void start() throws Exception { try { - // Get properties from ApplicationContext if available - AiravataServerProperties props = null; - try { - ApplicationContext ctx = org.apache.airavata.helix.impl.task.AiravataTask.getApplicationContext(); - if (ctx != null) { - props = ctx.getBean(AiravataServerProperties.class); - } - } catch (Exception e) { - log.warn("Could not get properties from ApplicationContext", e); - } - - final AiravataServerProperties finalProps = props; Runnable runner = new Runnable() { @Override public void run() { - DBEventManagerRunner dBEventManagerRunner = new DBEventManagerRunner(); - dBEventManagerRunner.startDBEventManagerRunner(finalProps); + DBEventManagerRunner.this.startDBEventManagerRunner(properties); } }; diff --git a/airavata-api/src/main/java/org/apache/airavata/orchestrator/impl/AbstractOrchestrator.java b/airavata-api/src/main/java/org/apache/airavata/orchestrator/impl/AbstractOrchestrator.java index 18ea17c892..2fe3558438 100644 --- a/airavata-api/src/main/java/org/apache/airavata/orchestrator/impl/AbstractOrchestrator.java +++ b/airavata-api/src/main/java/org/apache/airavata/orchestrator/impl/AbstractOrchestrator.java @@ -34,6 +34,7 @@ public abstract class AbstractOrchestrator implements Orchestrator { protected OrchestratorContext orchestratorContext; protected OrchestratorConfiguration orchestratorConfiguration; protected AiravataServerProperties properties; + protected OrchestratorUtils orchestratorUtils; private String registryURL; @@ -73,8 +74,8 @@ public abstract class AbstractOrchestrator implements Orchestrator { this.properties = props; try { /* Initializing the OrchestratorConfiguration object */ - if (properties != null) { - orchestratorConfiguration = OrchestratorUtils.loadOrchestratorConfiguration(properties); + if (properties != null && orchestratorUtils != null) { + orchestratorConfiguration = orchestratorUtils.loadOrchestratorConfiguration(); setGatewayProperties(); } else { // Fallback for non-Spring usage diff --git a/airavata-api/src/main/java/org/apache/airavata/orchestrator/impl/SimpleOrchestratorImpl.java b/airavata-api/src/main/java/org/apache/airavata/orchestrator/impl/SimpleOrchestratorImpl.java index f5adac9380..95c4d249be 100644 --- a/airavata-api/src/main/java/org/apache/airavata/orchestrator/impl/SimpleOrchestratorImpl.java +++ b/airavata-api/src/main/java/org/apache/airavata/orchestrator/impl/SimpleOrchestratorImpl.java @@ -85,15 +85,22 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator { private final RegistryService registryService; private final AiravataServerProperties properties; + private final OrchestratorUtils orchestratorUtils; - public SimpleOrchestratorImpl(RegistryService registryService, AiravataServerProperties properties) + public SimpleOrchestratorImpl( + RegistryService registryService, + AiravataServerProperties properties, + OrchestratorUtils orchestratorUtils) throws OrchestratorException { this.registryService = registryService; this.properties = properties; + this.orchestratorUtils = orchestratorUtils; + super.orchestratorUtils = orchestratorUtils; try { try { // We are only going to use GFacPassiveJobSubmitter jobSubmitter = new GFACPassiveJobSubmitter(); + ((GFACPassiveJobSubmitter) jobSubmitter).setOrchestratorUtils(orchestratorUtils); if (this.orchestratorContext != null) { jobSubmitter.initialize(this.orchestratorContext); } @@ -308,7 +315,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator { public String createAndSaveTasks(String gatewayId, ProcessModel processModel) throws OrchestratorException { try { GroupComputeResourcePreference preference = - OrchestratorUtils.getGroupComputeResourcePreference(processModel); + orchestratorUtils.getGroupComputeResourcePreference(processModel); ResourceType resourceType = preference.getResourceType(); logger.info("Determined resource type as {} for process {}", resourceType, processModel.getProcessId()); @@ -321,9 +328,9 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator { // TODO - handle for different resource types JobSubmissionInterface preferredJobSubmissionInterface = - OrchestratorUtils.getPreferredJobSubmissionInterface(processModel, gatewayId); - JobSubmissionProtocol preferredJobSubmissionProtocol = - OrchestratorUtils.getPreferredJobSubmissionProtocol(processModel, gatewayId); + orchestratorUtils.getPreferredJobSubmissionInterface(processModel, gatewayId); + JobSubmissionProtocol preferredJobSubmissionProtocol = + orchestratorUtils.getPreferredJobSubmissionProtocol(processModel, gatewayId); List<String> taskIdList = new ArrayList<>(); if (preferredJobSubmissionProtocol == JobSubmissionProtocol.UNICORE) { @@ -351,7 +358,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator { String gatewayId, ProcessModel processModel, ProcessModel parentProcess) throws OrchestratorException { try { GroupComputeResourcePreference preference = - OrchestratorUtils.getGroupComputeResourcePreference(processModel); + orchestratorUtils.getGroupComputeResourcePreference(processModel); ResourceType resourceType = preference.getResourceType(); List<String> taskIdList = new ArrayList<>(createAndSaveIntermediateOutputDataStagingTasks( processModel, gatewayId, parentProcess, resourceType)); @@ -390,9 +397,9 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator { EnvironmentSetupTaskModel envSetupSubModel = new EnvironmentSetupTaskModel(); envSetupSubModel.setProtocol( - OrchestratorUtils.getSecurityProtocol(processModel, gatewayId)); // TODO support for CLOUD (AWS) + orchestratorUtils.getSecurityProtocol(processModel, gatewayId)); // TODO support for CLOUD (AWS) - String scratchLocation = OrchestratorUtils.getScratchLocation(processModel, gatewayId); + String scratchLocation = orchestratorUtils.getScratchLocation(processModel, gatewayId); String workingDir = scratchLocation + File.separator + processModel.getProcessId(); envSetupSubModel.setLocation(workingDir); @@ -464,7 +471,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator { List<String> dataStagingTaskIds = new ArrayList<>(); try { List<OutputDataObjectType> processOutputs = processModel.getProcessOutputs(); - String appName = OrchestratorUtils.getApplicationInterfaceName(processModel); + String appName = orchestratorUtils.getApplicationInterfaceName(processModel); if (processOutputs != null) { for (OutputDataObjectType processOutput : processOutputs) { DataType type = processOutput.getType(); @@ -532,7 +539,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator { List<String> dataStagingTaskIds = new ArrayList<>(); try { List<OutputDataObjectType> processOutputs = processModel.getProcessOutputs(); - String appName = OrchestratorUtils.getApplicationInterfaceName(processModel); + String appName = orchestratorUtils.getApplicationInterfaceName(processModel); if (processOutputs != null) { for (OutputDataObjectType processOutput : processOutputs) { DataType type = processOutput.getType(); @@ -666,7 +673,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator { if (jobSubmissionProtocol == JobSubmissionProtocol.SSH || jobSubmissionProtocol == JobSubmissionProtocol.SSH_FORK) { SSHJobSubmission sshJobSubmission = - OrchestratorUtils.getSSHJobSubmission(jobSubmissionInterface.getJobSubmissionInterfaceId()); + orchestratorUtils.getSSHJobSubmission(jobSubmissionInterface.getJobSubmissionInterfaceId()); monitorMode = sshJobSubmission.getMonitorMode(); } else if (jobSubmissionProtocol == JobSubmissionProtocol.UNICORE) { monitorMode = MonitorMode.FORK; @@ -774,7 +781,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator { ComputeResourceDescription computeResource = registryService.getComputeResource(processModel.getComputeResourceId()); - String scratchLocation = OrchestratorUtils.getScratchLocation(processModel, gatewayId); + String scratchLocation = orchestratorUtils.getScratchLocation(processModel, gatewayId); String workingDir = (scratchLocation.endsWith(File.separator) ? scratchLocation : scratchLocation + File.separator) + processModel.getProcessId() @@ -783,8 +790,8 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator { URI destination; try { DataMovementProtocol dataMovementProtocol = - OrchestratorUtils.getPreferredDataMovementProtocol(processModel, gatewayId); - String loginUserName = OrchestratorUtils.getLoginUserName(processModel, gatewayId); + orchestratorUtils.getPreferredDataMovementProtocol(processModel, gatewayId); + String loginUserName = orchestratorUtils.getLoginUserName(processModel, gatewayId); StringBuilder destinationPath = new StringBuilder(workingDir); Optional.ofNullable(processInput.getOverrideFilename()) .ifPresent(destinationPath::append); // If an override filename is provided @@ -793,7 +800,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator { dataMovementProtocol.name(), loginUserName, computeResource.getHostName(), - OrchestratorUtils.getDataMovementPort(processModel, gatewayId), + orchestratorUtils.getDataMovementPort(processModel, gatewayId), destinationPath.toString(), null, null); @@ -843,15 +850,15 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator { registryService.getComputeResource(processModel.getComputeResourceId()); DataStagingTaskModel submodel = new DataStagingTaskModel(); - String workingDir = OrchestratorUtils.getScratchLocation(processModel, gatewayId) + String workingDir = orchestratorUtils.getScratchLocation(processModel, gatewayId) + File.separator + (parentProcess == null ? processModel.getProcessId() : parentProcess.getProcessId()) + File.separator; DataMovementProtocol dataMovementProtocol = - OrchestratorUtils.getPreferredDataMovementProtocol(processModel, gatewayId); + orchestratorUtils.getPreferredDataMovementProtocol(processModel, gatewayId); URI source; try { - String loginUserName = OrchestratorUtils.getLoginUserName(processModel, gatewayId); + String loginUserName = orchestratorUtils.getLoginUserName(processModel, gatewayId); if (processOutput != null) { submodel.setType(DataStageType.OUPUT); submodel.setProcessOutput(processOutput); @@ -859,7 +866,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator { dataMovementProtocol.name(), loginUserName, computeResource.getHostName(), - OrchestratorUtils.getDataMovementPort(processModel, gatewayId), + orchestratorUtils.getDataMovementPort(processModel, gatewayId), workingDir + processOutput.getValue(), null, null); @@ -870,7 +877,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator { dataMovementProtocol.name(), loginUserName, computeResource.getHostName(), - OrchestratorUtils.getDataMovementPort(processModel, gatewayId), + orchestratorUtils.getDataMovementPort(processModel, gatewayId), workingDir, null, null); diff --git a/airavata-api/src/main/java/org/apache/airavata/orchestrator/job/GFACPassiveJobSubmitter.java b/airavata-api/src/main/java/org/apache/airavata/orchestrator/job/GFACPassiveJobSubmitter.java index cbd56de3f4..a8be813f69 100644 --- a/airavata-api/src/main/java/org/apache/airavata/orchestrator/job/GFACPassiveJobSubmitter.java +++ b/airavata-api/src/main/java/org/apache/airavata/orchestrator/job/GFACPassiveJobSubmitter.java @@ -47,6 +47,7 @@ public class GFACPassiveJobSubmitter implements JobSubmitter, Watcher { private static final Object mutex = new Object(); private Publisher publisher; private AiravataServerProperties properties; + private OrchestratorUtils orchestratorUtils; public void initialize(OrchestratorContext orchestratorContext) throws OrchestratorException { if (orchestratorContext.getPublisher() != null) { @@ -67,6 +68,10 @@ public class GFACPassiveJobSubmitter implements JobSubmitter, Watcher { this.properties = properties; } + public void setOrchestratorUtils(OrchestratorUtils orchestratorUtils) { + this.orchestratorUtils = orchestratorUtils; + } + /** * Submit the job to a shared launch.queue accross multiple gfac instances * @@ -79,7 +84,7 @@ public class GFACPassiveJobSubmitter implements JobSubmitter, Watcher { public boolean submit(String experimentId, String processId, String tokenId) throws OrchestratorException { try { String gatewayId = null; - CredentialReader credentialReader = OrchestratorUtils.getCredentialReader(); + CredentialReader credentialReader = orchestratorUtils != null ? orchestratorUtils.getCredentialReader() : null; if (credentialReader != null) { try { gatewayId = credentialReader.getGatewayID(tokenId); @@ -119,7 +124,7 @@ public class GFACPassiveJobSubmitter implements JobSubmitter, Watcher { public boolean terminate(String experimentId, String processId, String tokenId) throws OrchestratorException { String gatewayId = null; try { - CredentialReader credentialReader = OrchestratorUtils.getCredentialReader(); + CredentialReader credentialReader = orchestratorUtils != null ? orchestratorUtils.getCredentialReader() : null; if (credentialReader != null) { try { gatewayId = credentialReader.getGatewayID(tokenId); diff --git a/airavata-api/src/main/java/org/apache/airavata/orchestrator/utils/OrchestratorUtils.java b/airavata-api/src/main/java/org/apache/airavata/orchestrator/utils/OrchestratorUtils.java index f64dc9791a..dfc6261b63 100644 --- a/airavata-api/src/main/java/org/apache/airavata/orchestrator/utils/OrchestratorUtils.java +++ b/airavata-api/src/main/java/org/apache/airavata/orchestrator/utils/OrchestratorUtils.java @@ -51,7 +51,6 @@ import org.apache.airavata.registry.api.exception.RegistryServiceException; import org.apache.airavata.service.RegistryService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; /** @@ -60,7 +59,6 @@ import org.springframework.stereotype.Component; @Component public class OrchestratorUtils { private static final Logger logger = LoggerFactory.getLogger(OrchestratorUtils.class); - private static ApplicationContext applicationContext; private final RegistryService registryService; private final CredentialReader credentialReader; @@ -69,22 +67,10 @@ public class OrchestratorUtils { public OrchestratorUtils( RegistryService registryService, CredentialReader credentialReader, - AiravataServerProperties properties, - ApplicationContext applicationContext) { + AiravataServerProperties properties) { this.registryService = registryService; this.credentialReader = credentialReader; this.properties = properties; - OrchestratorUtils.applicationContext = applicationContext; - } - - // Instance method for Spring DI - protected RegistryService getRegistryServiceInstance() { - return registryService; - } - - // Instance method for Spring DI - protected CredentialReader getCredentialReaderInstance() { - return credentialReader; } public OrchestratorConfiguration loadOrchestratorConfiguration() @@ -101,48 +87,31 @@ public class OrchestratorUtils { return orchestratorConfiguration; } - public static OrchestratorConfiguration loadOrchestratorConfiguration(AiravataServerProperties properties) - throws OrchestratorException, IOException, NumberFormatException { - - OrchestratorConfiguration orchestratorConfiguration = new OrchestratorConfiguration(); - orchestratorConfiguration.setEnableValidation(properties.airavata.enableValidation); - if (orchestratorConfiguration.isEnableValidation()) { - String validators = properties.services.monitor.job.validators; - if (validators != null && !validators.isEmpty()) { - orchestratorConfiguration.setValidatorClasses(Arrays.asList(validators.split(","))); - } - } - return orchestratorConfiguration; - } - - public static JobSubmissionProtocol getPreferredJobSubmissionProtocol(ProcessModel model, String gatewayId) + public JobSubmissionProtocol getPreferredJobSubmissionProtocol(ProcessModel model, String gatewayId) throws RegistryServiceException, OrchestratorException { return getPreferredJobSubmissionInterface(model, gatewayId).getJobSubmissionProtocol(); } - public static GroupComputeResourcePreference getGroupComputeResourcePreference(ProcessModel model) + public GroupComputeResourcePreference getGroupComputeResourcePreference(ProcessModel model) throws RegistryServiceException { - final RegistryService registryService = getRegistryService(); return registryService.getGroupComputeResourcePreference( model.getComputeResourceId(), model.getGroupResourceProfileId()); } - public static String getApplicationInterfaceName(ProcessModel model) + public String getApplicationInterfaceName(ProcessModel model) throws RegistryServiceException, OrchestratorException { - final RegistryService registryService = getRegistryService(); ApplicationInterfaceDescription appInterface = registryService.getApplicationInterface(model.getApplicationInterfaceId()); return appInterface.getApplicationName(); } - public static DataMovementProtocol getPreferredDataMovementProtocol(ProcessModel model, String gatewayId) + public DataMovementProtocol getPreferredDataMovementProtocol(ProcessModel model, String gatewayId) throws RegistryServiceException, OrchestratorException { return getPreferredDataMovementInterface(model, gatewayId).getDataMovementProtocol(); } - public static StoragePreference getStoragePreference(ProcessModel processModel, String gatewayId) + public StoragePreference getStoragePreference(ProcessModel processModel, String gatewayId) throws OrchestratorException { - final RegistryService registryService = getRegistryService(); try { String resourceHostId = processModel.getComputeResourceId(); return registryService.getGatewayStoragePreference(gatewayId, resourceHostId); @@ -152,9 +121,8 @@ public class OrchestratorUtils { } } - public static String getLoginUserName(ProcessModel processModel, String gatewayId) + public String getLoginUserName(ProcessModel processModel, String gatewayId) throws AiravataException, RegistryServiceException { - final RegistryService registryService = getRegistryService(); GroupComputeResourcePreference computeResourcePreference = getGroupComputeResourcePreference(processModel); ComputationalResourceSchedulingModel processResourceSchedule = processModel.getProcessResourceSchedule(); if (processModel.isUseUserCRPref()) { @@ -189,9 +157,8 @@ public class OrchestratorUtils { } } - public static String getScratchLocation(ProcessModel processModel, String gatewayId) + public String getScratchLocation(ProcessModel processModel, String gatewayId) throws AiravataException, RegistryServiceException { - final RegistryService registryService = getRegistryService(); GroupComputeResourcePreference computeResourcePreference = getGroupComputeResourcePreference(processModel); ComputationalResourceSchedulingModel processResourceSchedule = processModel.getProcessResourceSchedule(); String scratchLocation = computeResourcePreference.getScratchLocation(); @@ -229,9 +196,8 @@ public class OrchestratorUtils { } } - public static JobSubmissionInterface getPreferredJobSubmissionInterface(ProcessModel processModel, String gatewayId) + public JobSubmissionInterface getPreferredJobSubmissionInterface(ProcessModel processModel, String gatewayId) throws OrchestratorException { - final RegistryService registryService = getRegistryService(); try { String resourceHostId = processModel.getComputeResourceId(); ComputeResourceDescription resourceDescription = registryService.getComputeResource(resourceHostId); @@ -249,9 +215,8 @@ public class OrchestratorUtils { } } - public static DataMovementInterface getPreferredDataMovementInterface(ProcessModel processModel, String gatewayId) + public DataMovementInterface getPreferredDataMovementInterface(ProcessModel processModel, String gatewayId) throws OrchestratorException { - final RegistryService registryService = getRegistryService(); try { String resourceHostId = processModel.getComputeResourceId(); ComputeResourceDescription resourceDescription = registryService.getComputeResource(resourceHostId); @@ -269,7 +234,7 @@ public class OrchestratorUtils { } } - public static int getDataMovementPort(ProcessModel processModel, String gatewayId) + public int getDataMovementPort(ProcessModel processModel, String gatewayId) throws RegistryServiceException, ApplicationSettingsException, OrchestratorException { try { DataMovementProtocol protocol = getPreferredDataMovementProtocol(processModel, gatewayId); @@ -287,7 +252,7 @@ public class OrchestratorUtils { return 0; } - public static SecurityProtocol getSecurityProtocol(ProcessModel processModel, String gatewayId) + public SecurityProtocol getSecurityProtocol(ProcessModel processModel, String gatewayId) throws RegistryServiceException, ApplicationSettingsException, OrchestratorException { try { JobSubmissionProtocol submissionProtocol = getPreferredJobSubmissionProtocol(processModel, gatewayId); @@ -323,8 +288,7 @@ public class OrchestratorUtils { return null; } - public static LOCALSubmission getLocalJobSubmission(String submissionId) throws OrchestratorException { - final RegistryService registryService = getRegistryService(); + public LOCALSubmission getLocalJobSubmission(String submissionId) throws OrchestratorException { try { return registryService.getLocalJobSubmission(submissionId); } catch (Exception e) { @@ -334,8 +298,7 @@ public class OrchestratorUtils { } } - public static UnicoreJobSubmission getUnicoreJobSubmission(String submissionId) throws OrchestratorException { - final RegistryService registryService = getRegistryService(); + public UnicoreJobSubmission getUnicoreJobSubmission(String submissionId) throws OrchestratorException { try { return registryService.getUnicoreJobSubmission(submissionId); } catch (Exception e) { @@ -345,8 +308,7 @@ public class OrchestratorUtils { } } - public static SSHJobSubmission getSSHJobSubmission(String submissionId) throws OrchestratorException { - final RegistryService registryService = getRegistryService(); + public SSHJobSubmission getSSHJobSubmission(String submissionId) throws OrchestratorException { try { return registryService.getSSHJobSubmission(submissionId); } catch (Exception e) { @@ -356,8 +318,7 @@ public class OrchestratorUtils { } } - public static CloudJobSubmission getCloudJobSubmission(String submissionId) throws OrchestratorException { - final RegistryService registryService = getRegistryService(); + public CloudJobSubmission getCloudJobSubmission(String submissionId) throws OrchestratorException { try { return registryService.getCloudJobSubmission(submissionId); } catch (Exception e) { @@ -367,8 +328,7 @@ public class OrchestratorUtils { } } - public static SCPDataMovement getSCPDataMovement(String dataMoveId) throws OrchestratorException { - final RegistryService registryService = getRegistryService(); + public SCPDataMovement getSCPDataMovement(String dataMoveId) throws OrchestratorException { try { return registryService.getSCPDataMovement(dataMoveId); } catch (Exception e) { @@ -378,23 +338,11 @@ public class OrchestratorUtils { } } - private static boolean isValid(String str) { + private boolean isValid(String str) { return (str != null && !str.trim().isEmpty()); } - // Static method for backward compatibility - delegates to Spring-managed instance - public static CredentialReader getCredentialReader() { - if (applicationContext != null) { - return applicationContext.getBean(OrchestratorUtils.class).getCredentialReaderInstance(); - } - throw new IllegalStateException("ApplicationContext not available. CredentialReader cannot be retrieved."); - } - - private static RegistryService getRegistryService() { - if (applicationContext != null) { - OrchestratorUtils instance = applicationContext.getBean(OrchestratorUtils.class); - return instance.registryService; - } - throw new IllegalStateException("ApplicationContext not available"); + public CredentialReader getCredentialReader() { + return credentialReader; } } diff --git a/airavata-api/src/main/java/org/apache/airavata/security/GatewayGroupsInitializer.java b/airavata-api/src/main/java/org/apache/airavata/security/GatewayGroupsInitializer.java index d55da8be2d..1e8e4894fd 100644 --- a/airavata-api/src/main/java/org/apache/airavata/security/GatewayGroupsInitializer.java +++ b/airavata-api/src/main/java/org/apache/airavata/security/GatewayGroupsInitializer.java @@ -31,7 +31,6 @@ import org.apache.airavata.service.SharingRegistryService; import org.apache.airavata.sharing.models.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; /** @@ -41,37 +40,11 @@ import org.springframework.stereotype.Component; public class GatewayGroupsInitializer { private static final Logger logger = LoggerFactory.getLogger(GatewayGroupsInitializer.class); - private static ApplicationContext applicationContext; private final RegistryService registryService; private final SharingRegistryService sharingRegistryService; private final CredentialStoreService credentialStoreService; - public GatewayGroupsInitializer( - ApplicationContext applicationContext, - RegistryService registryService, - SharingRegistryService sharingRegistryService, - CredentialStoreService credentialStoreService) { - GatewayGroupsInitializer.applicationContext = applicationContext; - this.registryService = registryService; - this.sharingRegistryService = sharingRegistryService; - this.credentialStoreService = credentialStoreService; - } - - public static synchronized GatewayGroups initializeGatewayGroups(String gatewayId) { - try { - if (applicationContext == null) { - throw new RuntimeException( - "ApplicationContext not available. GatewayGroupsInitializer cannot be retrieved."); - } - GatewayGroupsInitializer gatewayGroupsInitializer = - applicationContext.getBean(GatewayGroupsInitializer.class); - return gatewayGroupsInitializer.initialize(gatewayId); - } catch (SharingRegistryException | RegistryServiceException | CredentialStoreException e) { - throw new RuntimeException("Failed to initialize a GatewayGroups instance for gateway: " + gatewayId, e); - } - } - public GatewayGroupsInitializer( RegistryService registryService, SharingRegistryService sharingRegistryService, diff --git a/airavata-api/src/main/java/org/apache/airavata/security/KeyCloakSecurityManager.java b/airavata-api/src/main/java/org/apache/airavata/security/KeyCloakSecurityManager.java index 693dcf7faa..44805cc3cc 100644 --- a/airavata-api/src/main/java/org/apache/airavata/security/KeyCloakSecurityManager.java +++ b/airavata-api/src/main/java/org/apache/airavata/security/KeyCloakSecurityManager.java @@ -36,6 +36,7 @@ import org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfil import org.apache.airavata.model.security.AuthzToken; import org.apache.airavata.model.workspace.Gateway; import org.apache.airavata.security.authzcache.*; +import org.apache.airavata.security.authzcache.AuthzCacheManagerFactory; import org.apache.airavata.service.RegistryService; import org.apache.airavata.service.SharingRegistryService; import org.apache.airavata.sharing.models.UserGroup; @@ -104,15 +105,21 @@ public class KeyCloakSecurityManager implements AiravataSecurityManager { private final RegistryService registryService; private final SharingRegistryService sharingRegistryService; private final AiravataServerProperties properties; + private final AuthzCacheManagerFactory authzCacheManagerFactory; + private final GatewayGroupsInitializer gatewayGroupsInitializer; public KeyCloakSecurityManager( RegistryService registryService, SharingRegistryService sharingRegistryService, - AiravataServerProperties properties) + AiravataServerProperties properties, + AuthzCacheManagerFactory authzCacheManagerFactory, + GatewayGroupsInitializer gatewayGroupsInitializer) throws AiravataSecurityException { this.registryService = registryService; this.sharingRegistryService = sharingRegistryService; this.properties = properties; + this.authzCacheManagerFactory = authzCacheManagerFactory; + this.gatewayGroupsInitializer = gatewayGroupsInitializer; rolePermissionConfig.put("admin", "/airavata/.*"); rolePermissionConfig.put("gateway-provider", "/airavata/.*"); rolePermissionConfig.put( @@ -193,7 +200,7 @@ public class KeyCloakSecurityManager implements AiravataSecurityManager { boolean decision; if (properties.security.authzCache.enabled) { - var authzCacheManager = AuthzCacheManagerFactory.getAuthzCacheManager(); + var authzCacheManager = authzCacheManagerFactory.getAuthzCacheManager(); var cacheIndex = new AuthzCacheIndex(subject, gatewayId, accessToken, action); var authzCachedStatus = authzCacheManager.getAuthzCachedStatus(cacheIndex); switch (authzCachedStatus) { @@ -296,7 +303,7 @@ public class KeyCloakSecurityManager implements AiravataSecurityManager { if (registryService.isGatewayGroupsExists(gatewayId)) { return registryService.getGatewayGroups(gatewayId); } else { - return GatewayGroupsInitializer.initializeGatewayGroups(gatewayId); + return gatewayGroupsInitializer.initialize(gatewayId); } } diff --git a/airavata-api/src/main/java/org/apache/airavata/security/authzcache/AuthzCacheManagerFactory.java b/airavata-api/src/main/java/org/apache/airavata/security/authzcache/AuthzCacheManagerFactory.java index dc7f82bea7..322d7d7666 100644 --- a/airavata-api/src/main/java/org/apache/airavata/security/authzcache/AuthzCacheManagerFactory.java +++ b/airavata-api/src/main/java/org/apache/airavata/security/authzcache/AuthzCacheManagerFactory.java @@ -33,40 +33,35 @@ import org.springframework.stereotype.Component; @Component public class AuthzCacheManagerFactory { private static final Logger logger = LoggerFactory.getLogger(AuthzCacheManagerFactory.class); - private static ApplicationContext applicationContext; - - private static AiravataServerProperties properties; + private final ApplicationContext applicationContext; + private final AiravataServerProperties properties; public AuthzCacheManagerFactory(ApplicationContext applicationContext, AiravataServerProperties properties) { - AuthzCacheManagerFactory.applicationContext = applicationContext; - AuthzCacheManagerFactory.properties = properties; + this.applicationContext = applicationContext; + this.properties = properties; } - public static AuthzCacheManager getAuthzCacheManager() throws AiravataSecurityException { - if (applicationContext != null && properties != null) { + public AuthzCacheManager getAuthzCacheManager() throws AiravataSecurityException { + try { + String className = properties.security.authzCache.classpath; + Class<?> authzCacheManagerImpl = Class.forName(className); + // Try to get from Spring context first (if it's a Spring bean) try { - String className = properties.security.authzCache.classpath; - Class<?> authzCacheManagerImpl = Class.forName(className); return (AuthzCacheManager) applicationContext.getBean(authzCacheManagerImpl); - } catch (ClassNotFoundException e) { - String error = "Authorization Cache Manager class could not be found."; - logger.error(e.getMessage(), e); - throw new AiravataSecurityException(error, e); - } - } - // Fallback to old reflection-based instantiation if ApplicationContext not available - if (properties != null) { - try { - String className = properties.security.authzCache.classpath; - Class<?> authzCacheManagerImpl = Class.forName(className); + } catch (Exception e) { + logger.debug("AuthzCacheManager not found in Spring context, creating new instance", e); + // Fallback to reflection-based instantiation return (AuthzCacheManager) authzCacheManagerImpl.getDeclaredConstructor().newInstance(); - } catch (Exception e) { - String error = "Error in instantiating the Authorization Cache Manager class."; - logger.error(e.getMessage(), e); - throw new AiravataSecurityException(error, e); } + } catch (ClassNotFoundException e) { + String error = "Authorization Cache Manager class could not be found."; + logger.error(e.getMessage(), e); + throw new AiravataSecurityException(error, e); + } catch (Exception e) { + String error = "Error in instantiating the Authorization Cache Manager class."; + logger.error(e.getMessage(), e); + throw new AiravataSecurityException(error, e); } - throw new AiravataSecurityException("Properties not initialized"); } } diff --git a/airavata-api/src/main/java/org/apache/airavata/service/AiravataService.java b/airavata-api/src/main/java/org/apache/airavata/service/AiravataService.java index f4e1f5c10b..665d969b4e 100644 --- a/airavata-api/src/main/java/org/apache/airavata/service/AiravataService.java +++ b/airavata-api/src/main/java/org/apache/airavata/service/AiravataService.java @@ -181,6 +181,8 @@ public class AiravataService { private final RegistryService registryService; private final SharingRegistryService sharingRegistryService; private final CredentialStoreService credentialStoreService; + private final SSHAccountManager sshAccountManager; + private final GatewayGroupsInitializer gatewayGroupsInitializer; private Publisher statusPublisher; private Publisher experimentPublisher; @@ -188,11 +190,15 @@ public class AiravataService { AiravataServerProperties properties, RegistryService registryService, SharingRegistryService sharingRegistryService, - CredentialStoreService credentialStoreService) { + CredentialStoreService credentialStoreService, + SSHAccountManager sshAccountManager, + GatewayGroupsInitializer gatewayGroupsInitializer) { this.properties = properties; this.registryService = registryService; this.sharingRegistryService = sharingRegistryService; this.credentialStoreService = credentialStoreService; + this.sshAccountManager = sshAccountManager; + this.gatewayGroupsInitializer = gatewayGroupsInitializer; logger.info("Initialized RegistryService"); logger.info("Initialized SharingRegistryService"); @@ -2873,10 +2879,14 @@ public class AiravataService { if (isGatewayGroupsExists(gatewayId)) { return getGatewayGroups(gatewayId); } else { - return GatewayGroupsInitializer.initializeGatewayGroups(gatewayId); + return gatewayGroupsInitializer.initialize(gatewayId); } } catch (AiravataSystemException e) { throw e; + } catch (Exception e) { + String msg = "Error while initializing gateway groups: " + gatewayId + " " + e.getMessage(); + logger.error(msg, e); + throw airavataSystemException(AiravataErrorType.INTERNAL_ERROR, msg, e); } } @@ -4445,7 +4455,7 @@ public class AiravataService { userId, computeResourceId, gatewayId); - return SSHAccountManager.doesUserHaveSSHAccount(gatewayId, computeResourceId, userId); + return sshAccountManager.doesUserHaveSSHAccount(gatewayId, computeResourceId, userId); } catch (InvalidSetupException | InvalidUsernameException e) { String msg = "Error occurred while checking if user has an SSH Account: " + e.getMessage(); logger.error(msg, e); @@ -4466,7 +4476,7 @@ public class AiravataService { gatewayId); SSHCredential sshCredential = getSSHCredential(airavataCredStoreToken, gatewayId); - return SSHAccountManager.isSSHAccountSetupComplete(gatewayId, computeResourceId, userId, sshCredential); + return sshAccountManager.isSSHAccountSetupComplete(gatewayId, computeResourceId, userId, sshCredential); } catch (InvalidSetupException | InvalidUsernameException | CredentialStoreException @@ -4489,7 +4499,7 @@ public class AiravataService { gatewayId); SSHCredential sshCredential = getSSHCredential(airavataCredStoreToken, gatewayId); - return SSHAccountManager.setupSSHAccount(gatewayId, computeResourceId, userId, sshCredential); + return sshAccountManager.setupSSHAccount(gatewayId, computeResourceId, userId, sshCredential); } catch (AiravataSystemException e) { throw e; } catch (CredentialStoreException | InvalidSetupException | InvalidUsernameException e) { diff --git a/airavata-api/src/test/java/org/apache/airavata/security/GatewayGroupsInitializerTest.java b/airavata-api/src/test/java/org/apache/airavata/security/GatewayGroupsInitializerTest.java index 048589a703..d3cf5bec49 100644 --- a/airavata-api/src/test/java/org/apache/airavata/security/GatewayGroupsInitializerTest.java +++ b/airavata-api/src/test/java/org/apache/airavata/security/GatewayGroupsInitializerTest.java @@ -61,14 +61,12 @@ public class GatewayGroupsInitializerTest { private CredentialStoreService mockCredentialStoreService; private GatewayGroupsInitializer gatewayGroupsInitializer; - private final ApplicationContext applicationContext; public GatewayGroupsInitializerTest( ApplicationContext applicationContext, RegistryService mockRegistryService, SharingRegistryService mockSharingRegistryService, CredentialStoreService mockCredentialStoreService) { - this.applicationContext = applicationContext; this.mockRegistryService = mockRegistryService; this.mockSharingRegistryService = mockSharingRegistryService; this.mockCredentialStoreService = mockCredentialStoreService; @@ -77,7 +75,6 @@ public class GatewayGroupsInitializerTest { @BeforeEach public void setUp() { gatewayGroupsInitializer = new GatewayGroupsInitializer( - applicationContext, mockRegistryService, mockSharingRegistryService, mockCredentialStoreService); } diff --git a/modules/file-server/src/main/java/org/apache/airavata/file/server/FileServerConfiguration.java b/modules/file-server/src/main/java/org/apache/airavata/file/server/FileServerConfiguration.java index e73f84866d..bfd1348e94 100644 --- a/modules/file-server/src/main/java/org/apache/airavata/file/server/FileServerConfiguration.java +++ b/modules/file-server/src/main/java/org/apache/airavata/file/server/FileServerConfiguration.java @@ -21,7 +21,6 @@ package org.apache.airavata.file.server; import org.apache.airavata.helix.core.support.adaptor.AdaptorSupportImpl; import org.apache.airavata.helix.task.api.support.AdaptorSupport; -import org.apache.airavata.service.RegistryService; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; @@ -35,8 +34,5 @@ public class FileServerConfiguration { return AdaptorSupportImpl.getInstance(); } - @Bean - public RegistryService registryService() { - return new RegistryService(); - } + // RegistryService is already a @Service bean, no need to create it here } diff --git a/modules/file-server/src/main/java/org/apache/airavata/file/server/service/AirvataFileService.java b/modules/file-server/src/main/java/org/apache/airavata/file/server/service/AirvataFileService.java index 0d39ac8e80..c874ff2fdc 100644 --- a/modules/file-server/src/main/java/org/apache/airavata/file/server/service/AirvataFileService.java +++ b/modules/file-server/src/main/java/org/apache/airavata/file/server/service/AirvataFileService.java @@ -29,9 +29,12 @@ import org.apache.airavata.agents.api.FileMetadata; import org.apache.airavata.file.server.model.AiravataDirectory; import org.apache.airavata.file.server.model.AiravataFile; import org.apache.airavata.helix.task.api.support.AdaptorSupport; +import org.apache.airavata.service.CredentialStoreService; import org.apache.airavata.service.RegistryService; +import org.apache.airavata.service.UserProfileService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -42,10 +45,21 @@ public class AirvataFileService { private final AdaptorSupport adaptorSupport; private final RegistryService registryService; - - public AirvataFileService(AdaptorSupport adaptorSupport, RegistryService registryService) { + private final ApplicationContext applicationContext; + private final UserProfileService userProfileService; + private final CredentialStoreService credentialStoreService; + + public AirvataFileService( + AdaptorSupport adaptorSupport, + RegistryService registryService, + ApplicationContext applicationContext, + UserProfileService userProfileService, + CredentialStoreService credentialStoreService) { this.adaptorSupport = adaptorSupport; this.registryService = registryService; + this.applicationContext = applicationContext; + this.userProfileService = userProfileService; + this.credentialStoreService = credentialStoreService; } private AgentAdaptor getAgentAdaptor(ProcessDataManager dataManager, String processId) throws Exception { @@ -60,7 +74,8 @@ public class AirvataFileService { } public FileMetadata getInfo(String processId, String subPath) throws Exception { - ProcessDataManager dataManager = new ProcessDataManager(registryService, processId, adaptorSupport); + ProcessDataManager dataManager = new ProcessDataManager( + applicationContext, registryService, userProfileService, credentialStoreService, processId, adaptorSupport); AgentAdaptor agentAdaptor = getAgentAdaptor(dataManager, processId); String absPath = dataManager.getBaseDir() + subPath; @@ -69,7 +84,8 @@ public class AirvataFileService { } public AiravataDirectory listDir(String processId, String subPath) throws Exception { - ProcessDataManager dataManager = new ProcessDataManager(registryService, processId, adaptorSupport); + ProcessDataManager dataManager = new ProcessDataManager( + applicationContext, registryService, userProfileService, credentialStoreService, processId, adaptorSupport); AgentAdaptor agentAdaptor = getAgentAdaptor(dataManager, processId); String absPath = dataManager.getBaseDir() + subPath; @@ -96,7 +112,8 @@ public class AirvataFileService { } public AiravataFile listFile(String processId, String subPath) throws Exception { - ProcessDataManager dataManager = new ProcessDataManager(registryService, processId, adaptorSupport); + ProcessDataManager dataManager = new ProcessDataManager( + applicationContext, registryService, userProfileService, credentialStoreService, processId, adaptorSupport); AgentAdaptor agentAdaptor = getAgentAdaptor(dataManager, processId); String absPath = dataManager.getBaseDir() + subPath; @@ -113,7 +130,8 @@ public class AirvataFileService { metadata.setSize(file.getSize()); Files.copy(file.getInputStream(), tempPath, StandardCopyOption.REPLACE_EXISTING); - ProcessDataManager dataManager = new ProcessDataManager(registryService, processId, adaptorSupport); + ProcessDataManager dataManager = new ProcessDataManager( + applicationContext, registryService, userProfileService, credentialStoreService, processId, adaptorSupport); AgentAdaptor agentAdaptor = getAgentAdaptor(dataManager, processId); String absPath = dataManager.getBaseDir() + subPath; @@ -133,7 +151,8 @@ public class AirvataFileService { public Path downloadFile(String processId, String subPath) throws Exception { - ProcessDataManager dataManager = new ProcessDataManager(registryService, processId, adaptorSupport); + ProcessDataManager dataManager = new ProcessDataManager( + applicationContext, registryService, userProfileService, credentialStoreService, processId, adaptorSupport); AgentAdaptor agentAdaptor = getAgentAdaptor(dataManager, processId); String absPath = dataManager.getBaseDir() + subPath; diff --git a/modules/file-server/src/main/java/org/apache/airavata/file/server/service/ProcessDataManager.java b/modules/file-server/src/main/java/org/apache/airavata/file/server/service/ProcessDataManager.java index 07721d4695..be0a6445f5 100644 --- a/modules/file-server/src/main/java/org/apache/airavata/file/server/service/ProcessDataManager.java +++ b/modules/file-server/src/main/java/org/apache/airavata/file/server/service/ProcessDataManager.java @@ -21,7 +21,6 @@ package org.apache.airavata.file.server.service; import java.util.UUID; import org.apache.airavata.agents.api.AgentAdaptor; -import org.apache.airavata.agents.api.AgentUtils; import org.apache.airavata.helix.adaptor.SSHJAgentAdaptor; import org.apache.airavata.helix.impl.task.aws.AWSProcessContextManager; import org.apache.airavata.helix.impl.task.staging.OutputDataStagingTask; @@ -30,9 +29,12 @@ import org.apache.airavata.model.appcatalog.groupresourceprofile.ResourceType; import org.apache.airavata.model.credential.store.SSHCredential; import org.apache.airavata.model.experiment.ExperimentModel; import org.apache.airavata.model.process.ProcessModel; +import org.apache.airavata.service.CredentialStoreService; import org.apache.airavata.service.RegistryService; +import org.apache.airavata.service.UserProfileService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; public class ProcessDataManager extends OutputDataStagingTask { @@ -44,9 +46,15 @@ public class ProcessDataManager extends OutputDataStagingTask { private ProcessModel process; ExperimentModel experiment; - public ProcessDataManager(RegistryService registryService, String processId, AdaptorSupport adaptorSupport) + public ProcessDataManager( + ApplicationContext applicationContext, + RegistryService registryService, + UserProfileService userProfileService, + CredentialStoreService credentialStoreService, + String processId, + AdaptorSupport adaptorSupport) throws Exception { - + super(applicationContext, registryService, userProfileService, credentialStoreService); this.adaptorSupport = adaptorSupport; try { process = registryService.getProcess(processId); @@ -68,13 +76,14 @@ public class ProcessDataManager extends OutputDataStagingTask { if (getTaskContext().getGroupComputeResourcePreference().getResourceType() == ResourceType.AWS) { logger.info("Using AWS adaptor for process {}", processId); - AWSProcessContextManager awsContext = new AWSProcessContextManager(getTaskContext()); - SSHCredential sshCredential = AgentUtils.getCredentialService() + AWSProcessContextManager awsContext = new AWSProcessContextManager(getRegistryService(), getTaskContext()); + // Use CredentialStoreService from parent class (AiravataTask) + SSHCredential sshCredential = getCredentialStoreService() .getSSHCredential(awsContext.getSSHCredentialToken(), getGatewayId()); logger.info("Using SSHCredential {} for AWS process {}", sshCredential.getPublicKey(), processId); logger.info("AWS public ip is {}", awsContext.getPublicIp()); - SSHJAgentAdaptor adaptor = new SSHJAgentAdaptor(); + SSHJAgentAdaptor adaptor = new SSHJAgentAdaptor(getRegistryService(), getCredentialStoreService()); adaptor.init( getTaskContext().getComputeResourceLoginUserName(), awsContext.getPublicIp(), 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 index dc34b3bb2e..7f41711b61 100644 --- 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 @@ -19,31 +19,13 @@ */ package org.apache.airavata.ide.integration; -import org.apache.airavata.api.thrift.server.AiravataServiceServer; -import org.apache.airavata.api.thrift.server.CredentialServiceServer; -import org.apache.airavata.api.thrift.server.OrchestratorServiceServer; -import org.apache.airavata.api.thrift.server.ProfileServiceServer; -import org.apache.airavata.api.thrift.server.RegistryServiceServer; -import org.apache.airavata.api.thrift.server.SharingRegistryServer; -import org.apache.airavata.manager.dbevent.DBEventManagerRunner; - public class APIServerStarter { public static void main(String[] args) throws Exception { - DBEventManagerRunner dbEventManagerRunner = new DBEventManagerRunner(); - RegistryServiceServer registryAPIServer = new RegistryServiceServer(); - CredentialServiceServer credentialStoreServer = new CredentialServiceServer(); - SharingRegistryServer sharingRegistryServer = new SharingRegistryServer(); - AiravataServiceServer airavataAPIServer = new AiravataServiceServer(); - OrchestratorServiceServer orchestratorServer = new OrchestratorServiceServer(); - ProfileServiceServer profileServiceServer = new ProfileServiceServer(); - - dbEventManagerRunner.start(); - registryAPIServer.start(); - credentialStoreServer.start(); - sharingRegistryServer.start(); - airavataAPIServer.start(); - orchestratorServer.start(); - profileServiceServer.start(); + // Note: DBEventManagerRunner is a Spring component and requires AiravataServerProperties. + // This main method should be run within a Spring application context. + // For standalone execution, use Spring Boot application or provide dependencies manually. + throw new UnsupportedOperationException( + "APIServerStarter must be used within a Spring application context"); } } 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 index c0ea02f385..c198e7a0e6 100644 --- 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 @@ -22,10 +22,7 @@ package org.apache.airavata.ide.integration; import java.util.ArrayList; import org.apache.airavata.common.utils.ApplicationSettings; 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; @@ -53,9 +50,9 @@ public class JobEngineStarter { zkHelixAdmin.addCluster(ApplicationSettings.getSetting("helix.cluster-name"), true); logger.info("Starting Helix Controller ......."); - // Starting helix controller - HelixController controller = new HelixController(); - controller.startServer(); + // Note: HelixController is a Spring component and requires AiravataServerProperties. + // This main method should be run within a Spring application context. + logger.warn("HelixController requires Spring context - skipping in standalone mode"); ArrayList<Class<? extends AbstractTask>> taskClasses = new ArrayList<>(); @@ -64,18 +61,14 @@ public class JobEngineStarter { } logger.info("Starting Helix Participant ......."); - - // Starting helix participant - globalParticipant.startServer(); + // Note: GlobalParticipant is a Spring component and requires AiravataServerProperties. + // This main method should be run within a Spring application context. + logger.warn("GlobalParticipant requires Spring context - skipping in standalone mode"); logger.info("Starting Pre Workflow Manager ......."); - - PreWorkflowManager preWorkflowManager = new PreWorkflowManager(); - preWorkflowManager.startServer(); - - logger.info("Starting Post Workflow Manager ......."); - - PostWorkflowManager postWorkflowManager = new PostWorkflowManager(); - postWorkflowManager.startServer(); + // Note: PreWorkflowManager and PostWorkflowManager are Spring components + // and require dependency injection. This main method should be run within + // a Spring application context or these should be obtained from the context. + logger.warn("PreWorkflowManager and PostWorkflowManager require Spring context - skipping in standalone mode"); } } 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 index 2068e4e38a..793bcb39b6 100644 --- 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 @@ -19,11 +19,11 @@ */ 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(); + // Note: EmailBasedMonitor is a Spring component and requires dependencies. + // This main method should be run within a Spring application context. + throw new UnsupportedOperationException( + "EmailBasedMonitor must be used within a Spring application context"); } } diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/AiravataService.java b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/AiravataService.java index 70914ef607..f152981f67 100644 --- a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/AiravataService.java +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/AiravataService.java @@ -31,20 +31,15 @@ import org.springframework.stereotype.Service; public class AiravataService { private static final Logger LOGGER = LoggerFactory.getLogger(AiravataService.class); + private final UserProfileService userProfileService; - public UserProfileService userProfileService() { - try { - LOGGER.info("User profile service initialized"); - return new UserProfileService(); - } catch (Exception e) { - LOGGER.error("Error while creating user profile service", e); - throw new RuntimeException(e); - } + public AiravataService(UserProfileService userProfileService) { + this.userProfileService = userProfileService; } public UserProfile getUserProfile(String userId) { try { - return userProfileService().getUserProfileById(UserContext.authzToken(), userId, UserContext.gatewayId()); + return userProfileService.getUserProfileById(UserContext.authzToken(), userId, UserContext.gatewayId()); } catch (Exception e) { LOGGER.error("Error while getting user profile with the id: {}", userId, e); throw new RuntimeException("Error while getting user profile with the id: " + userId, e); @@ -53,7 +48,7 @@ public class AiravataService { public UserProfile getUserProfile(AuthzToken authzToken, String userId, String gatewayId) { try { - return userProfileService().getUserProfileById(authzToken, userId, gatewayId); + return userProfileService.getUserProfileById(authzToken, userId, gatewayId); } catch (Exception e) { LOGGER.error("Error while getting user profile with the id: {} in the gateway: {}", userId, gatewayId, e); throw new RuntimeException(
