Skip to content

Commit d4388a9

Browse files
committed
data source/service_name: Add data source for service names
1 parent 60b4ad4 commit d4388a9

File tree

4 files changed

+214
-0
lines changed

4 files changed

+214
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package aws
2+
3+
import (
4+
"fmt"
5+
"sort"
6+
"strings"
7+
8+
"github.com/aws/aws-sdk-go/aws/endpoints"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
)
11+
12+
func dataSourceAwsServiceName() *schema.Resource {
13+
return &schema.Resource{
14+
Read: dataSourceAwsServiceNameRead,
15+
16+
Schema: map[string]*schema.Schema{
17+
"name": {
18+
Type: schema.TypeString,
19+
Computed: true,
20+
Optional: true,
21+
},
22+
23+
"region": {
24+
Type: schema.TypeString,
25+
Computed: true,
26+
Optional: true,
27+
},
28+
29+
"service": {
30+
Type: schema.TypeString,
31+
Computed: true,
32+
Optional: true,
33+
},
34+
35+
"service_prefix": {
36+
Type: schema.TypeString,
37+
Computed: true,
38+
Optional: true,
39+
},
40+
},
41+
}
42+
}
43+
44+
func dataSourceAwsServiceNameRead(d *schema.ResourceData, meta interface{}) error {
45+
client := meta.(*AWSClient)
46+
47+
if v, ok := d.GetOk("name"); ok {
48+
serviceParts := strings.Split(v.(string), ".")
49+
if len(serviceParts) < 4 {
50+
return fmt.Errorf("service names must have at least 4 parts (%s has %d)", v.(string), len(serviceParts))
51+
}
52+
53+
d.Set("service", serviceParts[len(serviceParts)-1])
54+
d.Set("region", serviceParts[len(serviceParts)-2])
55+
d.Set("service_prefix", strings.Join(serviceParts[0:len(serviceParts)-2], "."))
56+
}
57+
58+
if _, ok := d.GetOk("region"); !ok {
59+
d.Set("region", client.region)
60+
}
61+
62+
if _, ok := d.GetOk("service"); !ok {
63+
d.Set("service", endpoints.Ec2ServiceID)
64+
}
65+
66+
if _, ok := d.GetOk("service_prefix"); !ok {
67+
dnsParts := strings.Split(meta.(*AWSClient).dnsSuffix, ".")
68+
sort.Sort(sort.Reverse(sort.StringSlice(dnsParts)))
69+
d.Set("service_prefix", strings.Join(dnsParts, "."))
70+
}
71+
72+
d.Set("name", fmt.Sprintf("%s.%s.%s", d.Get("service_prefix").(string), d.Get("region").(string), d.Get("service").(string)))
73+
d.SetId(d.Get("name").(string))
74+
75+
return nil
76+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package aws
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/aws/aws-sdk-go/aws/endpoints"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
)
10+
11+
func TestAccAWSServiceName_basic(t *testing.T) {
12+
dataSourceName := "data.aws_service_name.default"
13+
14+
resource.ParallelTest(t, resource.TestCase{
15+
PreCheck: func() { testAccPreCheck(t) },
16+
Providers: testAccProviders,
17+
Steps: []resource.TestStep{
18+
{
19+
Config: testAccCheckAwsServiceNameConfig_basic(),
20+
Check: resource.ComposeTestCheckFunc(
21+
resource.TestCheckResourceAttr(dataSourceName, "region", testAccGetRegion()),
22+
resource.TestCheckResourceAttr(dataSourceName, "service", endpoints.Ec2ServiceID),
23+
resource.TestCheckResourceAttr(dataSourceName, "name", fmt.Sprintf("%s.%s.%s", "com.amazonaws", testAccGetRegion(), endpoints.Ec2ServiceID)),
24+
resource.TestCheckResourceAttr(dataSourceName, "service_prefix", "com.amazonaws"),
25+
),
26+
},
27+
},
28+
})
29+
}
30+
31+
func TestAccAWSServiceName_byServiceName(t *testing.T) {
32+
dataSourceName := "data.aws_service_name.test"
33+
34+
resource.ParallelTest(t, resource.TestCase{
35+
PreCheck: func() { testAccPreCheck(t) },
36+
Providers: testAccProviders,
37+
Steps: []resource.TestStep{
38+
{
39+
Config: testAccCheckAwsServiceNameConfig_byServiceName(),
40+
Check: resource.ComposeTestCheckFunc(
41+
resource.TestCheckResourceAttr(dataSourceName, "region", endpoints.ApNortheast1RegionID),
42+
resource.TestCheckResourceAttr(dataSourceName, "service", endpoints.S3ServiceID),
43+
resource.TestCheckResourceAttr(dataSourceName, "name", fmt.Sprintf("%s.%s.%s", "cn.com.amazonaws", endpoints.ApNortheast1RegionID, endpoints.S3ServiceID)),
44+
resource.TestCheckResourceAttr(dataSourceName, "service_prefix", "cn.com.amazonaws"),
45+
),
46+
},
47+
},
48+
})
49+
}
50+
51+
func TestAccAWSServiceName_byPart(t *testing.T) {
52+
dataSourceName := "data.aws_service_name.test"
53+
54+
resource.ParallelTest(t, resource.TestCase{
55+
PreCheck: func() { testAccPreCheck(t) },
56+
Providers: testAccProviders,
57+
Steps: []resource.TestStep{
58+
{
59+
Config: testAccCheckAwsServiceNameConfig_byPart(),
60+
Check: resource.ComposeTestCheckFunc(
61+
resource.TestCheckResourceAttr(dataSourceName, "region", testAccGetRegion()),
62+
resource.TestCheckResourceAttr(dataSourceName, "service", endpoints.Ec2ServiceID),
63+
resource.TestCheckResourceAttr(dataSourceName, "name", fmt.Sprintf("%s.%s.%s", "com.amazonaws", testAccGetRegion(), endpoints.Ec2ServiceID)),
64+
resource.TestCheckResourceAttr(dataSourceName, "service_prefix", "com.amazonaws"),
65+
),
66+
},
67+
},
68+
})
69+
}
70+
71+
func testAccCheckAwsServiceNameConfig_basic() string {
72+
return fmt.Sprintf(`
73+
data "aws_service_name" "default" {}
74+
`)
75+
}
76+
77+
func testAccCheckAwsServiceNameConfig_byServiceName() string {
78+
// lintignore:AWSAT003
79+
return fmt.Sprintf(`
80+
data "aws_service_name" "test" {
81+
name = "cn.com.amazonaws.ap-northeast-1.s3"
82+
}
83+
`)
84+
}
85+
86+
func testAccCheckAwsServiceNameConfig_byPart() string {
87+
return fmt.Sprintf(`
88+
data "aws_region" "current" {}
89+
90+
data "aws_service_name" "test" {
91+
service = "ec2"
92+
region = data.aws_region.current.name
93+
service_prefix = "com.amazonaws"
94+
}
95+
`)
96+
}

