From 13636b1ba2f0a6631afb2c5a31ec50fafd846874 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alfredo=20Espa=C3=B1a?= Date: Wed, 17 Jan 2024 10:52:22 -0600 Subject: [PATCH] Initial OpenTofu support (#675) * Initial OpenTofu support --- .../job/tcl/executor/ExecutorContext.java | 1 + .../job/tcl/executor/ExecutorService.java | 1 + .../terrakube/api/rs/workspace/Workspace.java | 3 +++ .../resources/db/changelog/changelog-demo.xml | 1 + .../main/resources/db/changelog/changelog.xml | 1 + .../db/changelog/demo-data/demo-tofu.xml | 9 +++++++ .../local/changelog-2.19.0-workspace-tofu.xml | 15 +++++++++++ executor/pom.xml | 2 +- .../executor/service/mode/TerraformJob.java | 1 + .../TerraformExecutorServiceImpl.java | 19 ++++++++----- ui/src/domain/Workspaces/Details.jsx | 27 ++++++++++++++----- 11 files changed, 65 insertions(+), 15 deletions(-) create mode 100644 api/src/main/resources/db/changelog/demo-data/demo-tofu.xml create mode 100644 api/src/main/resources/db/changelog/local/changelog-2.19.0-workspace-tofu.xml diff --git a/api/src/main/java/org/terrakube/api/plugin/scheduler/job/tcl/executor/ExecutorContext.java b/api/src/main/java/org/terrakube/api/plugin/scheduler/job/tcl/executor/ExecutorContext.java index bca183504..01f7bbce7 100644 --- a/api/src/main/java/org/terrakube/api/plugin/scheduler/job/tcl/executor/ExecutorContext.java +++ b/api/src/main/java/org/terrakube/api/plugin/scheduler/job/tcl/executor/ExecutorContext.java @@ -29,6 +29,7 @@ public class ExecutorContext { private String accessToken; private String moduleSshKey; private String commitId; + private boolean tofu; private HashMap environmentVariables; private HashMap variables; } diff --git a/api/src/main/java/org/terrakube/api/plugin/scheduler/job/tcl/executor/ExecutorService.java b/api/src/main/java/org/terrakube/api/plugin/scheduler/job/tcl/executor/ExecutorService.java index 81485daa4..057e8fa2a 100644 --- a/api/src/main/java/org/terrakube/api/plugin/scheduler/job/tcl/executor/ExecutorService.java +++ b/api/src/main/java/org/terrakube/api/plugin/scheduler/job/tcl/executor/ExecutorService.java @@ -123,6 +123,7 @@ public boolean execute(Job job, String stepId, Flow flow) { executorContext.setModuleSshKey(ssh.get().getPrivateKey()); } } + executorContext.setTofu(job.getWorkspace().isTofu()); executorContext.setCommitId(job.getCommitId()); executorContext.setFolder(job.getWorkspace().getFolder()); executorContext.setRefresh(job.isRefresh()); diff --git a/api/src/main/java/org/terrakube/api/rs/workspace/Workspace.java b/api/src/main/java/org/terrakube/api/rs/workspace/Workspace.java index cbc842fc8..9ae916851 100644 --- a/api/src/main/java/org/terrakube/api/rs/workspace/Workspace.java +++ b/api/src/main/java/org/terrakube/api/rs/workspace/Workspace.java @@ -60,6 +60,9 @@ public class Workspace extends GenericAuditFields { @Column(name = "deleted") private boolean deleted; + @Column(name = "tofu") + private boolean tofu = false; + @Column(name = "module_ssh_key") private String moduleSshKey; diff --git a/api/src/main/resources/db/changelog/changelog-demo.xml b/api/src/main/resources/db/changelog/changelog-demo.xml index afc30a765..c4ad4f9a2 100644 --- a/api/src/main/resources/db/changelog/changelog-demo.xml +++ b/api/src/main/resources/db/changelog/changelog-demo.xml @@ -13,4 +13,5 @@ + \ No newline at end of file diff --git a/api/src/main/resources/db/changelog/changelog.xml b/api/src/main/resources/db/changelog/changelog.xml index 4a69db76c..be6ffb377 100644 --- a/api/src/main/resources/db/changelog/changelog.xml +++ b/api/src/main/resources/db/changelog/changelog.xml @@ -45,4 +45,5 @@ + \ No newline at end of file diff --git a/api/src/main/resources/db/changelog/demo-data/demo-tofu.xml b/api/src/main/resources/db/changelog/demo-data/demo-tofu.xml new file mode 100644 index 000000000..22fe09757 --- /dev/null +++ b/api/src/main/resources/db/changelog/demo-data/demo-tofu.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/api/src/main/resources/db/changelog/local/changelog-2.19.0-workspace-tofu.xml b/api/src/main/resources/db/changelog/local/changelog-2.19.0-workspace-tofu.xml new file mode 100644 index 000000000..2e8a20e7e --- /dev/null +++ b/api/src/main/resources/db/changelog/local/changelog-2.19.0-workspace-tofu.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/executor/pom.xml b/executor/pom.xml index 4880eb236..0d8646b27 100644 --- a/executor/pom.xml +++ b/executor/pom.xml @@ -16,7 +16,7 @@ 17 1.10.0 - 0.11.2 + 0.12.0 0.12.0 2.8.0 1.15 diff --git a/executor/src/main/java/org/terrakube/executor/service/mode/TerraformJob.java b/executor/src/main/java/org/terrakube/executor/service/mode/TerraformJob.java index 4449ada7e..dcb3c809e 100644 --- a/executor/src/main/java/org/terrakube/executor/service/mode/TerraformJob.java +++ b/executor/src/main/java/org/terrakube/executor/service/mode/TerraformJob.java @@ -30,6 +30,7 @@ public class TerraformJob { private boolean refreshOnly; private String moduleSshKey; private String commitId; + private boolean tofu; private HashMap environmentVariables; private HashMap variables; diff --git a/executor/src/main/java/org/terrakube/executor/service/terraform/TerraformExecutorServiceImpl.java b/executor/src/main/java/org/terrakube/executor/service/terraform/TerraformExecutorServiceImpl.java index d6e0460f2..772d85a5e 100644 --- a/executor/src/main/java/org/terrakube/executor/service/terraform/TerraformExecutorServiceImpl.java +++ b/executor/src/main/java/org/terrakube/executor/service/terraform/TerraformExecutorServiceImpl.java @@ -107,7 +107,7 @@ public ExecutorJobResult plan(TerraformJob terraformJob, File workingDirectory, scriptBeforeSuccessPlan = executePreOperationScripts(terraformJob, terraformWorkingDir, planOutput); - showTerraformMessage("PLAN", planOutput); + showTerraformMessage(terraformJob,"PLAN", planOutput); if (scriptBeforeSuccessPlan) if (isDestroy) { @@ -180,7 +180,7 @@ public ExecutorJobResult apply(TerraformJob terraformJob, File workingDirectory) scriptBeforeSuccess = executePreOperationScripts(terraformJob, terraformWorkingDir, applyOutput); - showTerraformMessage("APPLY", applyOutput); + showTerraformMessage(terraformJob, "APPLY", applyOutput); if (scriptBeforeSuccess) { TerraformProcessData terraformProcessData = getTerraformProcessData(terraformJob, terraformWorkingDir); @@ -245,7 +245,7 @@ public ExecutorJobResult destroy(TerraformJob terraformJob, File workingDirector scriptBeforeSuccess = executePreOperationScripts(terraformJob, terraformWorkingDir, outputDestroy); - showTerraformMessage("DESTROY", outputDestroy); + showTerraformMessage(terraformJob, "DESTROY", outputDestroy); if (scriptBeforeSuccess) { execution = terraformClient.destroy( @@ -410,15 +410,19 @@ private void initBanner(TerraformJob terraformJob, Consumer output) { output.accept( colorize("Initializing Terrakube Job " + terraformJob.getJobId() + " Step " + terraformJob.getStepId(), colorMessage)); - output.accept(colorize("Running Terraform " + terraformJob.getTerraformVersion(), colorMessage)); + output.accept(colorize(String.format("Running %s ", getIaCType(terraformJob)) + terraformJob.getTerraformVersion(), colorMessage)); output.accept(colorize("\n\n" + STEP_SEPARATOR, colorMessage)); - output.accept(colorize("Running Terraform Init: ", colorMessage)); + output.accept(colorize(String.format("Running %s Init: ",getIaCType(terraformJob)), colorMessage)); } - private void showTerraformMessage(String operation, Consumer output) throws InterruptedException { + private String getIaCType(TerraformJob terraformJob){ + return terraformJob.isTofu() ? "Tofu": "Terraform"; + } + + private void showTerraformMessage(TerraformJob terraformJob, String operation, Consumer output) throws InterruptedException { AnsiFormat colorMessage = new AnsiFormat(GREEN_TEXT(), BLACK_BACK(), BOLD()); output.accept(colorize(STEP_SEPARATOR, colorMessage)); - output.accept(colorize("Running Terraform " + operation, colorMessage)); + output.accept(colorize(String.format("Running %s ",getIaCType(terraformJob)) + operation, colorMessage)); output.accept(colorize(STEP_SEPARATOR, colorMessage)); Thread.sleep(2000); } @@ -456,6 +460,7 @@ private TerraformProcessData getTerraformProcessData(TerraformJob terraformJob, .workingDirectory(workingDirectory) .refresh(terraformJob.isRefresh()) .refreshOnly(terraformJob.isRefreshOnly()) + .tofu(terraformJob.isTofu()) .sshFile(sshKeyFile) .build(); diff --git a/ui/src/domain/Workspaces/Details.jsx b/ui/src/domain/Workspaces/Details.jsx index 74d2fdc9a..3960520c3 100644 --- a/ui/src/domain/Workspaces/Details.jsx +++ b/ui/src/domain/Workspaces/Details.jsx @@ -315,6 +315,7 @@ export const WorkspaceDetails = (props) => { executionMode: values.executionMode, moduleSshKey: values.moduleSshKey, terraformVersion: values.terraformVersion, + tofu: values.tofu, }, }, }; @@ -798,6 +799,7 @@ export const WorkspaceDetails = (props) => { moduleSshKey: workspace.data.attributes.moduleSshKey, executionMode: workspace.data.attributes.executionMode, + tofu: workspace.data.attributes.tofu, }} layout="vertical" name="form-settings" @@ -857,15 +859,26 @@ export const WorkspaceDetails = (props) => { , + }} + > + + +