Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New Data Sources: aws_servicequotas_service and aws_servicequotas_service_quota #9177

Merged
merged 4 commits into from
Jul 1, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions aws/data_source_aws_servicequotas_service.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package aws

import (
"fmt"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/servicequotas"
"github.com/hashicorp/terraform/helper/schema"
)

func dataSourceAwsServiceQuotasService() *schema.Resource {
return &schema.Resource{
Read: dataSourceAwsServiceQuotasServiceRead,

Schema: map[string]*schema.Schema{
"service_code": {
Type: schema.TypeString,
Computed: true,
},
"service_name": {
Type: schema.TypeString,
Required: true,
},
},
}
}

func dataSourceAwsServiceQuotasServiceRead(d *schema.ResourceData, meta interface{}) error {
conn := meta.(*AWSClient).servicequotasconn

serviceName := d.Get("service_name").(string)

input := &servicequotas.ListServicesInput{}

var service *servicequotas.ServiceInfo
err := conn.ListServicesPages(input, func(page *servicequotas.ListServicesOutput, lastPage bool) bool {
for _, s := range page.Services {
if aws.StringValue(s.ServiceName) == serviceName {
service = s
break
}
}

return !lastPage
})

if err != nil {
return fmt.Errorf("error listing Services: %s", err)
}

if service == nil {
return fmt.Errorf("error finding Service (%s): no results found", serviceName)
}

d.Set("service_code", service.ServiceCode)
d.Set("service_name", service.ServiceName)
d.SetId(aws.StringValue(service.ServiceCode))

return nil
}
144 changes: 144 additions & 0 deletions aws/data_source_aws_servicequotas_service_quota.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
package aws

import (
"fmt"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/servicequotas"
"github.com/hashicorp/terraform/helper/schema"
)

func dataSourceAwsServiceQuotasServiceQuota() *schema.Resource {
return &schema.Resource{
Read: dataSourceAwsServiceQuotasServiceQuotaRead,

Schema: map[string]*schema.Schema{
"adjustable": {
Type: schema.TypeBool,
Computed: true,
},
"arn": {
Type: schema.TypeString,
Computed: true,
},
"default_value": {
Type: schema.TypeFloat,
Computed: true,
},
"global_quota": {
Type: schema.TypeBool,
Computed: true,
},
"quota_code": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ConflictsWith: []string{"quota_name"},
},
"quota_name": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ConflictsWith: []string{"quota_code"},
},
"service_code": {
Type: schema.TypeString,
Required: true,
},
"service_name": {
Type: schema.TypeString,
Computed: true,
},
"value": {
Type: schema.TypeFloat,
Computed: true,
},
},
}
}

