Skip to content

Commit 9bbfb1d

Browse files
committed
New Resource: aws_route53_key_signing_key
Reference: #16834 Reference: #16836 Output from acceptance testing in AWS Commercial: ``` --- PASS: TestAccAwsRoute53KeySigningKey_disappears (209.62s) --- PASS: TestAccAwsRoute53KeySigningKey_basic (233.38s) --- PASS: TestAccAwsRoute53KeySigningKey_Status (295.66s) ```
1 parent f96188d commit 9bbfb1d

10 files changed

Lines changed: 923 additions & 0 deletions
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package route53
2+
3+
const (
4+
KeySigningKeyStatusActionNeeded = "ACTION_NEEDED"
5+
KeySigningKeyStatusActive = "ACTIVE"
6+
KeySigningKeyStatusDeleting = "DELETING"
7+
KeySigningKeyStatusInactive = "INACTIVE"
8+
KeySigningKeyStatusInternalFailure = "INTERNAL_FAILURE"
9+
)
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package finder
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/aws/aws-sdk-go/aws"
7+
"github.com/aws/aws-sdk-go/service/route53"
8+
tfroute53 "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/route53"
9+
)
10+
11+
func KeySigningKey(conn *route53.Route53, hostedZoneID string, name string) (*route53.KeySigningKey, error) {
12+
input := &route53.GetDNSSECInput{
13+
HostedZoneId: aws.String(hostedZoneID),
14+
}
15+
16+
var result *route53.KeySigningKey
17+
18+
output, err := conn.GetDNSSEC(input)
19+
20+
if err != nil {
21+
return nil, err
22+
}
23+
24+
if output == nil {
25+
return nil, nil
26+
}
27+
28+
for _, keySigningKey := range output.KeySigningKeys {
29+
if keySigningKey == nil {
30+
continue
31+
}
32+
33+
if aws.StringValue(keySigningKey.Name) == name {
34+
result = keySigningKey
35+
break
36+
}
37+
}
38+
39+
return result, err
40+
}
41+
42+
func KeySigningKeyByResourceID(conn *route53.Route53, resourceID string) (*route53.KeySigningKey, error) {
43+
hostedZoneID, name, err := tfroute53.KeySigningKeyParseResourceID(resourceID)
44+
45+
if err != nil {
46+
return nil, fmt.Errorf("error parsing Route 53 Key Signing Key (%s) identifier: %w", resourceID, err)
47+
}
48+
49+
return KeySigningKey(conn, hostedZoneID, name)
50+
}

