Skip to content
This repository has been archived by the owner on Aug 16, 2022. It is now read-only.

feat: Simplify Resources #1385

Merged
merged 18 commits into from
Aug 7, 2022
10 changes: 10 additions & 0 deletions client/resolvers.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package client

import (
"context"
"encoding/json"
"reflect"
"time"

Expand Down Expand Up @@ -29,6 +30,15 @@ func ResolveWAFScope(_ context.Context, meta schema.ClientMeta, r *schema.Resour
return diag.WrapError(r.Set(c.Name, meta.(*Client).WAFScope))
}

func ResolvePathJson(path string) func(_ context.Context, _ schema.ClientMeta, r *schema.Resource, c schema.Column) error {
return func(_ context.Context, _ schema.ClientMeta, r *schema.Resource, c schema.Column) error {
bbernays marked this conversation as resolved.
Show resolved Hide resolved
jsonItem, err := json.Marshal(funk.Get(r.Item, path, funk.WithAllowZero()))
if err != nil {
return diag.WrapError(err)
}
return r.Set(c.Name, jsonItem)
}
}
func ResolveTags(ctx context.Context, meta schema.ClientMeta, r *schema.Resource, c schema.Column) error {
return ResolveTagField("Tags")(ctx, meta, r, c)
}
Expand Down
12 changes: 1 addition & 11 deletions resources/services/ec2/egress_only_internet_gateways.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package ec2

import (
"context"
"encoding/json"

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/ec2"
Expand Down Expand Up @@ -47,7 +46,7 @@ func EgressOnlyInternetGateways() *schema.Table {
Name: "attachments",
Description: "Information about the attachment of the egress-only internet gateway.",
Type: schema.TypeJSON,
Resolver: resolveEgressOnlyInternetGatewaysAttachments,
Resolver: ResolvePathJson("Attachements"),
},
{
Name: "id",
Expand Down Expand Up @@ -88,12 +87,3 @@ func fetchEc2EgressOnlyInternetGateways(ctx context.Context, meta schema.ClientM
}
return nil
}
func resolveEgressOnlyInternetGatewaysAttachments(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
egress := resource.Item.(types.EgressOnlyInternetGateway)
b, err := json.Marshal(egress.Attachments)
if err != nil {
return diag.WrapError(err)
}

return diag.WrapError(resource.Set(c.Name, b))
}
12 changes: 1 addition & 11 deletions resources/services/ec2/network_interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package ec2

import (
"context"
"encoding/json"

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/ec2"
Expand Down Expand Up @@ -161,7 +160,7 @@ func NetworkInterfaces() *schema.Table {
Name: "groups",
Description: "The tags assigned to the egress-only internet gateway.",
Type: schema.TypeJSON,
Resolver: resolveNetworkInterfacesGroups,
Resolver: client.ResolvePathJson("Groups"),
},
{
Name: "interface_type",
Expand Down Expand Up @@ -361,15 +360,6 @@ func fetchEc2NetworkInterfaces(ctx context.Context, meta schema.ClientMeta, pare
}
return nil
}
func resolveNetworkInterfacesGroups(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
ni := resource.Item.(types.NetworkInterface)
b, err := json.Marshal(ni.Groups)
if err != nil {
return diag.WrapError(err)
}

return diag.WrapError(resource.Set(c.Name, b))
}
func resolveNetworkInterfacesIpv4Prefixes(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
ni := resource.Item.(types.NetworkInterface)
ipv4 := make([]*string, 0)
Expand Down
166 changes: 16 additions & 150 deletions resources/services/wafv2/web_acls.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package wafv2

import (
"context"
"encoding/json"

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/cloudfront"
Expand Down Expand Up @@ -64,7 +63,7 @@ func Wafv2WebAcls() *schema.Table {
Name: "default_action",
Description: "The action to perform if none of the Rules contained in the WebACL match. ",
Type: schema.TypeJSON,
Resolver: resolveWafv2webACLDefaultAction,
Resolver: client.ResolvePathJson("DefaultAction"),
},
{
Name: "id",
Expand Down Expand Up @@ -124,14 +123,14 @@ func Wafv2WebAcls() *schema.Table {
Name: "logging_configuration",
Description: "The LoggingConfiguration for the specified web ACL.",
Type: schema.TypeStringArray,
Resolver: resolveWafV2WebACLRuleLoggingConfiguration,
Resolver: schema.PathResolver("LoggingConfiguration.LogDestinationConfigs"),
},
},
Relations: []*schema.Table{
{
Name: "aws_wafv2_web_acl_rules",
Description: "A single rule, which you can use in a WebACL or RuleGroup to identify web requests that you want to allow, block, or count",
Resolver: fetchWafv2WebAclRules,
Resolver: schema.PathTableResolver("Rules"),
Columns: []schema.Column{
{
Name: "web_acl_cq_id",
Expand All @@ -153,7 +152,7 @@ func Wafv2WebAcls() *schema.Table {
Name: "statement",
Description: "The AWS WAF processing statement for the rule, for example ByteMatchStatement or SizeConstraintStatement. ",
Type: schema.TypeJSON,
Resolver: resolveWafv2webACLRuleStatement,
Resolver: client.ResolvePathJson("Statement"),
},
{
Name: "visibility_config_cloud_watch_metrics_enabled",
Expand All @@ -177,13 +176,13 @@ func Wafv2WebAcls() *schema.Table {
Name: "action",
Description: "The action that AWS WAF should take on a web request when it matches the rule statement",
Type: schema.TypeJSON,
Resolver: resolveWafv2webACLRuleAction,
Resolver: client.ResolvePathJson("Action"),
},
{
Name: "override_action",
Description: "The override action to apply to the rules in a rule group",
Type: schema.TypeJSON,
Resolver: resolveWafv2webACLRuleOverrideAction,
Resolver: client.ResolvePathJson("OverrideAction"),
},
{
Name: "labels",
Expand All @@ -196,7 +195,7 @@ func Wafv2WebAcls() *schema.Table {
{
Name: "aws_wafv2_web_acl_post_process_firewall_manager_rule_groups",
Description: "A rule group that's defined for an AWS Firewall Manager WAF policy. ",
Resolver: fetchWafv2WebAclPostProcessFirewallManagerRuleGroups,
Resolver: schema.PathTableResolver("PostProcessFirewallManagerRuleGroups"),
IgnoreInTests: true,
Columns: []schema.Column{
{
Expand All @@ -209,7 +208,7 @@ func Wafv2WebAcls() *schema.Table {
Name: "statement",
Description: "The processing guidance for an AWS Firewall Manager rule",
Type: schema.TypeJSON,
Resolver: resolveWafv2webACLPostProcessFirewallManagerRuleGroupStatement,
Resolver: client.ResolvePathJson("FirewallManagerStatement"),
},
{
Name: "name",
Expand All @@ -220,7 +219,7 @@ func Wafv2WebAcls() *schema.Table {
Name: "override_action",
Description: "The override action to apply to the rules in a rule group",
Type: schema.TypeJSON,
Resolver: resolveWafv2webACLPostProcessFirewallManagerRuleGroupOverrideAction,
Resolver: client.ResolvePathJson("OverrideAction"),
},
{
Name: "priority",
Expand Down Expand Up @@ -250,7 +249,7 @@ func Wafv2WebAcls() *schema.Table {
{
Name: "aws_wafv2_web_acl_pre_process_firewall_manager_rule_groups",
Description: "A rule group that's defined for an AWS Firewall Manager WAF policy. ",
Resolver: fetchWafv2WebAclPreProcessFirewallManagerRuleGroups,
Resolver: schema.PathTableResolver("PreProcessFirewallManagerRuleGroups"),
IgnoreInTests: true,
Columns: []schema.Column{
{
Expand All @@ -263,7 +262,7 @@ func Wafv2WebAcls() *schema.Table {
Name: "statement",
Description: "The processing guidance for an AWS Firewall Manager rule",
Type: schema.TypeJSON,
Resolver: resolveWafv2webACLPreProcessFirewallManagerRuleGroupStatement,
Resolver: client.ResolvePathJson("FirewallManagerStatement"),
},
{
Name: "name",
Expand All @@ -274,7 +273,7 @@ func Wafv2WebAcls() *schema.Table {
Name: "override_action",
Description: "The override action to apply to the rules in a rule group",
Type: schema.TypeJSON,
Resolver: resolveWafv2webACLPreProcessFirewallManagerRuleGroupOverrideAction,
Resolver: client.ResolvePathJson("OverrideAction"),
},
{
Name: "priority",
Expand Down Expand Up @@ -304,7 +303,7 @@ func Wafv2WebAcls() *schema.Table {
{
Name: "aws_wafv2_web_acl_logging_configuration",
Description: "The LoggingConfiguration for the specified web ACL.",
Resolver: fetchWafv2WebACLLoggingConfiguration,
Resolver: schema.PathTableResolver("LoggingConfiguration"),
Columns: []schema.Column{
{
Name: "web_acl_cq_id",
Expand All @@ -326,7 +325,7 @@ func Wafv2WebAcls() *schema.Table {
Name: "logging_filter",
Description: "Filtering that specifies which web requests are kept in the logs and which are dropped. You can filter on the rule action and on the web request labels that were applied by matching rules during web ACL evaluation.",
Type: schema.TypeJSON,
Resolver: resolveWafv2WebACLLoggingConfigurationLoggingFilter,
Resolver: client.ResolvePathJson("LoggingFilter"),
},
{
Name: "managed_by_firewall_manager",
Expand All @@ -337,7 +336,7 @@ func Wafv2WebAcls() *schema.Table {
Name: "redacted_fields",
Description: "The parts of the request that you want redacted from the logs. For example, if you redact the cookie field, the cookie field in the firehose will be xxx. You can specify only the following fields for redaction: UriPath, QueryString, SingleHeader, Method, and JsonBody.",
Type: schema.TypeJSON,
Resolver: resolveWafv2WebACLLoggingConfigurationRedactedFields,
Resolver: client.ResolvePathJson("RedactedFields"),
},
},
},
Expand Down Expand Up @@ -470,55 +469,7 @@ func resolveWafv2webACLTags(ctx context.Context, meta schema.ClientMeta, resourc
}
return diag.WrapError(resource.Set(c.Name, outputTags))
}
func resolveWafv2webACLDefaultAction(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
webACL := resource.Item.(*WebACLWrapper)
if webACL.DefaultAction == nil {
return nil
}
data, err := json.Marshal(webACL.DefaultAction)
if err != nil {
return diag.WrapError(err)
}
return diag.WrapError(resource.Set(c.Name, data))
}
func fetchWafv2WebAclRules(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error {
webACL := parent.Item.(*WebACLWrapper)
res <- webACL.Rules
return nil
}
func resolveWafv2webACLRuleStatement(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
rule := resource.Item.(types.Rule)
if rule.Statement == nil {
return nil
}
data, err := json.Marshal(rule.Statement)
if err != nil {
return diag.WrapError(err)
}
return diag.WrapError(resource.Set(c.Name, data))
}
func resolveWafv2webACLRuleAction(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
rule := resource.Item.(types.Rule)
if rule.Action == nil {
return nil
}
data, err := json.Marshal(rule.Action)
if err != nil {
return diag.WrapError(err)
}
return diag.WrapError(resource.Set(c.Name, data))
}
func resolveWafv2webACLRuleOverrideAction(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
rule := resource.Item.(types.Rule)
if rule.OverrideAction == nil {
return nil
}
data, err := json.Marshal(rule.OverrideAction)
if err != nil {
return diag.WrapError(err)
}
return diag.WrapError(resource.Set(c.Name, data))
}

func resolveWafv2webACLRuleLabels(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
rule := resource.Item.(types.Rule)
labels := make([]string, len(rule.RuleLabels))
Expand All @@ -527,88 +478,3 @@ func resolveWafv2webACLRuleLabels(ctx context.Context, meta schema.ClientMeta, r
}
return diag.WrapError(resource.Set(c.Name, labels))
}
func fetchWafv2WebAclPostProcessFirewallManagerRuleGroups(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error {
webACL := parent.Item.(*WebACLWrapper)
res <- webACL.PostProcessFirewallManagerRuleGroups
return nil
}
func resolveWafv2webACLPostProcessFirewallManagerRuleGroupStatement(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
firewallManagerRuleGroup := resource.Item.(types.FirewallManagerRuleGroup)
if firewallManagerRuleGroup.FirewallManagerStatement == nil {
return nil
}
data, err := json.Marshal(firewallManagerRuleGroup.FirewallManagerStatement)
if err != nil {
return diag.WrapError(err)
}
return diag.WrapError(resource.Set(c.Name, data))
}
func resolveWafv2webACLPostProcessFirewallManagerRuleGroupOverrideAction(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
firewallManagerRuleGroup := resource.Item.(types.FirewallManagerRuleGroup)
if firewallManagerRuleGroup.OverrideAction == nil {
return nil
}
data, err := json.Marshal(firewallManagerRuleGroup.OverrideAction)
if err != nil {
return diag.WrapError(err)
}
return diag.WrapError(resource.Set(c.Name, data))
}
func fetchWafv2WebAclPreProcessFirewallManagerRuleGroups(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error {
webACL := parent.Item.(*WebACLWrapper)
res <- webACL.PreProcessFirewallManagerRuleGroups
return nil
}
func resolveWafv2webACLPreProcessFirewallManagerRuleGroupStatement(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
firewallManagerRuleGroup := resource.Item.(types.FirewallManagerRuleGroup)
if firewallManagerRuleGroup.FirewallManagerStatement == nil {
return nil
}
data, err := json.Marshal(firewallManagerRuleGroup.FirewallManagerStatement)
if err != nil {
return diag.WrapError(err)
}
return diag.WrapError(resource.Set(c.Name, data))
}
func resolveWafv2webACLPreProcessFirewallManagerRuleGroupOverrideAction(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
firewallManagerRuleGroup := resource.Item.(types.FirewallManagerRuleGroup)
if firewallManagerRuleGroup.OverrideAction == nil {
return nil
}
data, err := json.Marshal(firewallManagerRuleGroup.OverrideAction)
if err != nil {
return diag.WrapError(err)
}
return diag.WrapError(resource.Set(c.Name, data))
}
func fetchWafv2WebACLLoggingConfiguration(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, res chan<- interface{}) error {
rule := resource.Item.(*WebACLWrapper)
res <- rule.LoggingConfiguration
return nil
}
func resolveWafv2WebACLLoggingConfigurationRedactedFields(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
if conf := resource.Item.(*types.LoggingConfiguration); conf != nil {
out, err := json.Marshal(conf.RedactedFields)
if err != nil {
return diag.WrapError(err)
}
return diag.WrapError(resource.Set(c.Name, out))
}
return nil
}
func resolveWafv2WebACLLoggingConfigurationLoggingFilter(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
if conf := resource.Item.(*types.LoggingConfiguration); conf != nil {
out, err := json.Marshal(conf.LoggingFilter)
if err != nil {
return diag.WrapError(err)
}
return diag.WrapError(resource.Set(c.Name, out))
}
return nil
}
func resolveWafV2WebACLRuleLoggingConfiguration(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
if rule := resource.Item.(*WebACLWrapper); rule.LoggingConfiguration != nil {
return diag.WrapError(resource.Set(c.Name, rule.LoggingConfiguration.LogDestinationConfigs))
}
return nil
}