From a605a9acc6ac8320b0be540bcf38a4a77eb4e146 Mon Sep 17 00:00:00 2001 From: Adam Tyler Date: Sat, 6 Aug 2022 22:54:34 -0400 Subject: [PATCH 1/7] Add support for resource groups --- client/client.go | 3 + client/mocks/mock_resourcegroups.go | 96 +++++++++++++ client/services.go | 8 ++ .../aws_resourcegroups_resource_groups.md | 13 ++ go.mod | 7 +- go.sum | 11 +- resources/provider/provider.go | 2 + resources/services/resourcegroups/gen.hcl | 65 +++++++++ .../resourcegroups/resource_groups.go | 126 ++++++++++++++++++ .../resource_groups_mock_test.go | 51 +++++++ 10 files changed, 376 insertions(+), 6 deletions(-) create mode 100644 client/mocks/mock_resourcegroups.go create mode 100644 docs/tables/aws_resourcegroups_resource_groups.md create mode 100644 resources/services/resourcegroups/gen.hcl create mode 100644 resources/services/resourcegroups/resource_groups.go create mode 100644 resources/services/resourcegroups/resource_groups_mock_test.go diff --git a/client/client.go b/client/client.go index eebc29b35..e13a08662 100644 --- a/client/client.go +++ b/client/client.go @@ -59,6 +59,7 @@ import ( "github.com/aws/aws-sdk-go-v2/service/qldb" "github.com/aws/aws-sdk-go-v2/service/rds" "github.com/aws/aws-sdk-go-v2/service/redshift" + "github.com/aws/aws-sdk-go-v2/service/resourcegroups" "github.com/aws/aws-sdk-go-v2/service/route53" "github.com/aws/aws-sdk-go-v2/service/route53domains" "github.com/aws/aws-sdk-go-v2/service/s3" @@ -164,6 +165,7 @@ type Services struct { QLDB QLDBClient RDS RdsClient Redshift RedshiftClient + ResourceGroups ResourceGroupsClient Route53 Route53Client Route53Domains Route53DomainsClient S3 S3Client @@ -661,6 +663,7 @@ func initServices(region string, c aws.Config) Services { Organizations: organizations.NewFromConfig(awsCfg), QLDB: qldb.NewFromConfig(awsCfg), RDS: rds.NewFromConfig(awsCfg), + ResourceGroups: resourcegroups.NewFromConfig(awsCfg), Redshift: redshift.NewFromConfig(awsCfg), Route53: route53.NewFromConfig(awsCfg), Route53Domains: route53domains.NewFromConfig(awsCfg), diff --git a/client/mocks/mock_resourcegroups.go b/client/mocks/mock_resourcegroups.go new file mode 100644 index 000000000..e984d9f9a --- /dev/null +++ b/client/mocks/mock_resourcegroups.go @@ -0,0 +1,96 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/cloudquery/cq-provider-aws/client (interfaces: ResourceGroupsClient) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + resourcegroups "github.com/aws/aws-sdk-go-v2/service/resourcegroups" + gomock "github.com/golang/mock/gomock" +) + +// MockResourceGroupsClient is a mock of ResourceGroupsClient interface. +type MockResourceGroupsClient struct { + ctrl *gomock.Controller + recorder *MockResourceGroupsClientMockRecorder +} + +// MockResourceGroupsClientMockRecorder is the mock recorder for MockResourceGroupsClient. +type MockResourceGroupsClientMockRecorder struct { + mock *MockResourceGroupsClient +} + +// NewMockResourceGroupsClient creates a new mock instance. +func NewMockResourceGroupsClient(ctrl *gomock.Controller) *MockResourceGroupsClient { + mock := &MockResourceGroupsClient{ctrl: ctrl} + mock.recorder = &MockResourceGroupsClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockResourceGroupsClient) EXPECT() *MockResourceGroupsClientMockRecorder { + return m.recorder +} + +// GetGroupQuery mocks base method. +func (m *MockResourceGroupsClient) GetGroupQuery(arg0 context.Context, arg1 *resourcegroups.GetGroupQueryInput, arg2 ...func(*resourcegroups.Options)) (*resourcegroups.GetGroupQueryOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetGroupQuery", varargs...) + ret0, _ := ret[0].(*resourcegroups.GetGroupQueryOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetGroupQuery indicates an expected call of GetGroupQuery. +func (mr *MockResourceGroupsClientMockRecorder) GetGroupQuery(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGroupQuery", reflect.TypeOf((*MockResourceGroupsClient)(nil).GetGroupQuery), varargs...) +} + +// GetTags mocks base method. +func (m *MockResourceGroupsClient) GetTags(arg0 context.Context, arg1 *resourcegroups.GetTagsInput, arg2 ...func(*resourcegroups.Options)) (*resourcegroups.GetTagsOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetTags", varargs...) + ret0, _ := ret[0].(*resourcegroups.GetTagsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetTags indicates an expected call of GetTags. +func (mr *MockResourceGroupsClientMockRecorder) GetTags(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTags", reflect.TypeOf((*MockResourceGroupsClient)(nil).GetTags), varargs...) +} + +// ListGroups mocks base method. +func (m *MockResourceGroupsClient) ListGroups(arg0 context.Context, arg1 *resourcegroups.ListGroupsInput, arg2 ...func(*resourcegroups.Options)) (*resourcegroups.ListGroupsOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListGroups", varargs...) + ret0, _ := ret[0].(*resourcegroups.ListGroupsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListGroups indicates an expected call of ListGroups. +func (mr *MockResourceGroupsClientMockRecorder) ListGroups(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListGroups", reflect.TypeOf((*MockResourceGroupsClient)(nil).ListGroups), varargs...) +} diff --git a/client/services.go b/client/services.go index e5ac6dbb5..e9ce36800 100644 --- a/client/services.go +++ b/client/services.go @@ -49,6 +49,7 @@ import ( "github.com/aws/aws-sdk-go-v2/service/qldb" "github.com/aws/aws-sdk-go-v2/service/rds" "github.com/aws/aws-sdk-go-v2/service/redshift" + "github.com/aws/aws-sdk-go-v2/service/resourcegroups" "github.com/aws/aws-sdk-go-v2/service/route53" "github.com/aws/aws-sdk-go-v2/service/route53domains" "github.com/aws/aws-sdk-go-v2/service/s3" @@ -778,3 +779,10 @@ type KinesisClient interface { ListStreams(ctx context.Context, params *kinesis.ListStreamsInput, optFns ...func(*kinesis.Options)) (*kinesis.ListStreamsOutput, error) ListTagsForStream(ctx context.Context, params *kinesis.ListTagsForStreamInput, optFns ...func(*kinesis.Options)) (*kinesis.ListTagsForStreamOutput, error) } + +//go:generate mockgen -package=mocks -destination=./mocks/mock_resourcegroups.go . ResourceGroupsClient +type ResourceGroupsClient interface { + GetGroupQuery(ctx context.Context, params *resourcegroups.GetGroupQueryInput, optFns ...func(*resourcegroups.Options)) (*resourcegroups.GetGroupQueryOutput, error) + GetTags(ctx context.Context, params *resourcegroups.GetTagsInput, optFns ...func(*resourcegroups.Options)) (*resourcegroups.GetTagsOutput, error) + ListGroups(ctx context.Context, params *resourcegroups.ListGroupsInput, optFns ...func(*resourcegroups.Options)) (*resourcegroups.ListGroupsOutput, error) +} diff --git a/docs/tables/aws_resourcegroups_resource_groups.md b/docs/tables/aws_resourcegroups_resource_groups.md new file mode 100644 index 000000000..ce6249ac1 --- /dev/null +++ b/docs/tables/aws_resourcegroups_resource_groups.md @@ -0,0 +1,13 @@ + +# Table: aws_resourcegroups_resource_groups +The unique identifiers for a resource group +## Columns +| Name | Type | Description | +| ------------- | ------------- | ----- | +|account_id|text|The AWS Account ID of the resource.| +|region|text|The AWS Region of the resource.| +|tags|jsonb|| +|resource_query_type|text|The type of the query.| +|resource_query|text|The query that defines a group or a search.| +|arn|text|The ARN of the resource group| +|name|text|The name of the resource group| diff --git a/go.mod b/go.mod index 27a9265aa..f320caee5 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/cloudquery/cq-provider-aws go 1.18 require ( - github.com/aws/aws-sdk-go-v2 v1.16.7 + github.com/aws/aws-sdk-go-v2 v1.16.8 github.com/aws/aws-sdk-go-v2/config v1.15.14 github.com/aws/aws-sdk-go-v2/credentials v1.12.9 github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.20 @@ -50,6 +50,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/qldb v1.14.8 github.com/aws/aws-sdk-go-v2/service/rds v1.21.5 github.com/aws/aws-sdk-go-v2/service/redshift v1.25.1 + github.com/aws/aws-sdk-go-v2/service/resourcegroups v1.12.9 github.com/aws/aws-sdk-go-v2/service/route53 v1.21.2 github.com/aws/aws-sdk-go-v2/service/route53domains v1.12.7 github.com/aws/aws-sdk-go-v2/service/s3 v1.27.1 @@ -103,8 +104,8 @@ require ( github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.3 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.8 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.14 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.8 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.15 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.9 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.15 // indirect github.com/aws/aws-sdk-go-v2/service/athena v1.16.0 github.com/aws/aws-sdk-go-v2/service/backup v1.16.3 diff --git a/go.sum b/go.sum index ec98f0c03..ed6be5e29 100644 --- a/go.sum +++ b/go.sum @@ -55,8 +55,9 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= github.com/aws/aws-sdk-go-v2 v1.16.6/go.mod h1:6CpKuLXg2w7If3ABZCl/qZ6rEgwtjZTn4eAf4RcEyuw= -github.com/aws/aws-sdk-go-v2 v1.16.7 h1:zfBwXus3u14OszRxGcqCDS4MfMCv10e8SMJ2r8Xm0Ns= github.com/aws/aws-sdk-go-v2 v1.16.7/go.mod h1:6CpKuLXg2w7If3ABZCl/qZ6rEgwtjZTn4eAf4RcEyuw= +github.com/aws/aws-sdk-go-v2 v1.16.8 h1:gOe9UPR98XSf7oEJCcojYg+N2/jCRm4DdeIsP85pIyQ= +github.com/aws/aws-sdk-go-v2 v1.16.8/go.mod h1:6CpKuLXg2w7If3ABZCl/qZ6rEgwtjZTn4eAf4RcEyuw= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.3 h1:S/ZBwevQkr7gv5YxONYpGQxlMFFYSRfz3RMcjsC9Qhk= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.3/go.mod h1:gNsR5CaXKmQSSzrmGxmwmct/r+ZBfbxorAuXYsj/M5Y= github.com/aws/aws-sdk-go-v2/config v1.15.14 h1:+BqpqlydTq4c2et9Daury7gE+o67P4lbk7eybiCBNc4= @@ -68,11 +69,13 @@ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.8/go.mod h1:oL1Q3KuCq1D4NykQ github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.20 h1:J7/+NFr8N7ebaC/Khie8ptnWn0h436q1hblMeL53mww= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.20/go.mod h1:IOgK2DAat3WO2qAaPmIzTdF+QqL18samL3dqZdjRBZI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.13/go.mod h1:wLLesU+LdMZDM3U0PP9vZXJW39zmD/7L4nY2pSrYZ/g= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.14 h1:2C0pYHcUBmdzPj+EKNC4qj97oK6yjrUhc1KoSodglvk= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.14/go.mod h1:kdjrMwHwrC3+FsKhNcCMJ7tUVj/8uSD5CZXeQ4wV6fM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.15 h1:bx5F2mr6H6FC7zNIQoDoUr8wEKnvmwRncujT3FYRtic= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.15/go.mod h1:pWrr2OoHlT7M/Pd2y4HV3gJyPb3qj5qMmnPkKSNPYK4= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.7/go.mod h1:93Uot80ddyVzSl//xEJreNKMhxntr71WtR3v/A1cRYk= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.8 h1:2J+jdlBJWEmTyAwC82Ym68xCykIvnSnIN18b8xHGlcc= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.8/go.mod h1:ZIV8GYoC6WLBW5KGs+o4rsc65/ozd+eQ0L31XF5VDwk= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.9 h1:5sbyznZC2TeFpa4fvtpvpcGbzeXEEs1l1Jo51ynUNsQ= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.9/go.mod h1:08tUpeSGN33QKSO7fwxXczNfiwCpbj+GxK6XKwqWVv0= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.15 h1:QquxR7NH3ULBsKC+NoTpilzbKKS+5AELfNREInbhvas= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.15/go.mod h1:Tkrthp/0sNBShQQsamR7j/zY4p19tVTAs+nnqhH6R3c= github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.5 h1:tEEHn+PGAxRVqMPEhtU8oCSW/1Ge3zP5nUgPrGQNUPs= @@ -181,6 +184,8 @@ github.com/aws/aws-sdk-go-v2/service/rds v1.21.5 h1:FxgP8Ty+UMcnFfLDYATBxBBwNqxd github.com/aws/aws-sdk-go-v2/service/rds v1.21.5/go.mod h1:CETZ4xhuVW6rXcYVl9UIDaRPF1RDSjbr5IfTTCHswDM= github.com/aws/aws-sdk-go-v2/service/redshift v1.25.1 h1:pt62Je9eCVqDdlfB25LF9bnsuW24jyHqlpwpdQ4AEio= github.com/aws/aws-sdk-go-v2/service/redshift v1.25.1/go.mod h1:hb7YE8ERBjqEn3FV+xx4TVA1i/qX9aazglk+KBZK5lc= +github.com/aws/aws-sdk-go-v2/service/resourcegroups v1.12.9 h1:kz3eatV1DyQs28XMufhi7/Gk98F86pJm7liA430CiOA= +github.com/aws/aws-sdk-go-v2/service/resourcegroups v1.12.9/go.mod h1:kawkSDK0FqSCkzy89C6WQ+CsDixssVsPGe/Guh69N94= github.com/aws/aws-sdk-go-v2/service/route53 v1.21.2 h1:t7yn/jSMOVFAlCpJqFzivixMRPI/MySAcD0LhXdjbf4= github.com/aws/aws-sdk-go-v2/service/route53 v1.21.2/go.mod h1:ZBOkwr2JviKbUwZjhaUjQFaIbSx9XL0pQxNHaCqlMAU= github.com/aws/aws-sdk-go-v2/service/route53domains v1.12.7 h1:myfNXFwvCde6JZAfy6YoI9VMKhefNDjhMQTVGQWJ3nY= diff --git a/resources/provider/provider.go b/resources/provider/provider.go index 80bc6acce..d46df5362 100644 --- a/resources/provider/provider.go +++ b/resources/provider/provider.go @@ -49,6 +49,7 @@ import ( "github.com/cloudquery/cq-provider-aws/resources/services/qldb" "github.com/cloudquery/cq-provider-aws/resources/services/rds" "github.com/cloudquery/cq-provider-aws/resources/services/redshift" + "github.com/cloudquery/cq-provider-aws/resources/services/resourcegroups" "github.com/cloudquery/cq-provider-aws/resources/services/route53" "github.com/cloudquery/cq-provider-aws/resources/services/s3" "github.com/cloudquery/cq-provider-aws/resources/services/sagemaker" @@ -233,6 +234,7 @@ func Provider() *provider.Provider { "redshift.clusters": redshift.RedshiftClusters(), "redshift.event_subscriptions": redshift.EventSubscriptions(), "redshift.subnet_groups": redshift.RedshiftSubnetGroups(), + "resourcegroups.resource_groups": resourcegroups.ResourceGroups(), "route53.domains": route53.Route53Domains(), "route53.health_checks": route53.Route53HealthChecks(), "route53.hosted_zones": route53.Route53HostedZones(), diff --git a/resources/services/resourcegroups/gen.hcl b/resources/services/resourcegroups/gen.hcl new file mode 100644 index 000000000..507a40e42 --- /dev/null +++ b/resources/services/resourcegroups/gen.hcl @@ -0,0 +1,65 @@ +service = "aws" +output_directory = "." +add_generate = true + +description_modifier "remove_read_only" { + words = [" This member is required."] +} + +resource "aws" "resourcegroups" "resource_groups" { + path = "github.com/aws/aws-sdk-go-v2/service/resourcegroups/types.GroupIdentifier" + + ignoreError "IgnoreCommonErrors" { + path = "github.com/cloudquery/cq-provider-aws/client.IgnoreCommonErrors" + } + multiplex "AwsAccountRegion" { + path = "github.com/cloudquery/cq-provider-aws/client.ServiceAccountRegionMultiplexer" + params = ["resourcegroups"] + } + deleteFilter "AccountRegionFilter" { + path = "github.com/cloudquery/cq-provider-aws/client.DeleteAccountRegionFilter" + } + + options { + primary_keys = ["arn"] + } + + column "group_arn" { + rename = "arn" + } + column "group_name" { + rename = "name" + } + + userDefinedColumn "account_id" { + type = "string" + description = "The AWS Account ID of the resource." + resolver "resolveAWSAccount" { + path = "github.com/cloudquery/cq-provider-aws/client.ResolveAWSAccount" + } + } + userDefinedColumn "region" { + type = "string" + description = "The AWS Region of the resource." + resolver "resolveAWSRegion" { + path = "github.com/cloudquery/cq-provider-aws/client.ResolveAWSRegion" + } + } + userDefinedColumn "tags" { + type = "json" + generate_resolver = true + } + + postResourceResolver "resolveGroupQuery" { + path = "github.com/cloudquery/cq-provider-sdk/provider/schema.RowResolver" + generate = true + } + userDefinedColumn "resource_query_type" { + description = "The type of the query." + type = "string" + } + userDefinedColumn "resource_query" { + description = "The query that defines a group or a search." + type = "string" + } +} diff --git a/resources/services/resourcegroups/resource_groups.go b/resources/services/resourcegroups/resource_groups.go new file mode 100644 index 000000000..5a1cac3f5 --- /dev/null +++ b/resources/services/resourcegroups/resource_groups.go @@ -0,0 +1,126 @@ +package resourcegroups + +import ( + "context" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/resourcegroups" + "github.com/aws/aws-sdk-go-v2/service/resourcegroups/types" + "github.com/cloudquery/cq-provider-aws/client" + "github.com/cloudquery/cq-provider-sdk/provider/diag" + "github.com/cloudquery/cq-provider-sdk/provider/schema" +) + +//go:generate cq-gen --resource resource_groups --config gen.hcl --output . +func ResourceGroups() *schema.Table { + return &schema.Table{ + Name: "aws_resourcegroups_resource_groups", + Description: "The unique identifiers for a resource group", + Resolver: fetchResourcegroupsResourceGroups, + Multiplex: client.ServiceAccountRegionMultiplexer("resourcegroups"), + IgnoreError: client.IgnoreCommonErrors, + DeleteFilter: client.DeleteAccountRegionFilter, + PostResourceResolver: resolveGroupQuery, + Options: schema.TableCreationOptions{PrimaryKeys: []string{"arn"}}, + Columns: []schema.Column{ + { + Name: "account_id", + Description: "The AWS Account ID of the resource.", + Type: schema.TypeString, + Resolver: client.ResolveAWSAccount, + }, + { + Name: "region", + Description: "The AWS Region of the resource.", + Type: schema.TypeString, + Resolver: client.ResolveAWSRegion, + }, + { + Name: "tags", + Type: schema.TypeJSON, + Resolver: resolveResourcegroupsResourceGroupTags, + }, + { + Name: "resource_query_type", + Description: "The type of the query.", + Type: schema.TypeString, + }, + { + Name: "resource_query", + Description: "The query that defines a group or a search.", + Type: schema.TypeString, + }, + { + Name: "arn", + Description: "The ARN of the resource group", + Type: schema.TypeString, + Resolver: schema.PathResolver("GroupArn"), + }, + { + Name: "name", + Description: "The name of the resource group", + Type: schema.TypeString, + Resolver: schema.PathResolver("GroupName"), + }, + }, + } +} + +// ==================================================================================================================== +// Table Resolver Functions +// ==================================================================================================================== + +func fetchResourcegroupsResourceGroups(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + var config resourcegroups.ListGroupsInput + c := meta.(*client.Client) + svc := c.Services().ResourceGroups + for { + output, err := svc.ListGroups(ctx, &config, func(options *resourcegroups.Options) { + options.Region = c.Region + }) + if err != nil { + return diag.WrapError(err) + } + res <- output.GroupIdentifiers + if aws.ToString(output.NextToken) == "" { + break + } + config.NextToken = output.NextToken + } + return nil +} + +func resolveGroupQuery(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource) error { + group := resource.Item.(types.GroupIdentifier) + cl := meta.(*client.Client) + svc := cl.Services().ResourceGroups + input := resourcegroups.GetGroupQueryInput{ + Group: group.GroupArn, + } + output, err := svc.GetGroupQuery(ctx, &input, func(options *resourcegroups.Options) { + options.Region = cl.Region + }) + if err != nil { + return diag.WrapError(err) + } + if err := resource.Set("resource_query_type", output.GroupQuery.ResourceQuery.Type); err != nil { + return diag.WrapError(err) + } + return diag.WrapError(resource.Set("resource_query", output.GroupQuery.ResourceQuery.Query)) +} + +func resolveResourcegroupsResourceGroupTags(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error { + cl := meta.(*client.Client) + svc := cl.Services().ResourceGroups + group := resource.Item.(types.GroupIdentifier) + input := resourcegroups.GetTagsInput{ + Arn: group.GroupArn, + } + output, err := svc.GetTags(ctx, &input, func(options *resourcegroups.Options) { + options.Region = cl.Region + }) + if err != nil { + return diag.WrapError(err) + } + return diag.WrapError(resource.Set(c.Name, output.Tags)) +} diff --git a/resources/services/resourcegroups/resource_groups_mock_test.go b/resources/services/resourcegroups/resource_groups_mock_test.go new file mode 100644 index 000000000..5686c9095 --- /dev/null +++ b/resources/services/resourcegroups/resource_groups_mock_test.go @@ -0,0 +1,51 @@ +package resourcegroups + +import ( + "testing" + + "github.com/aws/aws-sdk-go-v2/service/resourcegroups" + "github.com/aws/aws-sdk-go-v2/service/resourcegroups/types" + "github.com/cloudquery/cq-provider-aws/client" + "github.com/cloudquery/cq-provider-aws/client/mocks" + "github.com/cloudquery/faker/v3" + "github.com/golang/mock/gomock" +) + +func buildResourceGroupsMock(t *testing.T, ctrl *gomock.Controller) client.Services { + m := mocks.NewMockResourceGroupsClient(ctrl) + gId := types.GroupIdentifier{} + err := faker.FakeData(&gId) + if err != nil { + t.Fatal(err) + } + + tagsResponse := resourcegroups.GetTagsOutput{} + err = faker.FakeData(&tagsResponse) + if err != nil { + t.Fatal(err) + } + + query := types.GroupQuery{} + err = faker.FakeData(&query) + if err != nil { + t.Fatal(err) + } + + m.EXPECT().ListGroups(gomock.Any(), gomock.Any(), gomock.Any()).Return( + &resourcegroups.ListGroupsOutput{ + GroupIdentifiers: []types.GroupIdentifier{gId}, + }, nil) + m.EXPECT().GetTags(gomock.Any(), gomock.Any(), gomock.Any()).Return(&tagsResponse, nil) + m.EXPECT().GetGroupQuery(gomock.Any(), gomock.Any(), gomock.Any()).Return( + &resourcegroups.GetGroupQueryOutput{ + GroupQuery: &query, + }, nil) + + return client.Services{ + ResourceGroups: m, + } +} + +func TestResourceGroups(t *testing.T) { + client.AwsMockTestHelper(t, ResourceGroups(), buildResourceGroupsMock, client.TestOptions{}) +} From ecd08c3a7e13f92f3cd87757c0b5cfd297226184 Mon Sep 17 00:00:00 2001 From: Adam Tyler Date: Sun, 7 Aug 2022 10:50:34 -0400 Subject: [PATCH 2/7] Add terraform templates for resourcegroups --- resources/services/resourcegroups/gen.hcl | 2 +- .../resourcegroups/resource_groups.go | 2 +- terraform/resourcegroups/local/main.tf | 5 +++++ terraform/resourcegroups/local/variables.tf | 9 +++++++++ .../resourcegroups/modules/test/provider.tf | 4 ++++ .../modules/test/resourcegroups.tf | 19 +++++++++++++++++++ .../resourcegroups/modules/test/terraform.tf | 10 ++++++++++ .../resourcegroups/modules/test/variables.tf | 16 ++++++++++++++++ 8 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 terraform/resourcegroups/local/main.tf create mode 100644 terraform/resourcegroups/local/variables.tf create mode 100644 terraform/resourcegroups/modules/test/provider.tf create mode 100644 terraform/resourcegroups/modules/test/resourcegroups.tf create mode 100644 terraform/resourcegroups/modules/test/terraform.tf create mode 100644 terraform/resourcegroups/modules/test/variables.tf diff --git a/resources/services/resourcegroups/gen.hcl b/resources/services/resourcegroups/gen.hcl index 507a40e42..7a7313cac 100644 --- a/resources/services/resourcegroups/gen.hcl +++ b/resources/services/resourcegroups/gen.hcl @@ -14,7 +14,7 @@ resource "aws" "resourcegroups" "resource_groups" { } multiplex "AwsAccountRegion" { path = "github.com/cloudquery/cq-provider-aws/client.ServiceAccountRegionMultiplexer" - params = ["resourcegroups"] + params = ["resource-groups"] } deleteFilter "AccountRegionFilter" { path = "github.com/cloudquery/cq-provider-aws/client.DeleteAccountRegionFilter" diff --git a/resources/services/resourcegroups/resource_groups.go b/resources/services/resourcegroups/resource_groups.go index 5a1cac3f5..4ee905e1b 100644 --- a/resources/services/resourcegroups/resource_groups.go +++ b/resources/services/resourcegroups/resource_groups.go @@ -17,7 +17,7 @@ func ResourceGroups() *schema.Table { Name: "aws_resourcegroups_resource_groups", Description: "The unique identifiers for a resource group", Resolver: fetchResourcegroupsResourceGroups, - Multiplex: client.ServiceAccountRegionMultiplexer("resourcegroups"), + Multiplex: client.ServiceAccountRegionMultiplexer("resource-groups"), IgnoreError: client.IgnoreCommonErrors, DeleteFilter: client.DeleteAccountRegionFilter, PostResourceResolver: resolveGroupQuery, diff --git a/terraform/resourcegroups/local/main.tf b/terraform/resourcegroups/local/main.tf new file mode 100644 index 000000000..e150ecb98 --- /dev/null +++ b/terraform/resourcegroups/local/main.tf @@ -0,0 +1,5 @@ +module "demo" { + source = "../modules/test" + prefix = var.prefix + } + \ No newline at end of file diff --git a/terraform/resourcegroups/local/variables.tf b/terraform/resourcegroups/local/variables.tf new file mode 100644 index 000000000..096015333 --- /dev/null +++ b/terraform/resourcegroups/local/variables.tf @@ -0,0 +1,9 @@ +variable "prefix" { + description = "Prefix to use for all name resources" + type = string + validation { + condition = length(var.prefix) == 2 + error_message = "The prefix should be exactly two characters." + } + } + \ No newline at end of file diff --git a/terraform/resourcegroups/modules/test/provider.tf b/terraform/resourcegroups/modules/test/provider.tf new file mode 100644 index 000000000..319a068db --- /dev/null +++ b/terraform/resourcegroups/modules/test/provider.tf @@ -0,0 +1,4 @@ +provider "aws" { + region = "us-east-1" + } + \ No newline at end of file diff --git a/terraform/resourcegroups/modules/test/resourcegroups.tf b/terraform/resourcegroups/modules/test/resourcegroups.tf new file mode 100644 index 000000000..7c0419601 --- /dev/null +++ b/terraform/resourcegroups/modules/test/resourcegroups.tf @@ -0,0 +1,19 @@ +resource "aws_resourcegroups_group" "test" { + name = "${var.prefix}-group" + + resource_query { + query = < Date: Sun, 7 Aug 2022 12:28:53 -0400 Subject: [PATCH 3/7] Convert resourcegroups to list and detail resolver --- client/mocks/mock_resourcegroups.go | 20 ++++++++++ client/services.go | 1 + resources/services/resourcegroups/gen.hcl | 5 +-- .../resourcegroups/resource_groups.go | 37 ++++++++++++++++--- .../resource_groups_mock_test.go | 10 +++++ .../modules/test/resourcegroups.tf | 5 ++- 6 files changed, 67 insertions(+), 11 deletions(-) diff --git a/client/mocks/mock_resourcegroups.go b/client/mocks/mock_resourcegroups.go index e984d9f9a..70b913f99 100644 --- a/client/mocks/mock_resourcegroups.go +++ b/client/mocks/mock_resourcegroups.go @@ -35,6 +35,26 @@ func (m *MockResourceGroupsClient) EXPECT() *MockResourceGroupsClientMockRecorde return m.recorder } +// GetGroup mocks base method. +func (m *MockResourceGroupsClient) GetGroup(arg0 context.Context, arg1 *resourcegroups.GetGroupInput, arg2 ...func(*resourcegroups.Options)) (*resourcegroups.GetGroupOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetGroup", varargs...) + ret0, _ := ret[0].(*resourcegroups.GetGroupOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetGroup indicates an expected call of GetGroup. +func (mr *MockResourceGroupsClientMockRecorder) GetGroup(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGroup", reflect.TypeOf((*MockResourceGroupsClient)(nil).GetGroup), varargs...) +} + // GetGroupQuery mocks base method. func (m *MockResourceGroupsClient) GetGroupQuery(arg0 context.Context, arg1 *resourcegroups.GetGroupQueryInput, arg2 ...func(*resourcegroups.Options)) (*resourcegroups.GetGroupQueryOutput, error) { m.ctrl.T.Helper() diff --git a/client/services.go b/client/services.go index e9ce36800..e7c11b9a7 100644 --- a/client/services.go +++ b/client/services.go @@ -782,6 +782,7 @@ type KinesisClient interface { //go:generate mockgen -package=mocks -destination=./mocks/mock_resourcegroups.go . ResourceGroupsClient type ResourceGroupsClient interface { + GetGroup(ctx context.Context, params *resourcegroups.GetGroupInput, optFns ...func(*resourcegroups.Options)) (*resourcegroups.GetGroupOutput, error) GetGroupQuery(ctx context.Context, params *resourcegroups.GetGroupQueryInput, optFns ...func(*resourcegroups.Options)) (*resourcegroups.GetGroupQueryOutput, error) GetTags(ctx context.Context, params *resourcegroups.GetTagsInput, optFns ...func(*resourcegroups.Options)) (*resourcegroups.GetTagsOutput, error) ListGroups(ctx context.Context, params *resourcegroups.ListGroupsInput, optFns ...func(*resourcegroups.Options)) (*resourcegroups.ListGroupsOutput, error) diff --git a/resources/services/resourcegroups/gen.hcl b/resources/services/resourcegroups/gen.hcl index 7a7313cac..a14fd310d 100644 --- a/resources/services/resourcegroups/gen.hcl +++ b/resources/services/resourcegroups/gen.hcl @@ -7,7 +7,7 @@ description_modifier "remove_read_only" { } resource "aws" "resourcegroups" "resource_groups" { - path = "github.com/aws/aws-sdk-go-v2/service/resourcegroups/types.GroupIdentifier" + path = "github.com/aws/aws-sdk-go-v2/service/resourcegroups/types.Group" ignoreError "IgnoreCommonErrors" { path = "github.com/cloudquery/cq-provider-aws/client.IgnoreCommonErrors" @@ -27,9 +27,6 @@ resource "aws" "resourcegroups" "resource_groups" { column "group_arn" { rename = "arn" } - column "group_name" { - rename = "name" - } userDefinedColumn "account_id" { type = "string" diff --git a/resources/services/resourcegroups/resource_groups.go b/resources/services/resourcegroups/resource_groups.go index 4ee905e1b..97df0f832 100644 --- a/resources/services/resourcegroups/resource_groups.go +++ b/resources/services/resourcegroups/resource_groups.go @@ -15,7 +15,7 @@ import ( func ResourceGroups() *schema.Table { return &schema.Table{ Name: "aws_resourcegroups_resource_groups", - Description: "The unique identifiers for a resource group", + Description: "A resource group that contains AWS resources", Resolver: fetchResourcegroupsResourceGroups, Multiplex: client.ServiceAccountRegionMultiplexer("resource-groups"), IgnoreError: client.IgnoreCommonErrors, @@ -60,7 +60,11 @@ func ResourceGroups() *schema.Table { Name: "name", Description: "The name of the resource group", Type: schema.TypeString, - Resolver: schema.PathResolver("GroupName"), + }, + { + Name: "description", + Description: "The description of the resource group", + Type: schema.TypeString, }, }, } @@ -71,6 +75,10 @@ func ResourceGroups() *schema.Table { // ==================================================================================================================== func fetchResourcegroupsResourceGroups(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + return diag.WrapError(client.ListAndDetailResolver(ctx, meta, res, listResourceGroups, resourceGroupDetail)) +} + +func listResourceGroups(ctx context.Context, meta schema.ClientMeta, detailChan chan<- interface{}) error { var config resourcegroups.ListGroupsInput c := meta.(*client.Client) svc := c.Services().ResourceGroups @@ -81,7 +89,9 @@ func fetchResourcegroupsResourceGroups(ctx context.Context, meta schema.ClientMe if err != nil { return diag.WrapError(err) } - res <- output.GroupIdentifiers + for _, item := range output.GroupIdentifiers { + detailChan <- item.GroupArn + } if aws.ToString(output.NextToken) == "" { break } @@ -90,8 +100,25 @@ func fetchResourcegroupsResourceGroups(ctx context.Context, meta schema.ClientMe return nil } +func resourceGroupDetail(ctx context.Context, meta schema.ClientMeta, resultsChan chan<- interface{}, errorChan chan<- error, listInfo interface{}) { + c := meta.(*client.Client) + groupArn := listInfo.(*string) + svc := c.Services().ResourceGroups + groupResponse, err := svc.GetGroup(ctx, &resourcegroups.GetGroupInput{ + Group: groupArn, + }) + if err != nil { + if c.IsNotFoundError(err) { + return + } + errorChan <- diag.WrapError(err) + return + } + resultsChan <- groupResponse.Group +} + func resolveGroupQuery(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource) error { - group := resource.Item.(types.GroupIdentifier) + group := resource.Item.(*types.Group) cl := meta.(*client.Client) svc := cl.Services().ResourceGroups input := resourcegroups.GetGroupQueryInput{ @@ -112,7 +139,7 @@ func resolveGroupQuery(ctx context.Context, meta schema.ClientMeta, resource *sc func resolveResourcegroupsResourceGroupTags(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error { cl := meta.(*client.Client) svc := cl.Services().ResourceGroups - group := resource.Item.(types.GroupIdentifier) + group := resource.Item.(*types.Group) input := resourcegroups.GetTagsInput{ Arn: group.GroupArn, } diff --git a/resources/services/resourcegroups/resource_groups_mock_test.go b/resources/services/resourcegroups/resource_groups_mock_test.go index 5686c9095..cdb4cde7e 100644 --- a/resources/services/resourcegroups/resource_groups_mock_test.go +++ b/resources/services/resourcegroups/resource_groups_mock_test.go @@ -19,6 +19,12 @@ func buildResourceGroupsMock(t *testing.T, ctrl *gomock.Controller) client.Servi t.Fatal(err) } + groupResponse := types.Group{} + err = faker.FakeData(&groupResponse) + if err != nil { + t.Fatal(err) + } + tagsResponse := resourcegroups.GetTagsOutput{} err = faker.FakeData(&tagsResponse) if err != nil { @@ -35,6 +41,10 @@ func buildResourceGroupsMock(t *testing.T, ctrl *gomock.Controller) client.Servi &resourcegroups.ListGroupsOutput{ GroupIdentifiers: []types.GroupIdentifier{gId}, }, nil) + m.EXPECT().GetGroup(gomock.Any(), gomock.Any(), gomock.Any()).Return( + &resourcegroups.GetGroupOutput{ + Group: &groupResponse, + }, nil) m.EXPECT().GetTags(gomock.Any(), gomock.Any(), gomock.Any()).Return(&tagsResponse, nil) m.EXPECT().GetGroupQuery(gomock.Any(), gomock.Any(), gomock.Any()).Return( &resourcegroups.GetGroupQueryOutput{ diff --git a/terraform/resourcegroups/modules/test/resourcegroups.tf b/terraform/resourcegroups/modules/test/resourcegroups.tf index 7c0419601..7f5e41971 100644 --- a/terraform/resourcegroups/modules/test/resourcegroups.tf +++ b/terraform/resourcegroups/modules/test/resourcegroups.tf @@ -1,5 +1,6 @@ resource "aws_resourcegroups_group" "test" { - name = "${var.prefix}-group" + name = "${var.prefix}-group" + description = "Test resource group" resource_query { query = < Date: Mon, 8 Aug 2022 19:06:39 -0400 Subject: [PATCH 4/7] Clean up resource group resolvers --- resources/services/resourcegroups/gen.hcl | 19 +--- .../resourcegroups/resource_groups.go | 102 +++++++++--------- 2 files changed, 56 insertions(+), 65 deletions(-) diff --git a/resources/services/resourcegroups/gen.hcl b/resources/services/resourcegroups/gen.hcl index a14fd310d..74a243341 100644 --- a/resources/services/resourcegroups/gen.hcl +++ b/resources/services/resourcegroups/gen.hcl @@ -7,7 +7,7 @@ description_modifier "remove_read_only" { } resource "aws" "resourcegroups" "resource_groups" { - path = "github.com/aws/aws-sdk-go-v2/service/resourcegroups/types.Group" + path = "../resourcegroups.ResourceGroupWrapper" ignoreError "IgnoreCommonErrors" { path = "github.com/cloudquery/cq-provider-aws/client.IgnoreCommonErrors" @@ -28,6 +28,10 @@ resource "aws" "resourcegroups" "resource_groups" { rename = "arn" } + column "group_name" { + rename = "group" + } + userDefinedColumn "account_id" { type = "string" description = "The AWS Account ID of the resource." @@ -46,17 +50,4 @@ resource "aws" "resourcegroups" "resource_groups" { type = "json" generate_resolver = true } - - postResourceResolver "resolveGroupQuery" { - path = "github.com/cloudquery/cq-provider-sdk/provider/schema.RowResolver" - generate = true - } - userDefinedColumn "resource_query_type" { - description = "The type of the query." - type = "string" - } - userDefinedColumn "resource_query" { - description = "The query that defines a group or a search." - type = "string" - } } diff --git a/resources/services/resourcegroups/resource_groups.go b/resources/services/resourcegroups/resource_groups.go index 97df0f832..f5fb9128f 100644 --- a/resources/services/resourcegroups/resource_groups.go +++ b/resources/services/resourcegroups/resource_groups.go @@ -14,14 +14,12 @@ import ( //go:generate cq-gen --resource resource_groups --config gen.hcl --output . func ResourceGroups() *schema.Table { return &schema.Table{ - Name: "aws_resourcegroups_resource_groups", - Description: "A resource group that contains AWS resources", - Resolver: fetchResourcegroupsResourceGroups, - Multiplex: client.ServiceAccountRegionMultiplexer("resource-groups"), - IgnoreError: client.IgnoreCommonErrors, - DeleteFilter: client.DeleteAccountRegionFilter, - PostResourceResolver: resolveGroupQuery, - Options: schema.TableCreationOptions{PrimaryKeys: []string{"arn"}}, + Name: "aws_resourcegroups_resource_groups", + Resolver: fetchResourcegroupsResourceGroups, + Multiplex: client.ServiceAccountRegionMultiplexer("resource-groups"), + IgnoreError: client.IgnoreCommonErrors, + DeleteFilter: client.DeleteAccountRegionFilter, + Options: schema.TableCreationOptions{PrimaryKeys: []string{"arn"}}, Columns: []schema.Column{ { Name: "account_id", @@ -41,30 +39,34 @@ func ResourceGroups() *schema.Table { Resolver: resolveResourcegroupsResourceGroupTags, }, { - Name: "resource_query_type", - Description: "The type of the query.", + Name: "arn", + Description: "The ARN of the resource group", Type: schema.TypeString, + Resolver: schema.PathResolver("Group.GroupArn"), }, { - Name: "resource_query", - Description: "The query that defines a group or a search.", + Name: "group", + Description: "The name of the resource group", Type: schema.TypeString, + Resolver: schema.PathResolver("Group.Name"), }, { - Name: "arn", - Description: "The ARN of the resource group", + Name: "group_description", + Description: "The description of the resource group", Type: schema.TypeString, - Resolver: schema.PathResolver("GroupArn"), + Resolver: schema.PathResolver("Group.Description"), }, { - Name: "name", - Description: "The name of the resource group", + Name: "resource_query", + Description: "The query that defines a group or a search", Type: schema.TypeString, + Resolver: schema.PathResolver("ResourceQuery.Query"), }, { - Name: "description", - Description: "The description of the resource group", + Name: "resource_query_type", + Description: "The type of the query", Type: schema.TypeString, + Resolver: schema.PathResolver("ResourceQuery.Type"), }, }, } @@ -77,6 +79,30 @@ func ResourceGroups() *schema.Table { func fetchResourcegroupsResourceGroups(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { return diag.WrapError(client.ListAndDetailResolver(ctx, meta, res, listResourceGroups, resourceGroupDetail)) } +func resolveResourcegroupsResourceGroupTags(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error { + cl := meta.(*client.Client) + svc := cl.Services().ResourceGroups + group := resource.Item.(ResourceGroupWrapper) + input := resourcegroups.GetTagsInput{ + Arn: group.GroupArn, + } + output, err := svc.GetTags(ctx, &input, func(options *resourcegroups.Options) { + options.Region = cl.Region + }) + if err != nil { + return diag.WrapError(err) + } + return diag.WrapError(resource.Set(c.Name, output.Tags)) +} + +// ==================================================================================================================== +// User Defined Helpers +// ==================================================================================================================== + +type ResourceGroupWrapper struct { + *types.Group + *types.ResourceQuery +} func listResourceGroups(ctx context.Context, meta schema.ClientMeta, detailChan chan<- interface{}) error { var config resourcegroups.ListGroupsInput @@ -99,7 +125,6 @@ func listResourceGroups(ctx context.Context, meta schema.ClientMeta, detailChan } return nil } - func resourceGroupDetail(ctx context.Context, meta schema.ClientMeta, resultsChan chan<- interface{}, errorChan chan<- error, listInfo interface{}) { c := meta.(*client.Client) groupArn := listInfo.(*string) @@ -111,43 +136,18 @@ func resourceGroupDetail(ctx context.Context, meta schema.ClientMeta, resultsCha if c.IsNotFoundError(err) { return } - errorChan <- diag.WrapError(err) return } - resultsChan <- groupResponse.Group -} -func resolveGroupQuery(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource) error { - group := resource.Item.(*types.Group) - cl := meta.(*client.Client) - svc := cl.Services().ResourceGroups input := resourcegroups.GetGroupQueryInput{ - Group: group.GroupArn, + Group: groupResponse.Group.GroupArn, } - output, err := svc.GetGroupQuery(ctx, &input, func(options *resourcegroups.Options) { - options.Region = cl.Region - }) + output, err := svc.GetGroupQuery(ctx, &input) if err != nil { - return diag.WrapError(err) - } - if err := resource.Set("resource_query_type", output.GroupQuery.ResourceQuery.Type); err != nil { - return diag.WrapError(err) - } - return diag.WrapError(resource.Set("resource_query", output.GroupQuery.ResourceQuery.Query)) -} - -func resolveResourcegroupsResourceGroupTags(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error { - cl := meta.(*client.Client) - svc := cl.Services().ResourceGroups - group := resource.Item.(*types.Group) - input := resourcegroups.GetTagsInput{ - Arn: group.GroupArn, + errorChan <- diag.WrapError(err) } - output, err := svc.GetTags(ctx, &input, func(options *resourcegroups.Options) { - options.Region = cl.Region - }) - if err != nil { - return diag.WrapError(err) + resultsChan <- ResourceGroupWrapper{ + groupResponse.Group, + output.GroupQuery.ResourceQuery, } - return diag.WrapError(resource.Set(c.Name, output.Tags)) } From 386124a7fd5ba90910951fcec4fcd10d47bb828f Mon Sep 17 00:00:00 2001 From: Adam Tyler Date: Tue, 9 Aug 2022 17:51:36 -0400 Subject: [PATCH 5/7] Update error handling and docs --- docs/tables/aws_resourcegroups_resource_groups.md | 9 +++++---- resources/services/resourcegroups/resource_groups.go | 12 +++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/docs/tables/aws_resourcegroups_resource_groups.md b/docs/tables/aws_resourcegroups_resource_groups.md index ce6249ac1..8baf9534f 100644 --- a/docs/tables/aws_resourcegroups_resource_groups.md +++ b/docs/tables/aws_resourcegroups_resource_groups.md @@ -1,13 +1,14 @@ # Table: aws_resourcegroups_resource_groups -The unique identifiers for a resource group + ## Columns | Name | Type | Description | | ------------- | ------------- | ----- | |account_id|text|The AWS Account ID of the resource.| |region|text|The AWS Region of the resource.| |tags|jsonb|| -|resource_query_type|text|The type of the query.| -|resource_query|text|The query that defines a group or a search.| |arn|text|The ARN of the resource group| -|name|text|The name of the resource group| +|group|text|The name of the resource group| +|group_description|text|The description of the resource group| +|resource_query|text|The query that defines a group or a search| +|resource_query_type|text|The type of the query| diff --git a/resources/services/resourcegroups/resource_groups.go b/resources/services/resourcegroups/resource_groups.go index f5fb9128f..92b14b2ef 100644 --- a/resources/services/resourcegroups/resource_groups.go +++ b/resources/services/resourcegroups/resource_groups.go @@ -11,6 +11,11 @@ import ( "github.com/cloudquery/cq-provider-sdk/provider/schema" ) +type ResourceGroupWrapper struct { + *types.Group + *types.ResourceQuery +} + //go:generate cq-gen --resource resource_groups --config gen.hcl --output . func ResourceGroups() *schema.Table { return &schema.Table{ @@ -99,11 +104,6 @@ func resolveResourcegroupsResourceGroupTags(ctx context.Context, meta schema.Cli // User Defined Helpers // ==================================================================================================================== -type ResourceGroupWrapper struct { - *types.Group - *types.ResourceQuery -} - func listResourceGroups(ctx context.Context, meta schema.ClientMeta, detailChan chan<- interface{}) error { var config resourcegroups.ListGroupsInput c := meta.(*client.Client) @@ -136,6 +136,7 @@ func resourceGroupDetail(ctx context.Context, meta schema.ClientMeta, resultsCha if c.IsNotFoundError(err) { return } + errorChan <- diag.WrapError(err) return } @@ -145,6 +146,7 @@ func resourceGroupDetail(ctx context.Context, meta schema.ClientMeta, resultsCha output, err := svc.GetGroupQuery(ctx, &input) if err != nil { errorChan <- diag.WrapError(err) + return } resultsChan <- ResourceGroupWrapper{ groupResponse.Group, From 92f62c48d566263f7695c7c6d0e03194fb06e2eb Mon Sep 17 00:00:00 2001 From: Adam Tyler Date: Wed, 10 Aug 2022 06:30:47 -0400 Subject: [PATCH 6/7] Sync with main --- resources/services/resourcegroups/resource_groups.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/services/resourcegroups/resource_groups.go b/resources/services/resourcegroups/resource_groups.go index 92b14b2ef..27dde9c55 100644 --- a/resources/services/resourcegroups/resource_groups.go +++ b/resources/services/resourcegroups/resource_groups.go @@ -11,11 +11,6 @@ import ( "github.com/cloudquery/cq-provider-sdk/provider/schema" ) -type ResourceGroupWrapper struct { - *types.Group - *types.ResourceQuery -} - //go:generate cq-gen --resource resource_groups --config gen.hcl --output . func ResourceGroups() *schema.Table { return &schema.Table{ @@ -104,6 +99,11 @@ func resolveResourcegroupsResourceGroupTags(ctx context.Context, meta schema.Cli // User Defined Helpers // ==================================================================================================================== +type ResourceGroupWrapper struct { + *types.Group + *types.ResourceQuery +} + func listResourceGroups(ctx context.Context, meta schema.ClientMeta, detailChan chan<- interface{}) error { var config resourcegroups.ListGroupsInput c := meta.(*client.Client) From d46171c55d8824cd36b66b8c9f61cc78a701336c Mon Sep 17 00:00:00 2001 From: bbernays Date: Wed, 10 Aug 2022 11:13:36 -0500 Subject: [PATCH 7/7] Update resources/services/resourcegroups/gen.hcl --- resources/services/resourcegroups/gen.hcl | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/services/resourcegroups/gen.hcl b/resources/services/resourcegroups/gen.hcl index 74a243341..19bdc064d 100644 --- a/resources/services/resourcegroups/gen.hcl +++ b/resources/services/resourcegroups/gen.hcl @@ -1,3 +1,4 @@ +//check-for-changes service = "aws" output_directory = "." add_generate = true