From 40968e8fec8039eaaf1297a9a48503bc3e905d69 Mon Sep 17 00:00:00 2001 From: James Nugent Date: Sat, 14 May 2016 14:18:51 -0400 Subject: [PATCH] provider/aws: Add aws_availability_zones source This commit adds a data source with a single set, `available` for the schema which gets populated with the availability zones to which an account has access. --- .../aws/data_source_availability_zones.go | 50 +++++++++++++++++++ builtin/providers/aws/provider.go | 4 ++ .../aws/d/availability_zones.html.markdown | 39 +++++++++++++++ website/source/layouts/aws.erb | 9 ++++ 4 files changed, 102 insertions(+) create mode 100644 builtin/providers/aws/data_source_availability_zones.go create mode 100644 website/source/docs/providers/aws/d/availability_zones.html.markdown diff --git a/builtin/providers/aws/data_source_availability_zones.go b/builtin/providers/aws/data_source_availability_zones.go new file mode 100644 index 000000000000..990176ae3283 --- /dev/null +++ b/builtin/providers/aws/data_source_availability_zones.go @@ -0,0 +1,50 @@ +package aws + +import ( + "fmt" + "log" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/ec2" + "github.com/hashicorp/terraform/helper/schema" +) + +func dataSourceAwsAvailabilityZones() *schema.Resource { + return &schema.Resource{ + Read: dataSourceAwsAvailabilityZonesRead, + + Schema: map[string]*schema.Schema{ + "available": &schema.Schema{ + Type: schema.TypeSet, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Set: schema.HashString, + }, + }, + } +} + +func dataSourceAwsAvailabilityZonesRead(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*AWSClient).ec2conn + + log.Printf("[DEBUG] Reading availability zones") + d.SetId(time.Now().UTC().String()) + + req := &ec2.DescribeAvailabilityZonesInput{DryRun: aws.Bool(false)} + azresp, err := conn.DescribeAvailabilityZones(req) + if err != nil { + return fmt.Errorf("Error listing availability zones: %s", err) + } + + raw := schema.NewSet(schema.HashString, nil) + for _, v := range azresp.AvailabilityZones { + raw.Add(*v.ZoneName) + } + + if err := d.Set("available", raw); err != nil { + return fmt.Errorf("[WARN] Error setting availability zones") + } + + return nil +} diff --git a/builtin/providers/aws/provider.go b/builtin/providers/aws/provider.go index df737555b419..4537f929b91d 100644 --- a/builtin/providers/aws/provider.go +++ b/builtin/providers/aws/provider.go @@ -110,6 +110,10 @@ func Provider() terraform.ResourceProvider { }, }, + DataSourcesMap: map[string]*schema.Resource{ + "aws_availability_zones": dataSourceAwsAvailabilityZones(), + }, + ResourcesMap: map[string]*schema.Resource{ "aws_ami": resourceAwsAmi(), "aws_ami_copy": resourceAwsAmiCopy(), diff --git a/website/source/docs/providers/aws/d/availability_zones.html.markdown b/website/source/docs/providers/aws/d/availability_zones.html.markdown new file mode 100644 index 000000000000..3e3b2b5b4355 --- /dev/null +++ b/website/source/docs/providers/aws/d/availability_zones.html.markdown @@ -0,0 +1,39 @@ +--- +layout: "aws" +page_title: "AWS: aws_availability_zones" +sidebar_current: "docs-aws-datasource-availability-zones" +description: |- + Provides a list of availability zones which can be used by an AWS account +--- + +# aws\_availability_zones + +The Availability Zones data source allows access to the list of AWS +Availability Zones which can be accessed by an AWS account within the region +configured in the provider. + +## Example Usage + +``` +# Declare the data source +data "aws_availability_zones" "zones" {} + +# Create a subnet in each availability zone +resource "aws_subnet" "public" { + count = "${length(data.aws_availability_zones.zones.available)}" + + availability_zone = "${data.aws_availability_zones.zones.available[count.index]}" + + # Other properties... +} +``` + +## Argument Reference + +There are no arguments for this data source. + +## Attributes Reference + +The following attributes are exported: + +* `available` - A list of the availability zone names available to the account. diff --git a/website/source/layouts/aws.erb b/website/source/layouts/aws.erb index b274eea987cc..142d22a00af7 100644 --- a/website/source/layouts/aws.erb +++ b/website/source/layouts/aws.erb @@ -10,6 +10,15 @@ AWS Provider + + Data Sources + + + > API Gateway Resources