Skip to content

Commit 5df342e

Browse files
authored
Merge branch 'main' into fix/addressing-stack-run
2 parents 2866080 + 30ff4c1 commit 5df342e

10 files changed

Lines changed: 121 additions & 4 deletions

File tree

config/stack.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ func StackOutput(ctx context.Context, l log.Logger, opts *options.TerragruntOpti
214214
}
215215

216216
for _, unit := range stackFile.Units {
217-
unitDir := filepath.Join(dir, StackDir, unit.Path)
217+
unitDir := getUnitDir(dir, unit)
218218

219219
var output map[string]cty.Value
220220

@@ -1027,3 +1027,12 @@ func CleanStacks(_ context.Context, l log.Logger, opts *options.TerragruntOption
10271027

10281028
return errs.ErrorOrNil()
10291029
}
1030+
1031+
// getUnitDir returns the directory path for a unit based on its no_dot_terragrunt_stack setting.
1032+
func getUnitDir(dir string, unit *Unit) string {
1033+
if unit.NoStack != nil && *unit.NoStack {
1034+
return filepath.Join(dir, unit.Path)
1035+
}
1036+
1037+
return filepath.Join(dir, StackDir, unit.Path)
1038+
}

docs-starlight/astro.config.mjs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ export default defineConfig({
7979
}),
8080
integrations: [starlight({
8181
title: "Terragrunt",
82+
editLink: {
83+
// TODO: update this once the docs live in `docs`.
84+
baseUrl: "https://github.com/gruntwork-io/terragrunt/edit/main/docs-starlight",
85+
},
8286
customCss: ["./src/styles/global.css"],
8387
head: [
8488
{

internal/discovery/discovery.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99
"sort"
1010
"strings"
1111

12+
"github.com/gruntwork-io/terragrunt/config/hclparse"
13+
1214
"github.com/gruntwork-io/terragrunt/internal/experiment"
1315
"github.com/gruntwork-io/terragrunt/util"
1416

@@ -18,6 +20,7 @@ import (
1820
"github.com/gruntwork-io/terragrunt/internal/errors"
1921
"github.com/gruntwork-io/terragrunt/options"
2022
"github.com/gruntwork-io/terragrunt/pkg/log"
23+
"github.com/hashicorp/hcl/v2"
2124
"github.com/zclconf/go-cty/cty"
2225
)
2326

@@ -248,6 +251,26 @@ func (c *DiscoveredConfig) Parse(ctx context.Context, l log.Logger, opts *option
248251
config.ExcludeBlock,
249252
)
250253

254+
if suppressParseErrors {
255+
// If suppressing parse errors, we want to filter diagnostics that contain references to outputs,
256+
// while leaving other diagnostics as is.
257+
parseOptions := append(parsingCtx.ParserOptions, hclparse.WithDiagnosticsHandler(func(file *hcl.File, hclDiags hcl.Diagnostics) (hcl.Diagnostics, error) {
258+
filteredDiags := hcl.Diagnostics{}
259+
260+
for _, hclDiag := range hclDiags {
261+
containsOutputRef := strings.Contains(strings.ToLower(hclDiag.Summary), "output") ||
262+
strings.Contains(strings.ToLower(hclDiag.Detail), "output")
263+
264+
if !containsOutputRef {
265+
filteredDiags = append(filteredDiags, hclDiag)
266+
}
267+
}
268+
269+
return filteredDiags, nil
270+
}))
271+
parsingCtx = parsingCtx.WithParseOption(parseOptions)
272+
}
273+
251274
//nolint: contextcheck
252275
cfg, err := config.ParseConfigFile(parsingCtx, l, parseOpts.TerragruntConfigPath, nil)
253276
if err != nil {
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
terraform {
2+
source = "github.com/gruntwork-io/terragrunt.git//test/fixtures/fail-fast/unit-a?ref=v0.84.1"
3+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
terraform {
2+
source = "github.com/gruntwork-io/terragrunt.git//test/fixtures/fail-fast/unit-a?ref=v0.84.1"
3+
}
4+
5+
dependency "unit-a" {
6+
config_path = "../unit-a"
7+
mock_outputs = {
8+
data = "test-data"
9+
}
10+
}
11+
12+
inputs = {
13+
data = dependency.unit-a.outputs.data
14+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
unit "app1" {
2+
source = "../units/app1"
3+
path = "app1"
4+
no_dot_terragrunt_stack = true
5+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
terraform {
2+
required_version = ">= 0.13"
3+
}
4+
5+
variable "name" {
6+
description = "Name of the application"
7+
type = string
8+
}
9+
10+
output "name" {
11+
value = var.name
12+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
terraform {
2+
source = "."
3+
}
4+
5+
inputs = {
6+
name = "app1"
7+
}

test/integration_runner_pool_test.go

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ import (
1313
)
1414

1515
const (
16-
testFixtureMixedConfig = "fixtures/mixed-config"
17-
testFixtureFailFast = "fixtures/fail-fast"
16+
testFixtureMixedConfig = "fixtures/mixed-config"
17+
testFixtureFailFast = "fixtures/fail-fast"
18+
testFixtureRunnerPoolRemoteSource = "fixtures/runner-pool-remote-source"
1819
)
1920

2021
func TestRunnerPoolDiscovery(t *testing.T) {
@@ -119,9 +120,13 @@ func TestRunnerPoolDestroyFailFast(t *testing.T) {
119120
tmpEnvPath := helpers.CopyEnvironment(t, testFixtureFailFast)
120121
testPath := util.JoinPath(tmpEnvPath, testFixtureFailFast)
121122

122-
_, _, err := helpers.RunTerragruntCommandWithOutput(t, "terragrunt run --all --non-interactive --experiment runner-pool --fail-fast --working-dir "+testPath+" -- apply")
123+
_, stdout, err := helpers.RunTerragruntCommandWithOutput(t, "terragrunt run --all --non-interactive --experiment runner-pool --fail-fast --working-dir "+testPath+" -- apply")
123124
require.NoError(t, err)
124125

126+
// Verify that there are no parsing errors in the output
127+
require.NotContains(t, stdout, "Error: Unsupported block type")
128+
require.NotContains(t, stdout, "This object does not have an attribute named \"outputs\"")
129+
125130
// create fail.txt in unit-a to trigger a failure
126131
helpers.CreateFile(t, testPath, "unit-b", "fail.txt")
127132
stdout, stderr, _ := helpers.RunTerragruntCommandWithOutput(t, "terragrunt run --all --non-interactive --experiment runner-pool --fail-fast --working-dir "+testPath+" -- destroy")
@@ -147,3 +152,16 @@ func TestRunnerPoolDestroyDependencies(t *testing.T) {
147152
assert.Contains(t, stdout, "unit-a tf-path="+wrappedBinary()+" msg=Destroy complete! Resources: 1 destroyed.")
148153

149154
}
155+
156+
func TestRunnerPoolRemoteSource(t *testing.T) {
157+
t.Parallel()
158+
159+
helpers.CleanupTerraformFolder(t, testFixtureRunnerPoolRemoteSource)
160+
tmpEnvPath := helpers.CopyEnvironment(t, testFixtureRunnerPoolRemoteSource)
161+
testPath := util.JoinPath(tmpEnvPath, testFixtureRunnerPoolRemoteSource)
162+
163+
stdout, _, err := helpers.RunTerragruntCommandWithOutput(t, "terragrunt run --all --non-interactive --log-level debug --experiment runner-pool --working-dir "+testPath+" -- apply")
164+
require.NoError(t, err)
165+
// Verify that the output contains value produced from remote unit
166+
require.Contains(t, stdout, "data = \"unit-a\"")
167+
}

test/integration_stacks_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ const (
4949
testFixtureStackNoValidation = "fixtures/stacks/no-validation"
5050
testFixtureStackTerragruntDir = "fixtures/stacks/terragrunt-dir"
5151
testFixtureStacksAllNoStackDir = "fixtures/stacks/all-no-stack-dir"
52+
testFixtureStackNoDotTerragruntStackOutput = "fixtures/stacks/no-dot-terragrunt-stack-output"
5253
)
5354

5455
func TestStacksGenerateBasic(t *testing.T) {
@@ -1333,3 +1334,24 @@ func TestStackRunAllNoStackDir(t *testing.T) {
13331334
assert.Contains(t, stdout, "Changes to Outputs:")
13341335
assert.Contains(t, stdout, "+ test = \"value\"")
13351336
}
1337+
1338+
func TestStackOutputWithNoDotTerragruntStack(t *testing.T) {
1339+
t.Parallel()
1340+
1341+
helpers.CleanupTerraformFolder(t, testFixtureStackNoDotTerragruntStackOutput)
1342+
tmpEnvPath := helpers.CopyEnvironment(t, testFixtureStackNoDotTerragruntStackOutput)
1343+
rootPath := util.JoinPath(tmpEnvPath, testFixtureStackNoDotTerragruntStackOutput, "live")
1344+
1345+
helpers.RunTerragrunt(t, "terragrunt stack generate --working-dir "+rootPath)
1346+
1347+
unitPath := util.JoinPath(rootPath, "app1")
1348+
helpers.RunTerragrunt(t, "terragrunt apply -auto-approve --non-interactive --working-dir "+unitPath)
1349+
1350+
stdout, _, err := helpers.RunTerragruntCommandWithOutput(
1351+
t,
1352+
"terragrunt stack output --non-interactive --working-dir "+rootPath,
1353+
)
1354+
require.NoError(t, err)
1355+
1356+
assert.Contains(t, stdout, "name = \"app1\"")
1357+
}

0 commit comments

Comments
 (0)