diff --git a/config/config.go b/config/config.go index fb4b6bf71de5..08a875e1abac 100644 --- a/config/config.go +++ b/config/config.go @@ -110,6 +110,7 @@ type ResourceLifecycle struct { CreateBeforeDestroy bool `mapstructure:"create_before_destroy"` PreventDestroy bool `mapstructure:"prevent_destroy"` IgnoreChanges []string `mapstructure:"ignore_changes"` + HideIgnored bool `mapstructure:"hide_ignored"` } // Copy returns a copy of this ResourceLifecycle diff --git a/config/loader_hcl.go b/config/loader_hcl.go index 8c81156e47a9..4be3c377b529 100644 --- a/config/loader_hcl.go +++ b/config/loader_hcl.go @@ -675,7 +675,7 @@ func loadManagedResourcesHcl(list *ast.ObjectList) ([]*Resource, error) { var lifecycle ResourceLifecycle if o := listVal.Filter("lifecycle"); len(o.Items) > 0 { // Check for invalid keys - valid := []string{"create_before_destroy", "ignore_changes", "prevent_destroy"} + valid := []string{"create_before_destroy", "ignore_changes", "hide_ignored", "prevent_destroy"} if err := checkHCLKeys(o.Items[0].Val, valid); err != nil { return nil, multierror.Prefix(err, fmt.Sprintf( "%s[%s]:", t, k)) diff --git a/terraform/eval_hide_ignored.go b/terraform/eval_hide_ignored.go new file mode 100644 index 000000000000..12aea2126552 --- /dev/null +++ b/terraform/eval_hide_ignored.go @@ -0,0 +1,40 @@ +package terraform + +import ( + "strings" + + "github.com/hashicorp/terraform/config" +) + +// EvalHideIgnored is an EvalNode implementation that removes ignored +// attributes from the state. +type EvalHideIgnored struct { + Resource *config.Resource + State **InstanceState +} + +func (n *EvalHideIgnored) Eval(ctx EvalContext) (interface{}, error) { + if n.State == nil || *n.State == nil || n.Resource == nil || n.Resource.Id() == "" { + return nil, nil + } + var state *InstanceState = *n.State + + if !n.Resource.Lifecycle.HideIgnored { + return nil, nil + } + + ignoreChanges := n.Resource.Lifecycle.IgnoreChanges + if len(ignoreChanges) == 0 { + return nil, nil + } + + for _, ignoredName := range ignoreChanges { + for name := range state.Attributes { + if strings.HasPrefix(name, ignoredName) { + delete(state.Attributes, name) + } + } + } + + return nil, nil +} diff --git a/terraform/transform_resource.go b/terraform/transform_resource.go index 81c5bae56cdd..12b2be2c13f5 100644 --- a/terraform/transform_resource.go +++ b/terraform/transform_resource.go @@ -303,6 +303,10 @@ func (n *graphNodeExpandedResource) managedResourceEvalNodes(resource *Resource, State: &state, Output: &state, }, + &EvalHideIgnored{ + Resource: n.Resource, + State: &state, + }, &EvalWriteState{ Name: n.stateId(), ResourceType: n.Resource.Type, @@ -348,6 +352,10 @@ func (n *graphNodeExpandedResource) managedResourceEvalNodes(resource *Resource, Resource: n.Resource, Diff: &diff, }, + &EvalHideIgnored{ + Resource: n.Resource, + State: &state, + }, &EvalWriteState{ Name: n.stateId(), ResourceType: n.Resource.Type, @@ -499,6 +507,10 @@ func (n *graphNodeExpandedResource) managedResourceEvalNodes(resource *Resource, Error: &err, CreateNew: &createNew, }, + &EvalHideIgnored{ + Resource: n.Resource, + State: &state, + }, &EvalWriteState{ Name: n.stateId(), ResourceType: n.Resource.Type, @@ -922,6 +934,10 @@ func (n *graphNodeExpandedResourceDestroy) EvalTree() EvalNode { Error: &err, }, }, + &EvalHideIgnored{ + Resource: n.Resource, + State: &state, + }, &EvalWriteState{ Name: n.stateId(), ResourceType: n.Resource.Type,