Skip to content

Commit

Permalink
Fix Calculate run position in queue (#1125)
Browse files Browse the repository at this point in the history
* Fix Calculate run position in queue
  • Loading branch information
alfespa17 authored Jul 25, 2024
1 parent 0a8c8f8 commit a9ecd20
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 95 deletions.
2 changes: 1 addition & 1 deletion api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<description>Spring Boot Terrakube API</description>
<properties>
<java.version>17</java.version>
<elide.version>7.0.5</elide.version>
<elide.version>7.1.0</elide.version>
<liquibase-core.version>4.28.0</liquibase-core.version>
<azure.version>5.12.0</azure.version>
<mssql-jdbc.version>12.6.3.jre11</mssql-jdbc.version>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ public ResponseEntity<String> getRunEvents(@PathVariable("runsId") String runsId
@Transactional
@GetMapping(produces = "application/vnd.api+json", path = "/runs/{runId}")
public ResponseEntity<RunsData> getRun(@PathVariable("runId") int runId, @RequestParam(name = "include", required = false) String include) {
return ResponseEntity.ok(remoteTfeService.getRun(runId, include));
return ResponseEntity.of(Optional.ofNullable(remoteTfeService.getRun(runId, include)));
}

@Transactional
Expand Down
192 changes: 100 additions & 92 deletions api/src/main/java/org/terrakube/api/plugin/state/RemoteTfeService.java
Original file line number Diff line number Diff line change
Expand Up @@ -795,93 +795,96 @@ private String getTemplateName(String configurationId, boolean isDestroy) {

RunsData getRun(int runId, String include) {
log.info("Searching Run {}", runId);
RunsData runsData = new RunsData();
RunsModel runsModel = new RunsModel();
runsModel.setId(String.valueOf(runId));
runsModel.setType("runs");
runsModel.setAttributes(new HashMap<>());

String planStatus = "running";
Job job = jobRepository.getReferenceById(Integer.valueOf(runId));

switch (job.getStatus()) {
case completed:
planStatus = "finished";
break;
case pending:
//check if any step is in status pending else we need to return running
//check if workspace is not lock return running too
Optional<Step> optionalStep = stepRepository.findFirstByJobIdOrderByStepNumber(job.getId());
if (optionalStep.isPresent()) {
Step step = optionalStep.get();
if (step.getStatus().equals(JobStatus.pending)){
if(job.getWorkspace() != null) {
RunsData runsData = new RunsData();
RunsModel runsModel = new RunsModel();
runsModel.setId(String.valueOf(runId));
runsModel.setType("runs");
runsModel.setAttributes(new HashMap<>());

String planStatus = "running";

switch (job.getStatus()) {
case completed:
planStatus = "finished";
break;
case pending:
//check if any step is in status pending else we need to return running
//check if workspace is not lock return running too
Optional<Step> optionalStep = stepRepository.findFirstByJobIdOrderByStepNumber(job.getId());
if (optionalStep.isPresent()) {
Step step = optionalStep.get();
if (step.getStatus().equals(JobStatus.pending)) {
planStatus = "pending";
} else {
planStatus = "running";
}
} else {
planStatus = "pending";
} else {
planStatus = "running";
}
} else {
planStatus = "pending";
}
break;
case running:
case queue:
planStatus = "running";
break;
case failed:
planStatus = "errored";
break;
}

runsModel.getAttributes().put("status", planStatus);
runsModel.getAttributes().put("has-changes", job.isPlanChanges());
runsModel.getAttributes().put("resource-additions", 1);
runsModel.getAttributes().put("resource-changes", 1);
runsModel.getAttributes().put("resource-destructions", 0);
runsModel.getAttributes().put("position-in-queue", calculateRunPositionInQueue(job));
break;
case running:
case queue:
planStatus = "running";
break;
case failed:
planStatus = "errored";
break;
}

HashMap<String, Object> actions = new HashMap<>();
actions.put("is-confirmable", true);
actions.put("is-discardable", true);
runsModel.getAttributes().put("actions", actions);

HashMap<String, Object> permissions = new HashMap<>();
permissions.put("can-apply", true);
runsModel.getAttributes().put("permissions", permissions);

runsData.setData(runsModel);
Relationships relationships = new Relationships();
org.terrakube.api.plugin.state.model.runs.PlanModel planModel = new org.terrakube.api.plugin.state.model.runs.PlanModel();
planModel.setData(new Resource());
planModel.getData().setType("plans");
planModel.getData().setId(String.valueOf(runId));
relationships.setPlan(planModel);

ApplyModel applyModel = new ApplyModel();
applyModel.setData(new Resource());
applyModel.getData().setType("applies");
applyModel.getData().setId(String.valueOf(runId));
relationships.setApply(applyModel);

org.terrakube.api.plugin.state.model.runs.WorkspaceModel workspaceModel = new org.terrakube.api.plugin.state.model.runs.WorkspaceModel();
workspaceModel.setData(new Resource());
workspaceModel.getData().setId(job.getWorkspace().getId().toString());
workspaceModel.getData().setType("workspaces");
relationships.setWorkspace(workspaceModel);

RunEventsModel runEventsModel = new RunEventsModel();
runEventsModel.setData(new ArrayList());
relationships.setRunEventsModel(runEventsModel);

log.info("Included: {}", include);
//if(include != null && include.equals("workspace")){
// runsData.setIncluded(new ArrayList());
// runsData.getIncluded().add(getWorkspace(job.getOrganization().getName(), job.getWorkspace().getName(), new HashMap<>()));
//}

runsData.getData().setRelationships(relationships);

log.info("{}", runsData.toString());
return runsData;
runsModel.getAttributes().put("status", planStatus);
runsModel.getAttributes().put("has-changes", job.isPlanChanges());
runsModel.getAttributes().put("resource-additions", 1);
runsModel.getAttributes().put("resource-changes", 1);
runsModel.getAttributes().put("resource-destructions", 0);
runsModel.getAttributes().put("position-in-queue", calculateRunPositionInQueue(job));

HashMap<String, Object> actions = new HashMap<>();
actions.put("is-confirmable", true);
actions.put("is-discardable", true);
runsModel.getAttributes().put("actions", actions);

HashMap<String, Object> permissions = new HashMap<>();
permissions.put("can-apply", true);
runsModel.getAttributes().put("permissions", permissions);

runsData.setData(runsModel);
Relationships relationships = new Relationships();
org.terrakube.api.plugin.state.model.runs.PlanModel planModel = new org.terrakube.api.plugin.state.model.runs.PlanModel();
planModel.setData(new Resource());
planModel.getData().setType("plans");
planModel.getData().setId(String.valueOf(runId));
relationships.setPlan(planModel);

ApplyModel applyModel = new ApplyModel();
applyModel.setData(new Resource());
applyModel.getData().setType("applies");
applyModel.getData().setId(String.valueOf(runId));
relationships.setApply(applyModel);

org.terrakube.api.plugin.state.model.runs.WorkspaceModel workspaceModel = new org.terrakube.api.plugin.state.model.runs.WorkspaceModel();
workspaceModel.setData(new Resource());
workspaceModel.getData().setId(job.getWorkspace().getId().toString());
workspaceModel.getData().setType("workspaces");
relationships.setWorkspace(workspaceModel);

RunEventsModel runEventsModel = new RunEventsModel();
runEventsModel.setData(new ArrayList());
relationships.setRunEventsModel(runEventsModel);

log.info("Included: {}", include);
//if(include != null && include.equals("workspace")){
// runsData.setIncluded(new ArrayList());
// runsData.getIncluded().add(getWorkspace(job.getOrganization().getName(), job.getWorkspace().getName(), new HashMap<>()));
//}

runsData.getData().setRelationships(relationships);

log.info("{}", runsData.toString());
return runsData;
} else return null;
}

int calculateRunPositionInQueue(Job job){
Expand Down Expand Up @@ -923,11 +926,13 @@ RunsDataList getRunsQueue(String organizationName) {
int runQueue = 0;
for (Job job : jobList) {
log.info("Run Queue {} job {}", runQueue, job.getId());
RunsData runsData = getRun(job.getId(), null);
RunsModel runsModel = runsData.getData();
runsModel.getAttributes().put("position-in-queue", runQueue);
runsDataList.getData().add(runsModel);
runQueue = runQueue + 1;
Optional<RunsData> runsData = Optional.ofNullable(getRun(job.getId(), null));
if (runsData.isPresent()) {
RunsModel runsModel = runsData.get().getData();
runsModel.getAttributes().put("position-in-queue", runQueue);
runsDataList.getData().add(runsModel);
runQueue = runQueue + 1;
}
}
runsDataList.setCurrentPage(1);
runsDataList.setTotalPages(1);
Expand All @@ -953,11 +958,14 @@ RunsDataList getWorkspaceRuns(String workspaceId) {
if(jobList.isPresent()){
for(Job job : jobList.get()){
log.info("Run Workspace {} job {}", runWorkspace, job.getId());
RunsData runsData = getRun(job.getId(), null);
RunsModel runsModel = runsData.getData();
runsModel.getAttributes().put("position-in-queue", runWorkspace);
runsDataList.getData().add(runsModel);
runWorkspace = runWorkspace + 1;
Optional<RunsData> runsData = Optional.ofNullable(getRun(job.getId(), null));
if(runsData.isPresent()){
RunsModel runsModel = runsData.get().getData();
runsModel.getAttributes().put("position-in-queue", runWorkspace);
runsDataList.getData().add(runsModel);
runWorkspace = runWorkspace + 1;
}

}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import org.terrakube.executor.plugin.tfoutput.TerraformOutputPathService;
import org.terrakube.executor.service.mode.TerraformJob;

import java.io.IOException;

@Slf4j
@Service
@AllArgsConstructor
Expand All @@ -31,7 +33,18 @@ public class UpdateJobStatusImpl implements UpdateJobStatus {
@Override
public void setRunningStatus(TerraformJob terraformJob, String commitId) {
if (!executorFlagsProperties.isDisableAcknowledge()) {
Job job = terrakubeClient.getJobById(terraformJob.getOrganizationId(), terraformJob.getJobId()).getData();
Job job = null;
for(int retry=0; retry<5; retry++) {
job = terrakubeClient.getJobById(terraformJob.getOrganizationId(), terraformJob.getJobId()).getData();

if(!job.getRelationships().getStep().getData().isEmpty()){
log.info("Step list is not empty...");
break;
} else {
log.error("Step list is empty for some reason...");
}
}

job.getAttributes().setStatus("running");
job.getAttributes().setCommitId(commitId);

Expand Down

0 comments on commit a9ecd20

Please sign in to comment.