func dataSourceAwsServiceQuotasServiceQuotaRead(d *schema.ResourceData, meta interface{}) error {
conn := meta.(*AWSClient).servicequotasconn

quotaCode := d.Get("quota_code").(string)
quotaName := d.Get("quota_name").(string)
serviceCode := d.Get("service_code").(string)

if quotaCode == "" && quotaName == "" {
return fmt.Errorf("either quota_code or quota_name must be configured")
}

var serviceQuota *servicequotas.ServiceQuota

if quotaCode == "" {
input := &servicequotas.ListServiceQuotasInput{
ServiceCode: aws.String(serviceCode),
}

err := conn.ListServiceQuotasPages(input, func(page *servicequotas.ListServiceQuotasOutput, lastPage bool) bool {
for _, q := range page.Quotas {
if aws.StringValue(q.QuotaName) == quotaName {
serviceQuota = q
break
}
}

return !lastPage
})

if err != nil {
return fmt.Errorf("error listing Service (%s) Quotas: %s", serviceCode, err)
}

if serviceQuota == nil {
return fmt.Errorf("error finding Service (%s) Quota (%s): no results found", serviceCode, quotaName)
}
} else {
input := &servicequotas.GetServiceQuotaInput{
QuotaCode: aws.String(quotaCode),
ServiceCode: aws.String(serviceCode),
}

output, err := conn.GetServiceQuota(input)

if err != nil {
return fmt.Errorf("error getting Service (%s) Quota (%s): %s", serviceCode, quotaCode, err)
}

if output == nil {
return fmt.Errorf("error getting Service (%s) Quota (%s): empty result", serviceCode, quotaCode)
}

serviceQuota = output.Quota
}

input := &servicequotas.GetAWSDefaultServiceQuotaInput{
QuotaCode: serviceQuota.QuotaCode,
ServiceCode: serviceQuota.ServiceCode,
}

output, err := conn.GetAWSDefaultServiceQuota(input)

if err != nil {
return fmt.Errorf("error getting Service (%s) Default Quota (%s): %s", serviceCode, aws.StringValue(serviceQuota.QuotaCode), err)
}

if output == nil {
return fmt.Errorf("error getting Service (%s) Default Quota (%s): empty result", serviceCode, aws.StringValue(serviceQuota.QuotaCode))
}

defaultQuota := output.Quota

d.Set("adjustable", serviceQuota.Adjustable)
d.Set("arn", serviceQuota.QuotaArn)
d.Set("default_value", defaultQuota.Value)
d.Set("global_quota", serviceQuota.GlobalQuota)
d.Set("quota_code", serviceQuota.QuotaCode)
d.Set("quota_name", serviceQuota.QuotaName)
d.Set("service_code", serviceQuota.ServiceCode)
d.Set("service_name", serviceQuota.ServiceName)
d.Set("value", serviceQuota.Value)
d.SetId(aws.StringValue(serviceQuota.QuotaArn))

return nil
}
77 changes: 77 additions & 0 deletions aws/data_source_aws_servicequotas_service_quota_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package aws

import (
"fmt"
"regexp"
"testing"

"github.com/hashicorp/terraform/helper/resource"
)

func TestAccAwsServiceQuotasServiceQuotaDataSource_QuotaCode(t *testing.T) {
dataSourceName := "data.aws_servicequotas_service_quota.test"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
Steps: []resource.TestStep{
{
Config: testAccAwsServiceQuotasServiceQuotaDataSourceConfigQuotaCode("vpc", "L-F678F1CE"),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(dataSourceName, "adjustable", "true"),
testAccCheckResourceAttrRegionalARN(dataSourceName, "arn", "servicequotas", "vpc/L-F678F1CE"),
resource.TestCheckResourceAttr(dataSourceName, "default_value", "5"),
resource.TestCheckResourceAttr(dataSourceName, "global_quota", "false"),
resource.TestCheckResourceAttr(dataSourceName, "quota_code", "L-F678F1CE"),
resource.TestCheckResourceAttr(dataSourceName, "quota_name", "VPCs per Region"),
resource.TestCheckResourceAttr(dataSourceName, "service_code", "vpc"),
resource.TestCheckResourceAttr(dataSourceName, "service_name", "Amazon Virtual Private Cloud (Amazon VPC)"),
resource.TestMatchResourceAttr(dataSourceName, "value", regexp.MustCompile(`^\d+$`)),
),
},
},
})
}

func TestAccAwsServiceQuotasServiceQuotaDataSource_QuotaName(t *testing.T) {
dataSourceName := "data.aws_servicequotas_service_quota.test"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
Steps: []resource.TestStep{
{
Config: testAccAwsServiceQuotasServiceQuotaDataSourceConfigQuotaName("vpc", "VPCs per Region"),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(dataSourceName, "adjustable", "true"),
testAccCheckResourceAttrRegionalARN(dataSourceName, "arn", "servicequotas", "vpc/L-F678F1CE"),
resource.TestCheckResourceAttr(dataSourceName, "default_value", "5"),
resource.TestCheckResourceAttr(dataSourceName, "global_quota", "false"),
resource.TestCheckResourceAttr(dataSourceName, "quota_code", "L-F678F1CE"),
resource.TestCheckResourceAttr(dataSourceName, "quota_name", "VPCs per Region"),
resource.TestCheckResourceAttr(dataSourceName, "service_code", "vpc"),
resource.TestCheckResourceAttr(dataSourceName, "service_name", "Amazon Virtual Private Cloud (Amazon VPC)"),
resource.TestMatchResourceAttr(dataSourceName, "value", regexp.MustCompile(`^\d+$`)),
),
},
},
})
}

