Skip to content

Commit faa2014

Browse files
Merge pull request #14897 from ewbankkit/f-aws_route53_resolver_query_log_config-resource
r/aws_route53_resolver_query_log_config: New resource
2 parents ddd2e67 + 189c3ac commit faa2014

7 files changed

Lines changed: 602 additions & 0 deletions

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package finder
2+
3+
import (
4+
"github.com/aws/aws-sdk-go/aws"
5+
"github.com/aws/aws-sdk-go/service/route53resolver"
6+
)
7+
8+
// ResolverQueryLogConfigByID returns the query logging configuration corresponding to the specified ID.
9+
// Returns nil if no configuration is found.
10+
func ResolverQueryLogConfigByID(conn *route53resolver.Route53Resolver, queryLogConfigID string) (*route53resolver.ResolverQueryLogConfig, error) {
11+
input := &route53resolver.GetResolverQueryLogConfigInput{
12+
ResolverQueryLogConfigId: aws.String(queryLogConfigID),
13+
}
14+
15+
output, err := conn.GetResolverQueryLogConfig(input)
16+
if err != nil {
17+
return nil, err
18+
}
19+
20+
if output == nil {
21+
return nil, nil
22+
}
23+
24+
return output.ResolverQueryLogConfig, nil
25+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package waiter
2+
3+
import (
4+
"github.com/aws/aws-sdk-go/aws"
5+
"github.com/aws/aws-sdk-go/service/route53resolver"
6+
"github.com/hashicorp/aws-sdk-go-base/tfawserr"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
8+
"github.com/terraform-providers/terraform-provider-aws/aws/internal/service/route53resolver/finder"
9+
)
10+
11+
const (
12+
resolverQueryLogConfigStatusNotFound = "NotFound"
13+
resolverQueryLogConfigStatusUnknown = "Unknown"
14+
)
15+
16+
// QueryLogConfigStatus fetches the QueryLogConfig and its Status
17+
func QueryLogConfigStatus(conn *route53resolver.Route53Resolver, queryLogConfigID string) resource.StateRefreshFunc {
18+
return func() (interface{}, string, error) {
19+
queryLogConfig, err := finder.ResolverQueryLogConfigByID(conn, queryLogConfigID)
20+
21+
if tfawserr.ErrCodeEquals(err, route53resolver.ErrCodeResourceNotFoundException) {
22+
return nil, resolverQueryLogConfigStatusNotFound, nil
23+
}
24+
25+
if err != nil {
26+
return nil, resolverQueryLogConfigStatusUnknown, err
27+
}
28+
29+
if queryLogConfig == nil {
30+
return nil, resolverQueryLogConfigStatusNotFound, nil
31+
}
32+
33+
return queryLogConfig, aws.StringValue(queryLogConfig.Status), nil
34+
}
35+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package waiter
2+
3+
import (
4+
"time"
5+
6+
"github.com/aws/aws-sdk-go/service/route53resolver"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
8+
)
9+
10+
const (
11+
// Maximum amount of time to wait for a QueryLogConfig to return CREATED
12+
QueryLogConfigCreatedTimeout = 5 * time.Minute
13+
14+
// Maximum amount of time to wait for a QueryLogConfig to be deleted
15+
QueryLogConfigDeletedTimeout = 5 * time.Minute
16+
)
17+
18+
// QueryLogConfigCreated waits for a QueryLogConfig to return CREATED
19+
func QueryLogConfigCreated(conn *route53resolver.Route53Resolver, queryLogConfigID string) (*route53resolver.ResolverQueryLogConfig, error) {
20+
stateConf := &resource.StateChangeConf{
21+
Pending: []string{route53resolver.ResolverQueryLogConfigStatusCreating},
22+
Target: []string{route53resolver.ResolverQueryLogConfigStatusCreated},
23+
Refresh: QueryLogConfigStatus(conn, queryLogConfigID),
24+
Timeout: QueryLogConfigCreatedTimeout,
25+
}
26+
27+
outputRaw, err := stateConf.WaitForState()
28+
29+
if v, ok := outputRaw.(*route53resolver.ResolverQueryLogConfig); ok {
30+
return v, err
31+
}
32+
33+
return nil, err
34+
}
35+
36+
// QueryLogConfigCreated waits for a QueryLogConfig to be deleted
37+
func QueryLogConfigDeleted(conn *route53resolver.Route53Resolver, queryLogConfigID string) (*route53resolver.ResolverQueryLogConfig, error) {
38+
stateConf := &resource.StateChangeConf{
39+
Pending: []string{route53resolver.ResolverQueryLogConfigStatusDeleting},
40+
Target: []string{},
41+
Refresh: QueryLogConfigStatus(conn, queryLogConfigID),
42+
Timeout: QueryLogConfigDeletedTimeout,
43+
}
44+
45+
outputRaw, err := stateConf.WaitForState()
46+
47+
if v, ok := outputRaw.(*route53resolver.ResolverQueryLogConfig); ok {
48+
return v, err
49+
}
50+
51+
return nil, err
52+
}

aws/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,6 +790,7 @@ func Provider() *schema.Provider {
790790
"aws_route53_zone": resourceAwsRoute53Zone(),
791791
"aws_route53_health_check": resourceAwsRoute53HealthCheck(),
792792
"aws_route53_resolver_endpoint": resourceAwsRoute53ResolverEndpoint(),
793+
"aws_route53_resolver_query_log_config": resourceAwsRoute53ResolverQueryLogConfig(),
793794
"aws_route53_resolver_rule_association": resourceAwsRoute53ResolverRuleAssociation(),
794795
"aws_route53_resolver_rule": resourceAwsRoute53ResolverRule(),
795796
"aws_route": resourceAwsRoute(),
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
package aws
2+
3+
import (
4+
"fmt"
5+
"log"
6+
7+
"github.com/aws/aws-sdk-go/aws"
8+
"github.com/aws/aws-sdk-go/service/route53resolver"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
11+
"github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags"
12+
"github.com/terraform-providers/terraform-provider-aws/aws/internal/service/route53resolver/finder"
13+
"github.com/terraform-providers/terraform-provider-aws/aws/internal/service/route53resolver/waiter"
14+
)
15+
16+
func resourceAwsRoute53ResolverQueryLogConfig() *schema.Resource {
17+
return &schema.Resource{
18+
Create: resourceAwsRoute53ResolverQueryLogConfigCreate,
19+
Read: resourceAwsRoute53ResolverQueryLogConfigRead,
20+
Update: resourceAwsRoute53ResolverQueryLogConfigUpdate,
21+
Delete: resourceAwsRoute53ResolverQueryLogConfigDelete,
22+
Importer: &schema.ResourceImporter{
23+
State: schema.ImportStatePassthrough,
24+
},
25+
26+
Schema: map[string]*schema.Schema{
27+
"arn": {
28+
Type: schema.TypeString,
29+
Computed: true,
30+
},
31+
32+
"destination_arn": {
33+
Type: schema.TypeString,
34+
Required: true,
35+
ForceNew: true,
36+
ValidateFunc: validateArn,
37+
},
38+
39+
"name": {
40+
Type: schema.TypeString,
41+
Required: true,
42+
ForceNew: true,
43+
ValidateFunc: validateRoute53ResolverName,
44+
},
45+
46+
"owner_id": {
47+
Type: schema.TypeString,
48+
Computed: true,
49+
},
50+
51+
"share_status": {
52+
Type: schema.TypeString,
53+
Computed: true,
54+
},
55+
56+
"tags": tagsSchema(),
57+
},
58+
}
59+
}
60+
61+
func resourceAwsRoute53ResolverQueryLogConfigCreate(d *schema.ResourceData, meta interface{}) error {
62+
conn := meta.(*AWSClient).route53resolverconn
63+
64+
input := &route53resolver.CreateResolverQueryLogConfigInput{
65+
CreatorRequestId: aws.String(resource.PrefixedUniqueId("tf-r53-resolver-query-log-config-")),
66+
DestinationArn: aws.String(d.Get("destination_arn").(string)),
67+
Name: aws.String(d.Get("name").(string)),
68+
}
69+
if v, ok := d.GetOk("tags"); ok && len(v.(map[string]interface{})) > 0 {
70+
input.Tags = keyvaluetags.New(d.Get("tags").(map[string]interface{})).IgnoreAws().Route53resolverTags()
71+
}
72+
73+
log.Printf("[DEBUG] Creating Route53 Resolver Query Log Config: %s", input)
74+
output, err := conn.CreateResolverQueryLogConfig(input)
75+
76+
if err != nil {
77+
return fmt.Errorf("error creating Route53 Resolver Query Log Config: %w", err)
78+
}
79+
80+
d.SetId(aws.StringValue(output.ResolverQueryLogConfig.Id))
81+
82+
_, err = waiter.QueryLogConfigCreated(conn, d.Id())
83+
84+
if err != nil {
85+
return fmt.Errorf("error waiting for Route53 Resolver Query Log Config (%s) to become available: %w", d.Id(), err)
86+
}
87+
88+
return resourceAwsRoute53ResolverQueryLogConfigRead(d, meta)
89+
}
90+
91+
func resourceAwsRoute53ResolverQueryLogConfigRead(d *schema.ResourceData, meta interface{}) error {
92+
conn := meta.(*AWSClient).route53resolverconn
93+
ignoreTagsConfig := meta.(*AWSClient).IgnoreTagsConfig
94+
95+
queryLogConfig, err := finder.ResolverQueryLogConfigByID(conn, d.Id())
96+
97+
if isAWSErr(err, route53resolver.ErrCodeResourceNotFoundException, "") {
98+
log.Printf("[WARN] Route53 Resolver Query Log Config (%s) not found, removing from state", d.Id())
99+
d.SetId("")
100+
return nil
101+
}
102+
103+
if err != nil {
104+
return fmt.Errorf("error reading Route53 Resolver Query Log Config (%s): %w", d.Id(), err)
105+
}
106+
107+
if queryLogConfig == nil {
108+
log.Printf("[WARN] Route53 Resolver Query Log Config (%s) not found, removing from state", d.Id())
109+
d.SetId("")
110+
return nil
111+
}
112+
113+
arn := aws.StringValue(queryLogConfig.Arn)
114+
d.Set("arn", arn)
115+
d.Set("destination_arn", queryLogConfig.DestinationArn)
116+
d.Set("name", queryLogConfig.Name)
117+
d.Set("owner_id", queryLogConfig.OwnerId)
118+
d.Set("share_status", queryLogConfig.ShareStatus)
119+
120+
tags, err := keyvaluetags.Route53resolverListTags(conn, arn)
121+
if err != nil {
122+
return fmt.Errorf("error listing tags for Route53 Resolver Query Log Config (%s): %w", arn, err)
123+
}
124+
125+
if err := d.Set("tags", tags.IgnoreAws().IgnoreConfig(ignoreTagsConfig).Map()); err != nil {
126+
return fmt.Errorf("error setting tags: %w", err)
127+
}
128+
129+
return nil
130+
}
131+
132+
func resourceAwsRoute53ResolverQueryLogConfigUpdate(d *schema.ResourceData, meta interface{}) error {
133+
conn := meta.(*AWSClient).route53resolverconn
134+
135+
if d.HasChange("tags") {
136+
o, n := d.GetChange("tags")
137+
if err := keyvaluetags.Route53resolverUpdateTags(conn, d.Get("arn").(string), o, n); err != nil {
138+
return fmt.Errorf("error updating Route53 Resolver Query Log Config (%s) tags: %s", d.Get("arn").(string), err)
139+
}
140+
}
141+
142+
return resourceAwsRoute53ResolverQueryLogConfigRead(d, meta)
143+
}
144+
145+
func resourceAwsRoute53ResolverQueryLogConfigDelete(d *schema.ResourceData, meta interface{}) error {
146+
conn := meta.(*AWSClient).route53resolverconn
147+
148+
log.Printf("[DEBUG] Deleting Route53 Resolver Query Log Config (%s)", d.Id())
149+
_, err := conn.DeleteResolverQueryLogConfig(&route53resolver.DeleteResolverQueryLogConfigInput{
150+
ResolverQueryLogConfigId: aws.String(d.Id()),
151+
})
152+
153+
if isAWSErr(err, route53resolver.ErrCodeResourceNotFoundException, "") {
154+
return nil
155+
}
156+
157+
if err != nil {
158+
return fmt.Errorf("error deleting Route53 Resolver Query Log Config (%s): %w", d.Id(), err)
159+
}
160+
161+
_, err = waiter.QueryLogConfigDeleted(conn, d.Id())
162+
163+
if err != nil {
164+
return fmt.Errorf("error waiting for Route53 Resolver Query Log Config (%s) to be deleted: %w", d.Id(), err)
165+
}
166+
167+
return nil
168+
}

0 commit comments

Comments
 (0)