| 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 |
| } |