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:
parent
fb262d0dbe
commit
3eb4a89104
|
@ -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
|
|
||||||
}
|
|
|
@ -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(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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}"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
|
@ -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}"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in New Issue