Skip to content

Commit

Permalink
✨ : save plan for currently running job step
Browse files Browse the repository at this point in the history
  • Loading branch information
juwit committed Feb 2, 2021
1 parent 5a9e74c commit 34058f2
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 1 deletion.
22 changes: 22 additions & 0 deletions src/main/java/io/gaia_app/runner/RunnerController.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import io.gaia_app.credentials.CredentialsService;
import io.gaia_app.stacks.bo.*;
import io.gaia_app.stacks.repository.JobRepository;
import io.gaia_app.stacks.repository.PlanRepository;
import io.gaia_app.stacks.repository.StackRepository;
import io.gaia_app.stacks.repository.StepRepository;
import io.gaia_app.stacks.workflow.JobWorkflow;
Expand All @@ -14,6 +15,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

/**
* Controller for the operations that are called by the runner only
Expand All @@ -22,6 +24,8 @@
@RequestMapping("/api/runner")
public class RunnerController {

private static final Logger LOG = Logger.getLogger("RunnerController");

@Autowired
private StackRepository stackRepository;

Expand All @@ -37,6 +41,9 @@ public class RunnerController {
@Autowired
private RunnerCommandBuilder runnerCommandBuilder;

@Autowired
private PlanRepository planRepository;

@GetMapping(value = "/stacks/{id}.tfvars", produces = "text/plain")
public String tfvars(@PathVariable String id){
var stack = stackRepository.findById(id).orElseThrow();
Expand Down Expand Up @@ -148,4 +155,19 @@ public void startStep(@PathVariable String stepId) {
this.stepRepository.saveAll(job.getSteps());
this.jobRepository.save(job);
}

@PostMapping(value = "/stacks/{stackId}/jobs/{jobId}/plan")
public void uploadPlan(@PathVariable String stackId, @PathVariable String jobId, @RequestBody Plan plan){
LOG.info("received plan from runner");

// saving the plan
planRepository.save(plan);

var job = this.jobRepository.findById(jobId).orElseThrow();
var planStep = job.getSteps().get(0);
planStep.setPlan(plan);

// updating the step with the link to the plan
stepRepository.save(planStep);
}
}
12 changes: 11 additions & 1 deletion src/main/java/io/gaia_app/stacks/bo/Plan.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,22 @@ import com.fasterxml.jackson.annotation.JsonAlias
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.annotation.JsonValue
import java.util.*

/**
* Represents the structure of terraform plan result.
*/
@JsonIgnoreProperties(ignoreUnknown = true)
data class Plan(val terraform_version:String, val resource_changes:List<ResourceChange>)
data class Plan(val id:String = UUID.randomUUID().toString(),
val terraform_version:String,
val resource_changes:List<ResourceChange>) {

fun getCreateCount() = resource_changes.count { it.change.actions.contains(ChangesTypes.CREATE) }
fun getUpdateCount() = resource_changes.count { it.change.actions.contains(ChangesTypes.UPDATE) }
fun getDeleteCount() = resource_changes.count { it.change.actions.contains(ChangesTypes.DELETE) }
fun getNoOpCount() = resource_changes.count { it.change.actions.contains(ChangesTypes.NOOP) }

}

/**
* Represents a resource_changes object in the plan
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/io/gaia_app/stacks/bo/Step.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package io.gaia_app.stacks.bo;

import org.springframework.data.mongodb.core.mapping.DBRef;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.LinkedList;
Expand All @@ -20,6 +22,9 @@ public class Step {
private StepStatus status = StepStatus.PENDING;
private List<String> logs = new LinkedList<>();

@DBRef
private Plan plan;

public Step() {
}

Expand Down Expand Up @@ -110,4 +115,11 @@ public void setLogs(List<String> logs) {
this.logs = logs;
}

public Plan getPlan() {
return plan;
}

public void setPlan(Plan plan) {
this.plan = plan;
}
}
11 changes: 11 additions & 0 deletions src/main/java/io/gaia_app/stacks/repository/PlanRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package io.gaia_app.stacks.repository;

import io.gaia_app.stacks.bo.Plan;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

/**
* Repository for plan data
*/
@Repository
public interface PlanRepository extends MongoRepository<Plan, String> {}
42 changes: 42 additions & 0 deletions src/test/java/io/gaia_app/runner/RunnerControllerIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,22 @@
import io.gaia_app.stacks.repository.StackRepository;
import io.gaia_app.stacks.repository.StepRepository;
import io.gaia_app.test.SharedMongoContainerTest;
import org.assertj.core.util.Files;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.MediaType;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;

import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.List;

import static org.assertj.core.api.Assertions.as;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.Matchers.notNullValue;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
Expand Down Expand Up @@ -251,4 +255,42 @@ void updateStepStatus_shouldUpdateStackStateToStopped_inCaseOfSuccessfulApply()
var updatedStack = this.stackRepository.findById("fakeStackId").orElseThrow();
assertThat(updatedStack.getState()).isEqualTo(StackState.STOPPED);
}

@Test
@WithMockUser("gaia-runner")
void uploadPlan_shouldUpdateTheJob_withThePlanData() throws Exception {
// given
var planStep = new Step(StepType.PLAN, "fakeJobId");
planStep.setStatus(StepStatus.FINISHED);

var job = new Job();
job.setId("fakeJobId");
job.setStackId("fakeStackId");
job.setType(JobType.DESTROY);
job.setStatus(JobStatus.APPLY_STARTED);
job.setSteps(List.of(planStep));

this.jobRepository.save(job);
this.stepRepository.saveAll(job.getSteps());

// when
String planContent = Files.contentOf(new ClassPathResource("sample-plan.json").getFile(), StandardCharsets.UTF_8);
mockMvc.perform(
post("/api/runner/stacks/{stackId}/jobs/{jobId}/plan", "stackId", job.getId())
.with(csrf())
.contentType(MediaType.APPLICATION_JSON)
.content(planContent))
.andExpect(status().isOk())
.andReturn();

// then
var savedStep = stepRepository.findById(planStep.getId());
assertThat(savedStep).isPresent();
assertThat(savedStep.get().getPlan()).satisfies(it -> {
assertThat(it.getCreateCount()).isEqualTo(2);
assertThat(it.getUpdateCount()).isEqualTo(1);
assertThat(it.getDeleteCount()).isEqualTo(1);
assertThat(it.getNoOpCount()).isEqualTo(1);
});
}
}

0 comments on commit 34058f2

Please sign in to comment.