Skip to content

Commit

Permalink
Added: Upload file to Coder
Browse files Browse the repository at this point in the history
  • Loading branch information
djuarezgf committed Jul 1, 2024
1 parent 2bb10b7 commit cab1617
Show file tree
Hide file tree
Showing 19 changed files with 399 additions and 226 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [0.0.1 - 2024-06-27]
## [0.0.1 - 2024-07-01]
### Added
- First version of the project
- Spring Application
Expand Down Expand Up @@ -137,3 +137,4 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
- Coder Service
- RStudio in Coder
- Research environment project type
- Upload file to Coder
45 changes: 26 additions & 19 deletions src/main/java/de/samply/app/ProjectManagerConst.java
Original file line number Diff line number Diff line change
Expand Up @@ -248,14 +248,15 @@ public class ProjectManagerConst {
public static final String EXPORTER_QUERY_CONTEXT_PROJECT_ID = "PROJECT-ID";
public final static String EXPORTER_QUERY_CONTEXT_SEPARATOR = ";";
public final static String API_KEY = "ApiKey";
public final static String EXPORTER_FETCH_QUERY_EXECUTION_URL_PATH = "/response?query-execution-id=";


// Focus
public final static String FOCUS_METADATA_PROJECT = "exporter";
public final static String FOCUS_TASK_PATH = "/v1/tasks";
public final static String FOCUS_TASK_RESULTS_PATH = "/results";
public final static String FOCUS_TASK_WAIT_TIME_PARAM = "wait_time";
public final static String FOCUS_TASK_WAIT_COUNT_PARAM = "wait_count";
// Beam
public final static String BEAM_FOCUS_METADATA_PROJECT = "exporter";
public final static String BEAM_TASK_PATH = "/v1/tasks";
public final static String BEAM_TASK_RESULTS_PATH = "/results";
public final static String BEAM_TASK_WAIT_TIME_PARAM = "wait_time";
public final static String BEAM_TASK_WAIT_COUNT_PARAM = "wait_count";

// Token Manager Variables
public final static String TOKEN_MANAGER_ROOT = "/api";
Expand Down Expand Up @@ -313,12 +314,12 @@ public class ProjectManagerConst {
public final static String EXPORT_TEMPLATES = "EXPORT_TEMPLATES";
public final static String DATASHIELD_TEMPLATES = "DATASHIELD_TEMPLATES";
public final static String RESEARCH_ENVIRONMENT_TEMPLATES = "RESEARCH_ENVIRONMENT_TEMPLATES";
public final static String FOCUS_PROJECT_MANAGER_ID = "FOCUS_PROJECT_MANAGER_ID";
public final static String FOCUS_TTL = "FOCUS_TTL";
public final static String FOCUS_FAILURE_STRATEGY_BACKOFF_IN_MILLISECONDS = "FOCUS_FAILURE_STRATEGY_BACKOFF_IN_MILLISECONDS";
public final static String FOCUS_FAILURE_STRATEGY_MAX_TRIES = "FOCUS_FAILURE_STRATEGY_MAX_TRIES";
public final static String FOCUS_URL = "FOCUS_URL";
public final static String FOCUS_API_KEY = "FOCUS_API_KEY";
public final static String BEAM_PROJECT_MANAGER_ID = "BEAM_PROJECT_MANAGER_ID";
public final static String BEAM_TTL = "BEAM_TTL";
public final static String BEAM_FAILURE_STRATEGY_BACKOFF_IN_MILLISECONDS = "BEAM_FAILURE_STRATEGY_BACKOFF_IN_MILLISECONDS";
public final static String BEAM_FAILURE_STRATEGY_MAX_TRIES = "BEAM_FAILURE_STRATEGY_MAX_TRIES";
public final static String BEAM_URL = "BEAM_URL";
public final static String EXPORTER_API_KEY = "EXPORTER_API_KEY";
public final static String TOKEN_MANAGER_URL = "TOKEN_MANAGER_URL";
public final static String ENABLE_EMAILS = "ENABLE_EMAILS";
public final static String MANAGE_TOKENS_CRON_EXPRESSION = "MANAGE_TOKENS_CRON_EXPRESSION";
Expand Down Expand Up @@ -346,12 +347,15 @@ public class ProjectManagerConst {
public final static String CODER_CREATE_PATH = "CODER_CREATE_PATH";
public final static String CODER_DELETE_PATH = "CODER_DELETE_PATH";
public final static String CODER_SESSION_TOKEN = "CODER_SESSION_TOKEN";
public final static String CODER_CRON_EXPRESSION = "CODER_CRON_EXPRESSION";

public final static String CODER_ENABLE_JUPYTER_LAB_PARAM_VALUE = "CODER_ENABLE_JUPYTER_LAB_PARAM_VALUE";
public final static String CODER_ENABLE_RSTUDIO_PARAM_VALUE = "CODER_ENABLE_RSTUDIO_PARAM_VALUE";
public final static String CODER_ENABLE_VS_CODE_SERVER_PARAM_VALUE = "CODER_ENABLE_VS_CODE_SERVER_PARAM_VALUE";
public final static String CODER_DOTFILES_URL_PARAM_VALUE = "CODER_DOTFILES_URL_PARAM_VALUE";
public final static String CODER_ENABLE_FILE_RECEIVER_PARAM_VALUE = "CODER_ENABLE_FILE_RECEIVER_PARAM_VALUE";
public final static String CODER_BEAM_ID_SUFFIX = "CODER_BEAM_ID_SUFFIX";
public final static String CODER_TEST_FILE_BEAM_ID = "CODER_TEST_FILE_BEAM_ID";
public final static String ENABLE_CODER = "ENABLE_CODER";

// Spring Values (SV)
Expand Down Expand Up @@ -397,13 +401,13 @@ public class ProjectManagerConst {
public final static String DATASHIELD_TEMPLATES_SV = HEAD_SV + DATASHIELD_TEMPLATES + BOTTOM_SV;
public final static String RESEARCH_ENVIRONMENT_TEMPLATES_SV = HEAD_SV + RESEARCH_ENVIRONMENT_TEMPLATES + BOTTOM_SV;
public final static String TOKEN_MANAGER_URL_SV = HEAD_SV + TOKEN_MANAGER_URL + BOTTOM_SV;
public final static String FOCUS_PROJECT_MANAGER_ID_SV = HEAD_SV + FOCUS_PROJECT_MANAGER_ID + BOTTOM_SV;
public final static String FOCUS_TTL_SV = HEAD_SV + FOCUS_TTL + ":60s" + BOTTOM_SV;
public final static String FOCUS_FAILURE_STRATEGY_BACKOFF_IN_MILLISECONDS_SV =
HEAD_SV + FOCUS_FAILURE_STRATEGY_BACKOFF_IN_MILLISECONDS + ":1000" + BOTTOM_SV;
public final static String FOCUS_FAILURE_STRATEGY_MAX_TRIES_SV = HEAD_SV + FOCUS_FAILURE_STRATEGY_MAX_TRIES + ":5" + BOTTOM_SV;
public final static String FOCUS_URL_SV = HEAD_SV + FOCUS_URL + BOTTOM_SV;
public final static String FOCUS_API_KEY_SV = HEAD_SV + FOCUS_API_KEY + BOTTOM_SV;
public final static String BEAM_PROJECT_MANAGER_ID_SV = HEAD_SV + BEAM_PROJECT_MANAGER_ID + BOTTOM_SV;
public final static String BEAM_TTL_SV = HEAD_SV + BEAM_TTL + ":60s" + BOTTOM_SV;
public final static String BEAM_FAILURE_STRATEGY_BACKOFF_IN_MILLISECONDS_SV =
HEAD_SV + BEAM_FAILURE_STRATEGY_BACKOFF_IN_MILLISECONDS + ":1000" + BOTTOM_SV;
public final static String BEAM_FAILURE_STRATEGY_MAX_TRIES_SV = HEAD_SV + BEAM_FAILURE_STRATEGY_MAX_TRIES + ":5" + BOTTOM_SV;
public final static String BEAM_URL_SV = HEAD_SV + BEAM_URL + BOTTOM_SV;
public final static String EXPORTER_API_KEY_SV = HEAD_SV + EXPORTER_API_KEY + BOTTOM_SV;
public final static String ENABLE_EMAILS_SV = HEAD_SV + ENABLE_EMAILS + ":true" + BOTTOM_SV;
public final static String ENABLE_TOKEN_MANAGER_SV = HEAD_SV + ENABLE_TOKEN_MANAGER + ":true" + BOTTOM_SV;
public final static String ENABLE_EXPORTER_SV = HEAD_SV + ENABLE_EXPORTER + ":true" + BOTTOM_SV;
Expand All @@ -430,6 +434,9 @@ public class ProjectManagerConst {
public final static String CODER_CREATE_PATH_SV = HEAD_SV + CODER_CREATE_PATH + BOTTOM_SV;
public final static String CODER_DELETE_PATH_SV = HEAD_SV + CODER_DELETE_PATH + BOTTOM_SV;
public final static String CODER_SESSION_TOKEN_SV = HEAD_SV + CODER_SESSION_TOKEN + BOTTOM_SV;
public final static String CODER_BEAM_ID_SUFFIX_SV = HEAD_SV + CODER_BEAM_ID_SUFFIX + BOTTOM_SV;
public final static String CODER_TEST_FILE_BEAM_ID_SV = HEAD_SV + CODER_TEST_FILE_BEAM_ID + BOTTOM_SV;
public final static String CODER_CRON_EXPRESSION_SV = HEAD_SV + CODER_CRON_EXPRESSION + BOTTOM_SV;

public final static String CODER_ENABLE_JUPYTER_LAB_PARAM_VALUE_SV = HEAD_SV + CODER_ENABLE_JUPYTER_LAB_PARAM_VALUE + ":1" + BOTTOM_SV;
public final static String CODER_ENABLE_RSTUDIO_PARAM_VALUE_SV = HEAD_SV + CODER_ENABLE_RSTUDIO_PARAM_VALUE + ":1" + BOTTOM_SV;
Expand Down
13 changes: 9 additions & 4 deletions src/main/java/de/samply/bridgehead/BridgeheadConfiguration.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ public class BridgeheadConfiguration {
@Data
public static class BridgeheadConfig {
private String explorerId;
private String focusId;
private String focusBeamId;
private String fileDispatcherBeamId;
private String tokenManagerId;
private String humanReadable;
}
Expand All @@ -34,7 +35,7 @@ public static class BridgeheadConfig {
private void initIdBridgeheadMaps() {
config.forEach((bridgehead, bridgeheadConfig) -> {
addBridgeheadId(bridgehead, bridgeheadConfig.getExplorerId(), explorerIdBridgeheadMap);
addBridgeheadId(bridgehead, bridgeheadConfig.getFocusId(), focusIdBridgeheadMap);
addBridgeheadId(bridgehead, bridgeheadConfig.getFocusBeamId(), focusIdBridgeheadMap);
addBridgeheadId(bridgehead, bridgeheadConfig.getTokenManagerId(), tokenManagerIdBridgeheadMap);
});
}
Expand All @@ -57,8 +58,8 @@ public boolean isRegisteredBridgehead(String bridgehead) {
return config.keySet().contains(bridgehead);
}

public String getFocusId(String bridgehead) {
return config.get(bridgehead).getFocusId();
public String getFocusBeamId(String bridgehead) {
return config.get(bridgehead).getFocusBeamId();
}

public String getHumanReadable(String bridgehead) {
Expand Down Expand Up @@ -86,6 +87,10 @@ public String fetchBridgeheadForFocusId(String focusId) {
return fetchBridgehead(focusId, focusIdBridgeheadMap);
}

public String getFileDispatcherBeamId(String bridgehead) {
return config.get(bridgehead).getFileDispatcherBeamId();
}

public Optional<String> getBridgeheadForTokenManagerId(String tokenManagerId) {
return fetchBridgeheadOptional(tokenManagerId, tokenManagerIdBridgeheadMap);
}
Expand Down
71 changes: 71 additions & 0 deletions src/main/java/de/samply/coder/CoderJob.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package de.samply.coder;

import de.samply.app.ProjectManagerConst;
import de.samply.db.model.ProjectBridgeheadUser;
import de.samply.db.model.ProjectCoder;
import de.samply.db.repository.ProjectBridgeheadUserRepository;
import de.samply.db.repository.ProjectCoderRepository;
import de.samply.exporter.ExporterService;
import de.samply.project.ProjectType;
import de.samply.project.state.ProjectBridgeheadState;
import de.samply.query.QueryState;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Optional;

@Component
public class CoderJob {

private final ProjectBridgeheadUserRepository projectBridgeheadUserRepository;
private final ProjectCoderRepository projectCoderRepository;
private final CoderService coderService;
private final ExporterService exporterService;

public CoderJob(ProjectBridgeheadUserRepository projectBridgeheadUserRepository,
ProjectCoderRepository projectCoderRepository,
CoderService coderService,
ExporterService exporterService
) {
this.projectBridgeheadUserRepository = projectBridgeheadUserRepository;
this.projectCoderRepository = projectCoderRepository;
this.coderService = coderService;
this.exporterService = exporterService;
}


@Scheduled(cron = ProjectManagerConst.CODER_CRON_EXPRESSION_SV)
public void manageCoderWorkspaces() {
manageCoderActiveUsers();
manageCoderInactiveUsers();
}

public void manageCoderActiveUsers() {
fetchActiveUsers().stream().forEach(user -> {
Optional<ProjectCoder> projectCoder = projectCoderRepository.findByProjectBridgeheadUserAndDeletedAtIsNull(user);
if (projectCoder.isEmpty()) {
this.coderService.createWorkspace(user);
} else if (!projectCoder.get().isExportTransferred()) {
exporterService.transferFileToCoder(user.getProjectBridgehead(), projectCoder.get()).subscribe(result -> {
projectCoder.get().setExportTransferred(true);
this.projectCoderRepository.save(projectCoder.get());
});
}
});
}

private List<ProjectBridgeheadUser> fetchActiveUsers() {
return projectBridgeheadUserRepository.getDistinctByProjectTypeAndQueryState(ProjectType.RESEARCH_ENVIRONMENT, QueryState.FINISHED, ProjectBridgeheadState.ACCEPTED);
}

public void manageCoderInactiveUsers() {
//TODO
}

private List<ProjectBridgeheadUser> fetchInactiveUsers() {
//TODO
return null;
}

}
Loading

0 comments on commit cab1617

Please sign in to comment.