mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-27 09:21:14 -06:00
e89b5390ca
As we add support for versioned providers, it's getting more complex to track the dependencies of each module and of the configuration as a whole, so this new package is intended to give us some room to model that nicely as a building block for the various aspects of dependency management. This package is not responsible for *building* the dependency data structure, since that requires knowledge of core Terraform and that would create cyclic package dependencies. A later change will add some logic in Terraform to create a Module tree based on the combination of a given configuration and state, returning an instance of this package's Module type. The Module.PluginRequirements method flattens the provider-oriented requirements into a set of plugin-oriented requirements (flattening any provider aliases) giving us what we need to work with the plugin/discovery package to find matching installed plugins. Other later uses of this package will include selecting plugin archives to auto-install from releases.hashicorp.com as part of "terraform init", where the module-oriented level of abstraction here should be useful for giving users good, specific feedback when constraints cannot be met. A "reason" is tracked for each provider dependency with the intent that this would later drive a UI for users to see and understand why a given dependency is present, to aid in debugging sticky issues with dependency resolution.
31 lines
791 B
Go
31 lines
791 B
Go
package moduledeps
|
|
|
|
import (
|
|
"strings"
|
|
)
|
|
|
|
// ProviderInstance describes a particular provider instance by its full name,
|
|
// like "null" or "aws.foo".
|
|
type ProviderInstance string
|
|
|
|
// Type returns the provider type of this instance. For example, for an instance
|
|
// named "aws.foo" the type is "aws".
|
|
func (p ProviderInstance) Type() string {
|
|
t := string(p)
|
|
if dotPos := strings.Index(t, "."); dotPos != -1 {
|
|
t = t[:dotPos]
|
|
}
|
|
return t
|
|
}
|
|
|
|
// Alias returns the alias of this provider, if any. An instance named "aws.foo"
|
|
// has the alias "foo", while an instance named just "docker" has no alias,
|
|
// so the empty string would be returned.
|
|
func (p ProviderInstance) Alias() string {
|
|
t := string(p)
|
|
if dotPos := strings.Index(t, "."); dotPos != -1 {
|
|
return t[dotPos+1:]
|
|
}
|
|
return ""
|
|
}
|