From 2c22c213e925ee4fadee30e1569f82eb31c387e1 Mon Sep 17 00:00:00 2001 From: Alisdair McDiarmid Date: Mon, 26 Feb 2024 14:48:29 -0500 Subject: [PATCH] stackeval: More robust absolute source addrs Instead of relying on the module call's source being unique, we now use the entire path as the key for looking up the parent's absolute source address. --- .../internal/stackeval/component_config.go | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/internal/stacks/stackruntime/internal/stackeval/component_config.go b/internal/stacks/stackruntime/internal/stackeval/component_config.go index 6bc03eb098..3c5d4186f2 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_config.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_config.go @@ -452,16 +452,16 @@ func (c *ComponentConfig) tracingName() string { // sourceBundleModuleWalker is an implementation of [configs.ModuleWalker] // that loads all modules from a single source bundle. type sourceBundleModuleWalker struct { - rootModuleSource sourceaddrs.FinalSource - absoluteSourceAddrs map[addrs.ModuleSource]sourceaddrs.FinalSource + absoluteSourceAddrs map[string]sourceaddrs.FinalSource sources *sourcebundle.Bundle parser *configs.SourceBundleParser } func newSourceBundleModuleWalker(rootModuleSource sourceaddrs.FinalSource, sources *sourcebundle.Bundle, parser *configs.SourceBundleParser) *sourceBundleModuleWalker { + absoluteSourceAddrs := make(map[string]sourceaddrs.FinalSource, 1) + absoluteSourceAddrs[addrs.RootModule.String()] = rootModuleSource return &sourceBundleModuleWalker{ - rootModuleSource: rootModuleSource, - absoluteSourceAddrs: make(map[addrs.ModuleSource]sourceaddrs.FinalSource), + absoluteSourceAddrs: absoluteSourceAddrs, sources: sources, parser: parser, } @@ -507,7 +507,7 @@ func (w *sourceBundleModuleWalker) LoadModule(req *configs.ModuleRequest) (*conf // We store the absolute source address for this module so that any in-repo // child modules can use it to construct their absolute source addresses // too. - w.absoluteSourceAddrs[req.SourceAddr] = absoluteSourceAddr + w.absoluteSourceAddrs[req.Path.String()] = absoluteSourceAddr _, err = w.sources.LocalPathForSource(absoluteSourceAddr) if err != nil { @@ -603,13 +603,15 @@ func (w *sourceBundleModuleWalker) bundleSourceAddrForTerraformSourceAddr(tfSour func (w *sourceBundleModuleWalker) absoluteSourceAddr(sourceAddr sourceaddrs.FinalSource, parent *configs.Config) (sourceaddrs.FinalSource, error) { switch source := sourceAddr.(type) { case sourceaddrs.LocalSource: - parentSourceAddr := w.rootModuleSource + parentPath := addrs.RootModule if parent != nil { - if p, ok := w.absoluteSourceAddrs[parent.SourceAddr]; ok { - parentSourceAddr = p - } + parentPath = parent.Path + } + absoluteParentSourceAddr, ok := w.absoluteSourceAddrs[parentPath.String()] + if !ok { + return nil, fmt.Errorf("unexpected missing source address for module parent %q", parentPath) } - return sourceaddrs.ResolveRelativeFinalSource(parentSourceAddr, source) + return sourceaddrs.ResolveRelativeFinalSource(absoluteParentSourceAddr, source) default: return sourceAddr, nil }