Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 11 additions & 31 deletions internal/configs/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -205,39 +205,19 @@ func (c *Config) DescendantForInstance(path addrs.ModuleInstance) *Config {
// within the configuration.
//
// This doesn't consider instance expansion, so we're only making sure the
// target could exist if the instance expansion expands correctly.
func (c *Config) TargetExists(target addrs.Targetable) bool {
switch target.AddrType() {
case addrs.ConfigResourceAddrType:
addr := target.(addrs.ConfigResource)
// configuration declares the object whose instances the target selects.
func (c *Config) TargetExists(target addrs.TargetPattern) bool {
switch addr := target.ConfigAddr().(type) {
case addrs.Module:
return c.Descendant(addr) != nil
case addrs.ConfigResource:
module := c.Descendant(addr.Module)
if module != nil {
return module.Module.ResourceByAddr(addr.Resource) != nil
} else {
return false
}
case addrs.AbsResourceInstanceAddrType:
addr := target.(addrs.AbsResourceInstance)
module := c.DescendantForInstance(addr.Module)
if module != nil {
return module.Module.ResourceByAddr(addr.Resource.Resource) != nil
} else {
return false
}
case addrs.AbsResourceAddrType:
addr := target.(addrs.AbsResource)
module := c.DescendantForInstance(addr.Module)
if module != nil {
return module.Module.ResourceByAddr(addr.Resource) != nil
} else {
return false
}
case addrs.ModuleAddrType:
return c.Descendant(target.(addrs.Module)) != nil
case addrs.ModuleInstanceAddrType:
return c.DescendantForInstance(target.(addrs.ModuleInstance)) != nil
return module != nil && module.Module.ResourceByAddr(addr.Resource) != nil
case addrs.ConfigAction:
module := c.Descendant(addr.Module)
return module != nil && module.Module.Actions[addr.Action.String()] != nil
default:
panic(fmt.Errorf("unrecognized targetable type: %d", target.AddrType()))
panic(fmt.Sprintf("unrecognized target %s", target))
}
}

Expand Down
87 changes: 14 additions & 73 deletions internal/configs/mock_provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
"github.com/zclconf/go-cty/cty"

"github.com/hashicorp/terraform/internal/addrs"
"github.com/hashicorp/terraform/internal/tfdiags"
)

var (
Expand Down Expand Up @@ -103,7 +102,7 @@ type MockData struct {
MockResources map[string]*MockResource
MockDataSources map[string]*MockResource
MockEphemeralResources map[string]*MockResource
Overrides addrs.Map[addrs.Targetable, *Override]
Overrides addrs.Map[addrs.TargetPattern, *Override]
}

// Merge will merge the target MockData object into the current MockData.
Expand Down Expand Up @@ -225,7 +224,7 @@ const (
// replacement values that should be used in place of whatever the underlying
// provider would normally do.
type Override struct {
Target addrs.Targetable
Target *addrs.TargetPattern
Values cty.Value

BlockName string
Expand Down Expand Up @@ -256,7 +255,7 @@ func decodeMockDataBody(body hcl.Body, useForPlanDefault bool, source OverrideSo
MockResources: make(map[string]*MockResource),
MockDataSources: make(map[string]*MockResource),
MockEphemeralResources: make(map[string]*MockResource),
Overrides: addrs.MakeMap[addrs.Targetable, *Override](),
Overrides: addrs.MakeMap[addrs.TargetPattern, *Override](),
}

for _, block := range content.Blocks {
Expand Down Expand Up @@ -307,7 +306,7 @@ func decodeMockDataBody(body hcl.Body, useForPlanDefault bool, source OverrideSo
diags = append(diags, overrideDiags...)

if override != nil && override.Target != nil {
subject := override.Target
subject := *override.Target
if previous, ok := data.Overrides.GetOk(subject); ok {
diags = append(diags, &hcl.Diagnostic{
Severity: hcl.DiagError,
Expand All @@ -324,7 +323,7 @@ func decodeMockDataBody(body hcl.Body, useForPlanDefault bool, source OverrideSo
diags = append(diags, overrideDiags...)

if override != nil && override.Target != nil {
subject := override.Target
subject := *override.Target
if previous, ok := data.Overrides.GetOk(subject); ok {
diags = append(diags, &hcl.Diagnostic{
Severity: hcl.DiagError,
Expand All @@ -341,7 +340,7 @@ func decodeMockDataBody(body hcl.Body, useForPlanDefault bool, source OverrideSo
diags = append(diags, overrideDiags...)

if override != nil && override.Target != nil {
subject := override.Target
subject := *override.Target
if previous, ok := data.Overrides.GetOk(subject); ok {
diags = append(diags, &hcl.Diagnostic{
Severity: hcl.DiagError,
Expand Down Expand Up @@ -400,10 +399,7 @@ func decodeOverrideModuleBlock(block *hcl.Block, useForPlanDefault bool, source
override, diags := decodeOverrideBlock(block, "outputs", "override_module", useForPlanDefault, source)

if override.Target != nil {
switch override.Target.AddrType() {
case addrs.ModuleAddrType, addrs.ModuleInstanceAddrType:
// Do nothing, we're good here.
default:
if _, ok := override.Target.ConfigAddr().(addrs.Module); !ok {
diags = diags.Append(&hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Invalid override target",
Expand All @@ -421,26 +417,7 @@ func decodeOverrideResourceBlock(block *hcl.Block, useForPlanDefault bool, sourc
override, diags := decodeOverrideBlock(block, "values", "override_resource", useForPlanDefault, source)

if override.Target != nil {
var mode addrs.ResourceMode

switch override.Target.AddrType() {
case addrs.AbsResourceInstanceAddrType:
subject := override.Target.(addrs.AbsResourceInstance)
mode = subject.Resource.Resource.Mode
case addrs.AbsResourceAddrType:
subject := override.Target.(addrs.AbsResource)
mode = subject.Resource.Mode
default:
diags = diags.Append(&hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Invalid override target",
Detail: fmt.Sprintf("You can only target resources from override_resource blocks, not %s.", override.Target),
Subject: override.TargetRange.Ptr(),
})
return nil, diags
}

if mode != addrs.ManagedResourceMode {
if addr, ok := override.Target.ConfigAddr().(addrs.ConfigResource); !ok || addr.Resource.Mode != addrs.ManagedResourceMode {
diags = diags.Append(&hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Invalid override target",
Expand All @@ -458,26 +435,7 @@ func decodeOverrideEphemeralBlock(block *hcl.Block, useForPlanDefault bool, sour
override, diags := decodeOverrideBlock(block, "values", "override_ephemeral", useForPlanDefault, source)

if override.Target != nil {
var mode addrs.ResourceMode

switch override.Target.AddrType() {
case addrs.AbsResourceInstanceAddrType:
subject := override.Target.(addrs.AbsResourceInstance)
mode = subject.Resource.Resource.Mode
case addrs.AbsResourceAddrType:
subject := override.Target.(addrs.AbsResource)
mode = subject.Resource.Mode
default:
diags = diags.Append(&hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Invalid override target",
Detail: fmt.Sprintf("You can only target ephemeral resources from override_ephemeral blocks, not %s.", override.Target),
Subject: override.TargetRange.Ptr(),
})
return nil, diags
}

if mode != addrs.EphemeralResourceMode {
if addr, ok := override.Target.ConfigAddr().(addrs.ConfigResource); !ok || addr.Resource.Mode != addrs.EphemeralResourceMode {
diags = diags.Append(&hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Invalid override target",
Expand All @@ -495,26 +453,7 @@ func decodeOverrideDataBlock(block *hcl.Block, useForPlanDefault bool, source Ov
override, diags := decodeOverrideBlock(block, "values", "override_data", useForPlanDefault, source)

if override.Target != nil {
var mode addrs.ResourceMode

switch override.Target.AddrType() {
case addrs.AbsResourceInstanceAddrType:
subject := override.Target.(addrs.AbsResourceInstance)
mode = subject.Resource.Resource.Mode
case addrs.AbsResourceAddrType:
subject := override.Target.(addrs.AbsResource)
mode = subject.Resource.Mode
default:
diags = diags.Append(&hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Invalid override target",
Detail: fmt.Sprintf("You can only target data sources from override_data blocks, not %s.", override.Target),
Subject: override.TargetRange.Ptr(),
})
return nil, diags
}

if mode != addrs.DataResourceMode {
if addr, ok := override.Target.ConfigAddr().(addrs.ConfigResource); !ok || addr.Resource.Mode != addrs.DataResourceMode {
diags = diags.Append(&hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Invalid override target",
Expand Down Expand Up @@ -552,9 +491,11 @@ func decodeOverrideBlock(block *hcl.Block, attributeName string, blockName strin
traversal, traversalDiags := hcl.AbsTraversalForExpr(target.Expr)
diags = append(diags, traversalDiags...)
if traversal != nil {
var targetDiags tfdiags.Diagnostics
override.Target, targetDiags = addrs.ParseAbsTargetable(traversal)
target, targetDiags := addrs.ParseTarget(traversal)
diags = append(diags, targetDiags.ToHCL()...)
if !targetDiags.HasErrors() {
override.Target = &target
}
}
} else {
diags = diags.Append(&hcl.Diagnostic{
Expand Down
Loading
Loading