func testAccAwsServiceQuotasServiceQuotaDataSourceConfigQuotaCode(serviceCode, quotaCode string) string {
return fmt.Sprintf(`
data "aws_servicequotas_service_quota" "test" {
quota_code = %[1]q
service_code = %[2]q
}
`, quotaCode, serviceCode)
}

func testAccAwsServiceQuotasServiceQuotaDataSourceConfigQuotaName(serviceCode, quotaName string) string {
return fmt.Sprintf(`
data "aws_servicequotas_service_quota" "test" {
quota_name = %[1]q
service_code = %[2]q
}
`, quotaName, serviceCode)
}
33 changes: 33 additions & 0 deletions aws/data_source_aws_servicequotas_service_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package aws

import (
"fmt"
"testing"

"github.com/hashicorp/terraform/helper/resource"
)

func TestAccAwsServiceQuotasServiceDataSource_ServiceName(t *testing.T) {
dataSourceName := "data.aws_servicequotas_service.test"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
Steps: []resource.TestStep{
{
Config: testAccAwsServiceQuotasServiceDataSourceConfigServiceName("Amazon Virtual Private Cloud (Amazon VPC)"),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(dataSourceName, "service_code", "vpc"),
),
},
},
})
}

func testAccAwsServiceQuotasServiceDataSourceConfigServiceName(serviceName string) string {
return fmt.Sprintf(`
data "aws_servicequotas_service" "test" {
service_name = %[1]q
}
`, serviceName)
}
2 changes: 2 additions & 0 deletions aws/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,8 @@ func Provider() terraform.ResourceProvider {
"aws_s3_bucket_object": dataSourceAwsS3BucketObject(),
"aws_secretsmanager_secret": dataSourceAwsSecretsManagerSecret(),
"aws_secretsmanager_secret_version": dataSourceAwsSecretsManagerSecretVersion(),
"aws_servicequotas_service": dataSourceAwsServiceQuotasService(),
"aws_servicequotas_service_quota": dataSourceAwsServiceQuotasServiceQuota(),
"aws_sns_topic": dataSourceAwsSnsTopic(),
"aws_sqs_queue": dataSourceAwsSqsQueue(),
"aws_ssm_document": dataSourceAwsSsmDocument(),
Expand Down
6 changes: 6 additions & 0 deletions website/aws.erb
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,12 @@
<li>
<a href="/docs/providers/aws/d/security_groups.html">aws_security_groups</a>
</li>
<li>
<a href="/docs/providers/aws/d/servicequotas_service.html">aws_servicequotas_service</a>
</li>
<li>
<a href="/docs/providers/aws/d/servicequotas_service_quota.html">aws_servicequotas_service_quota</a>
</li>
<li>
<a href="/docs/providers/aws/d/sns_topic.html">aws_sns_topic</a>
</li>
Expand Down
28 changes: 28 additions & 0 deletions website/docs/d/servicequotas_service.html.markdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
layout: "aws"
page_title: "AWS: aws_servicequotas_service"
sidebar_current: "docs-aws-datasource-servicequotas-service"
description: |-
Retrieve information about a Service Quotas Service
---

# Data Source: aws_servicequotas_service

Retrieve information about a Service Quotas Service.

## Example Usage

```hcl
data "aws_servicequotas_service" "example" {
service_name = "Amazon Virtual Private Cloud (Amazon VPC)"
}
```

## Argument Reference

* `service_name` - (Required) Service name to lookup within Service Quotas. Available values can be found with the [AWS CLI service-quotas list-services command](https://docs.aws.amazon.com/cli/latest/reference/service-quotas/list-services.html).

## Attributes Reference

* `id` - Code of the service.
* `service_code` - Code of the service.
Loading