mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-26 00:41:27 -06:00
8cd0ee80e5
It seems that this somehow got lost in the commit/rebase shuffle and wasn't caught by the tests that _did_ make it because they were all using just one file. As a result of this bug, locals would fail to work correctly in any configuration with more than one .tf file. Along with restoring the append/merge behavior, this also reworks some of the tests to exercise the multi-file case as better insurance against regressions of this sort in future. This fixes #15969.
93 lines
2.5 KiB
Go
93 lines
2.5 KiB
Go
package config
|
|
|
|
// Append appends one configuration to another.
|
|
//
|
|
// Append assumes that both configurations will not have
|
|
// conflicting variables, resources, etc. If they do, the
|
|
// problems will be caught in the validation phase.
|
|
//
|
|
// It is possible that c1, c2 on their own are not valid. For
|
|
// example, a resource in c2 may reference a variable in c1. But
|
|
// together, they would be valid.
|
|
func Append(c1, c2 *Config) (*Config, error) {
|
|
c := new(Config)
|
|
|
|
// Append unknown keys, but keep them unique since it is a set
|
|
unknowns := make(map[string]struct{})
|
|
for _, k := range c1.unknownKeys {
|
|
_, present := unknowns[k]
|
|
if !present {
|
|
unknowns[k] = struct{}{}
|
|
c.unknownKeys = append(c.unknownKeys, k)
|
|
}
|
|
}
|
|
|
|
for _, k := range c2.unknownKeys {
|
|
_, present := unknowns[k]
|
|
if !present {
|
|
unknowns[k] = struct{}{}
|
|
c.unknownKeys = append(c.unknownKeys, k)
|
|
}
|
|
}
|
|
|
|
c.Atlas = c1.Atlas
|
|
if c2.Atlas != nil {
|
|
c.Atlas = c2.Atlas
|
|
}
|
|
|
|
// merge Terraform blocks
|
|
if c1.Terraform != nil {
|
|
c.Terraform = c1.Terraform
|
|
if c2.Terraform != nil {
|
|
c.Terraform.Merge(c2.Terraform)
|
|
}
|
|
} else {
|
|
c.Terraform = c2.Terraform
|
|
}
|
|
|
|
if len(c1.Modules) > 0 || len(c2.Modules) > 0 {
|
|
c.Modules = make(
|
|
[]*Module, 0, len(c1.Modules)+len(c2.Modules))
|
|
c.Modules = append(c.Modules, c1.Modules...)
|
|
c.Modules = append(c.Modules, c2.Modules...)
|
|
}
|
|
|
|
if len(c1.Outputs) > 0 || len(c2.Outputs) > 0 {
|
|
c.Outputs = make(
|
|
[]*Output, 0, len(c1.Outputs)+len(c2.Outputs))
|
|
c.Outputs = append(c.Outputs, c1.Outputs...)
|
|
c.Outputs = append(c.Outputs, c2.Outputs...)
|
|
}
|
|
|
|
if len(c1.ProviderConfigs) > 0 || len(c2.ProviderConfigs) > 0 {
|
|
c.ProviderConfigs = make(
|
|
[]*ProviderConfig,
|
|
0, len(c1.ProviderConfigs)+len(c2.ProviderConfigs))
|
|
c.ProviderConfigs = append(c.ProviderConfigs, c1.ProviderConfigs...)
|
|
c.ProviderConfigs = append(c.ProviderConfigs, c2.ProviderConfigs...)
|
|
}
|
|
|
|
if len(c1.Resources) > 0 || len(c2.Resources) > 0 {
|
|
c.Resources = make(
|
|
[]*Resource,
|
|
0, len(c1.Resources)+len(c2.Resources))
|
|
c.Resources = append(c.Resources, c1.Resources...)
|
|
c.Resources = append(c.Resources, c2.Resources...)
|
|
}
|
|
|
|
if len(c1.Variables) > 0 || len(c2.Variables) > 0 {
|
|
c.Variables = make(
|
|
[]*Variable, 0, len(c1.Variables)+len(c2.Variables))
|
|
c.Variables = append(c.Variables, c1.Variables...)
|
|
c.Variables = append(c.Variables, c2.Variables...)
|
|
}
|
|
|
|
if len(c1.Locals) > 0 || len(c2.Locals) > 0 {
|
|
c.Locals = make([]*Local, 0, len(c1.Locals)+len(c2.Locals))
|
|
c.Locals = append(c.Locals, c1.Locals...)
|
|
c.Locals = append(c.Locals, c2.Locals...)
|
|
}
|
|
|
|
return c, nil
|
|
}
|