aws/internal/service/route53/id.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package route53
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
)
7+
8+
const KeySigningKeyResourceIDSeparator = ","
9+
10+
func KeySigningKeyCreateResourceID(transitGatewayRouteTableID string, prefixListID string) string {
11+
parts := []string{transitGatewayRouteTableID, prefixListID}
12+
id := strings.Join(parts, KeySigningKeyResourceIDSeparator)
13+
14+
return id
15+
}
16+
17+
func KeySigningKeyParseResourceID(id string) (string, string, error) {
18+
parts := strings.Split(id, KeySigningKeyResourceIDSeparator)
19+
20+
if len(parts) == 2 && parts[0] != "" && parts[1] != "" {
21+
return parts[0], parts[1], nil
22+
}
23+
24+
return "", "", fmt.Errorf("unexpected format for ID (%[1]s), expected hosted-zone-id%[2]sname", id, KeySigningKeyResourceIDSeparator)
25+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package waiter
2+
3+
import (
4+
"github.com/aws/aws-sdk-go/aws"
5+
"github.com/aws/aws-sdk-go/service/route53"
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
"github.com/terraform-providers/terraform-provider-aws/aws/internal/service/route53/finder"
8+
)
9+
10+
func ChangeInfoStatus(conn *route53.Route53, changeID string) resource.StateRefreshFunc {
11+
return func() (interface{}, string, error) {
12+
input := &route53.GetChangeInput{
13+
Id: aws.String(changeID),
14+
}
15+
16+
output, err := conn.GetChange(input)
17+
18+
if err != nil {
19+
return nil, "", err
20+
}
21+
22+
if output == nil || output.ChangeInfo == nil {
23+
return nil, "", nil
24+
}
25+
26+
return output.ChangeInfo, aws.StringValue(output.ChangeInfo.Status), nil
27+
}
28+
}
29+
30+
func KeySigningKeyStatus(conn *route53.Route53, hostedZoneID string, name string) resource.StateRefreshFunc {
31+
return func() (interface{}, string, error) {
32+
keySigningKey, err := finder.KeySigningKey(conn, hostedZoneID, name)
33+
34+
if err != nil {
35+
return nil, "", err
36+
}
37+
38+
if keySigningKey == nil {
39+
return nil, "", nil
40+
}
41+
42+
return keySigningKey, aws.StringValue(keySigningKey.Status), nil
43+
}
44+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package waiter
2+
3+
import (
4+
"fmt"
5+
"time"
6+
7+
"github.com/aws/aws-sdk-go/aws"
8+
"github.com/aws/aws-sdk-go/service/route53"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
10+
)
11+
12+
const (
13+
ChangeTimeout = 30 * time.Minute
14+
15+
KeySigningKeyStatusTimeout = 5 * time.Minute
16+
)
17+
18+
func ChangeInfoStatusInsync(conn *route53.Route53, changeID string) (*route53.ChangeInfo, error) {
19+
stateConf := &resource.StateChangeConf{
20+
Pending: []string{route53.ChangeStatusPending},
21+
Target: []string{route53.ChangeStatusInsync},
22+
Refresh: ChangeInfoStatus(conn, changeID),
23+
Delay: 30 * time.Second,
24+
MinTimeout: 5 * time.Second,
25+
Timeout: ChangeTimeout,
26+
}
27+
28+
outputRaw, err := stateConf.WaitForState()
29+
30+
if output, ok := outputRaw.(*route53.ChangeInfo); ok {
31+
return output, err
32+
}
33+
34+
return nil, err
35+
}
36+
37+
func KeySigningKeyStatusUpdated(conn *route53.Route53, hostedZoneID string, name string, status string) (*route53.KeySigningKey, error) {
38+
stateConf := &resource.StateChangeConf{
39+
Target: []string{status},
40+
Refresh: KeySigningKeyStatus(conn, hostedZoneID, name),
41+
MinTimeout: 5 * time.Second,
42+
Timeout: KeySigningKeyStatusTimeout,
43+
}
44+
45+
outputRaw, err := stateConf.WaitForState()
46+
47+
if output, ok := outputRaw.(*route53.KeySigningKey); ok {
48+
if err != nil && output != nil && output.Status != nil && output.StatusMessage != nil {
49+
newErr := fmt.Errorf("%s: %s", aws.StringValue(output.Status), aws.StringValue(output.StatusMessage))
50+
51+
switch e := err.(type) {
52+
case *resource.TimeoutError:
53+
if e.LastError == nil {
54+
e.LastError = newErr
55+
}
56+
case *resource.UnexpectedStateError:
57+
if e.LastError == nil {
58+
e.LastError = newErr
59+
}
60+
}
61+
}
62+
63+
return output, err
64+
}
65+
66+
return nil, err
67+
}

aws/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,7 @@ func Provider() *schema.Provider {
852852
"aws_redshift_event_subscription": resourceAwsRedshiftEventSubscription(),
853853
"aws_resourcegroups_group": resourceAwsResourceGroupsGroup(),
854854
"aws_route53_delegation_set": resourceAwsRoute53DelegationSet(),
855+
"aws_route53_key_signing_key": resourceAwsRoute53KeySigningKey(),
855856
"aws_route53_query_log": resourceAwsRoute53QueryLog(),
856857
"aws_route53_record": resourceAwsRoute53Record(),
857858
"aws_route53_zone_association": resourceAwsRoute53ZoneAssociation(),

0 commit comments

Comments
 (0)