Skip to content

Commit

Permalink
Add documentation for provider_meta.
Browse files Browse the repository at this point in the history
  • Loading branch information
paddycarver committed Nov 1, 2019
1 parent af53898 commit ee16912
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 0 deletions.
8 changes: 8 additions & 0 deletions website/docs/configuration/terraform.html.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,11 @@ to newer versions of the provider without altering the module.
Root modules should use a `~>` constraint to set both a lower and upper bound
on versions for each provider they depend on, as described in
[Provider Versions](providers.html#provider-versions).

## Passing Metadata to Providers

The `terraform` block can have a nested `provider_meta` block for each
provider a module is using, if the provider defines a schema for it. This
allows the provider to receive module-specific information. No interpolations
are performed on this block. For more information, see the
[`provider_meta` page](/docs/internals/provider-meta.html).
71 changes: 71 additions & 0 deletions website/docs/internals/provider-meta.html.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
---
layout: "docs"
page_title: "Provider Metadata"
sidebar_current: "docs-internals-provider-meta"
description: |-
For advanced use cases, modules can provide some pre-defined metadata for providers.
---

# Provider Metadata

In some situations it's beneficial for a provider to offer an interface
through which modules can pass it information unrelated to the resources
in the module, but scoped on a per-module basis. The provider metadata
functionality allows a provider to do this in a straightforward way.

~> **Advanced Topic!** This page covers technical details
of Terraform. You don't need to understand these details to
effectively use Terraform. The details are documented here for
module authors and provider developers working on advanced
functionality.

~> **Experimental Feature!** This functionality is still considered
experimental, and anyone taking advantage of it should [coordinate
with the Terraform team](https://github.com/hashicorp/terraform/issues/new)
to help the team understand how the feature is being used and to make
sure their use case is taken into account as the feature develops.

## Defining the Schema

Before a provider can receive information from a module, the provider
must strictly define the data it can accept. You can do this by setting
the `ProviderMeta` property on your `schema.Provider` struct. Its value
functions similarly to the provider config: a map of strings to the
`schema.Schema` describing the values those strings accept.

## Using the Data

When Terraform calls your provider, you can use the `schema.ResourceData`
that your `Create`, `Read`, and `Update` functions already use to get
access to the provider metadata being passed. First define a struct
that matches your schema, then call the `GetProviderSchema` method on
your `schema.ResourceData`, passing a pointer to a variable of that type.
The variable will be populated with the provider metadata, and will return
an error if there was an issue with parsing the data into the struct.

## Specifying Data in Modules

To include data in your modules, create a `provider_meta` nested block under
your module's `terraform` block, with the name of the provider it's trying
to pass information to:

```hcl
terraform {
provider_meta "my-provider" {
hello = "world"
}
}
```

The `provider_meta` block must match the schema the provider has defined.

## Versioning Your Modules

Any module taking advantage of this functionality must make sure that the
provider metadata supplied matches the schema defined in the provider, and
that the version of Terraform that is being run has support for the provider
metadata functionality. It's therefore recommended that any module taking
advantage of this functionality should specify a minimum Terraform version of
0.12.14 or higher, and a minimum version of each of the providers it specifies
metadata as the first version the schema being used was supported by the
provider.
4 changes: 4 additions & 0 deletions website/layouts/docs.erb
Original file line number Diff line number Diff line change
Expand Up @@ -456,6 +456,10 @@
<li<%= sidebar_current("docs-internals-plugins") %>>
<a href="/docs/internals/internal-plugins.html">Internal Plugins</a>
</li>

<li<%= sidebar_current("docs-internals-provider-meta") %>>
<a href="/docs/internals/provider-meta.html">Provider Metadata</a>
</li>
</ul>
</li>

Expand Down

0 comments on commit ee16912

Please sign in to comment.