63 lines
2.6 KiB
Go
63 lines
2.6 KiB
Go
|
package providers
|
||
|
|
||
|
import (
|
||
|
"github.com/hashicorp/terraform/internal/addrs"
|
||
|
"github.com/hashicorp/terraform/internal/configs/configschema"
|
||
|
)
|
||
|
|
||
|
// Schemas is an overall container for all of the schemas for all configurable
|
||
|
// objects defined within a particular provider.
|
||
|
//
|
||
|
// The schema for each individual configurable object is represented by nested
|
||
|
// instances of type Schema (singular) within this data structure.
|
||
|
//
|
||
|
// This type used to be known as terraform.ProviderSchema, but moved out here
|
||
|
// as part of our ongoing efforts to shrink down the "terraform" package.
|
||
|
// There's still a type alias at the old name, but we should prefer using
|
||
|
// providers.Schema in new code. However, a consequence of this transitional
|
||
|
// situation is that the "terraform" package still has the responsibility for
|
||
|
// constructing a providers.Schemas object based on responses from the provider
|
||
|
// API; hopefully we'll continue this refactor later so that functions in this
|
||
|
// package totally encapsulate the unmarshalling and include this as part of
|
||
|
// providers.GetProviderSchemaResponse.
|
||
|
type Schemas struct {
|
||
|
Provider *configschema.Block
|
||
|
ProviderMeta *configschema.Block
|
||
|
ResourceTypes map[string]*configschema.Block
|
||
|
DataSources map[string]*configschema.Block
|
||
|
|
||
|
ResourceTypeSchemaVersions map[string]uint64
|
||
|
}
|
||
|
|
||
|
// SchemaForResourceType attempts to find a schema for the given mode and type.
|
||
|
// Returns nil if no such schema is available.
|
||
|
func (ss *Schemas) SchemaForResourceType(mode addrs.ResourceMode, typeName string) (schema *configschema.Block, version uint64) {
|
||
|
switch mode {
|
||
|
case addrs.ManagedResourceMode:
|
||
|
return ss.ResourceTypes[typeName], ss.ResourceTypeSchemaVersions[typeName]
|
||
|
case addrs.DataResourceMode:
|
||
|
// Data resources don't have schema versions right now, since state is discarded for each refresh
|
||
|
return ss.DataSources[typeName], 0
|
||
|
default:
|
||
|
// Shouldn't happen, because the above cases are comprehensive.
|
||
|
return nil, 0
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// SchemaForResourceAddr attempts to find a schema for the mode and type from
|
||
|
// the given resource address. Returns nil if no such schema is available.
|
||
|
func (ss *Schemas) SchemaForResourceAddr(addr addrs.Resource) (schema *configschema.Block, version uint64) {
|
||
|
return ss.SchemaForResourceType(addr.Mode, addr.Type)
|
||
|
}
|
||
|
|
||
|
// Schema pairs a provider or resource schema with that schema's version.
|
||
|
// This is used to be able to upgrade the schema in UpgradeResourceState.
|
||
|
//
|
||
|
// This describes the schema for a single object within a provider. Type
|
||
|
// "Schemas" (plural) instead represents the overall collection of schemas
|
||
|
// for everything within a particular provider.
|
||
|
type Schema struct {
|
||
|
Version int64
|
||
|
Block *configschema.Block
|
||
|
}
|