provider/terraform: remote state resource becomes a data source

As a first example of a real-world data source, the pre-existing
terraform_remote_state resource is adapted to be a data source. The
original resource is shimmed to wrap the data source for backward
compatibility.
This commit is contained in:
Martin Atkins 2016-05-01 16:05:54 -07:00
parent fb262d0dbe
commit 3eb4a89104
6 changed files with 21 additions and 36 deletions

View File

@ -8,23 +8,19 @@ import (
"github.com/hashicorp/terraform/state/remote" "github.com/hashicorp/terraform/state/remote"
) )
func resourceRemoteState() *schema.Resource { func dataSourceRemoteState() *schema.Resource {
return &schema.Resource{ return &schema.Resource{
Create: resourceRemoteStateCreate, Read: dataSourceRemoteStateRead,
Read: resourceRemoteStateRead,
Delete: resourceRemoteStateDelete,
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
"backend": &schema.Schema{ "backend": &schema.Schema{
Type: schema.TypeString, Type: schema.TypeString,
Required: true, Required: true,
ForceNew: true,
}, },
"config": &schema.Schema{ "config": &schema.Schema{
Type: schema.TypeMap, Type: schema.TypeMap,
Optional: true, Optional: true,
ForceNew: true,
}, },
"output": &schema.Schema{ "output": &schema.Schema{
@ -35,11 +31,7 @@ func resourceRemoteState() *schema.Resource {
} }
} }
func resourceRemoteStateCreate(d *schema.ResourceData, meta interface{}) error { func dataSourceRemoteStateRead(d *schema.ResourceData, meta interface{}) error {
return resourceRemoteStateRead(d, meta)
}
func resourceRemoteStateRead(d *schema.ResourceData, meta interface{}) error {
backend := d.Get("backend").(string) backend := d.Get("backend").(string)
config := make(map[string]string) config := make(map[string]string)
for k, v := range d.Get("config").(map[string]interface{}) { for k, v := range d.Get("config").(map[string]interface{}) {
@ -69,8 +61,3 @@ func resourceRemoteStateRead(d *schema.ResourceData, meta interface{}) error {
d.Set("output", outputs) d.Set("output", outputs)
return nil return nil
} }
func resourceRemoteStateDelete(d *schema.ResourceData, meta interface{}) error {
d.SetId("")
return nil
}

View File

@ -9,7 +9,12 @@ import (
func Provider() terraform.ResourceProvider { func Provider() terraform.ResourceProvider {
return &schema.Provider{ return &schema.Provider{
ResourcesMap: map[string]*schema.Resource{ ResourcesMap: map[string]*schema.Resource{
"terraform_remote_state": resourceRemoteState(), "terraform_remote_state": schema.DataSourceResourceShim(
dataSourceRemoteState(),
),
},
DataSourcesMap: map[string]*schema.Resource{
"terraform_remote_state": dataSourceRemoteState(),
}, },
} }
} }

View File

@ -1,7 +1,7 @@
--- ---
layout: "terraform" layout: "terraform"
page_title: "Terraform: terraform_remote_state" page_title: "Terraform: terraform_remote_state"
sidebar_current: "docs-terraform-resource-remote-state" sidebar_current: "docs-terraform-datasource-remote-state"
description: |- description: |-
Accesses state meta data from a remote backend. Accesses state meta data from a remote backend.
--- ---
@ -13,7 +13,7 @@ Retrieves state meta data from a remote backend
## Example Usage ## Example Usage
``` ```
resource "terraform_remote_state" "vpc" { data "terraform_remote_state" "vpc" {
backend = "atlas" backend = "atlas"
config { config {
name = "hashicorp/vpc-prod" name = "hashicorp/vpc-prod"
@ -22,7 +22,7 @@ resource "terraform_remote_state" "vpc" {
resource "aws_instance" "foo" { resource "aws_instance" "foo" {
# ... # ...
subnet_id = "${terraform_remote_state.vpc.output.subnet_id}" subnet_id = "${data.terraform_remote_state.vpc.output.subnet_id}"
} }
``` ```

View File

@ -8,23 +8,16 @@ description: |-
# Terraform Provider # Terraform Provider
The terraform provider exposes resources to access state meta data The terraform provider provides access to outputs from the Terraform state
for Terraform outputs from shared infrastructure. of shared infrastructure.
The terraform provider is what we call a _logical provider_. This has no Use the navigation to the left to read about the available data sources.
impact on how it behaves, but conceptually it is important to understand.
The terraform provider doesn't manage any _physical_ resources; it isn't
creating servers, writing files, etc. It is used to access the outputs
of other Terraform states to be used as inputs for resources.
Examples will explain this best.
Use the navigation to the left to read about the available resources.
## Example Usage ## Example Usage
``` ```
# Shared infrastructure state stored in Atlas # Shared infrastructure state stored in Atlas
resource "terraform_remote_state" "vpc" { data "terraform_remote_state" "vpc" {
backend = "atlas" backend = "atlas"
config { config {
path = "hashicorp/vpc-prod" path = "hashicorp/vpc-prod"
@ -33,6 +26,6 @@ resource "terraform_remote_state" "vpc" {
resource "aws_instance" "foo" { resource "aws_instance" "foo" {
# ... # ...
subnet_id = "${terraform_remote_state.vpc.output.subnet_id}" subnet_id = "${data.terraform_remote_state.vpc.output.subnet_id}"
} }
``` ```

View File

@ -10,11 +10,11 @@
<a href="/docs/providers/terraform/index.html">Terraform Provider</a> <a href="/docs/providers/terraform/index.html">Terraform Provider</a>
</li> </li>
<li<%= sidebar_current(/^docs-terraform-resource/) %>> <li<%= sidebar_current(/^docs-terraform-datasource/) %>>
<a href="#">Resources</a> <a href="#">Data Sources</a>
<ul class="nav nav-visible"> <ul class="nav nav-visible">
<li<%= sidebar_current("docs-terraform-resource-remote-state") %>> <li<%= sidebar_current("docs-terraform-datasource-remote-state") %>>
<a href="/docs/providers/terraform/r/remote_state.html">terraform_remote_state</a> <a href="/docs/providers/terraform/d/remote_state.html">terraform_remote_state</a>
</li> </li>
</ul> </ul>
</li> </li>