From 9b61e421eea4a669841844077eab07912f432a18 Mon Sep 17 00:00:00 2001 From: Brian Flad Date: Thu, 18 Jun 2020 10:44:20 -0400 Subject: [PATCH 1/2] New Data Sources: aws_outposts_site(s) Output from acceptance testing: ``` Pending access TestAccAWSOutpostsSiteDataSource_Id: data_source_aws_outposts_sites_test.go:62: skipping since no Sites Outpost found --- SKIP: TestAccAWSOutpostsSiteDataSource_Id (3.14s) TestAccAWSOutpostsSitesDataSource_basic: data_source_aws_outposts_sites_test.go:62: skipping since no Sites Outpost found --- SKIP: TestAccAWSOutpostsSitesDataSource_basic (6.16s) TestAccAWSOutpostsSiteDataSource_Name: data_source_aws_outposts_sites_test.go:62: skipping since no Sites Outpost found --- SKIP: TestAccAWSOutpostsSiteDataSource_Name (6.93s) ``` --- aws/data_source_aws_outposts_site.go | 89 +++++++++++++++++++++ aws/data_source_aws_outposts_site_test.go | 76 ++++++++++++++++++ aws/data_source_aws_outposts_sites.go | 60 ++++++++++++++ aws/data_source_aws_outposts_sites_test.go | 70 ++++++++++++++++ aws/provider.go | 2 + website/aws.erb | 6 ++ website/docs/d/outposts_site.html.markdown | 33 ++++++++ website/docs/d/outposts_sites.html.markdown | 27 +++++++ 8 files changed, 363 insertions(+) create mode 100644 aws/data_source_aws_outposts_site.go create mode 100644 aws/data_source_aws_outposts_site_test.go create mode 100644 aws/data_source_aws_outposts_sites.go create mode 100644 aws/data_source_aws_outposts_sites_test.go create mode 100644 website/docs/d/outposts_site.html.markdown create mode 100644 website/docs/d/outposts_sites.html.markdown diff --git a/aws/data_source_aws_outposts_site.go b/aws/data_source_aws_outposts_site.go new file mode 100644 index 000000000000..00f2a299f216 --- /dev/null +++ b/aws/data_source_aws_outposts_site.go @@ -0,0 +1,89 @@ +package aws + +import ( + "fmt" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/outposts" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceAwsOutpostsSite() *schema.Resource { + return &schema.Resource{ + Read: dataSourceAwsOutpostsSiteRead, + + Schema: map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeString, + Computed: true, + }, + "description": { + Type: schema.TypeString, + Computed: true, + }, + "id": { + Type: schema.TypeString, + Optional: true, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Optional: true, + Computed: true, + }, + }, + } +} + +func dataSourceAwsOutpostsSiteRead(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*AWSClient).outpostsconn + + input := &outposts.ListSitesInput{} + + var results []*outposts.Site + + err := conn.ListSitesPages(input, func(page *outposts.ListSitesOutput, lastPage bool) bool { + if page == nil { + return !lastPage + } + + for _, site := range page.Sites { + if site == nil { + continue + } + + if v, ok := d.GetOk("id"); ok && v.(string) != aws.StringValue(site.SiteId) { + continue + } + + if v, ok := d.GetOk("name"); ok && v.(string) != aws.StringValue(site.Name) { + continue + } + + results = append(results, site) + } + + return !lastPage + }) + + if err != nil { + return fmt.Errorf("error listing Outposts Sites: %w", err) + } + + if len(results) == 0 { + return fmt.Errorf("no Outposts Site found matching criteria; try different search") + } + + if len(results) > 1 { + return fmt.Errorf("multiple Outposts Sites found matching criteria; try different search") + } + + site := results[0] + + d.SetId(aws.StringValue(site.SiteId)) + d.Set("account_id", site.AccountId) + d.Set("description", site.Description) + d.Set("name", site.Name) + + return nil +} diff --git a/aws/data_source_aws_outposts_site_test.go b/aws/data_source_aws_outposts_site_test.go new file mode 100644 index 000000000000..b8eed2449ac5 --- /dev/null +++ b/aws/data_source_aws_outposts_site_test.go @@ -0,0 +1,76 @@ +package aws + +import ( + "fmt" + "regexp" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" +) + +func TestAccAWSOutpostsSiteDataSource_Id(t *testing.T) { + dataSourceName := "data.aws_outposts_site.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t); testAccPreCheckAWSOutpostsSites(t) }, + Providers: testAccProviders, + CheckDestroy: nil, + Steps: []resource.TestStep{ + { + Config: testAccAWSOutpostsSiteDataSourceConfigId(), + Check: resource.ComposeTestCheckFunc( + testAccCheckResourceAttrAccountID(dataSourceName, "account_id"), + resource.TestCheckResourceAttrSet(dataSourceName, "description"), + resource.TestMatchResourceAttr(dataSourceName, "id", regexp.MustCompile(`^os-.+$`)), + resource.TestMatchResourceAttr(dataSourceName, "name", regexp.MustCompile(`^.+$`)), + ), + }, + }, + }) +} + +func TestAccAWSOutpostsSiteDataSource_Name(t *testing.T) { + sourceDataSourceName := "data.aws_outposts_site.source" + dataSourceName := "data.aws_outposts_site.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t); testAccPreCheckAWSOutpostsSites(t) }, + Providers: testAccProviders, + CheckDestroy: nil, + Steps: []resource.TestStep{ + { + Config: testAccAWSOutpostsSiteDataSourceConfigName(), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrPair(dataSourceName, "account_id", sourceDataSourceName, "account_id"), + resource.TestCheckResourceAttrPair(dataSourceName, "description", sourceDataSourceName, "description"), + resource.TestCheckResourceAttrPair(dataSourceName, "id", sourceDataSourceName, "id"), + resource.TestCheckResourceAttrPair(dataSourceName, "name", sourceDataSourceName, "name"), + ), + }, + }, + }) +} + +func testAccAWSOutpostsSiteDataSourceConfigId() string { + return fmt.Sprintf(` +data "aws_outposts_sites" "test" {} + +data "aws_outposts_site" "test" { + id = tolist(data.aws_outposts_sites.test.ids)[0] +} +`) +} + +func testAccAWSOutpostsSiteDataSourceConfigName() string { + return fmt.Sprintf(` +data "aws_outposts_sites" "test" {} + +data "aws_outposts_site" "source" { + id = tolist(data.aws_outposts_sites.test.ids)[0] +} + +data "aws_outposts_site" "test" { + name = data.aws_outposts_site.source.name +} +`) +} diff --git a/aws/data_source_aws_outposts_sites.go b/aws/data_source_aws_outposts_sites.go new file mode 100644 index 000000000000..c86fc778afde --- /dev/null +++ b/aws/data_source_aws_outposts_sites.go @@ -0,0 +1,60 @@ +package aws + +import ( + "fmt" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/outposts" + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceAwsOutpostsSites() *schema.Resource { + return &schema.Resource{ + Read: dataSourceAwsOutpostsSitesRead, + + Schema: map[string]*schema.Schema{ + "ids": { + Type: schema.TypeSet, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + }, + } +} + +func dataSourceAwsOutpostsSitesRead(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*AWSClient).outpostsconn + + input := &outposts.ListSitesInput{} + + var ids []string + + err := conn.ListSitesPages(input, func(page *outposts.ListSitesOutput, lastPage bool) bool { + if page == nil { + return !lastPage + } + + for _, site := range page.Sites { + if site == nil { + continue + } + + ids = append(ids, aws.StringValue(site.SiteId)) + } + + return !lastPage + }) + + if err != nil { + return fmt.Errorf("error listing Outposts Sites: %w", err) + } + + if err := d.Set("ids", ids); err != nil { + return fmt.Errorf("error setting ids: %w", err) + } + + d.SetId(resource.UniqueId()) + + return nil +} diff --git a/aws/data_source_aws_outposts_sites_test.go b/aws/data_source_aws_outposts_sites_test.go new file mode 100644 index 000000000000..2ef018d73d79 --- /dev/null +++ b/aws/data_source_aws_outposts_sites_test.go @@ -0,0 +1,70 @@ +package aws + +import ( + "fmt" + "testing" + + "github.com/aws/aws-sdk-go/service/outposts" + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/terraform" +) + +func TestAccAWSOutpostsSitesDataSource_basic(t *testing.T) { + dataSourceName := "data.aws_outposts_sites.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t); testAccPreCheckAWSOutpostsSites(t) }, + Providers: testAccProviders, + CheckDestroy: nil, + Steps: []resource.TestStep{ + { + Config: testAccAWSOutpostsSitesDataSourceConfig(), + Check: resource.ComposeTestCheckFunc( + testAccCheckOutpostsSitesAttributes(dataSourceName), + ), + }, + }, + }) +} + +func testAccCheckOutpostsSitesAttributes(dataSourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[dataSourceName] + if !ok { + return fmt.Errorf("Not found: %s", dataSourceName) + } + + if v := rs.Primary.Attributes["ids.#"]; v == "0" { + return fmt.Errorf("expected at least one ids result, got none") + } + + return nil + } +} + +func testAccPreCheckAWSOutpostsSites(t *testing.T) { + conn := testAccProvider.Meta().(*AWSClient).outpostsconn + + input := &outposts.ListSitesInput{} + + output, err := conn.ListSites(input) + + if testAccPreCheckSkipError(err) { + t.Skipf("skipping acceptance testing: %s", err) + } + + if err != nil { + t.Fatalf("unexpected PreCheck error: %s", err) + } + + // Ensure there is at least one Site + if output == nil || len(output.Sites) == 0 { + t.Skip("skipping since no Sites Outpost found") + } +} + +func testAccAWSOutpostsSitesDataSourceConfig() string { + return fmt.Sprintf(` +data "aws_outposts_sites" "test" {} +`) +} diff --git a/aws/provider.go b/aws/provider.go index f099bc0c14aa..aaa50eacbd4f 100644 --- a/aws/provider.go +++ b/aws/provider.go @@ -289,6 +289,8 @@ func Provider() terraform.ResourceProvider { "aws_organizations_organizational_units": dataSourceAwsOrganizationsOrganizationalUnits(), "aws_outposts_outpost": dataSourceAwsOutpostsOutpost(), "aws_outposts_outposts": dataSourceAwsOutpostsOutposts(), + "aws_outposts_site": dataSourceAwsOutpostsSite(), + "aws_outposts_sites": dataSourceAwsOutpostsSites(), "aws_partition": dataSourceAwsPartition(), "aws_prefix_list": dataSourceAwsPrefixList(), "aws_pricing_product": dataSourceAwsPricingProduct(), diff --git a/website/aws.erb b/website/aws.erb index 91480d751549..11cd64f4483b 100644 --- a/website/aws.erb +++ b/website/aws.erb @@ -2456,6 +2456,12 @@
  • aws_outposts_outposts
  • +
  • + aws_outposts_site +
  • +
  • + aws_outposts_sites +
  • diff --git a/website/docs/d/outposts_site.html.markdown b/website/docs/d/outposts_site.html.markdown new file mode 100644 index 000000000000..91f366ab7e45 --- /dev/null +++ b/website/docs/d/outposts_site.html.markdown @@ -0,0 +1,33 @@ +--- +subcategory: "Outposts" +layout: "aws" +page_title: "AWS: aws_outposts_site" +description: |- + Provides details about an Outposts Site +--- + +# Data Source: aws_outposts_site + +Provides details about an Outposts Site. + +## Example Usage + +```hcl +data "aws_outposts_site" "example" { + name = "example" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `id` - (Optional) Identifier of the Site. +* `name` - (Optional) Name of the Site. + +## Attribute Reference + +In addition to all arguments above, the following attributes are exported: + +* `account_id` - AWS Account identifier. +* `description` - Description. diff --git a/website/docs/d/outposts_sites.html.markdown b/website/docs/d/outposts_sites.html.markdown new file mode 100644 index 000000000000..a00ad91bee1e --- /dev/null +++ b/website/docs/d/outposts_sites.html.markdown @@ -0,0 +1,27 @@ +--- +subcategory: "Outposts" +layout: "aws" +page_title: "AWS: aws_outposts_sites" +description: |- + Provides details about multiple Outposts Sites. +--- + +# Data Source: aws_outposts_sites + +Provides details about multiple Outposts Sites. + +## Example Usage + +```hcl +data "aws_outposts_sites" "all" {} +``` + +## Argument Reference + +There are no arguments available for this data source. + +## Attribute Reference + +In addition to all arguments above, the following attributes are exported: + +* `ids` - Set of Outposts Site identifiers. From 30da90126f9d2f4b435b9314d097661db7f0d263 Mon Sep 17 00:00:00 2001 From: Brian Flad Date: Thu, 18 Jun 2020 15:00:21 -0400 Subject: [PATCH 2/2] service/outposts: Review feedback Output from acceptance testing: ``` --- PASS: TestAccAWSOutpostsSiteDataSource_Id (24.36s) --- PASS: TestAccAWSOutpostsSiteDataSource_Name (27.23s) ``` --- aws/data_source_aws_outposts_site.go | 14 ++++++++------ website/docs/d/outposts_sites.html.markdown | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/aws/data_source_aws_outposts_site.go b/aws/data_source_aws_outposts_site.go index 00f2a299f216..b4e1b0b77fe4 100644 --- a/aws/data_source_aws_outposts_site.go +++ b/aws/data_source_aws_outposts_site.go @@ -22,14 +22,16 @@ func dataSourceAwsOutpostsSite() *schema.Resource { Computed: true, }, "id": { - Type: schema.TypeString, - Optional: true, - Computed: true, + Type: schema.TypeString, + Optional: true, + Computed: true, + ExactlyOneOf: []string{"id", "name"}, }, "name": { - Type: schema.TypeString, - Optional: true, - Computed: true, + Type: schema.TypeString, + Optional: true, + Computed: true, + ExactlyOneOf: []string{"id", "name"}, }, }, } diff --git a/website/docs/d/outposts_sites.html.markdown b/website/docs/d/outposts_sites.html.markdown index a00ad91bee1e..0144f7a4642b 100644 --- a/website/docs/d/outposts_sites.html.markdown +++ b/website/docs/d/outposts_sites.html.markdown @@ -22,6 +22,6 @@ There are no arguments available for this data source. ## Attribute Reference -In addition to all arguments above, the following attributes are exported: +The following attributes are exported: * `ids` - Set of Outposts Site identifiers.