Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add extra metadata to workflow runs exported files #364

Merged
merged 12 commits into from
Dec 5, 2023
43 changes: 31 additions & 12 deletions conf/reflect-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -1969,6 +1969,13 @@
"name":"io.seqera.tower.cli.shared.ComputeEnvExportFormat$ComputeConfigMixin",
"queryAllDeclaredMethods":true
},
{
"name":"io.seqera.tower.cli.shared.WorkflowMetadata",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"queryAllDeclaredConstructors":true,
"methods":[{"name":"getPipelineId","parameterTypes":[] }, {"name":"getUserEmail","parameterTypes":[] }, {"name":"getUserId","parameterTypes":[] }, {"name":"getWorkspaceId","parameterTypes":[] }]
},
{
"name":"io.seqera.tower.cli.utils.VersionProvider",
"allDeclaredFields":true,
Expand Down Expand Up @@ -2150,13 +2157,13 @@
"allDeclaredFields":true,
"allDeclaredMethods":true,
"allDeclaredConstructors":true,
"methods":[{"name":"getConfig","parameterTypes":[] }, {"name":"getCredentialsId","parameterTypes":[] }, {"name":"getDateCreated","parameterTypes":[] }, {"name":"getDeleted","parameterTypes":[] }, {"name":"getDescription","parameterTypes":[] }, {"name":"getId","parameterTypes":[] }, {"name":"getLastUpdated","parameterTypes":[] }, {"name":"getLastUsed","parameterTypes":[] }, {"name":"getMessage","parameterTypes":[] }, {"name":"getName","parameterTypes":[] }, {"name":"getOrgId","parameterTypes":[] }, {"name":"getPlatform","parameterTypes":[] }, {"name":"getPrimary","parameterTypes":[] }, {"name":"getStatus","parameterTypes":[] }, {"name":"getWorkspaceId","parameterTypes":[] }]
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"getConfig","parameterTypes":[] }, {"name":"getCredentialsId","parameterTypes":[] }, {"name":"getDateCreated","parameterTypes":[] }, {"name":"getDeleted","parameterTypes":[] }, {"name":"getDescription","parameterTypes":[] }, {"name":"getId","parameterTypes":[] }, {"name":"getLastUpdated","parameterTypes":[] }, {"name":"getLastUsed","parameterTypes":[] }, {"name":"getMessage","parameterTypes":[] }, {"name":"getName","parameterTypes":[] }, {"name":"getOrgId","parameterTypes":[] }, {"name":"getPlatform","parameterTypes":[] }, {"name":"getPrimary","parameterTypes":[] }, {"name":"getStatus","parameterTypes":[] }, {"name":"getWorkspaceId","parameterTypes":[] }, {"name":"setConfig","parameterTypes":["io.seqera.tower.model.ComputeConfig"] }, {"name":"setCredentialsId","parameterTypes":["java.lang.String"] }, {"name":"setDescription","parameterTypes":["java.lang.String"] }, {"name":"setMessage","parameterTypes":["java.lang.String"] }, {"name":"setName","parameterTypes":["java.lang.String"] }, {"name":"setPlatform","parameterTypes":["io.seqera.tower.model.ComputeEnv$PlatformEnum"] }, {"name":"setStatus","parameterTypes":["io.seqera.tower.model.ComputeEnvStatus"] }]
},
{
"name":"io.seqera.tower.model.ComputeEnv$PlatformEnum",
"allDeclaredFields":true,
"allDeclaredMethods":true,
"methods":[{"name":"getValue","parameterTypes":[] }]
"methods":[{"name":"fromValue","parameterTypes":["java.lang.String"] }, {"name":"getValue","parameterTypes":[] }]
},
{
"name":"io.seqera.tower.model.ComputeEnvDbDto",
Expand All @@ -2181,13 +2188,14 @@
"name":"io.seqera.tower.model.ComputeEnvStatus",
"allDeclaredFields":true,
"allDeclaredMethods":true,
"methods":[{"name":"fromValue","parameterTypes":["java.lang.String"] }]
"methods":[{"name":"fromValue","parameterTypes":["java.lang.String"] }, {"name":"getValue","parameterTypes":[] }]
},
{
"name":"io.seqera.tower.model.ComputePlatformDto",
"allDeclaredFields":true,
"allDeclaredMethods":true,
"allDeclaredConstructors":true
"allDeclaredConstructors":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"setId","parameterTypes":["java.lang.String"] }, {"name":"setName","parameterTypes":["java.lang.String"] }]
},
{
"name":"io.seqera.tower.model.ConfigEnvVariable",
Expand Down Expand Up @@ -2395,7 +2403,8 @@
"name":"io.seqera.tower.model.DescribeLaunchResponse",
"allDeclaredFields":true,
"allDeclaredMethods":true,
"allDeclaredConstructors":true
"allDeclaredConstructors":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"setLaunch","parameterTypes":["io.seqera.tower.model.Launch"] }]
},
{
"name":"io.seqera.tower.model.DescribeOrganizationResponse",
Expand Down Expand Up @@ -2547,7 +2556,8 @@
"name":"io.seqera.tower.model.JobInfoDto",
"allDeclaredFields":true,
"allDeclaredMethods":true,
"allDeclaredConstructors":true
"allDeclaredConstructors":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"setExitCode","parameterTypes":["java.lang.Integer"] }, {"name":"setId","parameterTypes":["java.lang.Long"] }, {"name":"setMessage","parameterTypes":["java.lang.String"] }, {"name":"setOperationId","parameterTypes":["java.lang.String"] }, {"name":"setStatus","parameterTypes":["java.lang.String"] }]
},
{
"name":"io.seqera.tower.model.K8sComputeConfig",
Expand Down Expand Up @@ -2578,7 +2588,8 @@
"name":"io.seqera.tower.model.Launch",
"allDeclaredFields":true,
"allDeclaredMethods":true,
"allDeclaredConstructors":true
"allDeclaredConstructors":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"getComputeEnv_JsonNullable","parameterTypes":[] }, {"name":"getConfigProfiles","parameterTypes":[] }, {"name":"getConfigText","parameterTypes":[] }, {"name":"getDateCreated","parameterTypes":[] }, {"name":"getEntryName","parameterTypes":[] }, {"name":"getHeadJobCpus","parameterTypes":[] }, {"name":"getHeadJobMemoryMb","parameterTypes":[] }, {"name":"getId","parameterTypes":[] }, {"name":"getLastUpdated","parameterTypes":[] }, {"name":"getMainScript","parameterTypes":[] }, {"name":"getOptimizationId","parameterTypes":[] }, {"name":"getOptimizationTargets","parameterTypes":[] }, {"name":"getParamsText","parameterTypes":[] }, {"name":"getPipeline","parameterTypes":[] }, {"name":"getPostRunScript","parameterTypes":[] }, {"name":"getPreRunScript","parameterTypes":[] }, {"name":"getPullLatest","parameterTypes":[] }, {"name":"getResume","parameterTypes":[] }, {"name":"getResumeLaunchId","parameterTypes":[] }, {"name":"getRevision","parameterTypes":[] }, {"name":"getRunName","parameterTypes":[] }, {"name":"getSchemaName","parameterTypes":[] }, {"name":"getSessionId","parameterTypes":[] }, {"name":"getStubRun","parameterTypes":[] }, {"name":"getTowerConfig","parameterTypes":[] }, {"name":"getUserSecrets","parameterTypes":[] }, {"name":"getWorkDir","parameterTypes":[] }, {"name":"getWorkspaceSecrets","parameterTypes":[] }, {"name":"setComputeEnv_JsonNullable","parameterTypes":["org.openapitools.jackson.nullable.JsonNullable"] }, {"name":"setConfigProfiles","parameterTypes":["java.util.List"] }, {"name":"setConfigText","parameterTypes":["java.lang.String"] }, {"name":"setDateCreated","parameterTypes":["java.time.OffsetDateTime"] }, {"name":"setEntryName","parameterTypes":["java.lang.String"] }, {"name":"setHeadJobCpus","parameterTypes":["java.lang.Integer"] }, {"name":"setHeadJobMemoryMb","parameterTypes":["java.lang.Integer"] }, {"name":"setId","parameterTypes":["java.lang.String"] }, {"name":"setLastUpdated","parameterTypes":["java.time.OffsetDateTime"] }, {"name":"setMainScript","parameterTypes":["java.lang.String"] }, {"name":"setOptimizationId","parameterTypes":["java.lang.String"] }, {"name":"setOptimizationTargets","parameterTypes":["java.lang.String"] }, {"name":"setParamsText","parameterTypes":["java.lang.String"] }, {"name":"setPipeline","parameterTypes":["java.lang.String"] }, {"name":"setPostRunScript","parameterTypes":["java.lang.String"] }, {"name":"setPreRunScript","parameterTypes":["java.lang.String"] }, {"name":"setPullLatest","parameterTypes":["java.lang.Boolean"] }, {"name":"setResume","parameterTypes":["java.lang.Boolean"] }, {"name":"setResumeLaunchId","parameterTypes":["java.lang.String"] }, {"name":"setRevision","parameterTypes":["java.lang.String"] }, {"name":"setRunName","parameterTypes":["java.lang.String"] }, {"name":"setSchemaName","parameterTypes":["java.lang.String"] }, {"name":"setSessionId","parameterTypes":["java.lang.String"] }, {"name":"setStubRun","parameterTypes":["java.lang.Boolean"] }, {"name":"setTowerConfig","parameterTypes":["java.lang.String"] }, {"name":"setUserSecrets","parameterTypes":["java.util.List"] }, {"name":"setWorkDir","parameterTypes":["java.lang.String"] }, {"name":"setWorkspaceSecrets","parameterTypes":["java.util.List"] }]
},
{
"name":"io.seqera.tower.model.LaunchActionRequest",
Expand Down Expand Up @@ -2656,7 +2667,8 @@
"name":"io.seqera.tower.model.ListParticipantsResponse",
"allDeclaredFields":true,
"allDeclaredMethods":true,
"allDeclaredConstructors":true
"allDeclaredConstructors":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"setParticipants","parameterTypes":["java.util.List"] }, {"name":"setTotalSize","parameterTypes":["java.lang.Long"] }]
},
{
"name":"io.seqera.tower.model.ListPipelineSecretsResponse",
Expand Down Expand Up @@ -2747,7 +2759,8 @@
{
"name":"io.seqera.tower.model.OrgRole",
"allDeclaredFields":true,
"allDeclaredMethods":true
"allDeclaredMethods":true,
"methods":[{"name":"fromValue","parameterTypes":["java.lang.String"] }]
},
{
"name":"io.seqera.tower.model.Organization",
Expand All @@ -2765,7 +2778,8 @@
"name":"io.seqera.tower.model.ParticipantDbDto",
"allDeclaredFields":true,
"allDeclaredMethods":true,
"allDeclaredConstructors":true
"allDeclaredConstructors":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"setEmail","parameterTypes":["java.lang.String"] }, {"name":"setFirstName","parameterTypes":["java.lang.String"] }, {"name":"setLastName","parameterTypes":["java.lang.String"] }, {"name":"setMemberId","parameterTypes":["java.lang.Long"] }, {"name":"setOrgRole","parameterTypes":["io.seqera.tower.model.OrgRole"] }, {"name":"setParticipantId","parameterTypes":["java.lang.Long"] }, {"name":"setTeamAvatarUrl","parameterTypes":["java.lang.String"] }, {"name":"setTeamId","parameterTypes":["java.lang.Long"] }, {"name":"setTeamName","parameterTypes":["java.lang.String"] }, {"name":"setType","parameterTypes":["io.seqera.tower.model.ParticipantType"] }, {"name":"setUserAvatarUrl","parameterTypes":["java.lang.String"] }, {"name":"setUserName","parameterTypes":["java.lang.String"] }, {"name":"setWspRole","parameterTypes":["io.seqera.tower.model.WspRole"] }]
},
{
"name":"io.seqera.tower.model.ParticipantType",
Expand Down Expand Up @@ -3042,7 +3056,7 @@
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"queryAllDeclaredConstructors":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"setComputeEnv","parameterTypes":["io.seqera.tower.model.ComputeEnv"] }, {"name":"setConfigProfiles","parameterTypes":["java.util.List"] }, {"name":"setConfigText","parameterTypes":["java.lang.String"] }, {"name":"setDateCreated","parameterTypes":["java.time.OffsetDateTime"] }, {"name":"setEntryName","parameterTypes":["java.lang.String"] }, {"name":"setId","parameterTypes":["java.lang.String"] }, {"name":"setMainScript","parameterTypes":["java.lang.String"] }, {"name":"setParamsText","parameterTypes":["java.lang.String"] }, {"name":"setPipeline","parameterTypes":["java.lang.String"] }, {"name":"setPostRunScript","parameterTypes":["java.lang.String"] }, {"name":"setPreRunScript","parameterTypes":["java.lang.String"] }, {"name":"setPullLatest","parameterTypes":["java.lang.Boolean"] }, {"name":"setResume","parameterTypes":["java.lang.Boolean"] }, {"name":"setResumeCommitId","parameterTypes":["java.lang.String"] }, {"name":"setResumeDir","parameterTypes":["java.lang.String"] }, {"name":"setRevision","parameterTypes":["java.lang.String"] }, {"name":"setSchemaName","parameterTypes":["java.lang.String"] }, {"name":"setSessionId","parameterTypes":["java.lang.String"] }, {"name":"setStubRun","parameterTypes":["java.lang.Boolean"] }, {"name":"setTowerConfig","parameterTypes":["java.lang.String"] }, {"name":"setUserSecrets","parameterTypes":["java.util.List"] }, {"name":"setWorkDir","parameterTypes":["java.lang.String"] }, {"name":"setWorkspaceSecrets","parameterTypes":["java.util.List"] }]
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"setComputeEnv","parameterTypes":["io.seqera.tower.model.ComputeEnv"] }, {"name":"setConfigProfiles","parameterTypes":["java.util.List"] }, {"name":"setConfigText","parameterTypes":["java.lang.String"] }, {"name":"setDateCreated","parameterTypes":["java.time.OffsetDateTime"] }, {"name":"setEntryName","parameterTypes":["java.lang.String"] }, {"name":"setHeadJobCpus","parameterTypes":["java.lang.Integer"] }, {"name":"setHeadJobMemoryMb","parameterTypes":["java.lang.Integer"] }, {"name":"setId","parameterTypes":["java.lang.String"] }, {"name":"setMainScript","parameterTypes":["java.lang.String"] }, {"name":"setOptimizationId","parameterTypes":["java.lang.String"] }, {"name":"setOptimizationTargets","parameterTypes":["java.lang.String"] }, {"name":"setParamsText","parameterTypes":["java.lang.String"] }, {"name":"setPipeline","parameterTypes":["java.lang.String"] }, {"name":"setPipelineId","parameterTypes":["java.lang.Long"] }, {"name":"setPostRunScript","parameterTypes":["java.lang.String"] }, {"name":"setPreRunScript","parameterTypes":["java.lang.String"] }, {"name":"setPullLatest","parameterTypes":["java.lang.Boolean"] }, {"name":"setResume","parameterTypes":["java.lang.Boolean"] }, {"name":"setResumeCommitId","parameterTypes":["java.lang.String"] }, {"name":"setResumeDir","parameterTypes":["java.lang.String"] }, {"name":"setRevision","parameterTypes":["java.lang.String"] }, {"name":"setSchemaName","parameterTypes":["java.lang.String"] }, {"name":"setSessionId","parameterTypes":["java.lang.String"] }, {"name":"setStubRun","parameterTypes":["java.lang.Boolean"] }, {"name":"setTowerConfig","parameterTypes":["java.lang.String"] }, {"name":"setUserSecrets","parameterTypes":["java.util.List"] }, {"name":"setWorkDir","parameterTypes":["java.lang.String"] }, {"name":"setWorkspaceSecrets","parameterTypes":["java.util.List"] }]
},
{
"name":"io.seqera.tower.model.WorkflowLoad",
Expand Down Expand Up @@ -3073,7 +3087,8 @@
{
"name":"io.seqera.tower.model.WspRole",
"allDeclaredFields":true,
"allDeclaredMethods":true
"allDeclaredMethods":true,
"methods":[{"name":"fromValue","parameterTypes":["java.lang.String"] }]
},
{
"name":"java.io.Console",
Expand All @@ -3085,6 +3100,10 @@
"allDeclaredMethods":true,
"allDeclaredConstructors":true
},
{
"name":"java.io.FileNotFoundException",
"methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
},
{
"name":"java.io.IOException",
"methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import io.seqera.tower.cli.exceptions.RunNotFoundException;
import io.seqera.tower.cli.exceptions.WorkflowProgressNotFoundException;
import io.seqera.tower.model.DescribeLaunchResponse;
import io.seqera.tower.model.DescribeWorkflowLaunchResponse;
import io.seqera.tower.model.DescribeWorkflowResponse;
import io.seqera.tower.model.GetProgressResponse;
import io.seqera.tower.model.Launch;
Expand All @@ -45,6 +46,16 @@ protected DescribeWorkflowResponse workflowById(Long workspaceId, String id) thr
return workflowResponse;
}

protected DescribeWorkflowLaunchResponse workflowLaunchById(Long workspaceId, String workflowId) throws ApiException {
DescribeWorkflowLaunchResponse wfLaunchResponse = api().describeWorkflowLaunch(workflowId, workspaceId);

if (wfLaunchResponse == null) {
throw new ApiException(String.format("Workflow '%s' launch not found at %d workspace", workflowId, workspaceId));
}

return wfLaunchResponse;
}

protected Launch launchById(Long workspaceId, String id) throws ApiException {
DescribeLaunchResponse launchResponse = api().describeLaunch(id, workspaceId);

Expand Down
46 changes: 44 additions & 2 deletions src/main/java/io/seqera/tower/cli/commands/runs/DumpCmd.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,15 @@
import io.seqera.tower.cli.exceptions.TowerException;
import io.seqera.tower.cli.responses.Response;
import io.seqera.tower.cli.responses.runs.RunDump;
import io.seqera.tower.cli.shared.WorkflowMetadata;
import io.seqera.tower.cli.utils.SilentPrintWriter;
import io.seqera.tower.model.DescribeTaskResponse;
import io.seqera.tower.model.DescribeWorkflowLaunchResponse;
import io.seqera.tower.model.DescribeWorkflowResponse;
import io.seqera.tower.model.Launch;
import io.seqera.tower.model.ListParticipantsResponse;
import io.seqera.tower.model.ListTasksResponse;
import io.seqera.tower.model.ParticipantDbDto;
import io.seqera.tower.model.ServiceInfo;
import io.seqera.tower.model.Task;
import io.seqera.tower.model.TaskStatus;
Expand Down Expand Up @@ -167,15 +171,47 @@ private void dumpTasks(PrintWriter progress, TarArchiveOutputStream out, Long ws
private void dumpWorkflowDetails(PrintWriter progress, TarArchiveOutputStream out, Long wspId) throws ApiException, IOException {
progress.println(ansi("- Workflow details"));

// General workflow info
DescribeWorkflowResponse workflowResponse = workflowById(wspId, id);
Workflow workflow = workflowResponse.getWorkflow();
if (workflow == null) {
throw new TowerException("Unknown workflow");
}

// Launch info
Launch launch = null;
Long pipelineId = null;
if (workflow.getLaunchId() != null) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't we create a separate method with a descriptive name of what is happening here, instead of directly put the if clause?


launch = launchById(wspId, workflow.getLaunchId());

DescribeWorkflowLaunchResponse wfLaunchResponse = workflowLaunchById(wspId, workflow.getId());
if (wfLaunchResponse != null && wfLaunchResponse.getLaunch() != null) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here. What is the "if" checking? I think it would be better to create a separate method that returns a boolean, and has a descriptive name of what we are actually checking. Example: isLaunchResponseValid() or something.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the if condition is clear. We check if we got a response and if the response contains a Launch object (we don't have the null chain operator in Java).
Creating a separate method just for this simple check is not justified in my opinion, although It would be if the condition check is re-used multiple times in the class.

pipelineId = wfLaunchResponse.getLaunch().getPipelineId();
}
}

// User info
Long userId = workflow.getOwnerId();
String userMail = null;
String userName = workflow.getUserName();
try {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here. This Try catch could be hidden on a separate method with a descriptive name. That way all this method becomes way simpler and easy to understand.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that moving fragments of the code to a separate method makes sense if said method is getting reused more than once or if the fragment is overly complex. Otherwise we are just scattering the code around without actually reducing complexity.
I'll add some comments given that this filtering fragment is a bit convoluted. If we find an easier approach I'll update it.

Copy link
Contributor

@pgeadas pgeadas Nov 27, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that there are other advantages in splitting the code in smaller methods, rather than just for code reuse:

  • Single responsibility principle: a class should be only responsible of doing one thing. The same thing can be applied to methods.
  • Testability: smaller methods can be unit tested easily since they are only responsible of doing one thing.
  • Legibility: if we have one main method that calls other methods, the code will be way more understandable and, in many cases, you don't even need to look at the smaller methods' code in order to understand what the code intends to do.
  • Reduce comments: if the smaller methods have descriptive names, you avoid using comments that do not add much and only pollute the code base.

I will give you an example:
image

Both methods that were extracted are only used once, but in your opinion:
Which one looks cleaner? Which one takes less time to understand? :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comments are not pollution in the code base. We strongly encourage adding comments wherever is necessary as long as they explain the "why" rather than the "what" in the code.

Which one looks cleaner?

This is subjective, sure the wrapper method is 3 lines but then you have moved the same code into two methods, so you end with N+3 lines and additional jumps that makes debugging more difficult.

P.S: Thanks a lot for the recommendation, I enjoyed reading that book back in the day. Let me return the favor and recommend you another book.
If you are more curious about this and other pragmatic principles please let me know.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved the same code into two methods

Not really, what happens is that both methods will call a single method where all the duplicate code is. However, that part is not shown in the screenshot.

makes debugging more difficult
How so?

Thanks for the book recommendation 👍🏻

ListParticipantsResponse participants = api().listWorkspaceParticipants(workflowResponse.getOrgId(), workflowResponse.getWorkspaceId(), null, null, null);
JaimeSeqLabs marked this conversation as resolved.
Show resolved Hide resolved
userMail = participants.getParticipants().stream()
.filter(participant -> userName.equals(participant.getUserName()))
.findFirst()
.map(ParticipantDbDto::getEmail)
.orElse(null);
} catch (ApiException ignored) {}

// Load and metrics info
WorkflowLoad workflowLoad = workflowLoadByWorkflowId(wspId, id);
Launch launch = workflow.getLaunchId() != null ? launchById(wspId, workflow.getLaunchId()) : null;
List<WorkflowMetrics> metrics = api().describeWorkflowMetrics(workflow.getId(), wspId).getMetrics();

WorkflowMetadata wfMetadata = new WorkflowMetadata(pipelineId, wspId, userId, userMail);

addEntry(out, "workflow.json", Workflow.class, workflow);
addEntry(out, "workflow-metadata.json", WorkflowMetadata.class, wfMetadata);
addEntry(out, "workflow-load.json", WorkflowLoad.class, workflowLoad);
addEntry(out, "workflow-launch.json", Launch.class, launch);
addEntry(out, "workflow-metrics.json", List.class, metrics);
Expand Down Expand Up @@ -285,8 +321,14 @@ private <T> void addEntry(TarArchiveOutputStream out, String fileName, Class<T>
if (value == null) {
return;
}
addEntry(out, fileName, toJSON(type, value));
}

private void addEntry(TarArchiveOutputStream out, String fileName, byte[] data) throws IOException {
if (data == null) {
return;
}
TarArchiveEntry entry = new TarArchiveEntry(fileName);
byte[] data = toJSON(type, value);
entry.setSize(data.length);
out.putArchiveEntry(entry);
out.write(data);
Expand Down
Loading
Loading