aws/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ func Provider() *schema.Provider {
340340
"aws_secretsmanager_secret": dataSourceAwsSecretsManagerSecret(),
341341
"aws_secretsmanager_secret_rotation": dataSourceAwsSecretsManagerSecretRotation(),
342342
"aws_secretsmanager_secret_version": dataSourceAwsSecretsManagerSecretVersion(),
343+
"aws_service_name": dataSourceAwsServiceName(),
343344
"aws_servicequotas_service": dataSourceAwsServiceQuotasService(),
344345
"aws_servicequotas_service_quota": dataSourceAwsServiceQuotasServiceQuota(),
345346
"aws_sfn_activity": dataSourceAwsSfnActivity(),
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
---
2+
subcategory: ""
3+
layout: "aws"
4+
page_title: "AWS: aws_service_name"
5+
description: |-
6+
Construct AWS service names
7+
---
8+
9+
# Data Source: aws_service_name
10+
11+
Use this data source to compose AWS service names.
12+
13+
## Example Usage
14+
15+
```hcl
16+
resource "aws_vpc" "test" {
17+
cidr_block = "10.0.0.0/16"
18+
}
19+
20+
data "aws_service_name" "s3" {
21+
service = "s3"
22+
}
23+
24+
resource "aws_vpc_endpoint" "test" {
25+
vpc_id = aws_vpc.test.id
26+
service_name = data.aws_service_name.s3.id
27+
}
28+
```
29+
30+
## Argument Reference
31+
32+
~> **Note:** If the `name` argument is provided, `region`, `service`, and `service_prefix` values are ignored.
33+
34+
* `name` - Name of the service (e.g. `com.amazonaws.us-west-2.s3`)
35+
* `region` - Region of the service (e.g. `us-west-2`, `ap-northeast-1`).
36+
* `service` - Service (e.g. `s3`, `ec2`). Defaults to `ec2`.
37+
* `service_prefix` - Prefix of the service (e.g. `com.amazonaws` in AWS Commercial, `cn.com.amazonaws` in AWS China).
38+
39+
## Attributes Reference
40+
41+
Besides the arguments above, no attributes are exported.

0 commit comments

Comments
 (0)