From 5dbd9699f27e5ef73fd47fa7e9276773844e4807 Mon Sep 17 00:00:00 2001 From: Paddy Carver Date: Tue, 24 Sep 2019 11:21:38 -0700 Subject: [PATCH] Various bug fixes. Actually initialize the ProviderMetas map for the Module when calling configs.NewModules so we don't panic. Check the NodeValidatableResource implements GraphNodeAttachProviderMetaConfigs. When calling terraform.loadProviderSchemas, actually set the ProviderMeta block. Add ProviderMeta to state. For some reason? I don't know why. Fix the ProviderTransformer to use the ProviderConfig.Type instead of String() output for the provider when looking up the ProviderMeta to use. --- configs/module.go | 1 + terraform/eval_apply.go | 1 - terraform/node_resource_validate.go | 13 +++++++------ terraform/schemas.go | 4 ++++ terraform/state.go | 2 ++ terraform/transform_provider.go | 2 +- 6 files changed, 15 insertions(+), 8 deletions(-) diff --git a/configs/module.go b/configs/module.go index 90bf180e59..159cdfdca9 100644 --- a/configs/module.go +++ b/configs/module.go @@ -93,6 +93,7 @@ func NewModule(primaryFiles, overrideFiles []*File) (*Module, hcl.Diagnostics) { ModuleCalls: map[string]*ModuleCall{}, ManagedResources: map[string]*Resource{}, DataResources: map[string]*Resource{}, + ProviderMetas: map[string]*ProviderMeta{}, } for _, file := range primaryFiles { diff --git a/terraform/eval_apply.go b/terraform/eval_apply.go index 725595b869..e389e6b928 100644 --- a/terraform/eval_apply.go +++ b/terraform/eval_apply.go @@ -88,7 +88,6 @@ func (n *EvalApply) Eval(ctx EvalContext) (interface{}, error) { Subject: &n.ProviderMeta.ProviderRange, }) } else { - var configDiags tfdiags.Diagnostics metaConfigVal, _, configDiags = ctx.EvaluateBlock(n.ProviderMeta.Config, (*n.ProviderSchema).ProviderMeta, nil, EvalDataForNoInstanceKey) diags = diags.Append(configDiags) diff --git a/terraform/node_resource_validate.go b/terraform/node_resource_validate.go index 51bfd6f5d5..b0a11c1555 100644 --- a/terraform/node_resource_validate.go +++ b/terraform/node_resource_validate.go @@ -15,12 +15,13 @@ type NodeValidatableResource struct { } var ( - _ GraphNodeSubPath = (*NodeValidatableResource)(nil) - _ GraphNodeEvalable = (*NodeValidatableResource)(nil) - _ GraphNodeReferenceable = (*NodeValidatableResource)(nil) - _ GraphNodeReferencer = (*NodeValidatableResource)(nil) - _ GraphNodeResource = (*NodeValidatableResource)(nil) - _ GraphNodeAttachResourceConfig = (*NodeValidatableResource)(nil) + _ GraphNodeSubPath = (*NodeValidatableResource)(nil) + _ GraphNodeEvalable = (*NodeValidatableResource)(nil) + _ GraphNodeReferenceable = (*NodeValidatableResource)(nil) + _ GraphNodeReferencer = (*NodeValidatableResource)(nil) + _ GraphNodeResource = (*NodeValidatableResource)(nil) + _ GraphNodeAttachResourceConfig = (*NodeValidatableResource)(nil) + _ GraphNodeAttachProviderMetaConfigs = (*NodeValidatableResource)(nil) ) // GraphNodeEvalable diff --git a/terraform/schemas.go b/terraform/schemas.go index df9fd585e7..80eb80e60d 100644 --- a/terraform/schemas.go +++ b/terraform/schemas.go @@ -160,6 +160,10 @@ func loadProviderSchemas(schemas map[string]*ProviderSchema, config *configs.Con } } + if resp.ProviderMeta.Block != nil { + s.ProviderMeta = resp.ProviderMeta.Block + } + schemas[typeName] = s } diff --git a/terraform/state.go b/terraform/state.go index 2f97e5af3c..95c1e85130 100644 --- a/terraform/state.go +++ b/terraform/state.go @@ -1634,6 +1634,8 @@ type InstanceState struct { // and collections. Meta map[string]interface{} `json:"meta"` + ProviderMeta cty.Value + // Tainted is used to mark a resource for recreation. Tainted bool `json:"tainted"` diff --git a/terraform/transform_provider.go b/terraform/transform_provider.go index d8cebe713a..60f2d09838 100644 --- a/terraform/transform_provider.go +++ b/terraform/transform_provider.go @@ -140,7 +140,7 @@ func (t *ProviderTransformer) Transform(g *Graph) error { log.Printf("[TRACE] ProviderTransformer: no provider metas defined for %s", dag.VertexName(v)) continue } - if meta, ok := t.Config.Module.ProviderMetas[p.String()]; ok { + if meta, ok := t.Config.Module.ProviderMetas[p.ProviderConfig.Type]; ok { gnapmc.AttachProviderMetaConfigs(meta) } }