diff --git a/modinstaller/mod_installer.go b/modinstaller/mod_installer.go index 5909a0f65..a02a22779 100644 --- a/modinstaller/mod_installer.go +++ b/modinstaller/mod_installer.go @@ -337,7 +337,7 @@ func (i *ModInstaller) getModRefSatisfyingConstraints(modVersion *modconfig.ModV // find a version which satisfies the version constraint var version = getVersionSatisfyingConstraint(modVersion.Constraint, availableVersions) if version == nil { - return nil, fmt.Errorf("no version of %s found satisfying verison constraint: %s", modVersion.Name, modVersion.Constraint.Original) + return nil, fmt.Errorf("no version of %s found satisfying version constraint: %s", modVersion.Name, modVersion.Constraint.Original) } return NewResolvedModRef(modVersion, version) diff --git a/steampipeconfig/load_mod.go b/steampipeconfig/load_mod.go index 8429edc9e..91ebf400e 100644 --- a/steampipeconfig/load_mod.go +++ b/steampipeconfig/load_mod.go @@ -77,6 +77,9 @@ func LoadMod(modPath string, parentRunCtx *parse.RunContext) (mod *modconfig.Mod // now we have loaded dependencies, set the current mod on the run context runCtx.CurrentMod = mod + // now populate the resource maps of the current mod using the dependency mods + mod.ResourceMaps = runCtx.GetResourceMaps() + // if flag is set, create pseudo resources by mapping files var pseudoResources []modconfig.MappableResource if runCtx.CreatePseudoResources() { diff --git a/steampipeconfig/modconfig/mod.go b/steampipeconfig/modconfig/mod.go index de80d3bfb..9a8cd58f3 100644 --- a/steampipeconfig/modconfig/mod.go +++ b/steampipeconfig/modconfig/mod.go @@ -259,9 +259,6 @@ func (m *Mod) OnDecoded(block *hcl.Block, resourceMapProvider ModResourcesProvid m.Require = m.LegacyRequire } - // populate resource map references - m.ResourceMaps.PopulateReferences() - // initialise our Require if m.Require == nil { return nil diff --git a/steampipeconfig/parse/run_context.go b/steampipeconfig/parse/run_context.go index eb71d5f08..9382ea531 100644 --- a/steampipeconfig/parse/run_context.go +++ b/steampipeconfig/parse/run_context.go @@ -332,8 +332,19 @@ func (r *RunContext) GetMod(modShortName string) *modconfig.Mod { } func (r *RunContext) GetResourceMaps() *modconfig.ModResources { - // TODO [reports] add dep mods - return r.CurrentMod.GetResourceMaps() + dependencyResourceMaps := make([]*modconfig.ModResources, len(r.LoadedDependencyMods)) + idx := 0 + // use the current mod as the base resource map + resourceMap := r.CurrentMod.GetResourceMaps() + + // merge in the dependency mods + for _, m := range r.LoadedDependencyMods { + dependencyResourceMaps[idx] = m.GetResourceMaps() + idx++ + } + + resourceMap = resourceMap.Merge(dependencyResourceMaps) + return resourceMap } func (r *RunContext) newDependencyGraph() *topsort.Graph { diff --git a/workspace/workspace.go b/workspace/workspace.go index f0957461e..3cfff311b 100644 --- a/workspace/workspace.go +++ b/workspace/workspace.go @@ -45,9 +45,6 @@ type Workspace struct { // callback function to reset display after the file watche displays messages onFileWatcherEventMessages func() loadPseudoResources bool - - // maps of mod resources from this mod and ALL DEPENDENCIES, keyed by long and short names - resourceMaps *modconfig.ModResources } // Load creates a Workspace and loads the workspace mod @@ -219,6 +216,9 @@ func (w *Workspace) loadWorkspaceMod(ctx context.Context) error { return err } + // populate the mod references map references + m.ResourceMaps.PopulateReferences() + // now set workspace properties w.Mod = m @@ -227,9 +227,6 @@ func (w *Workspace) loadWorkspaceMod(ctx context.Context) error { // NOTE: add in the workspace mod to the dependency mods w.Mods[w.Mod.Name()] = w.Mod - // populate the workspace resource map - w.populateResourceMaps() - // verify all runtime dependencies can be resolved return w.verifyResourceRuntimeDependencies() } @@ -320,7 +317,7 @@ func (w *Workspace) loadWorkspaceResourceName() (*modconfig.WorkspaceResources, } func (w *Workspace) verifyResourceRuntimeDependencies() error { - for _, d := range w.resourceMaps.Dashboards { + for _, d := range w.Mod.ResourceMaps.Dashboards { if err := d.BuildRuntimeDependencyTree(w); err != nil { return err } diff --git a/workspace/workspace_events.go b/workspace/workspace_events.go index 599315c06..1c0c038ad 100644 --- a/workspace/workspace_events.go +++ b/workspace/workspace_events.go @@ -50,7 +50,7 @@ func (w *Workspace) reloadResourceMaps(ctx context.Context) (*modconfig.ModResou // get the pre-load resource maps // NOTE: do not call GetResourceMaps - we DO NOT want to lock loadLock - prevResourceMaps := w.resourceMaps + prevResourceMaps := w.Mod.ResourceMaps // if there is an outstanding watcher error, set prevResourceMaps to empty to force refresh if w.watcherError != nil { prevResourceMaps = modconfig.NewWorkspaceResourceMaps(w.Mod) @@ -73,7 +73,7 @@ func (w *Workspace) reloadResourceMaps(ctx context.Context) (*modconfig.ModResou w.watcherError = nil // reload the resource maps - resourceMaps := w.resourceMaps + resourceMaps := w.Mod.ResourceMaps return prevResourceMaps, resourceMaps, nil diff --git a/workspace/workspace_resources.go b/workspace/workspace_resources.go index b90ccfa2d..8e6114bc1 100644 --- a/workspace/workspace_resources.go +++ b/workspace/workspace_resources.go @@ -6,10 +6,10 @@ func (w *Workspace) GetQuery(queryName string) (*modconfig.Query, bool) { w.loadLock.Lock() defer w.loadLock.Unlock() - if query, ok := w.resourceMaps.LocalQueries[queryName]; ok { + if query, ok := w.Mod.ResourceMaps.LocalQueries[queryName]; ok { return query, true } - if query, ok := w.resourceMaps.Queries[queryName]; ok { + if query, ok := w.Mod.ResourceMaps.Queries[queryName]; ok { return query, true } return nil, false @@ -19,10 +19,10 @@ func (w *Workspace) GetControl(controlName string) (*modconfig.Control, bool) { w.loadLock.Lock() defer w.loadLock.Unlock() - if control, ok := w.resourceMaps.LocalControls[controlName]; ok { + if control, ok := w.Mod.ResourceMaps.LocalControls[controlName]; ok { return control, true } - if control, ok := w.resourceMaps.Controls[controlName]; ok { + if control, ok := w.Mod.ResourceMaps.Controls[controlName]; ok { return control, true } return nil, false @@ -33,24 +33,5 @@ func (w *Workspace) GetResourceMaps() *modconfig.ModResources { w.loadLock.Lock() defer w.loadLock.Unlock() - // this will only occur for unit tests - if w.resourceMaps == nil { - w.populateResourceMaps() - } - - return w.resourceMaps -} - -func (w *Workspace) populateResourceMaps() { - dependencyResourceMaps := make([]*modconfig.ModResources, len(w.Mods)) - idx := 0 - for _, m := range w.Mods { - dependencyResourceMaps[idx] = m.GetResourceMaps() - idx++ - } - - w.resourceMaps = w.Mod.GetResourceMaps().Merge(dependencyResourceMaps) - - // now populate references in the resource map - w.resourceMaps.PopulateReferences() + return w.Mod.ResourceMaps }