Skip to content

Commit

Permalink
feat: add support for importing files. (#440)
Browse files Browse the repository at this point in the history
  • Loading branch information
i4ki committed Jul 1, 2022
1 parent 930ee56 commit f92a01a
Show file tree
Hide file tree
Showing 15 changed files with 1,013 additions and 45 deletions.
2 changes: 1 addition & 1 deletion cmd/terramate/cli/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -1152,7 +1152,7 @@ func lookupProject(wd string) (prj project, found bool, err error) {

logger.Trace().Msg("Load root config.")

cfg, err := hcl.ParseDir(root)
cfg, err := hcl.ParseDir(root, root)
if err != nil {
return project{}, false, err
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/terramate/e2etests/exp_init_stack_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func TestStacksInit(t *testing.T) {

for _, path := range tc.input {
dir := filepath.Join(s.RootDir(), path)
got, err := hcl.ParseDir(dir)
got, err := hcl.ParseDir(s.RootDir(), dir)
assert.NoError(t, err, "parsing terramate file")

want := hcl.Config{
Expand Down
2 changes: 1 addition & 1 deletion config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ func TryLoadRootConfig(dir string) (cfg hcl.Config, found bool, err error) {

logger.Trace().Msg("Parse Terramate config.")

cfg, err = hcl.ParseDir(dir)
cfg, err = hcl.ParseDir(dir, dir)
if err != nil {
return hcl.Config{}, false, err
}
Expand Down
218 changes: 218 additions & 0 deletions generate/generate_hcl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,177 @@ func TestGenerateHCL(t *testing.T) {
},
},
},
{
name: "generate HCL for all stacks importing common",
layout: []string{
"s:stacks/stack-1",
"s:stacks/stack-2",
},
configs: []hclconfig{
{
path: "/common",
add: hcldoc(
generateHCL(
labels("backend.tf"),
content(
backend(
labels("test"),
expr("prefix", "global.backend_prefix"),
),
),
),
generateHCL(
labels("locals.tf"),
content(
locals(
expr("stackpath", "terramate.path"),
expr("local_a", "global.local_a"),
expr("local_b", "global.local_b"),
expr("local_c", "global.local_c"),
expr("local_d", "tm_try(global.local_d.field, null)"),
),
),
),
generateHCL(
labels("provider.tf"),
content(
provider(
labels("name"),
expr("data", "global.provider_data"),
),
terraform(
requiredProviders(
expr("name", `{
source = "integrations/name"
version = global.provider_version
}`),
),
),
terraform(
expr("required_version", "global.terraform_version"),
),
),
),
),
},
{
path: "/stacks/stack-1",
add: hcldoc(
importy(
str("source", fmt.Sprintf("/common/%s", config.DefaultFilename)),
),
globals(
str("local_a", "stack-1-local"),
boolean("local_b", true),
number("local_c", 666),
attr("local_d", `{ field = "local_d_field"}`),
str("backend_prefix", "stack-1-backend"),
str("provider_data", "stack-1-provider-data"),
str("provider_version", "stack-1-provider-version"),
str("terraform_version", "stack-1-terraform-version"),
),
),
},
{
path: "/stacks/stack-2",
add: hcldoc(
importy(
str("source", fmt.Sprintf("/common/%s", config.DefaultFilename)),
),
globals(
str("local_a", "stack-2-local"),
boolean("local_b", false),
number("local_c", 777),
attr("local_d", `{ oopsie = "local_d_field"}`),
str("backend_prefix", "stack-2-backend"),
str("provider_data", "stack-2-provider-data"),
str("provider_version", "stack-2-provider-version"),
str("terraform_version", "stack-2-terraform-version"),
),
),
},
},
want: []generatedFile{
{
stack: "/stacks/stack-1",
files: map[string]fmt.Stringer{
"backend.tf": backend(
labels("test"),
str("prefix", "stack-1-backend"),
),
"locals.tf": locals(
str("local_a", "stack-1-local"),
boolean("local_b", true),
number("local_c", 666),
str("local_d", "local_d_field"),
str("stackpath", "/stacks/stack-1"),
),
"provider.tf": hcldoc(
provider(
labels("name"),
str("data", "stack-1-provider-data"),
),
terraform(
requiredProviders(
attr("name", `{
source = "integrations/name"
version = "stack-1-provider-version"
}`),
),
),
terraform(
str("required_version", "stack-1-terraform-version"),
),
),
},
},
{
stack: "/stacks/stack-2",
files: map[string]fmt.Stringer{
"backend.tf": backend(
labels("test"),
str("prefix", "stack-2-backend"),
),
"locals.tf": locals(
str("local_a", "stack-2-local"),
boolean("local_b", false),
number("local_c", 777),
attr("local_d", "null"),
str("stackpath", "/stacks/stack-2"),
),
"provider.tf": hcldoc(
provider(
labels("name"),
str("data", "stack-2-provider-data"),
),
terraform(
requiredProviders(
attr("name", `{
source = "integrations/name"
version = "stack-2-provider-version"
}`),
),
),
terraform(
str("required_version", "stack-2-terraform-version"),
),
),
},
},
},
wantReport: generate.Report{
Successes: []generate.Result{
{
StackPath: "/stacks/stack-1",
Created: []string{"backend.tf", "locals.tf", "provider.tf"},
},
{
StackPath: "/stacks/stack-2",
Created: []string{"backend.tf", "locals.tf", "provider.tf"},
},
},
},
},
{
name: "generate HCL with traversal of unknown namespaces",
layout: []string{
Expand Down Expand Up @@ -348,6 +519,53 @@ func TestGenerateHCL(t *testing.T) {
},
},
},
{
name: "stack imports config with block with same label as parent",
layout: []string{
"s:stacks/stack",
"d:other",
},
configs: []hclconfig{
{
path: "/other",
add: generateHCL(
labels("repeated"),
content(
block("block",
str("data", "imported data"),
),
),
),
},
{
path: "/stacks",
add: generateHCL(
labels("repeated"),
content(
block("block",
str("data", "stacks data"),
),
),
),
},
{
path: "/stacks/stack",
add: importy(
str("source", fmt.Sprintf("/other/%s", config.DefaultFilename)),
),
},
},
wantReport: generate.Report{
Failures: []generate.FailureResult{
{
Result: generate.Result{
StackPath: "/stacks/stack",
},
Error: errors.E(generate.ErrConflictingConfig),
},
},
},
},
{
name: "stack with block with same label as parent but different condition",
layout: []string{
Expand Down
4 changes: 4 additions & 0 deletions generate/generate_hclwrite_utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,7 @@ func locals(builders ...hclwrite.BlockBuilder) *hclwrite.Block {
func terraform(builders ...hclwrite.BlockBuilder) *hclwrite.Block {
return hclwrite.BuildBlock("terraform", builders...)
}

func importy(builders ...hclwrite.BlockBuilder) *hclwrite.Block {
return hclwrite.BuildBlock("import", builders...)
}
2 changes: 1 addition & 1 deletion generate/genfile/genfile.go
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ func loadGenFileBlocks(rootdir string, cfgdir string) ([]genFileBlock, error) {
return nil, nil
}

blocks, err := hcl.ParseGenerateFileBlocks(cfgdir)
blocks, err := hcl.ParseGenerateFileBlocks(rootdir, cfgdir)
if err != nil {
return nil, errors.E(err, "cfgdir %q", cfgdir)
}
Expand Down
2 changes: 1 addition & 1 deletion generate/genhcl/genhcl.go
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ func loadGenHCLBlocks(rootdir string, cfgdir string) ([]loadedHCL, error) {
return nil, nil
}

blocks, err := hcl.ParseGenerateHCLBlocks(cfgdir)
blocks, err := hcl.ParseGenerateHCLBlocks(rootdir, cfgdir)
if err != nil {
return nil, errors.E(ErrParsing, err, "cfgdir %q", cfgdir)
}
Expand Down

0 comments on commit f92a01a

Please sign in to comment.