Skip to content

Commit

Permalink
add support for opentofu (#738)
Browse files Browse the repository at this point in the history
* add support for opentofu


Former-commit-id: aba7045
  • Loading branch information
motatoes authored Nov 7, 2023
1 parent b1949d3 commit dd7bb31
Show file tree
Hide file tree
Showing 16 changed files with 424 additions and 167 deletions.
5 changes: 5 additions & 0 deletions .github/workflows/go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ jobs:
go-version: 1.21.1
id: go

- name: Setup Opentofu
uses: opentofu/setup-opentofu@v1
with:
tofu_version: 1.6.0-alpha3

- name: Check out code into the Go module directory
uses: actions/checkout@v4

Expand Down
15 changes: 15 additions & 0 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,18 @@ inputs:
description: Setup terragrunt
required: false
default: 'false'
setup-opentofu:
description: Setup OpenToFu
required: false
default: 'false'
terragrunt-version:
description: Terragrunt version
required: false
default: v0.48.6
opentofu-version:
description: OpenTofu version
required: false
default: v1.6.0-alpha3
setup-terraform:
description: Setup terraform
required: false
Expand Down Expand Up @@ -214,6 +222,13 @@ runs:
terragrunt_version: ${{ inputs.terragrunt-version }}
if: inputs.setup-terragrunt == 'true'

- name: Setup OpenTofu
uses: opentofu/[email protected]
with:
tofu_version: ${{ inputs.opentofu-version }}
if: inputs.setup-opentofu == 'true'


- name: Setup Checkov
run: |
python3 -m venv .venv
Expand Down
7 changes: 7 additions & 0 deletions cmd/digger/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,7 @@ func gitHubCI(lock core_locking.Lock, policyChecker core_policy.Checker, backend
ProjectDir: projectConfig.Dir,
ProjectWorkspace: projectConfig.Workspace,
Terragrunt: projectConfig.Terragrunt,
OpenTofu: projectConfig.OpenTofu,
Commands: []string{command},
ApplyStage: orchestrator.ToConfigStage(workflow.Apply),
PlanStage: orchestrator.ToConfigStage(workflow.Plan),
Expand Down Expand Up @@ -238,6 +239,7 @@ func gitHubCI(lock core_locking.Lock, policyChecker core_policy.Checker, backend
ProjectDir: projectConfig.Dir,
ProjectWorkspace: projectConfig.Workspace,
Terragrunt: projectConfig.Terragrunt,
OpenTofu: projectConfig.OpenTofu,
Commands: []string{"digger drift-detect"},
ApplyStage: orchestrator.ToConfigStage(workflow.Apply),
PlanStage: orchestrator.ToConfigStage(workflow.Plan),
Expand Down Expand Up @@ -606,6 +608,7 @@ func bitbucketCI(lock core_locking.Lock, policyChecker core_policy.Checker, back
ProjectDir: projectConfig.Dir,
ProjectWorkspace: projectConfig.Workspace,
Terragrunt: projectConfig.Terragrunt,
OpenTofu: projectConfig.OpenTofu,
Commands: []string{command},
ApplyStage: orchestrator.ToConfigStage(workflow.Apply),
PlanStage: orchestrator.ToConfigStage(workflow.Plan),
Expand Down Expand Up @@ -635,6 +638,7 @@ func bitbucketCI(lock core_locking.Lock, policyChecker core_policy.Checker, back
ProjectDir: projectConfig.Dir,
ProjectWorkspace: projectConfig.Workspace,
Terragrunt: projectConfig.Terragrunt,
OpenTofu: projectConfig.OpenTofu,
Commands: []string{"digger drift-detect"},
ApplyStage: orchestrator.ToConfigStage(workflow.Apply),
PlanStage: orchestrator.ToConfigStage(workflow.Plan),
Expand Down Expand Up @@ -664,6 +668,7 @@ func bitbucketCI(lock core_locking.Lock, policyChecker core_policy.Checker, back
ProjectDir: projectConfig.Dir,
ProjectWorkspace: projectConfig.Workspace,
Terragrunt: projectConfig.Terragrunt,
OpenTofu: projectConfig.OpenTofu,
Commands: workflow.Configuration.OnCommitToDefault,
ApplyStage: orchestrator.ToConfigStage(workflow.Apply),
PlanStage: orchestrator.ToConfigStage(workflow.Plan),
Expand All @@ -690,6 +695,7 @@ func bitbucketCI(lock core_locking.Lock, policyChecker core_policy.Checker, back
ProjectDir: projectConfig.Dir,
ProjectWorkspace: projectConfig.Workspace,
Terragrunt: projectConfig.Terragrunt,
OpenTofu: projectConfig.OpenTofu,
Commands: []string{"digger plan"},
ApplyStage: orchestrator.ToConfigStage(workflow.Apply),
PlanStage: orchestrator.ToConfigStage(workflow.Plan),
Expand Down Expand Up @@ -734,6 +740,7 @@ func bitbucketCI(lock core_locking.Lock, policyChecker core_policy.Checker, back
ProjectDir: project.Dir,
ProjectWorkspace: project.Workspace,
Terragrunt: project.Terragrunt,
OpenTofu: project.OpenTofu,
Commands: workflow.Configuration.OnPullRequestPushed,
ApplyStage: orchestrator.ToConfigStage(workflow.Apply),
PlanStage: orchestrator.ToConfigStage(workflow.Plan),
Expand Down
1 change: 1 addition & 0 deletions libs/digger_config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ type Project struct {
Dir string
Workspace string
Terragrunt bool
OpenTofu bool
Workflow string
IncludePatterns []string
ExcludePatterns []string
Expand Down
1 change: 1 addition & 0 deletions libs/digger_config/converters.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ func copyProjects(projects []*ProjectYaml) []Project {
p.Dir,
p.Workspace,
p.Terragrunt,
p.OpenTofu,
p.Workflow,
p.IncludePatterns,
p.ExcludePatterns,
Expand Down
1 change: 1 addition & 0 deletions libs/digger_config/yaml.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ type ProjectYaml struct {
Dir string `yaml:"dir"`
Workspace string `yaml:"workspace"`
Terragrunt bool `yaml:"terragrunt"`
OpenTofu bool `yaml:"opentofu"`
Workflow string `yaml:"workflow"`
IncludePatterns []string `yaml:"include_patterns,omitempty"`
ExcludePatterns []string `yaml:"exclude_patterns,omitempty"`
Expand Down
57 changes: 30 additions & 27 deletions libs/orchestrator/github/github.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"context"
"fmt"
"github.com/diggerhq/digger/libs/digger_config"
orchestrator2 "github.com/diggerhq/digger/libs/orchestrator"
orchestrator "github.com/diggerhq/digger/libs/orchestrator"
"github.com/dominikbraun/graph"
"log"
"strings"
Expand Down Expand Up @@ -65,11 +65,11 @@ func (svc *GithubService) PublishComment(prNumber int, comment string) error {
return err
}

func (svc *GithubService) GetComments(prNumber int) ([]orchestrator2.Comment, error) {
func (svc *GithubService) GetComments(prNumber int) ([]orchestrator.Comment, error) {
comments, _, err := svc.Client.Issues.ListComments(context.Background(), svc.Owner, svc.RepoName, prNumber, &github.IssueListCommentsOptions{ListOptions: github.ListOptions{PerPage: 100}})
commentBodies := make([]orchestrator2.Comment, len(comments))
commentBodies := make([]orchestrator.Comment, len(comments))
for i, comment := range comments {
commentBodies[i] = orchestrator2.Comment{
commentBodies[i] = orchestrator.Comment{
Id: *comment.ID,
Body: comment.Body,
}
Expand Down Expand Up @@ -177,8 +177,8 @@ func (svc *GithubService) GetBranchName(prNumber int) (string, error) {
return pr.Head.GetRef(), nil
}

func ConvertGithubPullRequestEventToJobs(payload *github.PullRequestEvent, impactedProjects []digger_config.Project, requestedProject *digger_config.Project, workflows map[string]digger_config.Workflow) ([]orchestrator2.Job, bool, error) {
jobs := make([]orchestrator2.Job, 0)
func ConvertGithubPullRequestEventToJobs(payload *github.PullRequestEvent, impactedProjects []digger_config.Project, requestedProject *digger_config.Project, workflows map[string]digger_config.Workflow) ([]orchestrator.Job, bool, error) {
jobs := make([]orchestrator.Job, 0)

for _, project := range impactedProjects {
workflow, ok := workflows[project.Workflow]
Expand All @@ -190,15 +190,15 @@ func ConvertGithubPullRequestEventToJobs(payload *github.PullRequestEvent, impac
pullRequestNumber := payload.PullRequest.Number

if *payload.Action == "closed" && *payload.PullRequest.Merged && *(payload.PullRequest.Base).Ref == *(payload.Repo).DefaultBranch {
jobs = append(jobs, orchestrator2.Job{
jobs = append(jobs, orchestrator.Job{
ProjectName: project.Name,
ProjectDir: project.Dir,
ProjectWorkspace: project.Workspace,
ProjectWorkflow: project.Workflow,
Terragrunt: project.Terragrunt,
Commands: workflow.Configuration.OnCommitToDefault,
ApplyStage: orchestrator2.ToConfigStage(workflow.Apply),
PlanStage: orchestrator2.ToConfigStage(workflow.Plan),
ApplyStage: orchestrator.ToConfigStage(workflow.Apply),
PlanStage: orchestrator.ToConfigStage(workflow.Plan),
CommandEnvVars: commandEnvVars,
StateEnvVars: stateEnvVars,
PullRequestNumber: pullRequestNumber,
Expand All @@ -207,15 +207,16 @@ func ConvertGithubPullRequestEventToJobs(payload *github.PullRequestEvent, impac
RequestedBy: *payload.Sender.Login,
})
} else if *payload.Action == "opened" || *payload.Action == "reopened" || *payload.Action == "synchronize" {
jobs = append(jobs, orchestrator2.Job{
jobs = append(jobs, orchestrator.Job{
ProjectName: project.Name,
ProjectDir: project.Dir,
ProjectWorkspace: project.Workspace,
ProjectWorkflow: project.Workflow,
Terragrunt: project.Terragrunt,
OpenTofu: project.OpenTofu,
Commands: workflow.Configuration.OnPullRequestPushed,
ApplyStage: orchestrator2.ToConfigStage(workflow.Apply),
PlanStage: orchestrator2.ToConfigStage(workflow.Plan),
ApplyStage: orchestrator.ToConfigStage(workflow.Apply),
PlanStage: orchestrator.ToConfigStage(workflow.Plan),
CommandEnvVars: commandEnvVars,
StateEnvVars: stateEnvVars,
PullRequestNumber: pullRequestNumber,
Expand All @@ -224,15 +225,16 @@ func ConvertGithubPullRequestEventToJobs(payload *github.PullRequestEvent, impac
RequestedBy: *payload.Sender.Login,
})
} else if *payload.Action == "closed" {
jobs = append(jobs, orchestrator2.Job{
jobs = append(jobs, orchestrator.Job{
ProjectName: project.Name,
ProjectDir: project.Dir,
ProjectWorkspace: project.Workspace,
ProjectWorkflow: project.Workflow,
Terragrunt: project.Terragrunt,
OpenTofu: project.OpenTofu,
Commands: workflow.Configuration.OnPullRequestClosed,
ApplyStage: orchestrator2.ToConfigStage(workflow.Apply),
PlanStage: orchestrator2.ToConfigStage(workflow.Plan),
ApplyStage: orchestrator.ToConfigStage(workflow.Apply),
PlanStage: orchestrator.ToConfigStage(workflow.Plan),
CommandEnvVars: commandEnvVars,
StateEnvVars: stateEnvVars,
PullRequestNumber: pullRequestNumber,
Expand All @@ -245,8 +247,8 @@ func ConvertGithubPullRequestEventToJobs(payload *github.PullRequestEvent, impac
return jobs, true, nil
}

func ConvertGithubIssueCommentEventToJobs(payload *github.IssueCommentEvent, impactedProjects []digger_config.Project, requestedProject *digger_config.Project, workflows map[string]digger_config.Workflow) ([]orchestrator2.Job, bool, error) {
jobs := make([]orchestrator2.Job, 0)
func ConvertGithubIssueCommentEventToJobs(payload *github.IssueCommentEvent, impactedProjects []digger_config.Project, requestedProject *digger_config.Project, workflows map[string]digger_config.Workflow) ([]orchestrator.Job, bool, error) {
jobs := make([]orchestrator.Job, 0)

supportedCommands := []string{"digger plan", "digger apply", "digger unlock", "digger lock"}

Expand Down Expand Up @@ -277,22 +279,23 @@ func ConvertGithubIssueCommentEventToJobs(payload *github.IssueCommentEvent, imp
stateEnvVars, commandEnvVars := digger_config.CollectTerraformEnvConfig(workflow.EnvVars)

workspace := project.Workspace
workspaceOverride, err := orchestrator2.ParseWorkspace(*payload.Comment.Body)
workspaceOverride, err := orchestrator.ParseWorkspace(*payload.Comment.Body)
if err != nil {
return []orchestrator2.Job{}, false, err
return []orchestrator.Job{}, false, err
}
if workspaceOverride != "" {
workspace = workspaceOverride
}
jobs = append(jobs, orchestrator2.Job{
jobs = append(jobs, orchestrator.Job{
ProjectName: project.Name,
ProjectDir: project.Dir,
ProjectWorkspace: workspace,
ProjectWorkflow: project.Workflow,
Terragrunt: project.Terragrunt,
OpenTofu: project.OpenTofu,
Commands: []string{command},
ApplyStage: orchestrator2.ToConfigStage(workflow.Apply),
PlanStage: orchestrator2.ToConfigStage(workflow.Plan),
ApplyStage: orchestrator.ToConfigStage(workflow.Apply),
PlanStage: orchestrator.ToConfigStage(workflow.Plan),
CommandEnvVars: commandEnvVars,
StateEnvVars: stateEnvVars,
PullRequestNumber: issueNumber,
Expand All @@ -306,7 +309,7 @@ func ConvertGithubIssueCommentEventToJobs(payload *github.IssueCommentEvent, imp
return jobs, coversAllImpactedProjects, nil
}

func ProcessGitHubEvent(ghEvent interface{}, diggerConfig *digger_config.DiggerConfig, ciService orchestrator2.PullRequestService) ([]digger_config.Project, *digger_config.Project, int, error) {
func ProcessGitHubEvent(ghEvent interface{}, diggerConfig *digger_config.DiggerConfig, ciService orchestrator.PullRequestService) ([]digger_config.Project, *digger_config.Project, int, error) {
var impactedProjects []digger_config.Project
var prNumber int

Expand All @@ -329,7 +332,7 @@ func ProcessGitHubEvent(ghEvent interface{}, diggerConfig *digger_config.DiggerC
}

impactedProjects = diggerConfig.GetModifiedProjects(changedFiles)
requestedProject := orchestrator2.ParseProjectName(*event.Comment.Body)
requestedProject := orchestrator.ParseProjectName(*event.Comment.Body)

if requestedProject == "" {
return impactedProjects, nil, prNumber, nil
Expand All @@ -348,7 +351,7 @@ func ProcessGitHubEvent(ghEvent interface{}, diggerConfig *digger_config.DiggerC
return impactedProjects, nil, prNumber, nil
}

func ProcessGitHubPullRequestEvent(payload *github.PullRequestEvent, diggerConfig *digger_config.DiggerConfig, dependencyGraph graph.Graph[string, digger_config.Project], ciService orchestrator2.PullRequestService) ([]digger_config.Project, int, error) {
func ProcessGitHubPullRequestEvent(payload *github.PullRequestEvent, diggerConfig *digger_config.DiggerConfig, dependencyGraph graph.Graph[string, digger_config.Project], ciService orchestrator.PullRequestService) ([]digger_config.Project, int, error) {
var impactedProjects []digger_config.Project
var prNumber int
prNumber = *payload.PullRequest.Number
Expand Down Expand Up @@ -417,7 +420,7 @@ func FindAllProjectsDependantOnImpactedProjects(impactedProjects []digger_config
return impactedProjectsWithDependantProjects, nil
}

func ProcessGitHubIssueCommentEvent(payload *github.IssueCommentEvent, diggerConfig *digger_config.DiggerConfig, dependencyGraph graph.Graph[string, digger_config.Project], ciService orchestrator2.PullRequestService) ([]digger_config.Project, *digger_config.Project, int, error) {
func ProcessGitHubIssueCommentEvent(payload *github.IssueCommentEvent, diggerConfig *digger_config.DiggerConfig, dependencyGraph graph.Graph[string, digger_config.Project], ciService orchestrator.PullRequestService) ([]digger_config.Project, *digger_config.Project, int, error) {
var impactedProjects []digger_config.Project
var prNumber int

Expand All @@ -437,7 +440,7 @@ func ProcessGitHubIssueCommentEvent(payload *github.IssueCommentEvent, diggerCon
}
}

requestedProject := orchestrator2.ParseProjectName(*payload.Comment.Body)
requestedProject := orchestrator.ParseProjectName(*payload.Comment.Body)

if requestedProject == "" {
return impactedProjects, nil, prNumber, nil
Expand Down
1 change: 1 addition & 0 deletions libs/orchestrator/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ type Job struct {
ProjectWorkspace string
ProjectWorkflow string
Terragrunt bool
OpenTofu bool
Commands []string
ApplyStage *Stage
PlanStage *Stage
Expand Down
Loading

0 comments on commit dd7bb31

Please sign in to comment.