Skip to content

Commit cffbd38

Browse files
authored
Merge pull request #19262 from wedge-jarrad/f-aws_codestarconnections_connection-data-source-by-name
Support CodeStar Connection data source lookup by name
2 parents 0384cb0 + 665f81a commit cffbd38

14 files changed

+396
-188
lines changed

.changelog/19262.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
data-source/aws_codestarconnections_connection: Support lookup by `name`
3+
```

internal/service/codestarconnections/connection.go

+35-34
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package codestarconnections
22

33
import (
44
"fmt"
5+
"log"
56

67
"github.com/aws/aws-sdk-go/aws"
78
"github.com/aws/aws-sdk-go/service/codestarconnections"
@@ -10,6 +11,7 @@ import (
1011
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
1112
"github.com/hashicorp/terraform-provider-aws/internal/conns"
1213
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
14+
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
1315
"github.com/hashicorp/terraform-provider-aws/internal/verify"
1416
"github.com/hashicorp/terraform-provider-aws/names"
1517
)
@@ -20,6 +22,7 @@ func ResourceConnection() *schema.Resource {
2022
Read: resourceConnectionRead,
2123
Update: resourceConnectionUpdate,
2224
Delete: resourceConnectionDelete,
25+
2326
Importer: &schema.ResourceImporter{
2427
State: schema.ImportStatePassthrough,
2528
},
@@ -29,35 +32,30 @@ func ResourceConnection() *schema.Resource {
2932
Type: schema.TypeString,
3033
Computed: true,
3134
},
32-
3335
"connection_status": {
3436
Type: schema.TypeString,
3537
Computed: true,
3638
},
37-
38-
"name": {
39-
Type: schema.TypeString,
40-
Required: true,
41-
ForceNew: true,
42-
},
43-
4439
"host_arn": {
4540
Type: schema.TypeString,
4641
Optional: true,
4742
ForceNew: true,
48-
ConflictsWith: []string{"provider_type"},
4943
ValidateFunc: verify.ValidARN,
44+
ConflictsWith: []string{"provider_type"},
45+
},
46+
"name": {
47+
Type: schema.TypeString,
48+
Required: true,
49+
ForceNew: true,
5050
},
51-
5251
"provider_type": {
5352
Type: schema.TypeString,
5453
Optional: true,
5554
ForceNew: true,
5655
Computed: true,
57-
ConflictsWith: []string{"host_arn"},
5856
ValidateFunc: validation.StringInSlice(codestarconnections.ProviderType_Values(), false),
57+
ConflictsWith: []string{"host_arn"},
5958
},
60-
6159
"tags": tftags.TagsSchema(),
6260
"tags_all": tftags.TagsSchemaComputed(),
6361
},
@@ -71,28 +69,31 @@ func resourceConnectionCreate(d *schema.ResourceData, meta interface{}) error {
7169
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
7270
tags := defaultTagsConfig.MergeTags(tftags.New(d.Get("tags").(map[string]interface{})))
7371

74-
params := &codestarconnections.CreateConnectionInput{
75-
ConnectionName: aws.String(d.Get("name").(string)),
72+
name := d.Get("name").(string)
73+
input := &codestarconnections.CreateConnectionInput{
74+
ConnectionName: aws.String(name),
7675
}
7776

78-
if v, ok := d.GetOk("provider_type"); ok {
79-
params.ProviderType = aws.String(v.(string))
77+
if v, ok := d.GetOk("host_arn"); ok {
78+
input.HostArn = aws.String(v.(string))
8079
}
8180

82-
if v, ok := d.GetOk("host_arn"); ok {
83-
params.HostArn = aws.String(v.(string))
81+
if v, ok := d.GetOk("provider_type"); ok {
82+
input.ProviderType = aws.String(v.(string))
8483
}
8584

8685
if len(tags) > 0 {
87-
params.Tags = Tags(tags.IgnoreAWS())
86+
input.Tags = Tags(tags.IgnoreAWS())
8887
}
8988

90-
resp, err := conn.CreateConnection(params)
89+
log.Printf("[DEBUG] Creating CodeStar Connections Connection: %s", input)
90+
output, err := conn.CreateConnection(input)
91+
9192
if err != nil {
92-
return fmt.Errorf("error creating CodeStar connection: %w", err)
93+
return fmt.Errorf("creating CodeStar Connections Connection (%s): %w", name, err)
9394
}
9495

95-
d.SetId(aws.StringValue(resp.ConnectionArn))
96+
d.SetId(aws.StringValue(output.ConnectionArn))
9697

9798
return resourceConnectionRead(d, meta)
9899
}
@@ -102,8 +103,9 @@ func resourceConnectionRead(d *schema.ResourceData, meta interface{}) error {
102103
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
103104
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig
104105

105-
connection, err := findConnectionByARN(conn, d.Id())
106-
if !d.IsNewResource() && tfawserr.ErrCodeEquals(err, codestarconnections.ErrCodeResourceNotFoundException) {
106+
connection, err := FindConnectionByARN(conn, d.Id())
107+
108+
if !d.IsNewResource() && tfresource.NotFound(err) {
107109
names.LogNotFoundRemoveState(names.CodeStarConnections, names.ErrActionReading, ResConnection, d.Id())
108110
d.SetId("")
109111
return nil
@@ -113,33 +115,29 @@ func resourceConnectionRead(d *schema.ResourceData, meta interface{}) error {
113115
return names.Error(names.CodeStarConnections, names.ErrActionReading, ResConnection, d.Id(), err)
114116
}
115117

116-
if connection == nil {
117-
return fmt.Errorf("error reading CodeStar connection (%s): empty response", d.Id())
118-
}
119-
120118
arn := aws.StringValue(connection.ConnectionArn)
121119
d.SetId(arn)
122120
d.Set("arn", connection.ConnectionArn)
123121
d.Set("connection_status", connection.ConnectionStatus)
124-
d.Set("name", connection.ConnectionName)
125122
d.Set("host_arn", connection.HostArn)
123+
d.Set("name", connection.ConnectionName)
126124
d.Set("provider_type", connection.ProviderType)
127125

128126
tags, err := ListTags(conn, arn)
129127

130128
if err != nil {
131-
return fmt.Errorf("error listing tags for CodeStar Connection (%s): %w", arn, err)
129+
return fmt.Errorf("listing tags for CodeStar Connections Connection (%s): %w", arn, err)
132130
}
133131

134132
tags = tags.IgnoreAWS().IgnoreConfig(ignoreTagsConfig)
135133

136134
//lintignore:AWSR002
137135
if err := d.Set("tags", tags.RemoveDefaultConfig(defaultTagsConfig).Map()); err != nil {
138-
return fmt.Errorf("error setting tags: %w", err)
136+
return fmt.Errorf("setting tags: %w", err)
139137
}
140138

141139
if err := d.Set("tags_all", tags.Map()); err != nil {
142-
return fmt.Errorf("error setting tags_all: %w", err)
140+
return fmt.Errorf("setting tags_all: %w", err)
143141
}
144142

145143
return nil
@@ -152,7 +150,7 @@ func resourceConnectionUpdate(d *schema.ResourceData, meta interface{}) error {
152150
o, n := d.GetChange("tags_all")
153151

154152
if err := UpdateTags(conn, d.Get("arn").(string), o, n); err != nil {
155-
return fmt.Errorf("error Codestar Connection (%s) tags: %w", d.Id(), err)
153+
return fmt.Errorf("updating CodeStar Connections Connection (%s) tags: %w", d.Id(), err)
156154
}
157155
}
158156

@@ -162,14 +160,17 @@ func resourceConnectionUpdate(d *schema.ResourceData, meta interface{}) error {
162160
func resourceConnectionDelete(d *schema.ResourceData, meta interface{}) error {
163161
conn := meta.(*conns.AWSClient).CodeStarConnectionsConn
164162

163+
log.Printf("[DEBUG] Deleting CodeStar Connections Connection: %s", d.Id())
165164
_, err := conn.DeleteConnection(&codestarconnections.DeleteConnectionInput{
166165
ConnectionArn: aws.String(d.Id()),
167166
})
167+
168168
if tfawserr.ErrCodeEquals(err, codestarconnections.ErrCodeResourceNotFoundException) {
169169
return nil
170170
}
171+
171172
if err != nil {
172-
return fmt.Errorf("error deleting CodeStar connection: %w", err)
173+
return fmt.Errorf("deleting CodeStar Connections Connection (%s): %w", d.Id(), err)
173174
}
174175

175176
return nil

internal/service/codestarconnections/connection_data_source.go

+52-18
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package codestarconnections
22

33
import (
44
"fmt"
5-
"log"
65

6+
"github.com/aws/aws-sdk-go/aws"
7+
"github.com/aws/aws-sdk-go/service/codestarconnections"
78
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
89
"github.com/hashicorp/terraform-provider-aws/internal/conns"
910
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
11+
"github.com/hashicorp/terraform-provider-aws/internal/verify"
1012
)
1113

1214
func DataSourceConnection() *schema.Resource {
@@ -15,30 +17,30 @@ func DataSourceConnection() *schema.Resource {
1517

1618
Schema: map[string]*schema.Schema{
1719
"arn": {
18-
Type: schema.TypeString,
19-
Required: true,
20+
Type: schema.TypeString,
21+
Optional: true,
22+
Computed: true,
23+
ValidateFunc: verify.ValidARN,
24+
ExactlyOneOf: []string{"arn", "name"},
2025
},
21-
2226
"connection_status": {
2327
Type: schema.TypeString,
2428
Computed: true,
2529
},
26-
2730
"host_arn": {
2831
Type: schema.TypeString,
2932
Computed: true,
3033
},
31-
3234
"name": {
33-
Type: schema.TypeString,
34-
Computed: true,
35+
Type: schema.TypeString,
36+
Optional: true,
37+
Computed: true,
38+
ExactlyOneOf: []string{"arn", "name"},
3539
},
36-
3740
"provider_type": {
3841
Type: schema.TypeString,
3942
Computed: true,
4043
},
41-
4244
"tags": tftags.TagsSchemaComputed(),
4345
},
4446
}
@@ -48,28 +50,60 @@ func dataSourceConnectionRead(d *schema.ResourceData, meta interface{}) error {
4850
conn := meta.(*conns.AWSClient).CodeStarConnectionsConn
4951
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig
5052

51-
arn := d.Get("arn").(string)
53+
var connection *codestarconnections.Connection
54+
var err error
5255

53-
log.Printf("[DEBUG] Getting CodeStar Connection")
54-
connection, err := findConnectionByARN(conn, arn)
55-
if err != nil {
56-
return fmt.Errorf("error getting CodeStar Connection (%s): %w", arn, err)
56+
if v, ok := d.GetOk("arn"); ok {
57+
arn := v.(string)
58+
connection, err = FindConnectionByARN(conn, arn)
59+
60+
if err != nil {
61+
return fmt.Errorf("reading CodeStar Connections Connection (%s): %w", arn, err)
62+
}
63+
} else if v, ok := d.GetOk("name"); ok {
64+
name := v.(string)
65+
66+
err = conn.ListConnectionsPages(&codestarconnections.ListConnectionsInput{}, func(page *codestarconnections.ListConnectionsOutput, lastPage bool) bool {
67+
if page == nil {
68+
return !lastPage
69+
}
70+
71+
for _, v := range page.Connections {
72+
if aws.StringValue(v.ConnectionName) == name {
73+
connection = v
74+
75+
return false
76+
}
77+
}
78+
79+
return !lastPage
80+
})
81+
82+
if err != nil {
83+
return fmt.Errorf("listing CodeStar Connections Connections: %w", err)
84+
}
85+
86+
if connection == nil {
87+
return fmt.Errorf("CodeStar Connections Connection (%s): not found", name)
88+
}
5789
}
58-
log.Printf("[DEBUG] CodeStar Connection: %#v", connection)
5990

91+
arn := aws.StringValue(connection.ConnectionArn)
6092
d.SetId(arn)
93+
d.Set("arn", arn)
6194
d.Set("connection_status", connection.ConnectionStatus)
6295
d.Set("host_arn", connection.HostArn)
6396
d.Set("name", connection.ConnectionName)
6497
d.Set("provider_type", connection.ProviderType)
6598

6699
tags, err := ListTags(conn, arn)
100+
67101
if err != nil {
68-
return fmt.Errorf("error listing tags for CodeStar Connection (%s): %w", arn, err)
102+
return fmt.Errorf("listing tags for CodeStar Connections Connection (%s): %w", arn, err)
69103
}
70104

71105
if err := d.Set("tags", tags.IgnoreAWS().IgnoreConfig(ignoreTagsConfig).Map()); err != nil {
72-
return fmt.Errorf("error setting tags for CodeStar Connection (%s): %w", arn, err)
106+
return fmt.Errorf("setting tags: %w", err)
73107
}
74108

75109
return nil

internal/service/codestarconnections/connection_data_source_test.go

+13-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import (
1212

1313
func TestAccCodeStarConnectionsConnectionDataSource_basic(t *testing.T) {
1414
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
15-
dataSourceName := "data.aws_codestarconnections_connection.test"
15+
dataSourceName := "data.aws_codestarconnections_connection.test_arn"
16+
dataSourceName2 := "data.aws_codestarconnections_connection.test_name"
1617
resourceName := "aws_codestarconnections_connection.test"
1718

1819
resource.ParallelTest(t, resource.TestCase{
@@ -29,6 +30,12 @@ func TestAccCodeStarConnectionsConnectionDataSource_basic(t *testing.T) {
2930
resource.TestCheckResourceAttrPair(resourceName, "name", dataSourceName, "name"),
3031
resource.TestCheckResourceAttrPair(resourceName, "connection_status", dataSourceName, "connection_status"),
3132
resource.TestCheckResourceAttrPair(resourceName, "tags.%", dataSourceName, "tags.%"),
33+
resource.TestCheckResourceAttrPair(resourceName, "id", dataSourceName2, "id"),
34+
resource.TestCheckResourceAttrPair(resourceName, "arn", dataSourceName2, "arn"),
35+
resource.TestCheckResourceAttrPair(resourceName, "provider_type", dataSourceName2, "provider_type"),
36+
resource.TestCheckResourceAttrPair(resourceName, "name", dataSourceName2, "name"),
37+
resource.TestCheckResourceAttrPair(resourceName, "connection_status", dataSourceName2, "connection_status"),
38+
resource.TestCheckResourceAttrPair(resourceName, "tags.%", dataSourceName2, "tags.%"),
3239
),
3340
},
3441
},
@@ -62,9 +69,13 @@ resource "aws_codestarconnections_connection" "test" {
6269
provider_type = "Bitbucket"
6370
}
6471
65-
data "aws_codestarconnections_connection" "test" {
72+
data "aws_codestarconnections_connection" "test_arn" {
6673
arn = aws_codestarconnections_connection.test.arn
6774
}
75+
76+
data "aws_codestarconnections_connection" "test_name" {
77+
name = aws_codestarconnections_connection.test.name
78+
}
6879
`, rName)
6980
}
7081

0 commit comments

Comments
 (0)